Home | History | Annotate | Download | only in aarch32
      1 // Copyright 2015, VIXL authors
      2 // All rights reserved.
      3 //
      4 // Redistribution and use in source and binary forms, with or without
      5 // modification, are permitted provided that the following conditions are met:
      6 //
      7 //   * Redistributions of source code must retain the above copyright notice,
      8 //     this list of conditions and the following disclaimer.
      9 //   * Redistributions in binary form must reproduce the above copyright notice,
     10 //     this list of conditions and the following disclaimer in the documentation
     11 //     and/or other materials provided with the distribution.
     12 //   * Neither the name of ARM Limited nor the names of its contributors may be
     13 //     used to endorse or promote products derived from this software without
     14 //     specific prior written permission.
     15 //
     16 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS CONTRIBUTORS "AS IS" AND
     17 // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
     18 // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
     19 // DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
     20 // FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     21 // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
     22 // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
     23 // CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
     24 // OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     25 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     26 
     27 extern "C" {
     28 #include <stdint.h>
     29 }
     30 
     31 #include <cassert>
     32 #include <cstdio>
     33 #include <cstdlib>
     34 #include <cstring>
     35 #include <iomanip>
     36 #include <iostream>
     37 
     38 #include "utils-vixl.h"
     39 #include "aarch32/constants-aarch32.h"
     40 #include "aarch32/disasm-aarch32.h"
     41 #include "aarch32/instructions-aarch32.h"
     42 #include "aarch32/operands-aarch32.h"
     43 
     44 namespace vixl {
     45 namespace aarch32 {
     46 
     47 class T32CodeAddressIncrementer {
     48   uint32_t* code_address_;
     49   uint32_t increment_;
     50 
     51  public:
     52   T32CodeAddressIncrementer(uint32_t instr, uint32_t* code_address)
     53       : code_address_(code_address),
     54         increment_(Disassembler::Is16BitEncoding(instr) ? 2 : 4) {}
     55   ~T32CodeAddressIncrementer() { *code_address_ += increment_; }
     56 };
     57 
     58 class A32CodeAddressIncrementer {
     59   uint32_t* code_address_;
     60 
     61  public:
     62   explicit A32CodeAddressIncrementer(uint32_t* code_address)
     63       : code_address_(code_address) {}
     64   ~A32CodeAddressIncrementer() { *code_address_ += 4; }
     65 };
     66 
     67 class DecodeNeon {
     68   int lane_;
     69   SpacingType spacing_;
     70   bool valid_;
     71 
     72  public:
     73   DecodeNeon(int lane, SpacingType spacing)
     74       : lane_(lane), spacing_(spacing), valid_(true) {}
     75   DecodeNeon() : lane_(0), spacing_(kSingle), valid_(false) {}
     76   int GetLane() const { return lane_; }
     77   SpacingType GetSpacing() const { return spacing_; }
     78   bool IsValid() const { return valid_; }
     79 };
     80 
     81 class DecodeNeonAndAlign : public DecodeNeon {
     82  public:
     83   Alignment align_;
     84   DecodeNeonAndAlign(int lanes, SpacingType spacing, Alignment align)
     85       : DecodeNeon(lanes, spacing), align_(align) {}
     86   DecodeNeonAndAlign() : align_(kBadAlignment) {}
     87   Alignment GetAlign() const { return align_; }
     88 };
     89 
     90 // Start of generated code.
     91 DataTypeValue Dt_L_imm6_1_Decode(uint32_t value, uint32_t type_value) {
     92   if ((value & 0xf) == 0x1) {
     93     switch (type_value) {
     94       case 0x0:
     95         return S8;
     96       case 0x1:
     97         return U8;
     98     }
     99   } else if ((value & 0xe) == 0x2) {
    100     switch (type_value) {
    101       case 0x0:
    102         return S16;
    103       case 0x1:
    104         return U16;
    105     }
    106   } else if ((value & 0xc) == 0x4) {
    107     switch (type_value) {
    108       case 0x0:
    109         return S32;
    110       case 0x1:
    111         return U32;
    112     }
    113   } else if ((value & 0x8) == 0x8) {
    114     switch (type_value) {
    115       case 0x0:
    116         return S64;
    117       case 0x1:
    118         return U64;
    119     }
    120   }
    121   return kDataTypeValueInvalid;
    122 }
    123 
    124 DataTypeValue Dt_L_imm6_2_Decode(uint32_t value, uint32_t type_value) {
    125   if ((value & 0xf) == 0x1) {
    126     if (type_value == 0x1) return S8;
    127   } else if ((value & 0xe) == 0x2) {
    128     if (type_value == 0x1) return S16;
    129   } else if ((value & 0xc) == 0x4) {
    130     if (type_value == 0x1) return S32;
    131   } else if ((value & 0x8) == 0x8) {
    132     if (type_value == 0x1) return S64;
    133   }
    134   return kDataTypeValueInvalid;
    135 }
    136 
    137 DataTypeValue Dt_L_imm6_3_Decode(uint32_t value) {
    138   if ((value & 0xf) == 0x1) {
    139     return I8;
    140   } else if ((value & 0xe) == 0x2) {
    141     return I16;
    142   } else if ((value & 0xc) == 0x4) {
    143     return I32;
    144   } else if ((value & 0x8) == 0x8) {
    145     return I64;
    146   }
    147   return kDataTypeValueInvalid;
    148 }
    149 
    150 DataTypeValue Dt_L_imm6_4_Decode(uint32_t value) {
    151   if ((value & 0xf) == 0x1) {
    152     return Untyped8;
    153   } else if ((value & 0xe) == 0x2) {
    154     return Untyped16;
    155   } else if ((value & 0xc) == 0x4) {
    156     return Untyped32;
    157   } else if ((value & 0x8) == 0x8) {
    158     return Untyped64;
    159   }
    160   return kDataTypeValueInvalid;
    161 }
    162 
    163 DataTypeValue Dt_imm6_1_Decode(uint32_t value, uint32_t type_value) {
    164   if ((value & 0x7) == 0x1) {
    165     switch (type_value) {
    166       case 0x0:
    167         return S16;
    168       case 0x1:
    169         return U16;
    170     }
    171   } else if ((value & 0x6) == 0x2) {
    172     switch (type_value) {
    173       case 0x0:
    174         return S32;
    175       case 0x1:
    176         return U32;
    177     }
    178   } else if ((value & 0x4) == 0x4) {
    179     switch (type_value) {
    180       case 0x0:
    181         return S64;
    182       case 0x1:
    183         return U64;
    184     }
    185   }
    186   return kDataTypeValueInvalid;
    187 }
    188 
    189 DataTypeValue Dt_imm6_2_Decode(uint32_t value, uint32_t type_value) {
    190   if ((value & 0x7) == 0x1) {
    191     if (type_value == 0x1) return S16;
    192   } else if ((value & 0x6) == 0x2) {
    193     if (type_value == 0x1) return S32;
    194   } else if ((value & 0x4) == 0x4) {
    195     if (type_value == 0x1) return S64;
    196   }
    197   return kDataTypeValueInvalid;
    198 }
    199 
    200 DataTypeValue Dt_imm6_3_Decode(uint32_t value) {
    201   if ((value & 0x7) == 0x1) {
    202     return I16;
    203   } else if ((value & 0x6) == 0x2) {
    204     return I32;
    205   } else if ((value & 0x4) == 0x4) {
    206     return I64;
    207   }
    208   return kDataTypeValueInvalid;
    209 }
    210 
    211 DataTypeValue Dt_imm6_4_Decode(uint32_t value, uint32_t type_value) {
    212   if ((value & 0x7) == 0x1) {
    213     switch (type_value) {
    214       case 0x0:
    215         return S8;
    216       case 0x1:
    217         return U8;
    218     }
    219   } else if ((value & 0x6) == 0x2) {
    220     switch (type_value) {
    221       case 0x0:
    222         return S16;
    223       case 0x1:
    224         return U16;
    225     }
    226   } else if ((value & 0x4) == 0x4) {
    227     switch (type_value) {
    228       case 0x0:
    229         return S32;
    230       case 0x1:
    231         return U32;
    232     }
    233   }
    234   return kDataTypeValueInvalid;
    235 }
    236 
    237 DataTypeValue Dt_op_U_size_1_Decode(uint32_t value) {
    238   switch (value) {
    239     case 0x0:
    240       return S8;
    241     case 0x1:
    242       return S16;
    243     case 0x2:
    244       return S32;
    245     case 0x4:
    246       return U8;
    247     case 0x5:
    248       return U16;
    249     case 0x6:
    250       return U32;
    251     case 0x8:
    252       return P8;
    253     case 0xa:
    254       return P64;
    255   }
    256   return kDataTypeValueInvalid;
    257 }
    258 
    259 DataTypeValue Dt_op_size_1_Decode(uint32_t value) {
    260   switch (value) {
    261     case 0x0:
    262       return I8;
    263     case 0x1:
    264       return I16;
    265     case 0x2:
    266       return I32;
    267     case 0x4:
    268       return P8;
    269   }
    270   return kDataTypeValueInvalid;
    271 }
    272 
    273 DataTypeValue Dt_op_size_2_Decode(uint32_t value) {
    274   switch (value) {
    275     case 0x0:
    276       return S8;
    277     case 0x1:
    278       return S16;
    279     case 0x2:
    280       return S32;
    281     case 0x4:
    282       return U8;
    283     case 0x5:
    284       return U16;
    285     case 0x6:
    286       return U32;
    287   }
    288   return kDataTypeValueInvalid;
    289 }
    290 
    291 DataTypeValue Dt_op_size_3_Decode(uint32_t value) {
    292   switch (value) {
    293     case 0x0:
    294       return S16;
    295     case 0x1:
    296       return S32;
    297     case 0x2:
    298       return S64;
    299     case 0x4:
    300       return U16;
    301     case 0x5:
    302       return U32;
    303     case 0x6:
    304       return U64;
    305   }
    306   return kDataTypeValueInvalid;
    307 }
    308 
    309 DataTypeValue Dt_U_imm3H_1_Decode(uint32_t value) {
    310   switch (value) {
    311     case 0x1:
    312       return S8;
    313     case 0x2:
    314       return S16;
    315     case 0x4:
    316       return S32;
    317     case 0x9:
    318       return U8;
    319     case 0xa:
    320       return U16;
    321     case 0xc:
    322       return U32;
    323   }
    324   return kDataTypeValueInvalid;
    325 }
    326 
    327 DataTypeValue Dt_U_opc1_opc2_1_Decode(uint32_t value, unsigned* lane) {
    328   if ((value & 0x18) == 0x8) {
    329     *lane = value & 7;
    330     return S8;
    331   }
    332   if ((value & 0x19) == 0x1) {
    333     *lane = (value >> 1) & 3;
    334     return S16;
    335   }
    336   if ((value & 0x18) == 0x18) {
    337     *lane = value & 7;
    338     return U8;
    339   }
    340   if ((value & 0x19) == 0x11) {
    341     *lane = (value >> 1) & 3;
    342     return U16;
    343   }
    344   if ((value & 0x1b) == 0x0) {
    345     *lane = (value >> 2) & 1;
    346     return Untyped32;
    347   }
    348   *lane = -1;
    349   return kDataTypeValueInvalid;
    350 }
    351 
    352 DataTypeValue Dt_opc1_opc2_1_Decode(uint32_t value, unsigned* lane) {
    353   if ((value & 0x8) == 0x8) {
    354     *lane = value & 7;
    355     return Untyped8;
    356   }
    357   if ((value & 0x9) == 0x1) {
    358     *lane = (value >> 1) & 3;
    359     return Untyped16;
    360   }
    361   if ((value & 0xb) == 0x0) {
    362     *lane = (value >> 2) & 1;
    363     return Untyped32;
    364   }
    365   *lane = -1;
    366   return kDataTypeValueInvalid;
    367 }
    368 
    369 DataTypeValue Dt_imm4_1_Decode(uint32_t value, unsigned* lane) {
    370   if ((value & 0x1) == 0x1) {
    371     *lane = (value >> 1) & 7;
    372     return Untyped8;
    373   }
    374   if ((value & 0x3) == 0x2) {
    375     *lane = (value >> 2) & 3;
    376     return Untyped16;
    377   }
    378   if ((value & 0x7) == 0x4) {
    379     *lane = (value >> 3) & 1;
    380     return Untyped32;
    381   }
    382   *lane = -1;
    383   return kDataTypeValueInvalid;
    384 }
    385 
    386 DataTypeValue Dt_B_E_1_Decode(uint32_t value) {
    387   switch (value) {
    388     case 0x2:
    389       return Untyped8;
    390     case 0x1:
    391       return Untyped16;
    392     case 0x0:
    393       return Untyped32;
    394   }
    395   return kDataTypeValueInvalid;
    396 }
    397 
    398 DataTypeValue Dt_op_1_Decode1(uint32_t value) {
    399   switch (value) {
    400     case 0x0:
    401       return F32;
    402     case 0x1:
    403       return F32;
    404     case 0x2:
    405       return S32;
    406     case 0x3:
    407       return U32;
    408   }
    409   return kDataTypeValueInvalid;
    410 }
    411 
    412 DataTypeValue Dt_op_1_Decode2(uint32_t value) {
    413   switch (value) {
    414     case 0x0:
    415       return S32;
    416     case 0x1:
    417       return U32;
    418     case 0x2:
    419       return F32;
    420     case 0x3:
    421       return F32;
    422   }
    423   return kDataTypeValueInvalid;
    424 }
    425 
    426 DataTypeValue Dt_op_2_Decode(uint32_t value) {
    427   switch (value) {
    428     case 0x0:
    429       return U32;
    430     case 0x1:
    431       return S32;
    432   }
    433   return kDataTypeValueInvalid;
    434 }
    435 
    436 DataTypeValue Dt_op_3_Decode(uint32_t value) {
    437   switch (value) {
    438     case 0x0:
    439       return S32;
    440     case 0x1:
    441       return U32;
    442   }
    443   return kDataTypeValueInvalid;
    444 }
    445 
    446 DataTypeValue Dt_U_sx_1_Decode(uint32_t value) {
    447   switch (value) {
    448     case 0x0:
    449       return S16;
    450     case 0x1:
    451       return S32;
    452     case 0x2:
    453       return U16;
    454     case 0x3:
    455       return U32;
    456   }
    457   return kDataTypeValueInvalid;
    458 }
    459 
    460 DataTypeValue Dt_op_U_1_Decode1(uint32_t value) {
    461   switch (value) {
    462     case 0x0:
    463       return F32;
    464     case 0x1:
    465       return F32;
    466     case 0x2:
    467       return S32;
    468     case 0x3:
    469       return U32;
    470   }
    471   return kDataTypeValueInvalid;
    472 }
    473 
    474 DataTypeValue Dt_op_U_1_Decode2(uint32_t value) {
    475   switch (value) {
    476     case 0x0:
    477       return S32;
    478     case 0x1:
    479       return U32;
    480     case 0x2:
    481       return F32;
    482     case 0x3:
    483       return F32;
    484   }
    485   return kDataTypeValueInvalid;
    486 }
    487 
    488 DataTypeValue Dt_sz_1_Decode(uint32_t value) {
    489   switch (value) {
    490     case 0x0:
    491       return F32;
    492   }
    493   return kDataTypeValueInvalid;
    494 }
    495 
    496 DataTypeValue Dt_F_size_1_Decode(uint32_t value) {
    497   switch (value) {
    498     case 0x0:
    499       return S8;
    500     case 0x1:
    501       return S16;
    502     case 0x2:
    503       return S32;
    504     case 0x6:
    505       return F32;
    506   }
    507   return kDataTypeValueInvalid;
    508 }
    509 
    510 DataTypeValue Dt_F_size_2_Decode(uint32_t value) {
    511   switch (value) {
    512     case 0x0:
    513       return I8;
    514     case 0x1:
    515       return I16;
    516     case 0x2:
    517       return I32;
    518     case 0x6:
    519       return F32;
    520   }
    521   return kDataTypeValueInvalid;
    522 }
    523 
    524 DataTypeValue Dt_F_size_3_Decode(uint32_t value) {
    525   switch (value) {
    526     case 0x1:
    527       return I16;
    528     case 0x2:
    529       return I32;
    530     case 0x6:
    531       return F32;
    532   }
    533   return kDataTypeValueInvalid;
    534 }
    535 
    536 DataTypeValue Dt_F_size_4_Decode(uint32_t value) {
    537   switch (value) {
    538     case 0x2:
    539       return U32;
    540     case 0x6:
    541       return F32;
    542   }
    543   return kDataTypeValueInvalid;
    544 }
    545 
    546 DataTypeValue Dt_U_size_1_Decode(uint32_t value) {
    547   switch (value) {
    548     case 0x0:
    549       return S8;
    550     case 0x1:
    551       return S16;
    552     case 0x2:
    553       return S32;
    554     case 0x4:
    555       return U8;
    556     case 0x5:
    557       return U16;
    558     case 0x6:
    559       return U32;
    560   }
    561   return kDataTypeValueInvalid;
    562 }
    563 
    564 DataTypeValue Dt_U_size_2_Decode(uint32_t value) {
    565   switch (value) {
    566     case 0x1:
    567       return S16;
    568     case 0x2:
    569       return S32;
    570     case 0x5:
    571       return U16;
    572     case 0x6:
    573       return U32;
    574   }
    575   return kDataTypeValueInvalid;
    576 }
    577 
    578 DataTypeValue Dt_U_size_3_Decode(uint32_t value) {
    579   switch (value) {
    580     case 0x0:
    581       return S8;
    582     case 0x1:
    583       return S16;
    584     case 0x2:
    585       return S32;
    586     case 0x3:
    587       return S64;
    588     case 0x4:
    589       return U8;
    590     case 0x5:
    591       return U16;
    592     case 0x6:
    593       return U32;
    594     case 0x7:
    595       return U64;
    596   }
    597   return kDataTypeValueInvalid;
    598 }
    599 
    600 DataTypeValue Dt_size_1_Decode(uint32_t value) {
    601   switch (value) {
    602     case 0x0:
    603       return Untyped8;
    604   }
    605   return kDataTypeValueInvalid;
    606 }
    607 
    608 DataTypeValue Dt_size_2_Decode(uint32_t value) {
    609   switch (value) {
    610     case 0x0:
    611       return I8;
    612     case 0x1:
    613       return I16;
    614     case 0x2:
    615       return I32;
    616     case 0x3:
    617       return I64;
    618   }
    619   return kDataTypeValueInvalid;
    620 }
    621 
    622 DataTypeValue Dt_size_3_Decode(uint32_t value) {
    623   switch (value) {
    624     case 0x0:
    625       return I16;
    626     case 0x1:
    627       return I32;
    628     case 0x2:
    629       return I64;
    630   }
    631   return kDataTypeValueInvalid;
    632 }
    633 
    634 DataTypeValue Dt_size_4_Decode(uint32_t value) {
    635   switch (value) {
    636     case 0x0:
    637       return I8;
    638     case 0x1:
    639       return I16;
    640     case 0x2:
    641       return I32;
    642   }
    643   return kDataTypeValueInvalid;
    644 }
    645 
    646 DataTypeValue Dt_size_5_Decode(uint32_t value) {
    647   switch (value) {
    648     case 0x0:
    649       return S8;
    650     case 0x1:
    651       return S16;
    652     case 0x2:
    653       return S32;
    654   }
    655   return kDataTypeValueInvalid;
    656 }
    657 
    658 DataTypeValue Dt_size_6_Decode(uint32_t value) {
    659   switch (value) {
    660     case 0x0:
    661       return Untyped8;
    662     case 0x1:
    663       return Untyped16;
    664     case 0x2:
    665       return Untyped32;
    666     case 0x3:
    667       return Untyped64;
    668   }
    669   return kDataTypeValueInvalid;
    670 }
    671 
    672 DataTypeValue Dt_size_7_Decode(uint32_t value) {
    673   switch (value) {
    674     case 0x0:
    675       return Untyped8;
    676     case 0x1:
    677       return Untyped16;
    678     case 0x2:
    679       return Untyped32;
    680   }
    681   return kDataTypeValueInvalid;
    682 }
    683 
    684 DataTypeValue Dt_size_8_Decode(uint32_t value) {
    685   switch (value) {
    686     case 0x0:
    687       return Untyped8;
    688     case 0x1:
    689       return Untyped16;
    690     case 0x2:
    691       return Untyped32;
    692     case 0x3:
    693       return Untyped32;
    694   }
    695   return kDataTypeValueInvalid;
    696 }
    697 
    698 DataTypeValue Dt_size_9_Decode(uint32_t value, uint32_t type_value) {
    699   switch (value) {
    700     case 0x1:
    701       switch (type_value) {
    702         case 0x0:
    703           return I16;
    704       }
    705       break;
    706     case 0x2:
    707       switch (type_value) {
    708         case 0x0:
    709           return I32;
    710         case 0x1:
    711           return F32;
    712       }
    713       break;
    714   }
    715   return kDataTypeValueInvalid;
    716 }
    717 
    718 DataTypeValue Dt_size_10_Decode(uint32_t value) {
    719   switch (value) {
    720     case 0x0:
    721       return I8;
    722     case 0x1:
    723       return I16;
    724     case 0x2:
    725       return I32;
    726   }
    727   return kDataTypeValueInvalid;
    728 }
    729 
    730 DataTypeValue Dt_size_11_Decode(uint32_t value, uint32_t type_value) {
    731   switch (value) {
    732     case 0x1:
    733       switch (type_value) {
    734         case 0x0:
    735           return S16;
    736         case 0x1:
    737           return U16;
    738       }
    739       break;
    740     case 0x2:
    741       switch (type_value) {
    742         case 0x0:
    743           return S32;
    744         case 0x1:
    745           return U32;
    746       }
    747       break;
    748   }
    749   return kDataTypeValueInvalid;
    750 }
    751 
    752 DataTypeValue Dt_size_12_Decode(uint32_t value, uint32_t type_value) {
    753   switch (value) {
    754     case 0x0:
    755       switch (type_value) {
    756         case 0x0:
    757           return S8;
    758         case 0x1:
    759           return U8;
    760       }
    761       break;
    762     case 0x1:
    763       switch (type_value) {
    764         case 0x0:
    765           return S16;
    766         case 0x1:
    767           return U16;
    768       }
    769       break;
    770     case 0x2:
    771       switch (type_value) {
    772         case 0x0:
    773           return S32;
    774         case 0x1:
    775           return U32;
    776       }
    777       break;
    778   }
    779   return kDataTypeValueInvalid;
    780 }
    781 
    782 DataTypeValue Dt_size_13_Decode(uint32_t value) {
    783   switch (value) {
    784     case 0x1:
    785       return S16;
    786     case 0x2:
    787       return S32;
    788   }
    789   return kDataTypeValueInvalid;
    790 }
    791 
    792 DataTypeValue Dt_size_14_Decode(uint32_t value) {
    793   switch (value) {
    794     case 0x0:
    795       return S16;
    796     case 0x1:
    797       return S32;
    798     case 0x2:
    799       return S64;
    800   }
    801   return kDataTypeValueInvalid;
    802 }
    803 
    804 DataTypeValue Dt_size_15_Decode(uint32_t value) {
    805   switch (value) {
    806     case 0x0:
    807       return Untyped8;
    808     case 0x1:
    809       return Untyped16;
    810   }
    811   return kDataTypeValueInvalid;
    812 }
    813 
    814 DataTypeValue Dt_size_16_Decode(uint32_t value) {
    815   switch (value) {
    816     case 0x0:
    817       return I8;
    818     case 0x1:
    819       return I16;
    820     case 0x2:
    821       return I32;
    822   }
    823   return kDataTypeValueInvalid;
    824 }
    825 
    826 DecodeNeon Index_1_Decode(uint32_t value, DataType dt) {
    827   switch (dt.GetValue()) {
    828     case Untyped8: {
    829       int lane = (value >> 1) & 0x7;
    830       if ((value & 1) != 0) break;
    831       SpacingType spacing = kSingle;
    832       return DecodeNeon(lane, spacing);
    833     }
    834     case Untyped16: {
    835       int lane = (value >> 2) & 0x3;
    836       if ((value & 1) != 0) break;
    837       SpacingType spacing = ((value & 3) == 2) ? kDouble : kSingle;
    838       return DecodeNeon(lane, spacing);
    839     }
    840     case Untyped32: {
    841       int lane = (value >> 3) & 0x1;
    842       if ((value & 3) != 0) break;
    843       SpacingType spacing = ((value & 7) == 4) ? kDouble : kSingle;
    844       return DecodeNeon(lane, spacing);
    845     }
    846     default:
    847       break;
    848   }
    849   return DecodeNeon();
    850 }
    851 
    852 DecodeNeonAndAlign Align_index_align_1_Decode(uint32_t value, DataType dt) {
    853   switch (dt.GetValue()) {
    854     case Untyped8: {
    855       AlignmentType align;
    856       if ((value & 1) == 0) {
    857         align = kNoAlignment;
    858       } else {
    859         break;
    860       }
    861       int lane = (value >> 1) & 0x7;
    862       SpacingType spacing = kSingle;
    863       return DecodeNeonAndAlign(lane, spacing, align);
    864     }
    865     case Untyped16: {
    866       AlignmentType align;
    867       if ((value & 3) == 1) {
    868         align = k16BitAlign;
    869       } else if ((value & 3) == 0) {
    870         align = kNoAlignment;
    871       } else {
    872         break;
    873       }
    874       int lane = (value >> 2) & 0x3;
    875       SpacingType spacing = kSingle;
    876       return DecodeNeonAndAlign(lane, spacing, align);
    877     }
    878     case Untyped32: {
    879       AlignmentType align;
    880       if ((value & 7) == 3) {
    881         align = k32BitAlign;
    882       } else if ((value & 7) == 0) {
    883         align = kNoAlignment;
    884       } else {
    885         break;
    886       }
    887       int lane = (value >> 3) & 0x1;
    888       SpacingType spacing = kSingle;
    889       return DecodeNeonAndAlign(lane, spacing, align);
    890     }
    891     default:
    892       break;
    893   }
    894   return DecodeNeonAndAlign();
    895 }
    896 
    897 DecodeNeonAndAlign Align_index_align_2_Decode(uint32_t value, DataType dt) {
    898   switch (dt.GetValue()) {
    899     case Untyped8: {
    900       AlignmentType align;
    901       if ((value & 1) == 1) {
    902         align = k16BitAlign;
    903       } else if ((value & 1) == 0) {
    904         align = kNoAlignment;
    905       } else {
    906         break;
    907       }
    908       int lane = (value >> 1) & 0x7;
    909       SpacingType spacing = kSingle;
    910       return DecodeNeonAndAlign(lane, spacing, align);
    911     }
    912     case Untyped16: {
    913       AlignmentType align;
    914       if ((value & 1) == 1) {
    915         align = k32BitAlign;
    916       } else if ((value & 1) == 0) {
    917         align = kNoAlignment;
    918       } else {
    919         break;
    920       }
    921       int lane = (value >> 2) & 0x3;
    922       SpacingType spacing = ((value & 2) == 2) ? kDouble : kSingle;
    923       return DecodeNeonAndAlign(lane, spacing, align);
    924     }
    925     case Untyped32: {
    926       AlignmentType align;
    927       if ((value & 3) == 1) {
    928         align = k64BitAlign;
    929       } else if ((value & 3) == 0) {
    930         align = kNoAlignment;
    931       } else {
    932         break;
    933       }
    934       int lane = (value >> 3) & 0x1;
    935       SpacingType spacing = ((value & 4) == 4) ? kDouble : kSingle;
    936       return DecodeNeonAndAlign(lane, spacing, align);
    937     }
    938     default:
    939       break;
    940   }
    941   return DecodeNeonAndAlign();
    942 }
    943 
    944 DecodeNeonAndAlign Align_index_align_3_Decode(uint32_t value, DataType dt) {
    945   switch (dt.GetValue()) {
    946     case Untyped8: {
    947       AlignmentType align;
    948       if ((value & 1) == 1) {
    949         align = k32BitAlign;
    950       } else if ((value & 1) == 0) {
    951         align = kNoAlignment;
    952       } else {
    953         break;
    954       }
    955       int lane = (value >> 1) & 0x7;
    956       SpacingType spacing = kSingle;
    957       return DecodeNeonAndAlign(lane, spacing, align);
    958     }
    959     case Untyped16: {
    960       AlignmentType align;
    961       if ((value & 1) == 1) {
    962         align = k64BitAlign;
    963       } else if ((value & 1) == 0) {
    964         align = kNoAlignment;
    965       } else {
    966         break;
    967       }
    968       int lane = (value >> 2) & 0x3;
    969       SpacingType spacing = ((value & 2) == 2) ? kDouble : kSingle;
    970       return DecodeNeonAndAlign(lane, spacing, align);
    971     }
    972     case Untyped32: {
    973       AlignmentType align;
    974       if ((value & 3) == 1) {
    975         align = k64BitAlign;
    976       } else if ((value & 3) == 2) {
    977         align = k128BitAlign;
    978       } else if ((value & 3) == 0) {
    979         align = kNoAlignment;
    980       } else {
    981         break;
    982       }
    983       int lane = (value >> 3) & 0x1;
    984       SpacingType spacing = ((value & 4) == 4) ? kDouble : kSingle;
    985       return DecodeNeonAndAlign(lane, spacing, align);
    986     }
    987     default:
    988       break;
    989   }
    990   return DecodeNeonAndAlign();
    991 }
    992 
    993 Alignment Align_a_1_Decode(uint32_t value, DataType dt) {
    994   switch (value) {
    995     case 0:
    996       return kNoAlignment;
    997     case 1:
    998       if (dt.Is(Untyped16)) return k16BitAlign;
    999       if (dt.Is(Untyped32)) return k32BitAlign;
   1000       break;
   1001     default:
   1002       break;
   1003   }
   1004   return kBadAlignment;
   1005 }
   1006 
   1007 Alignment Align_a_2_Decode(uint32_t value, DataType dt) {
   1008   switch (value) {
   1009     case 0:
   1010       return kNoAlignment;
   1011     case 1:
   1012       if (dt.Is(Untyped8)) return k16BitAlign;
   1013       if (dt.Is(Untyped16)) return k32BitAlign;
   1014       if (dt.Is(Untyped32)) return k64BitAlign;
   1015       break;
   1016     default:
   1017       break;
   1018   }
   1019   return kBadAlignment;
   1020 }
   1021 
   1022 Alignment Align_a_3_Decode(uint32_t value, DataType dt, uint32_t size) {
   1023   switch (value) {
   1024     case 0:
   1025       if (size != 3) return kNoAlignment;
   1026       break;
   1027     case 1:
   1028       if (dt.Is(Untyped8)) return k32BitAlign;
   1029       if (dt.Is(Untyped16)) return k64BitAlign;
   1030       if (size == 2) return k64BitAlign;
   1031       if (size == 3) return k128BitAlign;
   1032       break;
   1033     default:
   1034       break;
   1035   }
   1036   return kBadAlignment;
   1037 }
   1038 
   1039 Alignment Align_align_1_Decode(uint32_t value) {
   1040   switch (value) {
   1041     case 0:
   1042       return kNoAlignment;
   1043     case 1:
   1044       return k64BitAlign;
   1045     case 2:
   1046       return k128BitAlign;
   1047     case 3:
   1048       return k256BitAlign;
   1049     default:
   1050       break;
   1051   }
   1052   return kBadAlignment;
   1053 }
   1054 
   1055 Alignment Align_align_2_Decode(uint32_t value) {
   1056   switch (value) {
   1057     case 0:
   1058       return kNoAlignment;
   1059     case 1:
   1060       return k64BitAlign;
   1061     case 2:
   1062       return k128BitAlign;
   1063     case 3:
   1064       return k256BitAlign;
   1065     default:
   1066       break;
   1067   }
   1068   return kBadAlignment;
   1069 }
   1070 
   1071 Alignment Align_align_3_Decode(uint32_t value) {
   1072   switch (value) {
   1073     case 0:
   1074       return kNoAlignment;
   1075     case 1:
   1076       return k64BitAlign;
   1077     default:
   1078       break;
   1079   }
   1080   return kBadAlignment;
   1081 }
   1082 
   1083 Alignment Align_align_4_Decode(uint32_t value) {
   1084   switch (value) {
   1085     case 0:
   1086       return kNoAlignment;
   1087     case 1:
   1088       return k64BitAlign;
   1089     case 2:
   1090       return k128BitAlign;
   1091     case 3:
   1092       return k256BitAlign;
   1093     default:
   1094       break;
   1095   }
   1096   return kBadAlignment;
   1097 }
   1098 
   1099 Alignment Align_align_5_Decode(uint32_t value) {
   1100   switch (value) {
   1101     case 0:
   1102       return kNoAlignment;
   1103     case 1:
   1104       return k64BitAlign;
   1105     case 2:
   1106       return k128BitAlign;
   1107     case 3:
   1108       return k256BitAlign;
   1109     default:
   1110       break;
   1111   }
   1112   return kBadAlignment;
   1113 }
   1114 
   1115 
   1116 void Disassembler::adc(Condition cond,
   1117                        EncodingSize size,
   1118                        Register rd,
   1119                        Register rn,
   1120                        const Operand& operand) {
   1121   os().SetCurrentInstruction(kAdc, kArithmetic);
   1122   os() << ToCString(kAdc) << ConditionPrinter(it_block_, cond) << size;
   1123   os() << " ";
   1124   if (!rd.Is(rn) || !use_short_hand_form_) {
   1125     os() << rd << ", ";
   1126   }
   1127   os() << rn << ", " << operand;
   1128 }
   1129 
   1130 void Disassembler::adcs(Condition cond,
   1131                         EncodingSize size,
   1132                         Register rd,
   1133                         Register rn,
   1134                         const Operand& operand) {
   1135   os().SetCurrentInstruction(kAdcs, kArithmetic);
   1136   os() << ToCString(kAdcs) << ConditionPrinter(it_block_, cond) << size;
   1137   os() << " ";
   1138   if (!rd.Is(rn) || !use_short_hand_form_) {
   1139     os() << rd << ", ";
   1140   }
   1141   os() << rn << ", " << operand;
   1142 }
   1143 
   1144 void Disassembler::add(Condition cond,
   1145                        EncodingSize size,
   1146                        Register rd,
   1147                        Register rn,
   1148                        const Operand& operand) {
   1149   os().SetCurrentInstruction(kAdd, kArithmetic);
   1150   os() << ToCString(kAdd) << ConditionPrinter(it_block_, cond) << size;
   1151   os() << " ";
   1152   if (!rd.Is(rn) || !use_short_hand_form_) {
   1153     os() << rd << ", ";
   1154   }
   1155   os() << rn << ", " << operand;
   1156 }
   1157 
   1158 void Disassembler::add(Condition cond, Register rd, const Operand& operand) {
   1159   os().SetCurrentInstruction(kAdd, kArithmetic);
   1160   os() << ToCString(kAdd) << ConditionPrinter(it_block_, cond) << " " << rd
   1161        << ", " << operand;
   1162 }
   1163 
   1164 void Disassembler::adds(Condition cond,
   1165                         EncodingSize size,
   1166                         Register rd,
   1167                         Register rn,
   1168                         const Operand& operand) {
   1169   os().SetCurrentInstruction(kAdds, kArithmetic);
   1170   os() << ToCString(kAdds) << ConditionPrinter(it_block_, cond) << size;
   1171   os() << " ";
   1172   if (!rd.Is(rn) || !use_short_hand_form_) {
   1173     os() << rd << ", ";
   1174   }
   1175   os() << rn << ", " << operand;
   1176 }
   1177 
   1178 void Disassembler::adds(Register rd, const Operand& operand) {
   1179   os().SetCurrentInstruction(kAdds, kArithmetic);
   1180   os() << ToCString(kAdds) << " " << rd << ", " << operand;
   1181 }
   1182 
   1183 void Disassembler::addw(Condition cond,
   1184                         Register rd,
   1185                         Register rn,
   1186                         const Operand& operand) {
   1187   os().SetCurrentInstruction(kAddw, kArithmetic);
   1188   os() << ToCString(kAddw) << ConditionPrinter(it_block_, cond);
   1189   os() << " ";
   1190   if (!rd.Is(rn) || !use_short_hand_form_) {
   1191     os() << rd << ", ";
   1192   }
   1193   os() << rn << ", " << operand;
   1194 }
   1195 
   1196 void Disassembler::adr(Condition cond,
   1197                        EncodingSize size,
   1198                        Register rd,
   1199                        Location* location) {
   1200   os().SetCurrentInstruction(kAdr, kAddress);
   1201   os() << ToCString(kAdr) << ConditionPrinter(it_block_, cond) << size << " "
   1202        << rd << ", "
   1203        << PrintLabel(kAnyLocation, location, GetCodeAddress() & ~3);
   1204 }
   1205 
   1206 void Disassembler::and_(Condition cond,
   1207                         EncodingSize size,
   1208                         Register rd,
   1209                         Register rn,
   1210                         const Operand& operand) {
   1211   os().SetCurrentInstruction(kAnd, kBitwise);
   1212   os() << ToCString(kAnd) << ConditionPrinter(it_block_, cond) << size;
   1213   os() << " ";
   1214   if (!rd.Is(rn) || !use_short_hand_form_) {
   1215     os() << rd << ", ";
   1216   }
   1217   os() << rn << ", " << operand;
   1218 }
   1219 
   1220 void Disassembler::ands(Condition cond,
   1221                         EncodingSize size,
   1222                         Register rd,
   1223                         Register rn,
   1224                         const Operand& operand) {
   1225   os().SetCurrentInstruction(kAnds, kBitwise);
   1226   os() << ToCString(kAnds) << ConditionPrinter(it_block_, cond) << size;
   1227   os() << " ";
   1228   if (!rd.Is(rn) || !use_short_hand_form_) {
   1229     os() << rd << ", ";
   1230   }
   1231   os() << rn << ", " << operand;
   1232 }
   1233 
   1234 void Disassembler::asr(Condition cond,
   1235                        EncodingSize size,
   1236                        Register rd,
   1237                        Register rm,
   1238                        const Operand& operand) {
   1239   os().SetCurrentInstruction(kAsr, kShift);
   1240   os() << ToCString(kAsr) << ConditionPrinter(it_block_, cond) << size;
   1241   os() << " ";
   1242   if (!rd.Is(rm) || !use_short_hand_form_) {
   1243     os() << rd << ", ";
   1244   }
   1245   os() << rm << ", " << operand;
   1246 }
   1247 
   1248 void Disassembler::asrs(Condition cond,
   1249                         EncodingSize size,
   1250                         Register rd,
   1251                         Register rm,
   1252                         const Operand& operand) {
   1253   os().SetCurrentInstruction(kAsrs, kShift);
   1254   os() << ToCString(kAsrs) << ConditionPrinter(it_block_, cond) << size;
   1255   os() << " ";
   1256   if (!rd.Is(rm) || !use_short_hand_form_) {
   1257     os() << rd << ", ";
   1258   }
   1259   os() << rm << ", " << operand;
   1260 }
   1261 
   1262 void Disassembler::b(Condition cond, EncodingSize size, Location* location) {
   1263   os().SetCurrentInstruction(kB, kAddress | kBranch);
   1264   os() << ToCString(kB) << ConditionPrinter(it_block_, cond) << size << " "
   1265        << PrintLabel(kCodeLocation, location, GetCodeAddress());
   1266 }
   1267 
   1268 void Disassembler::bfc(Condition cond,
   1269                        Register rd,
   1270                        uint32_t lsb,
   1271                        uint32_t width) {
   1272   os().SetCurrentInstruction(kBfc, kShift);
   1273   os() << ToCString(kBfc) << ConditionPrinter(it_block_, cond) << " " << rd
   1274        << ", " << ImmediatePrinter(lsb) << ", " << ImmediatePrinter(width);
   1275 }
   1276 
   1277 void Disassembler::bfi(
   1278     Condition cond, Register rd, Register rn, uint32_t lsb, uint32_t width) {
   1279   os().SetCurrentInstruction(kBfi, kShift);
   1280   os() << ToCString(kBfi) << ConditionPrinter(it_block_, cond) << " " << rd
   1281        << ", " << rn << ", " << ImmediatePrinter(lsb) << ", "
   1282        << ImmediatePrinter(width);
   1283 }
   1284 
   1285 void Disassembler::bic(Condition cond,
   1286                        EncodingSize size,
   1287                        Register rd,
   1288                        Register rn,
   1289                        const Operand& operand) {
   1290   os().SetCurrentInstruction(kBic, kBitwise);
   1291   os() << ToCString(kBic) << ConditionPrinter(it_block_, cond) << size;
   1292   os() << " ";
   1293   if (!rd.Is(rn) || !use_short_hand_form_) {
   1294     os() << rd << ", ";
   1295   }
   1296   os() << rn << ", " << operand;
   1297 }
   1298 
   1299 void Disassembler::bics(Condition cond,
   1300                         EncodingSize size,
   1301                         Register rd,
   1302                         Register rn,
   1303                         const Operand& operand) {
   1304   os().SetCurrentInstruction(kBics, kBitwise);
   1305   os() << ToCString(kBics) << ConditionPrinter(it_block_, cond) << size;
   1306   os() << " ";
   1307   if (!rd.Is(rn) || !use_short_hand_form_) {
   1308     os() << rd << ", ";
   1309   }
   1310   os() << rn << ", " << operand;
   1311 }
   1312 
   1313 void Disassembler::bkpt(Condition cond, uint32_t imm) {
   1314   os().SetCurrentInstruction(kBkpt, kSystem);
   1315   os() << ToCString(kBkpt) << ConditionPrinter(it_block_, cond) << " "
   1316        << RawImmediatePrinter(imm);
   1317 }
   1318 
   1319 void Disassembler::bl(Condition cond, Location* location) {
   1320   os().SetCurrentInstruction(kBl, kAddress | kBranch);
   1321   os() << ToCString(kBl) << ConditionPrinter(it_block_, cond) << " "
   1322        << PrintLabel(kCodeLocation, location, GetCodeAddress());
   1323 }
   1324 
   1325 void Disassembler::blx(Condition cond, Location* location) {
   1326   os().SetCurrentInstruction(kBlx, kAddress | kBranch);
   1327   os() << ToCString(kBlx) << ConditionPrinter(it_block_, cond) << " "
   1328        << PrintLabel(kCodeLocation, location, GetCodeAddress() & ~3);
   1329 }
   1330 
   1331 void Disassembler::blx(Condition cond, Register rm) {
   1332   os().SetCurrentInstruction(kBlx, kAddress | kBranch);
   1333   os() << ToCString(kBlx) << ConditionPrinter(it_block_, cond) << " " << rm;
   1334 }
   1335 
   1336 void Disassembler::bx(Condition cond, Register rm) {
   1337   os().SetCurrentInstruction(kBx, kAddress | kBranch);
   1338   os() << ToCString(kBx) << ConditionPrinter(it_block_, cond) << " " << rm;
   1339 }
   1340 
   1341 void Disassembler::bxj(Condition cond, Register rm) {
   1342   os().SetCurrentInstruction(kBxj, kAddress | kBranch);
   1343   os() << ToCString(kBxj) << ConditionPrinter(it_block_, cond) << " " << rm;
   1344 }
   1345 
   1346 void Disassembler::cbnz(Register rn, Location* location) {
   1347   os().SetCurrentInstruction(kCbnz, kAddress | kBranch);
   1348   os() << ToCString(kCbnz) << " " << rn << ", "
   1349        << PrintLabel(kCodeLocation, location, GetCodeAddress());
   1350 }
   1351 
   1352 void Disassembler::cbz(Register rn, Location* location) {
   1353   os().SetCurrentInstruction(kCbz, kAddress | kBranch);
   1354   os() << ToCString(kCbz) << " " << rn << ", "
   1355        << PrintLabel(kCodeLocation, location, GetCodeAddress());
   1356 }
   1357 
   1358 void Disassembler::clrex(Condition cond) {
   1359   os().SetCurrentInstruction(kClrex, kNoAttribute);
   1360   os() << ToCString(kClrex) << ConditionPrinter(it_block_, cond);
   1361 }
   1362 
   1363 void Disassembler::clz(Condition cond, Register rd, Register rm) {
   1364   os().SetCurrentInstruction(kClz, kNoAttribute);
   1365   os() << ToCString(kClz) << ConditionPrinter(it_block_, cond) << " " << rd
   1366        << ", " << rm;
   1367 }
   1368 
   1369 void Disassembler::cmn(Condition cond,
   1370                        EncodingSize size,
   1371                        Register rn,
   1372                        const Operand& operand) {
   1373   os().SetCurrentInstruction(kCmn, kArithmetic);
   1374   os() << ToCString(kCmn) << ConditionPrinter(it_block_, cond) << size << " "
   1375        << rn << ", " << operand;
   1376 }
   1377 
   1378 void Disassembler::cmp(Condition cond,
   1379                        EncodingSize size,
   1380                        Register rn,
   1381                        const Operand& operand) {
   1382   os().SetCurrentInstruction(kCmp, kArithmetic);
   1383   os() << ToCString(kCmp) << ConditionPrinter(it_block_, cond) << size << " "
   1384        << rn << ", " << operand;
   1385 }
   1386 
   1387 void Disassembler::crc32b(Condition cond,
   1388                           Register rd,
   1389                           Register rn,
   1390                           Register rm) {
   1391   os().SetCurrentInstruction(kCrc32b, kNoAttribute);
   1392   os() << ToCString(kCrc32b) << ConditionPrinter(it_block_, cond) << " " << rd
   1393        << ", " << rn << ", " << rm;
   1394 }
   1395 
   1396 void Disassembler::crc32cb(Condition cond,
   1397                            Register rd,
   1398                            Register rn,
   1399                            Register rm) {
   1400   os().SetCurrentInstruction(kCrc32cb, kNoAttribute);
   1401   os() << ToCString(kCrc32cb) << ConditionPrinter(it_block_, cond) << " " << rd
   1402        << ", " << rn << ", " << rm;
   1403 }
   1404 
   1405 void Disassembler::crc32ch(Condition cond,
   1406                            Register rd,
   1407                            Register rn,
   1408                            Register rm) {
   1409   os().SetCurrentInstruction(kCrc32ch, kNoAttribute);
   1410   os() << ToCString(kCrc32ch) << ConditionPrinter(it_block_, cond) << " " << rd
   1411        << ", " << rn << ", " << rm;
   1412 }
   1413 
   1414 void Disassembler::crc32cw(Condition cond,
   1415                            Register rd,
   1416                            Register rn,
   1417                            Register rm) {
   1418   os().SetCurrentInstruction(kCrc32cw, kNoAttribute);
   1419   os() << ToCString(kCrc32cw) << ConditionPrinter(it_block_, cond) << " " << rd
   1420        << ", " << rn << ", " << rm;
   1421 }
   1422 
   1423 void Disassembler::crc32h(Condition cond,
   1424                           Register rd,
   1425                           Register rn,
   1426                           Register rm) {
   1427   os().SetCurrentInstruction(kCrc32h, kNoAttribute);
   1428   os() << ToCString(kCrc32h) << ConditionPrinter(it_block_, cond) << " " << rd
   1429        << ", " << rn << ", " << rm;
   1430 }
   1431 
   1432 void Disassembler::crc32w(Condition cond,
   1433                           Register rd,
   1434                           Register rn,
   1435                           Register rm) {
   1436   os().SetCurrentInstruction(kCrc32w, kNoAttribute);
   1437   os() << ToCString(kCrc32w) << ConditionPrinter(it_block_, cond) << " " << rd
   1438        << ", " << rn << ", " << rm;
   1439 }
   1440 
   1441 void Disassembler::dmb(Condition cond, MemoryBarrier option) {
   1442   os().SetCurrentInstruction(kDmb, kNoAttribute);
   1443   os() << ToCString(kDmb) << ConditionPrinter(it_block_, cond) << " " << option;
   1444 }
   1445 
   1446 void Disassembler::dsb(Condition cond, MemoryBarrier option) {
   1447   os().SetCurrentInstruction(kDsb, kNoAttribute);
   1448   os() << ToCString(kDsb) << ConditionPrinter(it_block_, cond) << " " << option;
   1449 }
   1450 
   1451 void Disassembler::eor(Condition cond,
   1452                        EncodingSize size,
   1453                        Register rd,
   1454                        Register rn,
   1455                        const Operand& operand) {
   1456   os().SetCurrentInstruction(kEor, kBitwise);
   1457   os() << ToCString(kEor) << ConditionPrinter(it_block_, cond) << size;
   1458   os() << " ";
   1459   if (!rd.Is(rn) || !use_short_hand_form_) {
   1460     os() << rd << ", ";
   1461   }
   1462   os() << rn << ", " << operand;
   1463 }
   1464 
   1465 void Disassembler::eors(Condition cond,
   1466                         EncodingSize size,
   1467                         Register rd,
   1468                         Register rn,
   1469                         const Operand& operand) {
   1470   os().SetCurrentInstruction(kEors, kBitwise);
   1471   os() << ToCString(kEors) << ConditionPrinter(it_block_, cond) << size;
   1472   os() << " ";
   1473   if (!rd.Is(rn) || !use_short_hand_form_) {
   1474     os() << rd << ", ";
   1475   }
   1476   os() << rn << ", " << operand;
   1477 }
   1478 
   1479 void Disassembler::fldmdbx(Condition cond,
   1480                            Register rn,
   1481                            WriteBack write_back,
   1482                            DRegisterList dreglist) {
   1483   os().SetCurrentInstruction(kFldmdbx,
   1484                              kLoadStore | kLoadStoreMultiple | kFpNeon);
   1485   os() << ToCString(kFldmdbx) << ConditionPrinter(it_block_, cond) << " " << rn
   1486        << write_back << ", " << dreglist;
   1487 }
   1488 
   1489 void Disassembler::fldmiax(Condition cond,
   1490                            Register rn,
   1491                            WriteBack write_back,
   1492                            DRegisterList dreglist) {
   1493   os().SetCurrentInstruction(kFldmiax,
   1494                              kLoadStore | kLoadStoreMultiple | kFpNeon);
   1495   os() << ToCString(kFldmiax) << ConditionPrinter(it_block_, cond) << " " << rn
   1496        << write_back << ", " << dreglist;
   1497 }
   1498 
   1499 void Disassembler::fstmdbx(Condition cond,
   1500                            Register rn,
   1501                            WriteBack write_back,
   1502                            DRegisterList dreglist) {
   1503   os().SetCurrentInstruction(kFstmdbx,
   1504                              kLoadStore | kLoadStoreMultiple | kFpNeon);
   1505   os() << ToCString(kFstmdbx) << ConditionPrinter(it_block_, cond) << " " << rn
   1506        << write_back << ", " << dreglist;
   1507 }
   1508 
   1509 void Disassembler::fstmiax(Condition cond,
   1510                            Register rn,
   1511                            WriteBack write_back,
   1512                            DRegisterList dreglist) {
   1513   os().SetCurrentInstruction(kFstmiax,
   1514                              kLoadStore | kLoadStoreMultiple | kFpNeon);
   1515   os() << ToCString(kFstmiax) << ConditionPrinter(it_block_, cond) << " " << rn
   1516        << write_back << ", " << dreglist;
   1517 }
   1518 
   1519 void Disassembler::hlt(Condition cond, uint32_t imm) {
   1520   os().SetCurrentInstruction(kHlt, kSystem);
   1521   os() << ToCString(kHlt) << ConditionPrinter(it_block_, cond) << " "
   1522        << RawImmediatePrinter(imm);
   1523 }
   1524 
   1525 void Disassembler::hvc(Condition cond, uint32_t imm) {
   1526   os().SetCurrentInstruction(kHvc, kSystem);
   1527   os() << ToCString(kHvc) << ConditionPrinter(it_block_, cond) << " "
   1528        << RawImmediatePrinter(imm);
   1529 }
   1530 
   1531 void Disassembler::isb(Condition cond, MemoryBarrier option) {
   1532   os().SetCurrentInstruction(kIsb, kNoAttribute);
   1533   os() << ToCString(kIsb) << ConditionPrinter(it_block_, cond) << " " << option;
   1534 }
   1535 
   1536 void Disassembler::it(Condition cond, uint16_t mask) {
   1537   os().SetCurrentInstruction(kIt, kNoAttribute);
   1538   os() << ToCString(kIt);
   1539   int count;
   1540   if ((mask & 0x1) != 0) {
   1541     count = 3;
   1542   } else if ((mask & 0x2) != 0) {
   1543     count = 2;
   1544   } else if ((mask & 0x4) != 0) {
   1545     count = 1;
   1546   } else {
   1547     count = 0;
   1548   }
   1549   uint16_t tmp = 0x8;
   1550   uint16_t ref = (cond.GetCondition() & 0x1) << 3;
   1551   while (count-- > 0) {
   1552     os() << (((mask & tmp) == ref) ? "t" : "e");
   1553     tmp >>= 1;
   1554     ref >>= 1;
   1555   }
   1556   if (cond.Is(al)) {
   1557     os() << " al";
   1558   } else {
   1559     os() << " " << cond;
   1560   }
   1561 }
   1562 
   1563 void Disassembler::lda(Condition cond, Register rt, const MemOperand& operand) {
   1564   os().SetCurrentInstruction(kLda, kAddress | kLoadStore);
   1565   os() << ToCString(kLda) << ConditionPrinter(it_block_, cond) << " " << rt
   1566        << ", " << PrintMemOperand(kLoadWordLocation, operand);
   1567 }
   1568 
   1569 void Disassembler::ldab(Condition cond,
   1570                         Register rt,
   1571                         const MemOperand& operand) {
   1572   os().SetCurrentInstruction(kLdab, kAddress | kLoadStore);
   1573   os() << ToCString(kLdab) << ConditionPrinter(it_block_, cond) << " " << rt
   1574        << ", " << PrintMemOperand(kLoadByteLocation, operand);
   1575 }
   1576 
   1577 void Disassembler::ldaex(Condition cond,
   1578                          Register rt,
   1579                          const MemOperand& operand) {
   1580   os().SetCurrentInstruction(kLdaex, kAddress | kLoadStore);
   1581   os() << ToCString(kLdaex) << ConditionPrinter(it_block_, cond) << " " << rt
   1582        << ", " << PrintMemOperand(kLoadWordLocation, operand);
   1583 }
   1584 
   1585 void Disassembler::ldaexb(Condition cond,
   1586                           Register rt,
   1587                           const MemOperand& operand) {
   1588   os().SetCurrentInstruction(kLdaexb, kAddress | kLoadStore);
   1589   os() << ToCString(kLdaexb) << ConditionPrinter(it_block_, cond) << " " << rt
   1590        << ", " << PrintMemOperand(kLoadByteLocation, operand);
   1591 }
   1592 
   1593 void Disassembler::ldaexd(Condition cond,
   1594                           Register rt,
   1595                           Register rt2,
   1596                           const MemOperand& operand) {
   1597   os().SetCurrentInstruction(kLdaexd, kAddress | kLoadStore);
   1598   os() << ToCString(kLdaexd) << ConditionPrinter(it_block_, cond) << " " << rt
   1599        << ", " << rt2 << ", "
   1600        << PrintMemOperand(kLoadDoubleWordLocation, operand);
   1601 }
   1602 
   1603 void Disassembler::ldaexh(Condition cond,
   1604                           Register rt,
   1605                           const MemOperand& operand) {
   1606   os().SetCurrentInstruction(kLdaexh, kAddress | kLoadStore);
   1607   os() << ToCString(kLdaexh) << ConditionPrinter(it_block_, cond) << " " << rt
   1608        << ", " << PrintMemOperand(kLoadHalfWordLocation, operand);
   1609 }
   1610 
   1611 void Disassembler::ldah(Condition cond,
   1612                         Register rt,
   1613                         const MemOperand& operand) {
   1614   os().SetCurrentInstruction(kLdah, kAddress | kLoadStore);
   1615   os() << ToCString(kLdah) << ConditionPrinter(it_block_, cond) << " " << rt
   1616        << ", " << PrintMemOperand(kLoadHalfWordLocation, operand);
   1617 }
   1618 
   1619 void Disassembler::ldm(Condition cond,
   1620                        EncodingSize size,
   1621                        Register rn,
   1622                        WriteBack write_back,
   1623                        RegisterList registers) {
   1624   os().SetCurrentInstruction(kLdm, kLoadStore | kLoadStoreMultiple);
   1625   os() << ToCString(kLdm) << ConditionPrinter(it_block_, cond) << size << " "
   1626        << rn << write_back << ", " << registers;
   1627 }
   1628 
   1629 void Disassembler::ldmda(Condition cond,
   1630                          Register rn,
   1631                          WriteBack write_back,
   1632                          RegisterList registers) {
   1633   os().SetCurrentInstruction(kLdmda, kLoadStore | kLoadStoreMultiple);
   1634   os() << ToCString(kLdmda) << ConditionPrinter(it_block_, cond) << " " << rn
   1635        << write_back << ", " << registers;
   1636 }
   1637 
   1638 void Disassembler::ldmdb(Condition cond,
   1639                          Register rn,
   1640                          WriteBack write_back,
   1641                          RegisterList registers) {
   1642   os().SetCurrentInstruction(kLdmdb, kLoadStore | kLoadStoreMultiple);
   1643   os() << ToCString(kLdmdb) << ConditionPrinter(it_block_, cond) << " " << rn
   1644        << write_back << ", " << registers;
   1645 }
   1646 
   1647 void Disassembler::ldmea(Condition cond,
   1648                          Register rn,
   1649                          WriteBack write_back,
   1650                          RegisterList registers) {
   1651   os().SetCurrentInstruction(kLdmea, kLoadStore | kLoadStoreMultiple);
   1652   os() << ToCString(kLdmea) << ConditionPrinter(it_block_, cond) << " " << rn
   1653        << write_back << ", " << registers;
   1654 }
   1655 
   1656 void Disassembler::ldmed(Condition cond,
   1657                          Register rn,
   1658                          WriteBack write_back,
   1659                          RegisterList registers) {
   1660   os().SetCurrentInstruction(kLdmed, kLoadStore | kLoadStoreMultiple);
   1661   os() << ToCString(kLdmed) << ConditionPrinter(it_block_, cond) << " " << rn
   1662        << write_back << ", " << registers;
   1663 }
   1664 
   1665 void Disassembler::ldmfa(Condition cond,
   1666                          Register rn,
   1667                          WriteBack write_back,
   1668                          RegisterList registers) {
   1669   os().SetCurrentInstruction(kLdmfa, kLoadStore | kLoadStoreMultiple);
   1670   os() << ToCString(kLdmfa) << ConditionPrinter(it_block_, cond) << " " << rn
   1671        << write_back << ", " << registers;
   1672 }
   1673 
   1674 void Disassembler::ldmfd(Condition cond,
   1675                          EncodingSize size,
   1676                          Register rn,
   1677                          WriteBack write_back,
   1678                          RegisterList registers) {
   1679   os().SetCurrentInstruction(kLdmfd, kLoadStore | kLoadStoreMultiple);
   1680   os() << ToCString(kLdmfd) << ConditionPrinter(it_block_, cond) << size << " "
   1681        << rn << write_back << ", " << registers;
   1682 }
   1683 
   1684 void Disassembler::ldmib(Condition cond,
   1685                          Register rn,
   1686                          WriteBack write_back,
   1687                          RegisterList registers) {
   1688   os().SetCurrentInstruction(kLdmib, kLoadStore | kLoadStoreMultiple);
   1689   os() << ToCString(kLdmib) << ConditionPrinter(it_block_, cond) << " " << rn
   1690        << write_back << ", " << registers;
   1691 }
   1692 
   1693 void Disassembler::ldr(Condition cond,
   1694                        EncodingSize size,
   1695                        Register rt,
   1696                        const MemOperand& operand) {
   1697   os().SetCurrentInstruction(kLdr, kAddress | kLoadStore);
   1698   os() << ToCString(kLdr) << ConditionPrinter(it_block_, cond) << size << " "
   1699        << rt << ", " << PrintMemOperand(kLoadWordLocation, operand);
   1700 }
   1701 
   1702 void Disassembler::ldr(Condition cond,
   1703                        EncodingSize size,
   1704                        Register rt,
   1705                        Location* location) {
   1706   os().SetCurrentInstruction(kLdr, kAddress | kLoadStore);
   1707   os() << ToCString(kLdr) << ConditionPrinter(it_block_, cond) << size << " "
   1708        << rt << ", "
   1709        << PrintLabel(kLoadWordLocation, location, GetCodeAddress() & ~3);
   1710 }
   1711 
   1712 void Disassembler::ldrb(Condition cond,
   1713                         EncodingSize size,
   1714                         Register rt,
   1715                         const MemOperand& operand) {
   1716   os().SetCurrentInstruction(kLdrb, kAddress | kLoadStore);
   1717   os() << ToCString(kLdrb) << ConditionPrinter(it_block_, cond) << size << " "
   1718        << rt << ", " << PrintMemOperand(kLoadByteLocation, operand);
   1719 }
   1720 
   1721 void Disassembler::ldrb(Condition cond, Register rt, Location* location) {
   1722   os().SetCurrentInstruction(kLdrb, kAddress | kLoadStore);
   1723   os() << ToCString(kLdrb) << ConditionPrinter(it_block_, cond) << " " << rt
   1724        << ", "
   1725        << PrintLabel(kLoadByteLocation, location, GetCodeAddress() & ~3);
   1726 }
   1727 
   1728 void Disassembler::ldrd(Condition cond,
   1729                         Register rt,
   1730                         Register rt2,
   1731                         const MemOperand& operand) {
   1732   os().SetCurrentInstruction(kLdrd, kAddress | kLoadStore);
   1733   os() << ToCString(kLdrd) << ConditionPrinter(it_block_, cond) << " " << rt
   1734        << ", " << rt2 << ", "
   1735        << PrintMemOperand(kLoadDoubleWordLocation, operand);
   1736 }
   1737 
   1738 void Disassembler::ldrd(Condition cond,
   1739                         Register rt,
   1740                         Register rt2,
   1741                         Location* location) {
   1742   os().SetCurrentInstruction(kLdrd, kAddress | kLoadStore);
   1743   os() << ToCString(kLdrd) << ConditionPrinter(it_block_, cond) << " " << rt
   1744        << ", " << rt2 << ", "
   1745        << PrintLabel(kLoadDoubleWordLocation, location, GetCodeAddress() & ~3);
   1746 }
   1747 
   1748 void Disassembler::ldrex(Condition cond,
   1749                          Register rt,
   1750                          const MemOperand& operand) {
   1751   os().SetCurrentInstruction(kLdrex, kAddress | kLoadStore);
   1752   os() << ToCString(kLdrex) << ConditionPrinter(it_block_, cond) << " " << rt
   1753        << ", " << PrintMemOperand(kLoadWordLocation, operand);
   1754 }
   1755 
   1756 void Disassembler::ldrexb(Condition cond,
   1757                           Register rt,
   1758                           const MemOperand& operand) {
   1759   os().SetCurrentInstruction(kLdrexb, kAddress | kLoadStore);
   1760   os() << ToCString(kLdrexb) << ConditionPrinter(it_block_, cond) << " " << rt
   1761        << ", " << PrintMemOperand(kLoadByteLocation, operand);
   1762 }
   1763 
   1764 void Disassembler::ldrexd(Condition cond,
   1765                           Register rt,
   1766                           Register rt2,
   1767                           const MemOperand& operand) {
   1768   os().SetCurrentInstruction(kLdrexd, kAddress | kLoadStore);
   1769   os() << ToCString(kLdrexd) << ConditionPrinter(it_block_, cond) << " " << rt
   1770        << ", " << rt2 << ", "
   1771        << PrintMemOperand(kLoadDoubleWordLocation, operand);
   1772 }
   1773 
   1774 void Disassembler::ldrexh(Condition cond,
   1775                           Register rt,
   1776                           const MemOperand& operand) {
   1777   os().SetCurrentInstruction(kLdrexh, kAddress | kLoadStore);
   1778   os() << ToCString(kLdrexh) << ConditionPrinter(it_block_, cond) << " " << rt
   1779        << ", " << PrintMemOperand(kLoadHalfWordLocation, operand);
   1780 }
   1781 
   1782 void Disassembler::ldrh(Condition cond,
   1783                         EncodingSize size,
   1784                         Register rt,
   1785                         const MemOperand& operand) {
   1786   os().SetCurrentInstruction(kLdrh, kAddress | kLoadStore);
   1787   os() << ToCString(kLdrh) << ConditionPrinter(it_block_, cond) << size << " "
   1788        << rt << ", " << PrintMemOperand(kLoadHalfWordLocation, operand);
   1789 }
   1790 
   1791 void Disassembler::ldrh(Condition cond, Register rt, Location* location) {
   1792   os().SetCurrentInstruction(kLdrh, kAddress | kLoadStore);
   1793   os() << ToCString(kLdrh) << ConditionPrinter(it_block_, cond) << " " << rt
   1794        << ", "
   1795        << PrintLabel(kLoadHalfWordLocation, location, GetCodeAddress() & ~3);
   1796 }
   1797 
   1798 void Disassembler::ldrsb(Condition cond,
   1799                          EncodingSize size,
   1800                          Register rt,
   1801                          const MemOperand& operand) {
   1802   os().SetCurrentInstruction(kLdrsb, kAddress | kLoadStore);
   1803   os() << ToCString(kLdrsb) << ConditionPrinter(it_block_, cond) << size << " "
   1804        << rt << ", " << PrintMemOperand(kLoadSignedByteLocation, operand);
   1805 }
   1806 
   1807 void Disassembler::ldrsb(Condition cond, Register rt, Location* location) {
   1808   os().SetCurrentInstruction(kLdrsb, kAddress | kLoadStore);
   1809   os() << ToCString(kLdrsb) << ConditionPrinter(it_block_, cond) << " " << rt
   1810        << ", "
   1811        << PrintLabel(kLoadSignedByteLocation, location, GetCodeAddress() & ~3);
   1812 }
   1813 
   1814 void Disassembler::ldrsh(Condition cond,
   1815                          EncodingSize size,
   1816                          Register rt,
   1817                          const MemOperand& operand) {
   1818   os().SetCurrentInstruction(kLdrsh, kAddress | kLoadStore);
   1819   os() << ToCString(kLdrsh) << ConditionPrinter(it_block_, cond) << size << " "
   1820        << rt << ", " << PrintMemOperand(kLoadSignedHalfWordLocation, operand);
   1821 }
   1822 
   1823 void Disassembler::ldrsh(Condition cond, Register rt, Location* location) {
   1824   os().SetCurrentInstruction(kLdrsh, kAddress | kLoadStore);
   1825   os() << ToCString(kLdrsh) << ConditionPrinter(it_block_, cond) << " " << rt
   1826        << ", " << PrintLabel(kLoadSignedHalfWordLocation,
   1827                              location,
   1828                              GetCodeAddress() & ~3);
   1829 }
   1830 
   1831 void Disassembler::lsl(Condition cond,
   1832                        EncodingSize size,
   1833                        Register rd,
   1834                        Register rm,
   1835                        const Operand& operand) {
   1836   os().SetCurrentInstruction(kLsl, kShift);
   1837   os() << ToCString(kLsl) << ConditionPrinter(it_block_, cond) << size;
   1838   os() << " ";
   1839   if (!rd.Is(rm) || !use_short_hand_form_) {
   1840     os() << rd << ", ";
   1841   }
   1842   os() << rm << ", " << operand;
   1843 }
   1844 
   1845 void Disassembler::lsls(Condition cond,
   1846                         EncodingSize size,
   1847                         Register rd,
   1848                         Register rm,
   1849                         const Operand& operand) {
   1850   os().SetCurrentInstruction(kLsls, kShift);
   1851   os() << ToCString(kLsls) << ConditionPrinter(it_block_, cond) << size;
   1852   os() << " ";
   1853   if (!rd.Is(rm) || !use_short_hand_form_) {
   1854     os() << rd << ", ";
   1855   }
   1856   os() << rm << ", " << operand;
   1857 }
   1858 
   1859 void Disassembler::lsr(Condition cond,
   1860                        EncodingSize size,
   1861                        Register rd,
   1862                        Register rm,
   1863                        const Operand& operand) {
   1864   os().SetCurrentInstruction(kLsr, kShift);
   1865   os() << ToCString(kLsr) << ConditionPrinter(it_block_, cond) << size;
   1866   os() << " ";
   1867   if (!rd.Is(rm) || !use_short_hand_form_) {
   1868     os() << rd << ", ";
   1869   }
   1870   os() << rm << ", " << operand;
   1871 }
   1872 
   1873 void Disassembler::lsrs(Condition cond,
   1874                         EncodingSize size,
   1875                         Register rd,
   1876                         Register rm,
   1877                         const Operand& operand) {
   1878   os().SetCurrentInstruction(kLsrs, kShift);
   1879   os() << ToCString(kLsrs) << ConditionPrinter(it_block_, cond) << size;
   1880   os() << " ";
   1881   if (!rd.Is(rm) || !use_short_hand_form_) {
   1882     os() << rd << ", ";
   1883   }
   1884   os() << rm << ", " << operand;
   1885 }
   1886 
   1887 void Disassembler::mla(
   1888     Condition cond, Register rd, Register rn, Register rm, Register ra) {
   1889   os().SetCurrentInstruction(kMla, kArithmetic);
   1890   os() << ToCString(kMla) << ConditionPrinter(it_block_, cond) << " " << rd
   1891        << ", " << rn << ", " << rm << ", " << ra;
   1892 }
   1893 
   1894 void Disassembler::mlas(
   1895     Condition cond, Register rd, Register rn, Register rm, Register ra) {
   1896   os().SetCurrentInstruction(kMlas, kArithmetic);
   1897   os() << ToCString(kMlas) << ConditionPrinter(it_block_, cond) << " " << rd
   1898        << ", " << rn << ", " << rm << ", " << ra;
   1899 }
   1900 
   1901 void Disassembler::mls(
   1902     Condition cond, Register rd, Register rn, Register rm, Register ra) {
   1903   os().SetCurrentInstruction(kMls, kArithmetic);
   1904   os() << ToCString(kMls) << ConditionPrinter(it_block_, cond) << " " << rd
   1905        << ", " << rn << ", " << rm << ", " << ra;
   1906 }
   1907 
   1908 void Disassembler::mov(Condition cond,
   1909                        EncodingSize size,
   1910                        Register rd,
   1911                        const Operand& operand) {
   1912   os().SetCurrentInstruction(kMov, kNoAttribute);
   1913   os() << ToCString(kMov) << ConditionPrinter(it_block_, cond) << size << " "
   1914        << rd << ", " << operand;
   1915 }
   1916 
   1917 void Disassembler::movs(Condition cond,
   1918                         EncodingSize size,
   1919                         Register rd,
   1920                         const Operand& operand) {
   1921   os().SetCurrentInstruction(kMovs, kNoAttribute);
   1922   os() << ToCString(kMovs) << ConditionPrinter(it_block_, cond) << size << " "
   1923        << rd << ", " << operand;
   1924 }
   1925 
   1926 void Disassembler::movt(Condition cond, Register rd, const Operand& operand) {
   1927   os().SetCurrentInstruction(kMovt, kNoAttribute);
   1928   os() << ToCString(kMovt) << ConditionPrinter(it_block_, cond) << " " << rd
   1929        << ", " << operand;
   1930 }
   1931 
   1932 void Disassembler::movw(Condition cond, Register rd, const Operand& operand) {
   1933   os().SetCurrentInstruction(kMovw, kNoAttribute);
   1934   os() << ToCString(kMovw) << ConditionPrinter(it_block_, cond) << " " << rd
   1935        << ", " << operand;
   1936 }
   1937 
   1938 void Disassembler::mrs(Condition cond, Register rd, SpecialRegister spec_reg) {
   1939   os().SetCurrentInstruction(kMrs, kNoAttribute);
   1940   os() << ToCString(kMrs) << ConditionPrinter(it_block_, cond) << " " << rd
   1941        << ", " << spec_reg;
   1942 }
   1943 
   1944 void Disassembler::msr(Condition cond,
   1945                        MaskedSpecialRegister spec_reg,
   1946                        const Operand& operand) {
   1947   os().SetCurrentInstruction(kMsr, kNoAttribute);
   1948   os() << ToCString(kMsr) << ConditionPrinter(it_block_, cond) << " "
   1949        << spec_reg << ", " << operand;
   1950 }
   1951 
   1952 void Disassembler::mul(
   1953     Condition cond, EncodingSize size, Register rd, Register rn, Register rm) {
   1954   os().SetCurrentInstruction(kMul, kArithmetic);
   1955   os() << ToCString(kMul) << ConditionPrinter(it_block_, cond) << size << " "
   1956        << rd << ", " << rn << ", " << rm;
   1957 }
   1958 
   1959 void Disassembler::muls(Condition cond, Register rd, Register rn, Register rm) {
   1960   os().SetCurrentInstruction(kMuls, kArithmetic);
   1961   os() << ToCString(kMuls) << ConditionPrinter(it_block_, cond) << " " << rd
   1962        << ", " << rn << ", " << rm;
   1963 }
   1964 
   1965 void Disassembler::mvn(Condition cond,
   1966                        EncodingSize size,
   1967                        Register rd,
   1968                        const Operand& operand) {
   1969   os().SetCurrentInstruction(kMvn, kNoAttribute);
   1970   os() << ToCString(kMvn) << ConditionPrinter(it_block_, cond) << size << " "
   1971        << rd << ", " << operand;
   1972 }
   1973 
   1974 void Disassembler::mvns(Condition cond,
   1975                         EncodingSize size,
   1976                         Register rd,
   1977                         const Operand& operand) {
   1978   os().SetCurrentInstruction(kMvns, kNoAttribute);
   1979   os() << ToCString(kMvns) << ConditionPrinter(it_block_, cond) << size << " "
   1980        << rd << ", " << operand;
   1981 }
   1982 
   1983 void Disassembler::nop(Condition cond, EncodingSize size) {
   1984   os().SetCurrentInstruction(kNop, kNoAttribute);
   1985   os() << ToCString(kNop) << ConditionPrinter(it_block_, cond) << size;
   1986 }
   1987 
   1988 void Disassembler::orn(Condition cond,
   1989                        Register rd,
   1990                        Register rn,
   1991                        const Operand& operand) {
   1992   os().SetCurrentInstruction(kOrn, kBitwise);
   1993   os() << ToCString(kOrn) << ConditionPrinter(it_block_, cond);
   1994   os() << " ";
   1995   if (!rd.Is(rn) || !use_short_hand_form_) {
   1996     os() << rd << ", ";
   1997   }
   1998   os() << rn << ", " << operand;
   1999 }
   2000 
   2001 void Disassembler::orns(Condition cond,
   2002                         Register rd,
   2003                         Register rn,
   2004                         const Operand& operand) {
   2005   os().SetCurrentInstruction(kOrns, kBitwise);
   2006   os() << ToCString(kOrns) << ConditionPrinter(it_block_, cond);
   2007   os() << " ";
   2008   if (!rd.Is(rn) || !use_short_hand_form_) {
   2009     os() << rd << ", ";
   2010   }
   2011   os() << rn << ", " << operand;
   2012 }
   2013 
   2014 void Disassembler::orr(Condition cond,
   2015                        EncodingSize size,
   2016                        Register rd,
   2017                        Register rn,
   2018                        const Operand& operand) {
   2019   os().SetCurrentInstruction(kOrr, kBitwise);
   2020   os() << ToCString(kOrr) << ConditionPrinter(it_block_, cond) << size;
   2021   os() << " ";
   2022   if (!rd.Is(rn) || !use_short_hand_form_) {
   2023     os() << rd << ", ";
   2024   }
   2025   os() << rn << ", " << operand;
   2026 }
   2027 
   2028 void Disassembler::orrs(Condition cond,
   2029                         EncodingSize size,
   2030                         Register rd,
   2031                         Register rn,
   2032                         const Operand& operand) {
   2033   os().SetCurrentInstruction(kOrrs, kBitwise);
   2034   os() << ToCString(kOrrs) << ConditionPrinter(it_block_, cond) << size;
   2035   os() << " ";
   2036   if (!rd.Is(rn) || !use_short_hand_form_) {
   2037     os() << rd << ", ";
   2038   }
   2039   os() << rn << ", " << operand;
   2040 }
   2041 
   2042 void Disassembler::pkhbt(Condition cond,
   2043                          Register rd,
   2044                          Register rn,
   2045                          const Operand& operand) {
   2046   os().SetCurrentInstruction(kPkhbt, kNoAttribute);
   2047   os() << ToCString(kPkhbt) << ConditionPrinter(it_block_, cond);
   2048   os() << " ";
   2049   if (!rd.Is(rn) || !use_short_hand_form_) {
   2050     os() << rd << ", ";
   2051   }
   2052   os() << rn << ", " << operand;
   2053 }
   2054 
   2055 void Disassembler::pkhtb(Condition cond,
   2056                          Register rd,
   2057                          Register rn,
   2058                          const Operand& operand) {
   2059   os().SetCurrentInstruction(kPkhtb, kNoAttribute);
   2060   os() << ToCString(kPkhtb) << ConditionPrinter(it_block_, cond);
   2061   os() << " ";
   2062   if (!rd.Is(rn) || !use_short_hand_form_) {
   2063     os() << rd << ", ";
   2064   }
   2065   os() << rn << ", " << operand;
   2066 }
   2067 
   2068 void Disassembler::pld(Condition cond, Location* location) {
   2069   os().SetCurrentInstruction(kPld, kAddress);
   2070   os() << ToCString(kPld) << ConditionPrinter(it_block_, cond) << " "
   2071        << PrintLabel(kDataLocation, location, GetCodeAddress() & ~3);
   2072 }
   2073 
   2074 void Disassembler::pld(Condition cond, const MemOperand& operand) {
   2075   os().SetCurrentInstruction(kPld, kAddress);
   2076   os() << ToCString(kPld) << ConditionPrinter(it_block_, cond) << " "
   2077        << PrintMemOperand(kDataLocation, operand);
   2078 }
   2079 
   2080 void Disassembler::pldw(Condition cond, const MemOperand& operand) {
   2081   os().SetCurrentInstruction(kPldw, kAddress);
   2082   os() << ToCString(kPldw) << ConditionPrinter(it_block_, cond) << " "
   2083        << PrintMemOperand(kDataLocation, operand);
   2084 }
   2085 
   2086 void Disassembler::pli(Condition cond, const MemOperand& operand) {
   2087   os().SetCurrentInstruction(kPli, kAddress);
   2088   os() << ToCString(kPli) << ConditionPrinter(it_block_, cond) << " "
   2089        << PrintMemOperand(kCodeLocation, operand);
   2090 }
   2091 
   2092 void Disassembler::pli(Condition cond, Location* location) {
   2093   os().SetCurrentInstruction(kPli, kAddress);
   2094   os() << ToCString(kPli) << ConditionPrinter(it_block_, cond) << " "
   2095        << PrintLabel(kCodeLocation, location, GetCodeAddress() & ~3);
   2096 }
   2097 
   2098 void Disassembler::pop(Condition cond,
   2099                        EncodingSize size,
   2100                        RegisterList registers) {
   2101   os().SetCurrentInstruction(kPop, kLoadStore | kLoadStoreMultiple);
   2102   os() << ToCString(kPop) << ConditionPrinter(it_block_, cond) << size << " "
   2103        << registers;
   2104 }
   2105 
   2106 void Disassembler::pop(Condition cond, EncodingSize size, Register rt) {
   2107   os().SetCurrentInstruction(kPop, kLoadStore | kLoadStoreMultiple);
   2108   os() << ToCString(kPop) << ConditionPrinter(it_block_, cond) << size << " "
   2109        << "{" << rt << "}";
   2110 }
   2111 
   2112 void Disassembler::push(Condition cond,
   2113                         EncodingSize size,
   2114                         RegisterList registers) {
   2115   os().SetCurrentInstruction(kPush, kLoadStore | kLoadStoreMultiple);
   2116   os() << ToCString(kPush) << ConditionPrinter(it_block_, cond) << size << " "
   2117        << registers;
   2118 }
   2119 
   2120 void Disassembler::push(Condition cond, EncodingSize size, Register rt) {
   2121   os().SetCurrentInstruction(kPush, kLoadStore | kLoadStoreMultiple);
   2122   os() << ToCString(kPush) << ConditionPrinter(it_block_, cond) << size << " "
   2123        << "{" << rt << "}";
   2124 }
   2125 
   2126 void Disassembler::qadd(Condition cond, Register rd, Register rm, Register rn) {
   2127   os().SetCurrentInstruction(kQadd, kArithmetic);
   2128   os() << ToCString(kQadd) << ConditionPrinter(it_block_, cond);
   2129   os() << " ";
   2130   if (!rd.Is(rm) || !use_short_hand_form_) {
   2131     os() << rd << ", ";
   2132   }
   2133   os() << rm << ", " << rn;
   2134 }
   2135 
   2136 void Disassembler::qadd16(Condition cond,
   2137                           Register rd,
   2138                           Register rn,
   2139                           Register rm) {
   2140   os().SetCurrentInstruction(kQadd16, kArithmetic);
   2141   os() << ToCString(kQadd16) << ConditionPrinter(it_block_, cond);
   2142   os() << " ";
   2143   if (!rd.Is(rn) || !use_short_hand_form_) {
   2144     os() << rd << ", ";
   2145   }
   2146   os() << rn << ", " << rm;
   2147 }
   2148 
   2149 void Disassembler::qadd8(Condition cond,
   2150                          Register rd,
   2151                          Register rn,
   2152                          Register rm) {
   2153   os().SetCurrentInstruction(kQadd8, kArithmetic);
   2154   os() << ToCString(kQadd8) << ConditionPrinter(it_block_, cond);
   2155   os() << " ";
   2156   if (!rd.Is(rn) || !use_short_hand_form_) {
   2157     os() << rd << ", ";
   2158   }
   2159   os() << rn << ", " << rm;
   2160 }
   2161 
   2162 void Disassembler::qasx(Condition cond, Register rd, Register rn, Register rm) {
   2163   os().SetCurrentInstruction(kQasx, kArithmetic);
   2164   os() << ToCString(kQasx) << ConditionPrinter(it_block_, cond);
   2165   os() << " ";
   2166   if (!rd.Is(rn) || !use_short_hand_form_) {
   2167     os() << rd << ", ";
   2168   }
   2169   os() << rn << ", " << rm;
   2170 }
   2171 
   2172 void Disassembler::qdadd(Condition cond,
   2173                          Register rd,
   2174                          Register rm,
   2175                          Register rn) {
   2176   os().SetCurrentInstruction(kQdadd, kArithmetic);
   2177   os() << ToCString(kQdadd) << ConditionPrinter(it_block_, cond);
   2178   os() << " ";
   2179   if (!rd.Is(rm) || !use_short_hand_form_) {
   2180     os() << rd << ", ";
   2181   }
   2182   os() << rm << ", " << rn;
   2183 }
   2184 
   2185 void Disassembler::qdsub(Condition cond,
   2186                          Register rd,
   2187                          Register rm,
   2188                          Register rn) {
   2189   os().SetCurrentInstruction(kQdsub, kArithmetic);
   2190   os() << ToCString(kQdsub) << ConditionPrinter(it_block_, cond);
   2191   os() << " ";
   2192   if (!rd.Is(rm) || !use_short_hand_form_) {
   2193     os() << rd << ", ";
   2194   }
   2195   os() << rm << ", " << rn;
   2196 }
   2197 
   2198 void Disassembler::qsax(Condition cond, Register rd, Register rn, Register rm) {
   2199   os().SetCurrentInstruction(kQsax, kArithmetic);
   2200   os() << ToCString(kQsax) << ConditionPrinter(it_block_, cond);
   2201   os() << " ";
   2202   if (!rd.Is(rn) || !use_short_hand_form_) {
   2203     os() << rd << ", ";
   2204   }
   2205   os() << rn << ", " << rm;
   2206 }
   2207 
   2208 void Disassembler::qsub(Condition cond, Register rd, Register rm, Register rn) {
   2209   os().SetCurrentInstruction(kQsub, kArithmetic);
   2210   os() << ToCString(kQsub) << ConditionPrinter(it_block_, cond);
   2211   os() << " ";
   2212   if (!rd.Is(rm) || !use_short_hand_form_) {
   2213     os() << rd << ", ";
   2214   }
   2215   os() << rm << ", " << rn;
   2216 }
   2217 
   2218 void Disassembler::qsub16(Condition cond,
   2219                           Register rd,
   2220                           Register rn,
   2221                           Register rm) {
   2222   os().SetCurrentInstruction(kQsub16, kArithmetic);
   2223   os() << ToCString(kQsub16) << ConditionPrinter(it_block_, cond);
   2224   os() << " ";
   2225   if (!rd.Is(rn) || !use_short_hand_form_) {
   2226     os() << rd << ", ";
   2227   }
   2228   os() << rn << ", " << rm;
   2229 }
   2230 
   2231 void Disassembler::qsub8(Condition cond,
   2232                          Register rd,
   2233                          Register rn,
   2234                          Register rm) {
   2235   os().SetCurrentInstruction(kQsub8, kArithmetic);
   2236   os() << ToCString(kQsub8) << ConditionPrinter(it_block_, cond);
   2237   os() << " ";
   2238   if (!rd.Is(rn) || !use_short_hand_form_) {
   2239     os() << rd << ", ";
   2240   }
   2241   os() << rn << ", " << rm;
   2242 }
   2243 
   2244 void Disassembler::rbit(Condition cond, Register rd, Register rm) {
   2245   os().SetCurrentInstruction(kRbit, kNoAttribute);
   2246   os() << ToCString(kRbit) << ConditionPrinter(it_block_, cond) << " " << rd
   2247        << ", " << rm;
   2248 }
   2249 
   2250 void Disassembler::rev(Condition cond,
   2251                        EncodingSize size,
   2252                        Register rd,
   2253                        Register rm) {
   2254   os().SetCurrentInstruction(kRev, kNoAttribute);
   2255   os() << ToCString(kRev) << ConditionPrinter(it_block_, cond) << size << " "
   2256        << rd << ", " << rm;
   2257 }
   2258 
   2259 void Disassembler::rev16(Condition cond,
   2260                          EncodingSize size,
   2261                          Register rd,
   2262                          Register rm) {
   2263   os().SetCurrentInstruction(kRev16, kNoAttribute);
   2264   os() << ToCString(kRev16) << ConditionPrinter(it_block_, cond) << size << " "
   2265        << rd << ", " << rm;
   2266 }
   2267 
   2268 void Disassembler::revsh(Condition cond,
   2269                          EncodingSize size,
   2270                          Register rd,
   2271                          Register rm) {
   2272   os().SetCurrentInstruction(kRevsh, kNoAttribute);
   2273   os() << ToCString(kRevsh) << ConditionPrinter(it_block_, cond) << size << " "
   2274        << rd << ", " << rm;
   2275 }
   2276 
   2277 void Disassembler::ror(Condition cond,
   2278                        EncodingSize size,
   2279                        Register rd,
   2280                        Register rm,
   2281                        const Operand& operand) {
   2282   os().SetCurrentInstruction(kRor, kShift);
   2283   os() << ToCString(kRor) << ConditionPrinter(it_block_, cond) << size;
   2284   os() << " ";
   2285   if (!rd.Is(rm) || !use_short_hand_form_) {
   2286     os() << rd << ", ";
   2287   }
   2288   os() << rm << ", " << operand;
   2289 }
   2290 
   2291 void Disassembler::rors(Condition cond,
   2292                         EncodingSize size,
   2293                         Register rd,
   2294                         Register rm,
   2295                         const Operand& operand) {
   2296   os().SetCurrentInstruction(kRors, kShift);
   2297   os() << ToCString(kRors) << ConditionPrinter(it_block_, cond) << size;
   2298   os() << " ";
   2299   if (!rd.Is(rm) || !use_short_hand_form_) {
   2300     os() << rd << ", ";
   2301   }
   2302   os() << rm << ", " << operand;
   2303 }
   2304 
   2305 void Disassembler::rrx(Condition cond, Register rd, Register rm) {
   2306   os().SetCurrentInstruction(kRrx, kShift);
   2307   os() << ToCString(kRrx) << ConditionPrinter(it_block_, cond);
   2308   os() << " ";
   2309   if (!rd.Is(rm) || !use_short_hand_form_) {
   2310     os() << rd << ", ";
   2311   }
   2312   os() << rm;
   2313 }
   2314 
   2315 void Disassembler::rrxs(Condition cond, Register rd, Register rm) {
   2316   os().SetCurrentInstruction(kRrxs, kShift);
   2317   os() << ToCString(kRrxs) << ConditionPrinter(it_block_, cond);
   2318   os() << " ";
   2319   if (!rd.Is(rm) || !use_short_hand_form_) {
   2320     os() << rd << ", ";
   2321   }
   2322   os() << rm;
   2323 }
   2324 
   2325 void Disassembler::rsb(Condition cond,
   2326                        EncodingSize size,
   2327                        Register rd,
   2328                        Register rn,
   2329                        const Operand& operand) {
   2330   os().SetCurrentInstruction(kRsb, kArithmetic);
   2331   os() << ToCString(kRsb) << ConditionPrinter(it_block_, cond) << size;
   2332   os() << " ";
   2333   if (!rd.Is(rn) || !use_short_hand_form_) {
   2334     os() << rd << ", ";
   2335   }
   2336   os() << rn << ", " << operand;
   2337 }
   2338 
   2339 void Disassembler::rsbs(Condition cond,
   2340                         EncodingSize size,
   2341                         Register rd,
   2342                         Register rn,
   2343                         const Operand& operand) {
   2344   os().SetCurrentInstruction(kRsbs, kArithmetic);
   2345   os() << ToCString(kRsbs) << ConditionPrinter(it_block_, cond) << size;
   2346   os() << " ";
   2347   if (!rd.Is(rn) || !use_short_hand_form_) {
   2348     os() << rd << ", ";
   2349   }
   2350   os() << rn << ", " << operand;
   2351 }
   2352 
   2353 void Disassembler::rsc(Condition cond,
   2354                        Register rd,
   2355                        Register rn,
   2356                        const Operand& operand) {
   2357   os().SetCurrentInstruction(kRsc, kArithmetic);
   2358   os() << ToCString(kRsc) << ConditionPrinter(it_block_, cond);
   2359   os() << " ";
   2360   if (!rd.Is(rn) || !use_short_hand_form_) {
   2361     os() << rd << ", ";
   2362   }
   2363   os() << rn << ", " << operand;
   2364 }
   2365 
   2366 void Disassembler::rscs(Condition cond,
   2367                         Register rd,
   2368                         Register rn,
   2369                         const Operand& operand) {
   2370   os().SetCurrentInstruction(kRscs, kArithmetic);
   2371   os() << ToCString(kRscs) << ConditionPrinter(it_block_, cond);
   2372   os() << " ";
   2373   if (!rd.Is(rn) || !use_short_hand_form_) {
   2374     os() << rd << ", ";
   2375   }
   2376   os() << rn << ", " << operand;
   2377 }
   2378 
   2379 void Disassembler::sadd16(Condition cond,
   2380                           Register rd,
   2381                           Register rn,
   2382                           Register rm) {
   2383   os().SetCurrentInstruction(kSadd16, kArithmetic);
   2384   os() << ToCString(kSadd16) << ConditionPrinter(it_block_, cond);
   2385   os() << " ";
   2386   if (!rd.Is(rn) || !use_short_hand_form_) {
   2387     os() << rd << ", ";
   2388   }
   2389   os() << rn << ", " << rm;
   2390 }
   2391 
   2392 void Disassembler::sadd8(Condition cond,
   2393                          Register rd,
   2394                          Register rn,
   2395                          Register rm) {
   2396   os().SetCurrentInstruction(kSadd8, kArithmetic);
   2397   os() << ToCString(kSadd8) << ConditionPrinter(it_block_, cond);
   2398   os() << " ";
   2399   if (!rd.Is(rn) || !use_short_hand_form_) {
   2400     os() << rd << ", ";
   2401   }
   2402   os() << rn << ", " << rm;
   2403 }
   2404 
   2405 void Disassembler::sasx(Condition cond, Register rd, Register rn, Register rm) {
   2406   os().SetCurrentInstruction(kSasx, kArithmetic);
   2407   os() << ToCString(kSasx) << ConditionPrinter(it_block_, cond);
   2408   os() << " ";
   2409   if (!rd.Is(rn) || !use_short_hand_form_) {
   2410     os() << rd << ", ";
   2411   }
   2412   os() << rn << ", " << rm;
   2413 }
   2414 
   2415 void Disassembler::sbc(Condition cond,
   2416                        EncodingSize size,
   2417                        Register rd,
   2418                        Register rn,
   2419                        const Operand& operand) {
   2420   os().SetCurrentInstruction(kSbc, kArithmetic);
   2421   os() << ToCString(kSbc) << ConditionPrinter(it_block_, cond) << size;
   2422   os() << " ";
   2423   if (!rd.Is(rn) || !use_short_hand_form_) {
   2424     os() << rd << ", ";
   2425   }
   2426   os() << rn << ", " << operand;
   2427 }
   2428 
   2429 void Disassembler::sbcs(Condition cond,
   2430                         EncodingSize size,
   2431                         Register rd,
   2432                         Register rn,
   2433                         const Operand& operand) {
   2434   os().SetCurrentInstruction(kSbcs, kArithmetic);
   2435   os() << ToCString(kSbcs) << ConditionPrinter(it_block_, cond) << size;
   2436   os() << " ";
   2437   if (!rd.Is(rn) || !use_short_hand_form_) {
   2438     os() << rd << ", ";
   2439   }
   2440   os() << rn << ", " << operand;
   2441 }
   2442 
   2443 void Disassembler::sbfx(
   2444     Condition cond, Register rd, Register rn, uint32_t lsb, uint32_t width) {
   2445   os().SetCurrentInstruction(kSbfx, kShift);
   2446   os() << ToCString(kSbfx) << ConditionPrinter(it_block_, cond) << " " << rd
   2447        << ", " << rn << ", " << ImmediatePrinter(lsb) << ", "
   2448        << ImmediatePrinter(width);
   2449 }
   2450 
   2451 void Disassembler::sdiv(Condition cond, Register rd, Register rn, Register rm) {
   2452   os().SetCurrentInstruction(kSdiv, kArithmetic);
   2453   os() << ToCString(kSdiv) << ConditionPrinter(it_block_, cond);
   2454   os() << " ";
   2455   if (!rd.Is(rn) || !use_short_hand_form_) {
   2456     os() << rd << ", ";
   2457   }
   2458   os() << rn << ", " << rm;
   2459 }
   2460 
   2461 void Disassembler::sel(Condition cond, Register rd, Register rn, Register rm) {
   2462   os().SetCurrentInstruction(kSel, kNoAttribute);
   2463   os() << ToCString(kSel) << ConditionPrinter(it_block_, cond);
   2464   os() << " ";
   2465   if (!rd.Is(rn) || !use_short_hand_form_) {
   2466     os() << rd << ", ";
   2467   }
   2468   os() << rn << ", " << rm;
   2469 }
   2470 
   2471 void Disassembler::shadd16(Condition cond,
   2472                            Register rd,
   2473                            Register rn,
   2474                            Register rm) {
   2475   os().SetCurrentInstruction(kShadd16, kArithmetic);
   2476   os() << ToCString(kShadd16) << ConditionPrinter(it_block_, cond);
   2477   os() << " ";
   2478   if (!rd.Is(rn) || !use_short_hand_form_) {
   2479     os() << rd << ", ";
   2480   }
   2481   os() << rn << ", " << rm;
   2482 }
   2483 
   2484 void Disassembler::shadd8(Condition cond,
   2485                           Register rd,
   2486                           Register rn,
   2487                           Register rm) {
   2488   os().SetCurrentInstruction(kShadd8, kArithmetic);
   2489   os() << ToCString(kShadd8) << ConditionPrinter(it_block_, cond);
   2490   os() << " ";
   2491   if (!rd.Is(rn) || !use_short_hand_form_) {
   2492     os() << rd << ", ";
   2493   }
   2494   os() << rn << ", " << rm;
   2495 }
   2496 
   2497 void Disassembler::shasx(Condition cond,
   2498                          Register rd,
   2499                          Register rn,
   2500                          Register rm) {
   2501   os().SetCurrentInstruction(kShasx, kArithmetic);
   2502   os() << ToCString(kShasx) << ConditionPrinter(it_block_, cond);
   2503   os() << " ";
   2504   if (!rd.Is(rn) || !use_short_hand_form_) {
   2505     os() << rd << ", ";
   2506   }
   2507   os() << rn << ", " << rm;
   2508 }
   2509 
   2510 void Disassembler::shsax(Condition cond,
   2511                          Register rd,
   2512                          Register rn,
   2513                          Register rm) {
   2514   os().SetCurrentInstruction(kShsax, kArithmetic);
   2515   os() << ToCString(kShsax) << ConditionPrinter(it_block_, cond);
   2516   os() << " ";
   2517   if (!rd.Is(rn) || !use_short_hand_form_) {
   2518     os() << rd << ", ";
   2519   }
   2520   os() << rn << ", " << rm;
   2521 }
   2522 
   2523 void Disassembler::shsub16(Condition cond,
   2524                            Register rd,
   2525                            Register rn,
   2526                            Register rm) {
   2527   os().SetCurrentInstruction(kShsub16, kArithmetic);
   2528   os() << ToCString(kShsub16) << ConditionPrinter(it_block_, cond);
   2529   os() << " ";
   2530   if (!rd.Is(rn) || !use_short_hand_form_) {
   2531     os() << rd << ", ";
   2532   }
   2533   os() << rn << ", " << rm;
   2534 }
   2535 
   2536 void Disassembler::shsub8(Condition cond,
   2537                           Register rd,
   2538                           Register rn,
   2539                           Register rm) {
   2540   os().SetCurrentInstruction(kShsub8, kArithmetic);
   2541   os() << ToCString(kShsub8) << ConditionPrinter(it_block_, cond);
   2542   os() << " ";
   2543   if (!rd.Is(rn) || !use_short_hand_form_) {
   2544     os() << rd << ", ";
   2545   }
   2546   os() << rn << ", " << rm;
   2547 }
   2548 
   2549 void Disassembler::smlabb(
   2550     Condition cond, Register rd, Register rn, Register rm, Register ra) {
   2551   os().SetCurrentInstruction(kSmlabb, kArithmetic);
   2552   os() << ToCString(kSmlabb) << ConditionPrinter(it_block_, cond) << " " << rd
   2553        << ", " << rn << ", " << rm << ", " << ra;
   2554 }
   2555 
   2556 void Disassembler::smlabt(
   2557     Condition cond, Register rd, Register rn, Register rm, Register ra) {
   2558   os().SetCurrentInstruction(kSmlabt, kArithmetic);
   2559   os() << ToCString(kSmlabt) << ConditionPrinter(it_block_, cond) << " " << rd
   2560        << ", " << rn << ", " << rm << ", " << ra;
   2561 }
   2562 
   2563 void Disassembler::smlad(
   2564     Condition cond, Register rd, Register rn, Register rm, Register ra) {
   2565   os().SetCurrentInstruction(kSmlad, kArithmetic);
   2566   os() << ToCString(kSmlad) << ConditionPrinter(it_block_, cond) << " " << rd
   2567        << ", " << rn << ", " << rm << ", " << ra;
   2568 }
   2569 
   2570 void Disassembler::smladx(
   2571     Condition cond, Register rd, Register rn, Register rm, Register ra) {
   2572   os().SetCurrentInstruction(kSmladx, kArithmetic);
   2573   os() << ToCString(kSmladx) << ConditionPrinter(it_block_, cond) << " " << rd
   2574        << ", " << rn << ", " << rm << ", " << ra;
   2575 }
   2576 
   2577 void Disassembler::smlal(
   2578     Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
   2579   os().SetCurrentInstruction(kSmlal, kArithmetic);
   2580   os() << ToCString(kSmlal) << ConditionPrinter(it_block_, cond) << " " << rdlo
   2581        << ", " << rdhi << ", " << rn << ", " << rm;
   2582 }
   2583 
   2584 void Disassembler::smlalbb(
   2585     Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
   2586   os().SetCurrentInstruction(kSmlalbb, kArithmetic);
   2587   os() << ToCString(kSmlalbb) << ConditionPrinter(it_block_, cond) << " "
   2588        << rdlo << ", " << rdhi << ", " << rn << ", " << rm;
   2589 }
   2590 
   2591 void Disassembler::smlalbt(
   2592     Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
   2593   os().SetCurrentInstruction(kSmlalbt, kArithmetic);
   2594   os() << ToCString(kSmlalbt) << ConditionPrinter(it_block_, cond) << " "
   2595        << rdlo << ", " << rdhi << ", " << rn << ", " << rm;
   2596 }
   2597 
   2598 void Disassembler::smlald(
   2599     Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
   2600   os().SetCurrentInstruction(kSmlald, kArithmetic);
   2601   os() << ToCString(kSmlald) << ConditionPrinter(it_block_, cond) << " " << rdlo
   2602        << ", " << rdhi << ", " << rn << ", " << rm;
   2603 }
   2604 
   2605 void Disassembler::smlaldx(
   2606     Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
   2607   os().SetCurrentInstruction(kSmlaldx, kArithmetic);
   2608   os() << ToCString(kSmlaldx) << ConditionPrinter(it_block_, cond) << " "
   2609        << rdlo << ", " << rdhi << ", " << rn << ", " << rm;
   2610 }
   2611 
   2612 void Disassembler::smlals(
   2613     Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
   2614   os().SetCurrentInstruction(kSmlals, kArithmetic);
   2615   os() << ToCString(kSmlals) << ConditionPrinter(it_block_, cond) << " " << rdlo
   2616        << ", " << rdhi << ", " << rn << ", " << rm;
   2617 }
   2618 
   2619 void Disassembler::smlaltb(
   2620     Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
   2621   os().SetCurrentInstruction(kSmlaltb, kArithmetic);
   2622   os() << ToCString(kSmlaltb) << ConditionPrinter(it_block_, cond) << " "
   2623        << rdlo << ", " << rdhi << ", " << rn << ", " << rm;
   2624 }
   2625 
   2626 void Disassembler::smlaltt(
   2627     Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
   2628   os().SetCurrentInstruction(kSmlaltt, kArithmetic);
   2629   os() << ToCString(kSmlaltt) << ConditionPrinter(it_block_, cond) << " "
   2630        << rdlo << ", " << rdhi << ", " << rn << ", " << rm;
   2631 }
   2632 
   2633 void Disassembler::smlatb(
   2634     Condition cond, Register rd, Register rn, Register rm, Register ra) {
   2635   os().SetCurrentInstruction(kSmlatb, kArithmetic);
   2636   os() << ToCString(kSmlatb) << ConditionPrinter(it_block_, cond) << " " << rd
   2637        << ", " << rn << ", " << rm << ", " << ra;
   2638 }
   2639 
   2640 void Disassembler::smlatt(
   2641     Condition cond, Register rd, Register rn, Register rm, Register ra) {
   2642   os().SetCurrentInstruction(kSmlatt, kArithmetic);
   2643   os() << ToCString(kSmlatt) << ConditionPrinter(it_block_, cond) << " " << rd
   2644        << ", " << rn << ", " << rm << ", " << ra;
   2645 }
   2646 
   2647 void Disassembler::smlawb(
   2648     Condition cond, Register rd, Register rn, Register rm, Register ra) {
   2649   os().SetCurrentInstruction(kSmlawb, kArithmetic);
   2650   os() << ToCString(kSmlawb) << ConditionPrinter(it_block_, cond) << " " << rd
   2651        << ", " << rn << ", " << rm << ", " << ra;
   2652 }
   2653 
   2654 void Disassembler::smlawt(
   2655     Condition cond, Register rd, Register rn, Register rm, Register ra) {
   2656   os().SetCurrentInstruction(kSmlawt, kArithmetic);
   2657   os() << ToCString(kSmlawt) << ConditionPrinter(it_block_, cond) << " " << rd
   2658        << ", " << rn << ", " << rm << ", " << ra;
   2659 }
   2660 
   2661 void Disassembler::smlsd(
   2662     Condition cond, Register rd, Register rn, Register rm, Register ra) {
   2663   os().SetCurrentInstruction(kSmlsd, kArithmetic);
   2664   os() << ToCString(kSmlsd) << ConditionPrinter(it_block_, cond) << " " << rd
   2665        << ", " << rn << ", " << rm << ", " << ra;
   2666 }
   2667 
   2668 void Disassembler::smlsdx(
   2669     Condition cond, Register rd, Register rn, Register rm, Register ra) {
   2670   os().SetCurrentInstruction(kSmlsdx, kArithmetic);
   2671   os() << ToCString(kSmlsdx) << ConditionPrinter(it_block_, cond) << " " << rd
   2672        << ", " << rn << ", " << rm << ", " << ra;
   2673 }
   2674 
   2675 void Disassembler::smlsld(
   2676     Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
   2677   os().SetCurrentInstruction(kSmlsld, kArithmetic);
   2678   os() << ToCString(kSmlsld) << ConditionPrinter(it_block_, cond) << " " << rdlo
   2679        << ", " << rdhi << ", " << rn << ", " << rm;
   2680 }
   2681 
   2682 void Disassembler::smlsldx(
   2683     Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
   2684   os().SetCurrentInstruction(kSmlsldx, kArithmetic);
   2685   os() << ToCString(kSmlsldx) << ConditionPrinter(it_block_, cond) << " "
   2686        << rdlo << ", " << rdhi << ", " << rn << ", " << rm;
   2687 }
   2688 
   2689 void Disassembler::smmla(
   2690     Condition cond, Register rd, Register rn, Register rm, Register ra) {
   2691   os().SetCurrentInstruction(kSmmla, kArithmetic);
   2692   os() << ToCString(kSmmla) << ConditionPrinter(it_block_, cond) << " " << rd
   2693        << ", " << rn << ", " << rm << ", " << ra;
   2694 }
   2695 
   2696 void Disassembler::smmlar(
   2697     Condition cond, Register rd, Register rn, Register rm, Register ra) {
   2698   os().SetCurrentInstruction(kSmmlar, kArithmetic);
   2699   os() << ToCString(kSmmlar) << ConditionPrinter(it_block_, cond) << " " << rd
   2700        << ", " << rn << ", " << rm << ", " << ra;
   2701 }
   2702 
   2703 void Disassembler::smmls(
   2704     Condition cond, Register rd, Register rn, Register rm, Register ra) {
   2705   os().SetCurrentInstruction(kSmmls, kArithmetic);
   2706   os() << ToCString(kSmmls) << ConditionPrinter(it_block_, cond) << " " << rd
   2707        << ", " << rn << ", " << rm << ", " << ra;
   2708 }
   2709 
   2710 void Disassembler::smmlsr(
   2711     Condition cond, Register rd, Register rn, Register rm, Register ra) {
   2712   os().SetCurrentInstruction(kSmmlsr, kArithmetic);
   2713   os() << ToCString(kSmmlsr) << ConditionPrinter(it_block_, cond) << " " << rd
   2714        << ", " << rn << ", " << rm << ", " << ra;
   2715 }
   2716 
   2717 void Disassembler::smmul(Condition cond,
   2718                          Register rd,
   2719                          Register rn,
   2720                          Register rm) {
   2721   os().SetCurrentInstruction(kSmmul, kArithmetic);
   2722   os() << ToCString(kSmmul) << ConditionPrinter(it_block_, cond);
   2723   os() << " ";
   2724   if (!rd.Is(rn) || !use_short_hand_form_) {
   2725     os() << rd << ", ";
   2726   }
   2727   os() << rn << ", " << rm;
   2728 }
   2729 
   2730 void Disassembler::smmulr(Condition cond,
   2731                           Register rd,
   2732                           Register rn,
   2733                           Register rm) {
   2734   os().SetCurrentInstruction(kSmmulr, kArithmetic);
   2735   os() << ToCString(kSmmulr) << ConditionPrinter(it_block_, cond);
   2736   os() << " ";
   2737   if (!rd.Is(rn) || !use_short_hand_form_) {
   2738     os() << rd << ", ";
   2739   }
   2740   os() << rn << ", " << rm;
   2741 }
   2742 
   2743 void Disassembler::smuad(Condition cond,
   2744                          Register rd,
   2745                          Register rn,
   2746                          Register rm) {
   2747   os().SetCurrentInstruction(kSmuad, kArithmetic);
   2748   os() << ToCString(kSmuad) << ConditionPrinter(it_block_, cond);
   2749   os() << " ";
   2750   if (!rd.Is(rn) || !use_short_hand_form_) {
   2751     os() << rd << ", ";
   2752   }
   2753   os() << rn << ", " << rm;
   2754 }
   2755 
   2756 void Disassembler::smuadx(Condition cond,
   2757                           Register rd,
   2758                           Register rn,
   2759                           Register rm) {
   2760   os().SetCurrentInstruction(kSmuadx, kArithmetic);
   2761   os() << ToCString(kSmuadx) << ConditionPrinter(it_block_, cond);
   2762   os() << " ";
   2763   if (!rd.Is(rn) || !use_short_hand_form_) {
   2764     os() << rd << ", ";
   2765   }
   2766   os() << rn << ", " << rm;
   2767 }
   2768 
   2769 void Disassembler::smulbb(Condition cond,
   2770                           Register rd,
   2771                           Register rn,
   2772                           Register rm) {
   2773   os().SetCurrentInstruction(kSmulbb, kArithmetic);
   2774   os() << ToCString(kSmulbb) << ConditionPrinter(it_block_, cond);
   2775   os() << " ";
   2776   if (!rd.Is(rn) || !use_short_hand_form_) {
   2777     os() << rd << ", ";
   2778   }
   2779   os() << rn << ", " << rm;
   2780 }
   2781 
   2782 void Disassembler::smulbt(Condition cond,
   2783                           Register rd,
   2784                           Register rn,
   2785                           Register rm) {
   2786   os().SetCurrentInstruction(kSmulbt, kArithmetic);
   2787   os() << ToCString(kSmulbt) << ConditionPrinter(it_block_, cond);
   2788   os() << " ";
   2789   if (!rd.Is(rn) || !use_short_hand_form_) {
   2790     os() << rd << ", ";
   2791   }
   2792   os() << rn << ", " << rm;
   2793 }
   2794 
   2795 void Disassembler::smull(
   2796     Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
   2797   os().SetCurrentInstruction(kSmull, kArithmetic);
   2798   os() << ToCString(kSmull) << ConditionPrinter(it_block_, cond) << " " << rdlo
   2799        << ", " << rdhi << ", " << rn << ", " << rm;
   2800 }
   2801 
   2802 void Disassembler::smulls(
   2803     Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
   2804   os().SetCurrentInstruction(kSmulls, kArithmetic);
   2805   os() << ToCString(kSmulls) << ConditionPrinter(it_block_, cond) << " " << rdlo
   2806        << ", " << rdhi << ", " << rn << ", " << rm;
   2807 }
   2808 
   2809 void Disassembler::smultb(Condition cond,
   2810                           Register rd,
   2811                           Register rn,
   2812                           Register rm) {
   2813   os().SetCurrentInstruction(kSmultb, kArithmetic);
   2814   os() << ToCString(kSmultb) << ConditionPrinter(it_block_, cond);
   2815   os() << " ";
   2816   if (!rd.Is(rn) || !use_short_hand_form_) {
   2817     os() << rd << ", ";
   2818   }
   2819   os() << rn << ", " << rm;
   2820 }
   2821 
   2822 void Disassembler::smultt(Condition cond,
   2823                           Register rd,
   2824                           Register rn,
   2825                           Register rm) {
   2826   os().SetCurrentInstruction(kSmultt, kArithmetic);
   2827   os() << ToCString(kSmultt) << ConditionPrinter(it_block_, cond);
   2828   os() << " ";
   2829   if (!rd.Is(rn) || !use_short_hand_form_) {
   2830     os() << rd << ", ";
   2831   }
   2832   os() << rn << ", " << rm;
   2833 }
   2834 
   2835 void Disassembler::smulwb(Condition cond,
   2836                           Register rd,
   2837                           Register rn,
   2838                           Register rm) {
   2839   os().SetCurrentInstruction(kSmulwb, kArithmetic);
   2840   os() << ToCString(kSmulwb) << ConditionPrinter(it_block_, cond);
   2841   os() << " ";
   2842   if (!rd.Is(rn) || !use_short_hand_form_) {
   2843     os() << rd << ", ";
   2844   }
   2845   os() << rn << ", " << rm;
   2846 }
   2847 
   2848 void Disassembler::smulwt(Condition cond,
   2849                           Register rd,
   2850                           Register rn,
   2851                           Register rm) {
   2852   os().SetCurrentInstruction(kSmulwt, kArithmetic);
   2853   os() << ToCString(kSmulwt) << ConditionPrinter(it_block_, cond);
   2854   os() << " ";
   2855   if (!rd.Is(rn) || !use_short_hand_form_) {
   2856     os() << rd << ", ";
   2857   }
   2858   os() << rn << ", " << rm;
   2859 }
   2860 
   2861 void Disassembler::smusd(Condition cond,
   2862                          Register rd,
   2863                          Register rn,
   2864                          Register rm) {
   2865   os().SetCurrentInstruction(kSmusd, kArithmetic);
   2866   os() << ToCString(kSmusd) << ConditionPrinter(it_block_, cond);
   2867   os() << " ";
   2868   if (!rd.Is(rn) || !use_short_hand_form_) {
   2869     os() << rd << ", ";
   2870   }
   2871   os() << rn << ", " << rm;
   2872 }
   2873 
   2874 void Disassembler::smusdx(Condition cond,
   2875                           Register rd,
   2876                           Register rn,
   2877                           Register rm) {
   2878   os().SetCurrentInstruction(kSmusdx, kArithmetic);
   2879   os() << ToCString(kSmusdx) << ConditionPrinter(it_block_, cond);
   2880   os() << " ";
   2881   if (!rd.Is(rn) || !use_short_hand_form_) {
   2882     os() << rd << ", ";
   2883   }
   2884   os() << rn << ", " << rm;
   2885 }
   2886 
   2887 void Disassembler::ssat(Condition cond,
   2888                         Register rd,
   2889                         uint32_t imm,
   2890                         const Operand& operand) {
   2891   os().SetCurrentInstruction(kSsat, kArithmetic);
   2892   os() << ToCString(kSsat) << ConditionPrinter(it_block_, cond) << " " << rd
   2893        << ", " << ImmediatePrinter(imm) << ", " << operand;
   2894 }
   2895 
   2896 void Disassembler::ssat16(Condition cond,
   2897                           Register rd,
   2898                           uint32_t imm,
   2899                           Register rn) {
   2900   os().SetCurrentInstruction(kSsat16, kArithmetic);
   2901   os() << ToCString(kSsat16) << ConditionPrinter(it_block_, cond) << " " << rd
   2902        << ", " << ImmediatePrinter(imm) << ", " << rn;
   2903 }
   2904 
   2905 void Disassembler::ssax(Condition cond, Register rd, Register rn, Register rm) {
   2906   os().SetCurrentInstruction(kSsax, kArithmetic);
   2907   os() << ToCString(kSsax) << ConditionPrinter(it_block_, cond);
   2908   os() << " ";
   2909   if (!rd.Is(rn) || !use_short_hand_form_) {
   2910     os() << rd << ", ";
   2911   }
   2912   os() << rn << ", " << rm;
   2913 }
   2914 
   2915 void Disassembler::ssub16(Condition cond,
   2916                           Register rd,
   2917                           Register rn,
   2918                           Register rm) {
   2919   os().SetCurrentInstruction(kSsub16, kArithmetic);
   2920   os() << ToCString(kSsub16) << ConditionPrinter(it_block_, cond);
   2921   os() << " ";
   2922   if (!rd.Is(rn) || !use_short_hand_form_) {
   2923     os() << rd << ", ";
   2924   }
   2925   os() << rn << ", " << rm;
   2926 }
   2927 
   2928 void Disassembler::ssub8(Condition cond,
   2929                          Register rd,
   2930                          Register rn,
   2931                          Register rm) {
   2932   os().SetCurrentInstruction(kSsub8, kArithmetic);
   2933   os() << ToCString(kSsub8) << ConditionPrinter(it_block_, cond);
   2934   os() << " ";
   2935   if (!rd.Is(rn) || !use_short_hand_form_) {
   2936     os() << rd << ", ";
   2937   }
   2938   os() << rn << ", " << rm;
   2939 }
   2940 
   2941 void Disassembler::stl(Condition cond, Register rt, const MemOperand& operand) {
   2942   os().SetCurrentInstruction(kStl, kAddress | kLoadStore);
   2943   os() << ToCString(kStl) << ConditionPrinter(it_block_, cond) << " " << rt
   2944        << ", " << PrintMemOperand(kStoreWordLocation, operand);
   2945 }
   2946 
   2947 void Disassembler::stlb(Condition cond,
   2948                         Register rt,
   2949                         const MemOperand& operand) {
   2950   os().SetCurrentInstruction(kStlb, kAddress | kLoadStore);
   2951   os() << ToCString(kStlb) << ConditionPrinter(it_block_, cond) << " " << rt
   2952        << ", " << PrintMemOperand(kStoreByteLocation, operand);
   2953 }
   2954 
   2955 void Disassembler::stlex(Condition cond,
   2956                          Register rd,
   2957                          Register rt,
   2958                          const MemOperand& operand) {
   2959   os().SetCurrentInstruction(kStlex, kAddress | kLoadStore);
   2960   os() << ToCString(kStlex) << ConditionPrinter(it_block_, cond) << " " << rd
   2961        << ", " << rt << ", " << PrintMemOperand(kStoreWordLocation, operand);
   2962 }
   2963 
   2964 void Disassembler::stlexb(Condition cond,
   2965                           Register rd,
   2966                           Register rt,
   2967                           const MemOperand& operand) {
   2968   os().SetCurrentInstruction(kStlexb, kAddress | kLoadStore);
   2969   os() << ToCString(kStlexb) << ConditionPrinter(it_block_, cond) << " " << rd
   2970        << ", " << rt << ", " << PrintMemOperand(kStoreByteLocation, operand);
   2971 }
   2972 
   2973 void Disassembler::stlexd(Condition cond,
   2974                           Register rd,
   2975                           Register rt,
   2976                           Register rt2,
   2977                           const MemOperand& operand) {
   2978   os().SetCurrentInstruction(kStlexd, kAddress | kLoadStore);
   2979   os() << ToCString(kStlexd) << ConditionPrinter(it_block_, cond) << " " << rd
   2980        << ", " << rt << ", " << rt2 << ", "
   2981        << PrintMemOperand(kStoreDoubleWordLocation, operand);
   2982 }
   2983 
   2984 void Disassembler::stlexh(Condition cond,
   2985                           Register rd,
   2986                           Register rt,
   2987                           const MemOperand& operand) {
   2988   os().SetCurrentInstruction(kStlexh, kAddress | kLoadStore);
   2989   os() << ToCString(kStlexh) << ConditionPrinter(it_block_, cond) << " " << rd
   2990        << ", " << rt << ", "
   2991        << PrintMemOperand(kStoreHalfWordLocation, operand);
   2992 }
   2993 
   2994 void Disassembler::stlh(Condition cond,
   2995                         Register rt,
   2996                         const MemOperand& operand) {
   2997   os().SetCurrentInstruction(kStlh, kAddress | kLoadStore);
   2998   os() << ToCString(kStlh) << ConditionPrinter(it_block_, cond) << " " << rt
   2999        << ", " << PrintMemOperand(kStoreHalfWordLocation, operand);
   3000 }
   3001 
   3002 void Disassembler::stm(Condition cond,
   3003                        EncodingSize size,
   3004                        Register rn,
   3005                        WriteBack write_back,
   3006                        RegisterList registers) {
   3007   os().SetCurrentInstruction(kStm, kLoadStore | kLoadStoreMultiple);
   3008   os() << ToCString(kStm) << ConditionPrinter(it_block_, cond) << size << " "
   3009        << rn << write_back << ", " << registers;
   3010 }
   3011 
   3012 void Disassembler::stmda(Condition cond,
   3013                          Register rn,
   3014                          WriteBack write_back,
   3015                          RegisterList registers) {
   3016   os().SetCurrentInstruction(kStmda, kLoadStore | kLoadStoreMultiple);
   3017   os() << ToCString(kStmda) << ConditionPrinter(it_block_, cond) << " " << rn
   3018        << write_back << ", " << registers;
   3019 }
   3020 
   3021 void Disassembler::stmdb(Condition cond,
   3022                          EncodingSize size,
   3023                          Register rn,
   3024                          WriteBack write_back,
   3025                          RegisterList registers) {
   3026   os().SetCurrentInstruction(kStmdb, kLoadStore | kLoadStoreMultiple);
   3027   os() << ToCString(kStmdb) << ConditionPrinter(it_block_, cond) << size << " "
   3028        << rn << write_back << ", " << registers;
   3029 }
   3030 
   3031 void Disassembler::stmea(Condition cond,
   3032                          EncodingSize size,
   3033                          Register rn,
   3034                          WriteBack write_back,
   3035                          RegisterList registers) {
   3036   os().SetCurrentInstruction(kStmea, kLoadStore | kLoadStoreMultiple);
   3037   os() << ToCString(kStmea) << ConditionPrinter(it_block_, cond) << size << " "
   3038        << rn << write_back << ", " << registers;
   3039 }
   3040 
   3041 void Disassembler::stmed(Condition cond,
   3042                          Register rn,
   3043                          WriteBack write_back,
   3044                          RegisterList registers) {
   3045   os().SetCurrentInstruction(kStmed, kLoadStore | kLoadStoreMultiple);
   3046   os() << ToCString(kStmed) << ConditionPrinter(it_block_, cond) << " " << rn
   3047        << write_back << ", " << registers;
   3048 }
   3049 
   3050 void Disassembler::stmfa(Condition cond,
   3051                          Register rn,
   3052                          WriteBack write_back,
   3053                          RegisterList registers) {
   3054   os().SetCurrentInstruction(kStmfa, kLoadStore | kLoadStoreMultiple);
   3055   os() << ToCString(kStmfa) << ConditionPrinter(it_block_, cond) << " " << rn
   3056        << write_back << ", " << registers;
   3057 }
   3058 
   3059 void Disassembler::stmfd(Condition cond,
   3060                          Register rn,
   3061                          WriteBack write_back,
   3062                          RegisterList registers) {
   3063   os().SetCurrentInstruction(kStmfd, kLoadStore | kLoadStoreMultiple);
   3064   os() << ToCString(kStmfd) << ConditionPrinter(it_block_, cond) << " " << rn
   3065        << write_back << ", " << registers;
   3066 }
   3067 
   3068 void Disassembler::stmib(Condition cond,
   3069                          Register rn,
   3070                          WriteBack write_back,
   3071                          RegisterList registers) {
   3072   os().SetCurrentInstruction(kStmib, kLoadStore | kLoadStoreMultiple);
   3073   os() << ToCString(kStmib) << ConditionPrinter(it_block_, cond) << " " << rn
   3074        << write_back << ", " << registers;
   3075 }
   3076 
   3077 void Disassembler::str(Condition cond,
   3078                        EncodingSize size,
   3079                        Register rt,
   3080                        const MemOperand& operand) {
   3081   os().SetCurrentInstruction(kStr, kAddress | kLoadStore);
   3082   os() << ToCString(kStr) << ConditionPrinter(it_block_, cond) << size << " "
   3083        << rt << ", " << PrintMemOperand(kStoreWordLocation, operand);
   3084 }
   3085 
   3086 void Disassembler::strb(Condition cond,
   3087                         EncodingSize size,
   3088                         Register rt,
   3089                         const MemOperand& operand) {
   3090   os().SetCurrentInstruction(kStrb, kAddress | kLoadStore);
   3091   os() << ToCString(kStrb) << ConditionPrinter(it_block_, cond) << size << " "
   3092        << rt << ", " << PrintMemOperand(kStoreByteLocation, operand);
   3093 }
   3094 
   3095 void Disassembler::strd(Condition cond,
   3096                         Register rt,
   3097                         Register rt2,
   3098                         const MemOperand& operand) {
   3099   os().SetCurrentInstruction(kStrd, kAddress | kLoadStore);
   3100   os() << ToCString(kStrd) << ConditionPrinter(it_block_, cond) << " " << rt
   3101        << ", " << rt2 << ", "
   3102        << PrintMemOperand(kStoreDoubleWordLocation, operand);
   3103 }
   3104 
   3105 void Disassembler::strex(Condition cond,
   3106                          Register rd,
   3107                          Register rt,
   3108                          const MemOperand& operand) {
   3109   os().SetCurrentInstruction(kStrex, kAddress | kLoadStore);
   3110   os() << ToCString(kStrex) << ConditionPrinter(it_block_, cond) << " " << rd
   3111        << ", " << rt << ", " << PrintMemOperand(kStoreWordLocation, operand);
   3112 }
   3113 
   3114 void Disassembler::strexb(Condition cond,
   3115                           Register rd,
   3116                           Register rt,
   3117                           const MemOperand& operand) {
   3118   os().SetCurrentInstruction(kStrexb, kAddress | kLoadStore);
   3119   os() << ToCString(kStrexb) << ConditionPrinter(it_block_, cond) << " " << rd
   3120        << ", " << rt << ", " << PrintMemOperand(kStoreByteLocation, operand);
   3121 }
   3122 
   3123 void Disassembler::strexd(Condition cond,
   3124                           Register rd,
   3125                           Register rt,
   3126                           Register rt2,
   3127                           const MemOperand& operand) {
   3128   os().SetCurrentInstruction(kStrexd, kAddress | kLoadStore);
   3129   os() << ToCString(kStrexd) << ConditionPrinter(it_block_, cond) << " " << rd
   3130        << ", " << rt << ", " << rt2 << ", "
   3131        << PrintMemOperand(kStoreDoubleWordLocation, operand);
   3132 }
   3133 
   3134 void Disassembler::strexh(Condition cond,
   3135                           Register rd,
   3136                           Register rt,
   3137                           const MemOperand& operand) {
   3138   os().SetCurrentInstruction(kStrexh, kAddress | kLoadStore);
   3139   os() << ToCString(kStrexh) << ConditionPrinter(it_block_, cond) << " " << rd
   3140        << ", " << rt << ", "
   3141        << PrintMemOperand(kStoreHalfWordLocation, operand);
   3142 }
   3143 
   3144 void Disassembler::strh(Condition cond,
   3145                         EncodingSize size,
   3146                         Register rt,
   3147                         const MemOperand& operand) {
   3148   os().SetCurrentInstruction(kStrh, kAddress | kLoadStore);
   3149   os() << ToCString(kStrh) << ConditionPrinter(it_block_, cond) << size << " "
   3150        << rt << ", " << PrintMemOperand(kStoreHalfWordLocation, operand);
   3151 }
   3152 
   3153 void Disassembler::sub(Condition cond,
   3154                        EncodingSize size,
   3155                        Register rd,
   3156                        Register rn,
   3157                        const Operand& operand) {
   3158   os().SetCurrentInstruction(kSub, kArithmetic);
   3159   os() << ToCString(kSub) << ConditionPrinter(it_block_, cond) << size;
   3160   os() << " ";
   3161   if (!rd.Is(rn) || !use_short_hand_form_) {
   3162     os() << rd << ", ";
   3163   }
   3164   os() << rn << ", " << operand;
   3165 }
   3166 
   3167 void Disassembler::sub(Condition cond, Register rd, const Operand& operand) {
   3168   os().SetCurrentInstruction(kSub, kArithmetic);
   3169   os() << ToCString(kSub) << ConditionPrinter(it_block_, cond) << " " << rd
   3170        << ", " << operand;
   3171 }
   3172 
   3173 void Disassembler::subs(Condition cond,
   3174                         EncodingSize size,
   3175                         Register rd,
   3176                         Register rn,
   3177                         const Operand& operand) {
   3178   os().SetCurrentInstruction(kSubs, kArithmetic);
   3179   os() << ToCString(kSubs) << ConditionPrinter(it_block_, cond) << size;
   3180   os() << " ";
   3181   if (!rd.Is(rn) || !use_short_hand_form_) {
   3182     os() << rd << ", ";
   3183   }
   3184   os() << rn << ", " << operand;
   3185 }
   3186 
   3187 void Disassembler::subs(Register rd, const Operand& operand) {
   3188   os().SetCurrentInstruction(kSubs, kArithmetic);
   3189   os() << ToCString(kSubs) << " " << rd << ", " << operand;
   3190 }
   3191 
   3192 void Disassembler::subw(Condition cond,
   3193                         Register rd,
   3194                         Register rn,
   3195                         const Operand& operand) {
   3196   os().SetCurrentInstruction(kSubw, kArithmetic);
   3197   os() << ToCString(kSubw) << ConditionPrinter(it_block_, cond);
   3198   os() << " ";
   3199   if (!rd.Is(rn) || !use_short_hand_form_) {
   3200     os() << rd << ", ";
   3201   }
   3202   os() << rn << ", " << operand;
   3203 }
   3204 
   3205 void Disassembler::svc(Condition cond, uint32_t imm) {
   3206   os().SetCurrentInstruction(kSvc, kSystem);
   3207   os() << ToCString(kSvc) << ConditionPrinter(it_block_, cond) << " "
   3208        << RawImmediatePrinter(imm);
   3209 }
   3210 
   3211 void Disassembler::sxtab(Condition cond,
   3212                          Register rd,
   3213                          Register rn,
   3214                          const Operand& operand) {
   3215   os().SetCurrentInstruction(kSxtab, kArithmetic);
   3216   os() << ToCString(kSxtab) << ConditionPrinter(it_block_, cond);
   3217   os() << " ";
   3218   if (!rd.Is(rn) || !use_short_hand_form_) {
   3219     os() << rd << ", ";
   3220   }
   3221   os() << rn << ", " << operand;
   3222 }
   3223 
   3224 void Disassembler::sxtab16(Condition cond,
   3225                            Register rd,
   3226                            Register rn,
   3227                            const Operand& operand) {
   3228   os().SetCurrentInstruction(kSxtab16, kArithmetic);
   3229   os() << ToCString(kSxtab16) << ConditionPrinter(it_block_, cond);
   3230   os() << " ";
   3231   if (!rd.Is(rn) || !use_short_hand_form_) {
   3232     os() << rd << ", ";
   3233   }
   3234   os() << rn << ", " << operand;
   3235 }
   3236 
   3237 void Disassembler::sxtah(Condition cond,
   3238                          Register rd,
   3239                          Register rn,
   3240                          const Operand& operand) {
   3241   os().SetCurrentInstruction(kSxtah, kArithmetic);
   3242   os() << ToCString(kSxtah) << ConditionPrinter(it_block_, cond);
   3243   os() << " ";
   3244   if (!rd.Is(rn) || !use_short_hand_form_) {
   3245     os() << rd << ", ";
   3246   }
   3247   os() << rn << ", " << operand;
   3248 }
   3249 
   3250 void Disassembler::sxtb(Condition cond,
   3251                         EncodingSize size,
   3252                         Register rd,
   3253                         const Operand& operand) {
   3254   os().SetCurrentInstruction(kSxtb, kArithmetic);
   3255   os() << ToCString(kSxtb) << ConditionPrinter(it_block_, cond) << size;
   3256   os() << " ";
   3257   if (!rd.Is(operand.GetBaseRegister()) || !use_short_hand_form_) {
   3258     os() << rd << ", ";
   3259   }
   3260   os() << operand;
   3261 }
   3262 
   3263 void Disassembler::sxtb16(Condition cond, Register rd, const Operand& operand) {
   3264   os().SetCurrentInstruction(kSxtb16, kArithmetic);
   3265   os() << ToCString(kSxtb16) << ConditionPrinter(it_block_, cond);
   3266   os() << " ";
   3267   if (!rd.Is(operand.GetBaseRegister()) || !use_short_hand_form_) {
   3268     os() << rd << ", ";
   3269   }
   3270   os() << operand;
   3271 }
   3272 
   3273 void Disassembler::sxth(Condition cond,
   3274                         EncodingSize size,
   3275                         Register rd,
   3276                         const Operand& operand) {
   3277   os().SetCurrentInstruction(kSxth, kArithmetic);
   3278   os() << ToCString(kSxth) << ConditionPrinter(it_block_, cond) << size;
   3279   os() << " ";
   3280   if (!rd.Is(operand.GetBaseRegister()) || !use_short_hand_form_) {
   3281     os() << rd << ", ";
   3282   }
   3283   os() << operand;
   3284 }
   3285 
   3286 void Disassembler::tbb(Condition cond, Register rn, Register rm) {
   3287   os().SetCurrentInstruction(kTbb, kBranch);
   3288   os() << ToCString(kTbb) << ConditionPrinter(it_block_, cond) << " "
   3289        << MemOperand(rn, rm);
   3290 }
   3291 
   3292 void Disassembler::tbh(Condition cond, Register rn, Register rm) {
   3293   os().SetCurrentInstruction(kTbh, kBranch);
   3294   os() << ToCString(kTbh) << ConditionPrinter(it_block_, cond) << " "
   3295        << MemOperand(rn, plus, rm, LSL, 1);
   3296 }
   3297 
   3298 void Disassembler::teq(Condition cond, Register rn, const Operand& operand) {
   3299   os().SetCurrentInstruction(kTeq, kBitwise);
   3300   os() << ToCString(kTeq) << ConditionPrinter(it_block_, cond) << " " << rn
   3301        << ", " << operand;
   3302 }
   3303 
   3304 void Disassembler::tst(Condition cond,
   3305                        EncodingSize size,
   3306                        Register rn,
   3307                        const Operand& operand) {
   3308   os().SetCurrentInstruction(kTst, kBitwise);
   3309   os() << ToCString(kTst) << ConditionPrinter(it_block_, cond) << size << " "
   3310        << rn << ", " << operand;
   3311 }
   3312 
   3313 void Disassembler::uadd16(Condition cond,
   3314                           Register rd,
   3315                           Register rn,
   3316                           Register rm) {
   3317   os().SetCurrentInstruction(kUadd16, kArithmetic);
   3318   os() << ToCString(kUadd16) << ConditionPrinter(it_block_, cond);
   3319   os() << " ";
   3320   if (!rd.Is(rn) || !use_short_hand_form_) {
   3321     os() << rd << ", ";
   3322   }
   3323   os() << rn << ", " << rm;
   3324 }
   3325 
   3326 void Disassembler::uadd8(Condition cond,
   3327                          Register rd,
   3328                          Register rn,
   3329                          Register rm) {
   3330   os().SetCurrentInstruction(kUadd8, kArithmetic);
   3331   os() << ToCString(kUadd8) << ConditionPrinter(it_block_, cond);
   3332   os() << " ";
   3333   if (!rd.Is(rn) || !use_short_hand_form_) {
   3334     os() << rd << ", ";
   3335   }
   3336   os() << rn << ", " << rm;
   3337 }
   3338 
   3339 void Disassembler::uasx(Condition cond, Register rd, Register rn, Register rm) {
   3340   os().SetCurrentInstruction(kUasx, kArithmetic);
   3341   os() << ToCString(kUasx) << ConditionPrinter(it_block_, cond);
   3342   os() << " ";
   3343   if (!rd.Is(rn) || !use_short_hand_form_) {
   3344     os() << rd << ", ";
   3345   }
   3346   os() << rn << ", " << rm;
   3347 }
   3348 
   3349 void Disassembler::ubfx(
   3350     Condition cond, Register rd, Register rn, uint32_t lsb, uint32_t width) {
   3351   os().SetCurrentInstruction(kUbfx, kShift);
   3352   os() << ToCString(kUbfx) << ConditionPrinter(it_block_, cond) << " " << rd
   3353        << ", " << rn << ", " << ImmediatePrinter(lsb) << ", "
   3354        << ImmediatePrinter(width);
   3355 }
   3356 
   3357 void Disassembler::udf(Condition cond, EncodingSize size, uint32_t imm) {
   3358   os().SetCurrentInstruction(kUdf, kNoAttribute);
   3359   os() << ToCString(kUdf) << ConditionPrinter(it_block_, cond) << size << " "
   3360        << RawImmediatePrinter(imm);
   3361 }
   3362 
   3363 void Disassembler::udiv(Condition cond, Register rd, Register rn, Register rm) {
   3364   os().SetCurrentInstruction(kUdiv, kArithmetic);
   3365   os() << ToCString(kUdiv) << ConditionPrinter(it_block_, cond);
   3366   os() << " ";
   3367   if (!rd.Is(rn) || !use_short_hand_form_) {
   3368     os() << rd << ", ";
   3369   }
   3370   os() << rn << ", " << rm;
   3371 }
   3372 
   3373 void Disassembler::uhadd16(Condition cond,
   3374                            Register rd,
   3375                            Register rn,
   3376                            Register rm) {
   3377   os().SetCurrentInstruction(kUhadd16, kArithmetic);
   3378   os() << ToCString(kUhadd16) << ConditionPrinter(it_block_, cond);
   3379   os() << " ";
   3380   if (!rd.Is(rn) || !use_short_hand_form_) {
   3381     os() << rd << ", ";
   3382   }
   3383   os() << rn << ", " << rm;
   3384 }
   3385 
   3386 void Disassembler::uhadd8(Condition cond,
   3387                           Register rd,
   3388                           Register rn,
   3389                           Register rm) {
   3390   os().SetCurrentInstruction(kUhadd8, kArithmetic);
   3391   os() << ToCString(kUhadd8) << ConditionPrinter(it_block_, cond);
   3392   os() << " ";
   3393   if (!rd.Is(rn) || !use_short_hand_form_) {
   3394     os() << rd << ", ";
   3395   }
   3396   os() << rn << ", " << rm;
   3397 }
   3398 
   3399 void Disassembler::uhasx(Condition cond,
   3400                          Register rd,
   3401                          Register rn,
   3402                          Register rm) {
   3403   os().SetCurrentInstruction(kUhasx, kArithmetic);
   3404   os() << ToCString(kUhasx) << ConditionPrinter(it_block_, cond);
   3405   os() << " ";
   3406   if (!rd.Is(rn) || !use_short_hand_form_) {
   3407     os() << rd << ", ";
   3408   }
   3409   os() << rn << ", " << rm;
   3410 }
   3411 
   3412 void Disassembler::uhsax(Condition cond,
   3413                          Register rd,
   3414                          Register rn,
   3415                          Register rm) {
   3416   os().SetCurrentInstruction(kUhsax, kArithmetic);
   3417   os() << ToCString(kUhsax) << ConditionPrinter(it_block_, cond);
   3418   os() << " ";
   3419   if (!rd.Is(rn) || !use_short_hand_form_) {
   3420     os() << rd << ", ";
   3421   }
   3422   os() << rn << ", " << rm;
   3423 }
   3424 
   3425 void Disassembler::uhsub16(Condition cond,
   3426                            Register rd,
   3427                            Register rn,
   3428                            Register rm) {
   3429   os().SetCurrentInstruction(kUhsub16, kArithmetic);
   3430   os() << ToCString(kUhsub16) << ConditionPrinter(it_block_, cond);
   3431   os() << " ";
   3432   if (!rd.Is(rn) || !use_short_hand_form_) {
   3433     os() << rd << ", ";
   3434   }
   3435   os() << rn << ", " << rm;
   3436 }
   3437 
   3438 void Disassembler::uhsub8(Condition cond,
   3439                           Register rd,
   3440                           Register rn,
   3441                           Register rm) {
   3442   os().SetCurrentInstruction(kUhsub8, kArithmetic);
   3443   os() << ToCString(kUhsub8) << ConditionPrinter(it_block_, cond);
   3444   os() << " ";
   3445   if (!rd.Is(rn) || !use_short_hand_form_) {
   3446     os() << rd << ", ";
   3447   }
   3448   os() << rn << ", " << rm;
   3449 }
   3450 
   3451 void Disassembler::umaal(
   3452     Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
   3453   os().SetCurrentInstruction(kUmaal, kArithmetic);
   3454   os() << ToCString(kUmaal) << ConditionPrinter(it_block_, cond) << " " << rdlo
   3455        << ", " << rdhi << ", " << rn << ", " << rm;
   3456 }
   3457 
   3458 void Disassembler::umlal(
   3459     Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
   3460   os().SetCurrentInstruction(kUmlal, kArithmetic);
   3461   os() << ToCString(kUmlal) << ConditionPrinter(it_block_, cond) << " " << rdlo
   3462        << ", " << rdhi << ", " << rn << ", " << rm;
   3463 }
   3464 
   3465 void Disassembler::umlals(
   3466     Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
   3467   os().SetCurrentInstruction(kUmlals, kArithmetic);
   3468   os() << ToCString(kUmlals) << ConditionPrinter(it_block_, cond) << " " << rdlo
   3469        << ", " << rdhi << ", " << rn << ", " << rm;
   3470 }
   3471 
   3472 void Disassembler::umull(
   3473     Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
   3474   os().SetCurrentInstruction(kUmull, kArithmetic);
   3475   os() << ToCString(kUmull) << ConditionPrinter(it_block_, cond) << " " << rdlo
   3476        << ", " << rdhi << ", " << rn << ", " << rm;
   3477 }
   3478 
   3479 void Disassembler::umulls(
   3480     Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
   3481   os().SetCurrentInstruction(kUmulls, kArithmetic);
   3482   os() << ToCString(kUmulls) << ConditionPrinter(it_block_, cond) << " " << rdlo
   3483        << ", " << rdhi << ", " << rn << ", " << rm;
   3484 }
   3485 
   3486 void Disassembler::uqadd16(Condition cond,
   3487                            Register rd,
   3488                            Register rn,
   3489                            Register rm) {
   3490   os().SetCurrentInstruction(kUqadd16, kArithmetic);
   3491   os() << ToCString(kUqadd16) << ConditionPrinter(it_block_, cond);
   3492   os() << " ";
   3493   if (!rd.Is(rn) || !use_short_hand_form_) {
   3494     os() << rd << ", ";
   3495   }
   3496   os() << rn << ", " << rm;
   3497 }
   3498 
   3499 void Disassembler::uqadd8(Condition cond,
   3500                           Register rd,
   3501                           Register rn,
   3502                           Register rm) {
   3503   os().SetCurrentInstruction(kUqadd8, kArithmetic);
   3504   os() << ToCString(kUqadd8) << ConditionPrinter(it_block_, cond);
   3505   os() << " ";
   3506   if (!rd.Is(rn) || !use_short_hand_form_) {
   3507     os() << rd << ", ";
   3508   }
   3509   os() << rn << ", " << rm;
   3510 }
   3511 
   3512 void Disassembler::uqasx(Condition cond,
   3513                          Register rd,
   3514                          Register rn,
   3515                          Register rm) {
   3516   os().SetCurrentInstruction(kUqasx, kArithmetic);
   3517   os() << ToCString(kUqasx) << ConditionPrinter(it_block_, cond);
   3518   os() << " ";
   3519   if (!rd.Is(rn) || !use_short_hand_form_) {
   3520     os() << rd << ", ";
   3521   }
   3522   os() << rn << ", " << rm;
   3523 }
   3524 
   3525 void Disassembler::uqsax(Condition cond,
   3526                          Register rd,
   3527                          Register rn,
   3528                          Register rm) {
   3529   os().SetCurrentInstruction(kUqsax, kArithmetic);
   3530   os() << ToCString(kUqsax) << ConditionPrinter(it_block_, cond);
   3531   os() << " ";
   3532   if (!rd.Is(rn) || !use_short_hand_form_) {
   3533     os() << rd << ", ";
   3534   }
   3535   os() << rn << ", " << rm;
   3536 }
   3537 
   3538 void Disassembler::uqsub16(Condition cond,
   3539                            Register rd,
   3540                            Register rn,
   3541                            Register rm) {
   3542   os().SetCurrentInstruction(kUqsub16, kArithmetic);
   3543   os() << ToCString(kUqsub16) << ConditionPrinter(it_block_, cond);
   3544   os() << " ";
   3545   if (!rd.Is(rn) || !use_short_hand_form_) {
   3546     os() << rd << ", ";
   3547   }
   3548   os() << rn << ", " << rm;
   3549 }
   3550 
   3551 void Disassembler::uqsub8(Condition cond,
   3552                           Register rd,
   3553                           Register rn,
   3554                           Register rm) {
   3555   os().SetCurrentInstruction(kUqsub8, kArithmetic);
   3556   os() << ToCString(kUqsub8) << ConditionPrinter(it_block_, cond);
   3557   os() << " ";
   3558   if (!rd.Is(rn) || !use_short_hand_form_) {
   3559     os() << rd << ", ";
   3560   }
   3561   os() << rn << ", " << rm;
   3562 }
   3563 
   3564 void Disassembler::usad8(Condition cond,
   3565                          Register rd,
   3566                          Register rn,
   3567                          Register rm) {
   3568   os().SetCurrentInstruction(kUsad8, kArithmetic);
   3569   os() << ToCString(kUsad8) << ConditionPrinter(it_block_, cond);
   3570   os() << " ";
   3571   if (!rd.Is(rn) || !use_short_hand_form_) {
   3572     os() << rd << ", ";
   3573   }
   3574   os() << rn << ", " << rm;
   3575 }
   3576 
   3577 void Disassembler::usada8(
   3578     Condition cond, Register rd, Register rn, Register rm, Register ra) {
   3579   os().SetCurrentInstruction(kUsada8, kArithmetic);
   3580   os() << ToCString(kUsada8) << ConditionPrinter(it_block_, cond) << " " << rd
   3581        << ", " << rn << ", " << rm << ", " << ra;
   3582 }
   3583 
   3584 void Disassembler::usat(Condition cond,
   3585                         Register rd,
   3586                         uint32_t imm,
   3587                         const Operand& operand) {
   3588   os().SetCurrentInstruction(kUsat, kArithmetic);
   3589   os() << ToCString(kUsat) << ConditionPrinter(it_block_, cond) << " " << rd
   3590        << ", " << ImmediatePrinter(imm) << ", " << operand;
   3591 }
   3592 
   3593 void Disassembler::usat16(Condition cond,
   3594                           Register rd,
   3595                           uint32_t imm,
   3596                           Register rn) {
   3597   os().SetCurrentInstruction(kUsat16, kArithmetic);
   3598   os() << ToCString(kUsat16) << ConditionPrinter(it_block_, cond) << " " << rd
   3599        << ", " << ImmediatePrinter(imm) << ", " << rn;
   3600 }
   3601 
   3602 void Disassembler::usax(Condition cond, Register rd, Register rn, Register rm) {
   3603   os().SetCurrentInstruction(kUsax, kArithmetic);
   3604   os() << ToCString(kUsax) << ConditionPrinter(it_block_, cond);
   3605   os() << " ";
   3606   if (!rd.Is(rn) || !use_short_hand_form_) {
   3607     os() << rd << ", ";
   3608   }
   3609   os() << rn << ", " << rm;
   3610 }
   3611 
   3612 void Disassembler::usub16(Condition cond,
   3613                           Register rd,
   3614                           Register rn,
   3615                           Register rm) {
   3616   os().SetCurrentInstruction(kUsub16, kArithmetic);
   3617   os() << ToCString(kUsub16) << ConditionPrinter(it_block_, cond);
   3618   os() << " ";
   3619   if (!rd.Is(rn) || !use_short_hand_form_) {
   3620     os() << rd << ", ";
   3621   }
   3622   os() << rn << ", " << rm;
   3623 }
   3624 
   3625 void Disassembler::usub8(Condition cond,
   3626                          Register rd,
   3627                          Register rn,
   3628                          Register rm) {
   3629   os().SetCurrentInstruction(kUsub8, kArithmetic);
   3630   os() << ToCString(kUsub8) << ConditionPrinter(it_block_, cond);
   3631   os() << " ";
   3632   if (!rd.Is(rn) || !use_short_hand_form_) {
   3633     os() << rd << ", ";
   3634   }
   3635   os() << rn << ", " << rm;
   3636 }
   3637 
   3638 void Disassembler::uxtab(Condition cond,
   3639                          Register rd,
   3640                          Register rn,
   3641                          const Operand& operand) {
   3642   os().SetCurrentInstruction(kUxtab, kArithmetic);
   3643   os() << ToCString(kUxtab) << ConditionPrinter(it_block_, cond);
   3644   os() << " ";
   3645   if (!rd.Is(rn) || !use_short_hand_form_) {
   3646     os() << rd << ", ";
   3647   }
   3648   os() << rn << ", " << operand;
   3649 }
   3650 
   3651 void Disassembler::uxtab16(Condition cond,
   3652                            Register rd,
   3653                            Register rn,
   3654                            const Operand& operand) {
   3655   os().SetCurrentInstruction(kUxtab16, kArithmetic);
   3656   os() << ToCString(kUxtab16) << ConditionPrinter(it_block_, cond);
   3657   os() << " ";
   3658   if (!rd.Is(rn) || !use_short_hand_form_) {
   3659     os() << rd << ", ";
   3660   }
   3661   os() << rn << ", " << operand;
   3662 }
   3663 
   3664 void Disassembler::uxtah(Condition cond,
   3665                          Register rd,
   3666                          Register rn,
   3667                          const Operand& operand) {
   3668   os().SetCurrentInstruction(kUxtah, kArithmetic);
   3669   os() << ToCString(kUxtah) << ConditionPrinter(it_block_, cond);
   3670   os() << " ";
   3671   if (!rd.Is(rn) || !use_short_hand_form_) {
   3672     os() << rd << ", ";
   3673   }
   3674   os() << rn << ", " << operand;
   3675 }
   3676 
   3677 void Disassembler::uxtb(Condition cond,
   3678                         EncodingSize size,
   3679                         Register rd,
   3680                         const Operand& operand) {
   3681   os().SetCurrentInstruction(kUxtb, kArithmetic);
   3682   os() << ToCString(kUxtb) << ConditionPrinter(it_block_, cond) << size;
   3683   os() << " ";
   3684   if (!rd.Is(operand.GetBaseRegister()) || !use_short_hand_form_) {
   3685     os() << rd << ", ";
   3686   }
   3687   os() << operand;
   3688 }
   3689 
   3690 void Disassembler::uxtb16(Condition cond, Register rd, const Operand& operand) {
   3691   os().SetCurrentInstruction(kUxtb16, kArithmetic);
   3692   os() << ToCString(kUxtb16) << ConditionPrinter(it_block_, cond);
   3693   os() << " ";
   3694   if (!rd.Is(operand.GetBaseRegister()) || !use_short_hand_form_) {
   3695     os() << rd << ", ";
   3696   }
   3697   os() << operand;
   3698 }
   3699 
   3700 void Disassembler::uxth(Condition cond,
   3701                         EncodingSize size,
   3702                         Register rd,
   3703                         const Operand& operand) {
   3704   os().SetCurrentInstruction(kUxth, kArithmetic);
   3705   os() << ToCString(kUxth) << ConditionPrinter(it_block_, cond) << size;
   3706   os() << " ";
   3707   if (!rd.Is(operand.GetBaseRegister()) || !use_short_hand_form_) {
   3708     os() << rd << ", ";
   3709   }
   3710   os() << operand;
   3711 }
   3712 
   3713 void Disassembler::vaba(
   3714     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   3715   os().SetCurrentInstruction(kVaba, kFpNeon);
   3716   os() << ToCString(kVaba) << ConditionPrinter(it_block_, cond) << dt << " "
   3717        << rd << ", " << rn << ", " << rm;
   3718 }
   3719 
   3720 void Disassembler::vaba(
   3721     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   3722   os().SetCurrentInstruction(kVaba, kFpNeon);
   3723   os() << ToCString(kVaba) << ConditionPrinter(it_block_, cond) << dt << " "
   3724        << rd << ", " << rn << ", " << rm;
   3725 }
   3726 
   3727 void Disassembler::vabal(
   3728     Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
   3729   os().SetCurrentInstruction(kVabal, kFpNeon);
   3730   os() << ToCString(kVabal) << ConditionPrinter(it_block_, cond) << dt << " "
   3731        << rd << ", " << rn << ", " << rm;
   3732 }
   3733 
   3734 void Disassembler::vabd(
   3735     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   3736   os().SetCurrentInstruction(kVabd, kFpNeon);
   3737   os() << ToCString(kVabd) << ConditionPrinter(it_block_, cond) << dt;
   3738   os() << " ";
   3739   if (!rd.Is(rn) || !use_short_hand_form_) {
   3740     os() << rd << ", ";
   3741   }
   3742   os() << rn << ", " << rm;
   3743 }
   3744 
   3745 void Disassembler::vabd(
   3746     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   3747   os().SetCurrentInstruction(kVabd, kFpNeon);
   3748   os() << ToCString(kVabd) << ConditionPrinter(it_block_, cond) << dt;
   3749   os() << " ";
   3750   if (!rd.Is(rn) || !use_short_hand_form_) {
   3751     os() << rd << ", ";
   3752   }
   3753   os() << rn << ", " << rm;
   3754 }
   3755 
   3756 void Disassembler::vabdl(
   3757     Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
   3758   os().SetCurrentInstruction(kVabdl, kFpNeon);
   3759   os() << ToCString(kVabdl) << ConditionPrinter(it_block_, cond) << dt << " "
   3760        << rd << ", " << rn << ", " << rm;
   3761 }
   3762 
   3763 void Disassembler::vabs(Condition cond,
   3764                         DataType dt,
   3765                         DRegister rd,
   3766                         DRegister rm) {
   3767   os().SetCurrentInstruction(kVabs, kFpNeon);
   3768   os() << ToCString(kVabs) << ConditionPrinter(it_block_, cond) << dt << " "
   3769        << rd << ", " << rm;
   3770 }
   3771 
   3772 void Disassembler::vabs(Condition cond,
   3773                         DataType dt,
   3774                         QRegister rd,
   3775                         QRegister rm) {
   3776   os().SetCurrentInstruction(kVabs, kFpNeon);
   3777   os() << ToCString(kVabs) << ConditionPrinter(it_block_, cond) << dt << " "
   3778        << rd << ", " << rm;
   3779 }
   3780 
   3781 void Disassembler::vabs(Condition cond,
   3782                         DataType dt,
   3783                         SRegister rd,
   3784                         SRegister rm) {
   3785   os().SetCurrentInstruction(kVabs, kFpNeon);
   3786   os() << ToCString(kVabs) << ConditionPrinter(it_block_, cond) << dt << " "
   3787        << rd << ", " << rm;
   3788 }
   3789 
   3790 void Disassembler::vacge(
   3791     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   3792   os().SetCurrentInstruction(kVacge, kFpNeon);
   3793   os() << ToCString(kVacge) << ConditionPrinter(it_block_, cond) << dt;
   3794   os() << " ";
   3795   if (!rd.Is(rn) || !use_short_hand_form_) {
   3796     os() << rd << ", ";
   3797   }
   3798   os() << rn << ", " << rm;
   3799 }
   3800 
   3801 void Disassembler::vacge(
   3802     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   3803   os().SetCurrentInstruction(kVacge, kFpNeon);
   3804   os() << ToCString(kVacge) << ConditionPrinter(it_block_, cond) << dt;
   3805   os() << " ";
   3806   if (!rd.Is(rn) || !use_short_hand_form_) {
   3807     os() << rd << ", ";
   3808   }
   3809   os() << rn << ", " << rm;
   3810 }
   3811 
   3812 void Disassembler::vacgt(
   3813     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   3814   os().SetCurrentInstruction(kVacgt, kFpNeon);
   3815   os() << ToCString(kVacgt) << ConditionPrinter(it_block_, cond) << dt;
   3816   os() << " ";
   3817   if (!rd.Is(rn) || !use_short_hand_form_) {
   3818     os() << rd << ", ";
   3819   }
   3820   os() << rn << ", " << rm;
   3821 }
   3822 
   3823 void Disassembler::vacgt(
   3824     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   3825   os().SetCurrentInstruction(kVacgt, kFpNeon);
   3826   os() << ToCString(kVacgt) << ConditionPrinter(it_block_, cond) << dt;
   3827   os() << " ";
   3828   if (!rd.Is(rn) || !use_short_hand_form_) {
   3829     os() << rd << ", ";
   3830   }
   3831   os() << rn << ", " << rm;
   3832 }
   3833 
   3834 void Disassembler::vacle(
   3835     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   3836   os().SetCurrentInstruction(kVacle, kFpNeon);
   3837   os() << ToCString(kVacle) << ConditionPrinter(it_block_, cond) << dt;
   3838   os() << " ";
   3839   if (!rd.Is(rn) || !use_short_hand_form_) {
   3840     os() << rd << ", ";
   3841   }
   3842   os() << rn << ", " << rm;
   3843 }
   3844 
   3845 void Disassembler::vacle(
   3846     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   3847   os().SetCurrentInstruction(kVacle, kFpNeon);
   3848   os() << ToCString(kVacle) << ConditionPrinter(it_block_, cond) << dt;
   3849   os() << " ";
   3850   if (!rd.Is(rn) || !use_short_hand_form_) {
   3851     os() << rd << ", ";
   3852   }
   3853   os() << rn << ", " << rm;
   3854 }
   3855 
   3856 void Disassembler::vaclt(
   3857     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   3858   os().SetCurrentInstruction(kVaclt, kFpNeon);
   3859   os() << ToCString(kVaclt) << ConditionPrinter(it_block_, cond) << dt;
   3860   os() << " ";
   3861   if (!rd.Is(rn) || !use_short_hand_form_) {
   3862     os() << rd << ", ";
   3863   }
   3864   os() << rn << ", " << rm;
   3865 }
   3866 
   3867 void Disassembler::vaclt(
   3868     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   3869   os().SetCurrentInstruction(kVaclt, kFpNeon);
   3870   os() << ToCString(kVaclt) << ConditionPrinter(it_block_, cond) << dt;
   3871   os() << " ";
   3872   if (!rd.Is(rn) || !use_short_hand_form_) {
   3873     os() << rd << ", ";
   3874   }
   3875   os() << rn << ", " << rm;
   3876 }
   3877 
   3878 void Disassembler::vadd(
   3879     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   3880   os().SetCurrentInstruction(kVadd, kFpNeon);
   3881   os() << ToCString(kVadd) << ConditionPrinter(it_block_, cond) << dt;
   3882   os() << " ";
   3883   if (!rd.Is(rn) || !use_short_hand_form_) {
   3884     os() << rd << ", ";
   3885   }
   3886   os() << rn << ", " << rm;
   3887 }
   3888 
   3889 void Disassembler::vadd(
   3890     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   3891   os().SetCurrentInstruction(kVadd, kFpNeon);
   3892   os() << ToCString(kVadd) << ConditionPrinter(it_block_, cond) << dt;
   3893   os() << " ";
   3894   if (!rd.Is(rn) || !use_short_hand_form_) {
   3895     os() << rd << ", ";
   3896   }
   3897   os() << rn << ", " << rm;
   3898 }
   3899 
   3900 void Disassembler::vadd(
   3901     Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
   3902   os().SetCurrentInstruction(kVadd, kFpNeon);
   3903   os() << ToCString(kVadd) << ConditionPrinter(it_block_, cond) << dt;
   3904   os() << " ";
   3905   if (!rd.Is(rn) || !use_short_hand_form_) {
   3906     os() << rd << ", ";
   3907   }
   3908   os() << rn << ", " << rm;
   3909 }
   3910 
   3911 void Disassembler::vaddhn(
   3912     Condition cond, DataType dt, DRegister rd, QRegister rn, QRegister rm) {
   3913   os().SetCurrentInstruction(kVaddhn, kFpNeon);
   3914   os() << ToCString(kVaddhn) << ConditionPrinter(it_block_, cond) << dt << " "
   3915        << rd << ", " << rn << ", " << rm;
   3916 }
   3917 
   3918 void Disassembler::vaddl(
   3919     Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
   3920   os().SetCurrentInstruction(kVaddl, kFpNeon);
   3921   os() << ToCString(kVaddl) << ConditionPrinter(it_block_, cond) << dt << " "
   3922        << rd << ", " << rn << ", " << rm;
   3923 }
   3924 
   3925 void Disassembler::vaddw(
   3926     Condition cond, DataType dt, QRegister rd, QRegister rn, DRegister rm) {
   3927   os().SetCurrentInstruction(kVaddw, kFpNeon);
   3928   os() << ToCString(kVaddw) << ConditionPrinter(it_block_, cond) << dt;
   3929   os() << " ";
   3930   if (!rd.Is(rn) || !use_short_hand_form_) {
   3931     os() << rd << ", ";
   3932   }
   3933   os() << rn << ", " << rm;
   3934 }
   3935 
   3936 void Disassembler::vand(Condition cond,
   3937                         DataType dt,
   3938                         DRegister rd,
   3939                         DRegister rn,
   3940                         const DOperand& operand) {
   3941   os().SetCurrentInstruction(kVand, kFpNeon);
   3942   os() << ToCString(kVand) << ConditionPrinter(it_block_, cond) << dt;
   3943   os() << " ";
   3944   if (!rd.Is(rn) || !use_short_hand_form_) {
   3945     os() << rd << ", ";
   3946   }
   3947   os() << rn << ", " << operand;
   3948 }
   3949 
   3950 void Disassembler::vand(Condition cond,
   3951                         DataType dt,
   3952                         QRegister rd,
   3953                         QRegister rn,
   3954                         const QOperand& operand) {
   3955   os().SetCurrentInstruction(kVand, kFpNeon);
   3956   os() << ToCString(kVand) << ConditionPrinter(it_block_, cond) << dt;
   3957   os() << " ";
   3958   if (!rd.Is(rn) || !use_short_hand_form_) {
   3959     os() << rd << ", ";
   3960   }
   3961   os() << rn << ", " << operand;
   3962 }
   3963 
   3964 void Disassembler::vbic(Condition cond,
   3965                         DataType dt,
   3966                         DRegister rd,
   3967                         DRegister rn,
   3968                         const DOperand& operand) {
   3969   os().SetCurrentInstruction(kVbic, kFpNeon);
   3970   os() << ToCString(kVbic) << ConditionPrinter(it_block_, cond) << dt;
   3971   os() << " ";
   3972   if (!rd.Is(rn) || !use_short_hand_form_) {
   3973     os() << rd << ", ";
   3974   }
   3975   os() << rn << ", " << operand;
   3976 }
   3977 
   3978 void Disassembler::vbic(Condition cond,
   3979                         DataType dt,
   3980                         QRegister rd,
   3981                         QRegister rn,
   3982                         const QOperand& operand) {
   3983   os().SetCurrentInstruction(kVbic, kFpNeon);
   3984   os() << ToCString(kVbic) << ConditionPrinter(it_block_, cond) << dt;
   3985   os() << " ";
   3986   if (!rd.Is(rn) || !use_short_hand_form_) {
   3987     os() << rd << ", ";
   3988   }
   3989   os() << rn << ", " << operand;
   3990 }
   3991 
   3992 void Disassembler::vbif(
   3993     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   3994   os().SetCurrentInstruction(kVbif, kFpNeon);
   3995   os() << ToCString(kVbif) << ConditionPrinter(it_block_, cond) << dt;
   3996   os() << " ";
   3997   if (!rd.Is(rn) || !use_short_hand_form_) {
   3998     os() << rd << ", ";
   3999   }
   4000   os() << rn << ", " << rm;
   4001 }
   4002 
   4003 void Disassembler::vbif(
   4004     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   4005   os().SetCurrentInstruction(kVbif, kFpNeon);
   4006   os() << ToCString(kVbif) << ConditionPrinter(it_block_, cond) << dt;
   4007   os() << " ";
   4008   if (!rd.Is(rn) || !use_short_hand_form_) {
   4009     os() << rd << ", ";
   4010   }
   4011   os() << rn << ", " << rm;
   4012 }
   4013 
   4014 void Disassembler::vbit(
   4015     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   4016   os().SetCurrentInstruction(kVbit, kFpNeon);
   4017   os() << ToCString(kVbit) << ConditionPrinter(it_block_, cond) << dt;
   4018   os() << " ";
   4019   if (!rd.Is(rn) || !use_short_hand_form_) {
   4020     os() << rd << ", ";
   4021   }
   4022   os() << rn << ", " << rm;
   4023 }
   4024 
   4025 void Disassembler::vbit(
   4026     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   4027   os().SetCurrentInstruction(kVbit, kFpNeon);
   4028   os() << ToCString(kVbit) << ConditionPrinter(it_block_, cond) << dt;
   4029   os() << " ";
   4030   if (!rd.Is(rn) || !use_short_hand_form_) {
   4031     os() << rd << ", ";
   4032   }
   4033   os() << rn << ", " << rm;
   4034 }
   4035 
   4036 void Disassembler::vbsl(
   4037     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   4038   os().SetCurrentInstruction(kVbsl, kFpNeon);
   4039   os() << ToCString(kVbsl) << ConditionPrinter(it_block_, cond) << dt;
   4040   os() << " ";
   4041   if (!rd.Is(rn) || !use_short_hand_form_) {
   4042     os() << rd << ", ";
   4043   }
   4044   os() << rn << ", " << rm;
   4045 }
   4046 
   4047 void Disassembler::vbsl(
   4048     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   4049   os().SetCurrentInstruction(kVbsl, kFpNeon);
   4050   os() << ToCString(kVbsl) << ConditionPrinter(it_block_, cond) << dt;
   4051   os() << " ";
   4052   if (!rd.Is(rn) || !use_short_hand_form_) {
   4053     os() << rd << ", ";
   4054   }
   4055   os() << rn << ", " << rm;
   4056 }
   4057 
   4058 void Disassembler::vceq(Condition cond,
   4059                         DataType dt,
   4060                         DRegister rd,
   4061                         DRegister rm,
   4062                         const DOperand& operand) {
   4063   os().SetCurrentInstruction(kVceq, kFpNeon);
   4064   os() << ToCString(kVceq) << ConditionPrinter(it_block_, cond) << dt;
   4065   os() << " ";
   4066   if (!rd.Is(rm) || !use_short_hand_form_) {
   4067     os() << rd << ", ";
   4068   }
   4069   os() << rm << ", " << operand;
   4070 }
   4071 
   4072 void Disassembler::vceq(Condition cond,
   4073                         DataType dt,
   4074                         QRegister rd,
   4075                         QRegister rm,
   4076                         const QOperand& operand) {
   4077   os().SetCurrentInstruction(kVceq, kFpNeon);
   4078   os() << ToCString(kVceq) << ConditionPrinter(it_block_, cond) << dt;
   4079   os() << " ";
   4080   if (!rd.Is(rm) || !use_short_hand_form_) {
   4081     os() << rd << ", ";
   4082   }
   4083   os() << rm << ", " << operand;
   4084 }
   4085 
   4086 void Disassembler::vceq(
   4087     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   4088   os().SetCurrentInstruction(kVceq, kFpNeon);
   4089   os() << ToCString(kVceq) << ConditionPrinter(it_block_, cond) << dt;
   4090   os() << " ";
   4091   if (!rd.Is(rn) || !use_short_hand_form_) {
   4092     os() << rd << ", ";
   4093   }
   4094   os() << rn << ", " << rm;
   4095 }
   4096 
   4097 void Disassembler::vceq(
   4098     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   4099   os().SetCurrentInstruction(kVceq, kFpNeon);
   4100   os() << ToCString(kVceq) << ConditionPrinter(it_block_, cond) << dt;
   4101   os() << " ";
   4102   if (!rd.Is(rn) || !use_short_hand_form_) {
   4103     os() << rd << ", ";
   4104   }
   4105   os() << rn << ", " << rm;
   4106 }
   4107 
   4108 void Disassembler::vcge(Condition cond,
   4109                         DataType dt,
   4110                         DRegister rd,
   4111                         DRegister rm,
   4112                         const DOperand& operand) {
   4113   os().SetCurrentInstruction(kVcge, kFpNeon);
   4114   os() << ToCString(kVcge) << ConditionPrinter(it_block_, cond) << dt;
   4115   os() << " ";
   4116   if (!rd.Is(rm) || !use_short_hand_form_) {
   4117     os() << rd << ", ";
   4118   }
   4119   os() << rm << ", " << operand;
   4120 }
   4121 
   4122 void Disassembler::vcge(Condition cond,
   4123                         DataType dt,
   4124                         QRegister rd,
   4125                         QRegister rm,
   4126                         const QOperand& operand) {
   4127   os().SetCurrentInstruction(kVcge, kFpNeon);
   4128   os() << ToCString(kVcge) << ConditionPrinter(it_block_, cond) << dt;
   4129   os() << " ";
   4130   if (!rd.Is(rm) || !use_short_hand_form_) {
   4131     os() << rd << ", ";
   4132   }
   4133   os() << rm << ", " << operand;
   4134 }
   4135 
   4136 void Disassembler::vcge(
   4137     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   4138   os().SetCurrentInstruction(kVcge, kFpNeon);
   4139   os() << ToCString(kVcge) << ConditionPrinter(it_block_, cond) << dt;
   4140   os() << " ";
   4141   if (!rd.Is(rn) || !use_short_hand_form_) {
   4142     os() << rd << ", ";
   4143   }
   4144   os() << rn << ", " << rm;
   4145 }
   4146 
   4147 void Disassembler::vcge(
   4148     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   4149   os().SetCurrentInstruction(kVcge, kFpNeon);
   4150   os() << ToCString(kVcge) << ConditionPrinter(it_block_, cond) << dt;
   4151   os() << " ";
   4152   if (!rd.Is(rn) || !use_short_hand_form_) {
   4153     os() << rd << ", ";
   4154   }
   4155   os() << rn << ", " << rm;
   4156 }
   4157 
   4158 void Disassembler::vcgt(Condition cond,
   4159                         DataType dt,
   4160                         DRegister rd,
   4161                         DRegister rm,
   4162                         const DOperand& operand) {
   4163   os().SetCurrentInstruction(kVcgt, kFpNeon);
   4164   os() << ToCString(kVcgt) << ConditionPrinter(it_block_, cond) << dt;
   4165   os() << " ";
   4166   if (!rd.Is(rm) || !use_short_hand_form_) {
   4167     os() << rd << ", ";
   4168   }
   4169   os() << rm << ", " << operand;
   4170 }
   4171 
   4172 void Disassembler::vcgt(Condition cond,
   4173                         DataType dt,
   4174                         QRegister rd,
   4175                         QRegister rm,
   4176                         const QOperand& operand) {
   4177   os().SetCurrentInstruction(kVcgt, kFpNeon);
   4178   os() << ToCString(kVcgt) << ConditionPrinter(it_block_, cond) << dt;
   4179   os() << " ";
   4180   if (!rd.Is(rm) || !use_short_hand_form_) {
   4181     os() << rd << ", ";
   4182   }
   4183   os() << rm << ", " << operand;
   4184 }
   4185 
   4186 void Disassembler::vcgt(
   4187     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   4188   os().SetCurrentInstruction(kVcgt, kFpNeon);
   4189   os() << ToCString(kVcgt) << ConditionPrinter(it_block_, cond) << dt;
   4190   os() << " ";
   4191   if (!rd.Is(rn) || !use_short_hand_form_) {
   4192     os() << rd << ", ";
   4193   }
   4194   os() << rn << ", " << rm;
   4195 }
   4196 
   4197 void Disassembler::vcgt(
   4198     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   4199   os().SetCurrentInstruction(kVcgt, kFpNeon);
   4200   os() << ToCString(kVcgt) << ConditionPrinter(it_block_, cond) << dt;
   4201   os() << " ";
   4202   if (!rd.Is(rn) || !use_short_hand_form_) {
   4203     os() << rd << ", ";
   4204   }
   4205   os() << rn << ", " << rm;
   4206 }
   4207 
   4208 void Disassembler::vcle(Condition cond,
   4209                         DataType dt,
   4210                         DRegister rd,
   4211                         DRegister rm,
   4212                         const DOperand& operand) {
   4213   os().SetCurrentInstruction(kVcle, kFpNeon);
   4214   os() << ToCString(kVcle) << ConditionPrinter(it_block_, cond) << dt;
   4215   os() << " ";
   4216   if (!rd.Is(rm) || !use_short_hand_form_) {
   4217     os() << rd << ", ";
   4218   }
   4219   os() << rm << ", " << operand;
   4220 }
   4221 
   4222 void Disassembler::vcle(Condition cond,
   4223                         DataType dt,
   4224                         QRegister rd,
   4225                         QRegister rm,
   4226                         const QOperand& operand) {
   4227   os().SetCurrentInstruction(kVcle, kFpNeon);
   4228   os() << ToCString(kVcle) << ConditionPrinter(it_block_, cond) << dt;
   4229   os() << " ";
   4230   if (!rd.Is(rm) || !use_short_hand_form_) {
   4231     os() << rd << ", ";
   4232   }
   4233   os() << rm << ", " << operand;
   4234 }
   4235 
   4236 void Disassembler::vcle(
   4237     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   4238   os().SetCurrentInstruction(kVcle, kFpNeon);
   4239   os() << ToCString(kVcle) << ConditionPrinter(it_block_, cond) << dt;
   4240   os() << " ";
   4241   if (!rd.Is(rn) || !use_short_hand_form_) {
   4242     os() << rd << ", ";
   4243   }
   4244   os() << rn << ", " << rm;
   4245 }
   4246 
   4247 void Disassembler::vcle(
   4248     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   4249   os().SetCurrentInstruction(kVcle, kFpNeon);
   4250   os() << ToCString(kVcle) << ConditionPrinter(it_block_, cond) << dt;
   4251   os() << " ";
   4252   if (!rd.Is(rn) || !use_short_hand_form_) {
   4253     os() << rd << ", ";
   4254   }
   4255   os() << rn << ", " << rm;
   4256 }
   4257 
   4258 void Disassembler::vcls(Condition cond,
   4259                         DataType dt,
   4260                         DRegister rd,
   4261                         DRegister rm) {
   4262   os().SetCurrentInstruction(kVcls, kFpNeon);
   4263   os() << ToCString(kVcls) << ConditionPrinter(it_block_, cond) << dt << " "
   4264        << rd << ", " << rm;
   4265 }
   4266 
   4267 void Disassembler::vcls(Condition cond,
   4268                         DataType dt,
   4269                         QRegister rd,
   4270                         QRegister rm) {
   4271   os().SetCurrentInstruction(kVcls, kFpNeon);
   4272   os() << ToCString(kVcls) << ConditionPrinter(it_block_, cond) << dt << " "
   4273        << rd << ", " << rm;
   4274 }
   4275 
   4276 void Disassembler::vclt(Condition cond,
   4277                         DataType dt,
   4278                         DRegister rd,
   4279                         DRegister rm,
   4280                         const DOperand& operand) {
   4281   os().SetCurrentInstruction(kVclt, kFpNeon);
   4282   os() << ToCString(kVclt) << ConditionPrinter(it_block_, cond) << dt;
   4283   os() << " ";
   4284   if (!rd.Is(rm) || !use_short_hand_form_) {
   4285     os() << rd << ", ";
   4286   }
   4287   os() << rm << ", " << operand;
   4288 }
   4289 
   4290 void Disassembler::vclt(Condition cond,
   4291                         DataType dt,
   4292                         QRegister rd,
   4293                         QRegister rm,
   4294                         const QOperand& operand) {
   4295   os().SetCurrentInstruction(kVclt, kFpNeon);
   4296   os() << ToCString(kVclt) << ConditionPrinter(it_block_, cond) << dt;
   4297   os() << " ";
   4298   if (!rd.Is(rm) || !use_short_hand_form_) {
   4299     os() << rd << ", ";
   4300   }
   4301   os() << rm << ", " << operand;
   4302 }
   4303 
   4304 void Disassembler::vclt(
   4305     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   4306   os().SetCurrentInstruction(kVclt, kFpNeon);
   4307   os() << ToCString(kVclt) << ConditionPrinter(it_block_, cond) << dt;
   4308   os() << " ";
   4309   if (!rd.Is(rn) || !use_short_hand_form_) {
   4310     os() << rd << ", ";
   4311   }
   4312   os() << rn << ", " << rm;
   4313 }
   4314 
   4315 void Disassembler::vclt(
   4316     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   4317   os().SetCurrentInstruction(kVclt, kFpNeon);
   4318   os() << ToCString(kVclt) << ConditionPrinter(it_block_, cond) << dt;
   4319   os() << " ";
   4320   if (!rd.Is(rn) || !use_short_hand_form_) {
   4321     os() << rd << ", ";
   4322   }
   4323   os() << rn << ", " << rm;
   4324 }
   4325 
   4326 void Disassembler::vclz(Condition cond,
   4327                         DataType dt,
   4328                         DRegister rd,
   4329                         DRegister rm) {
   4330   os().SetCurrentInstruction(kVclz, kFpNeon);
   4331   os() << ToCString(kVclz) << ConditionPrinter(it_block_, cond) << dt << " "
   4332        << rd << ", " << rm;
   4333 }
   4334 
   4335 void Disassembler::vclz(Condition cond,
   4336                         DataType dt,
   4337                         QRegister rd,
   4338                         QRegister rm) {
   4339   os().SetCurrentInstruction(kVclz, kFpNeon);
   4340   os() << ToCString(kVclz) << ConditionPrinter(it_block_, cond) << dt << " "
   4341        << rd << ", " << rm;
   4342 }
   4343 
   4344 void Disassembler::vcmp(Condition cond,
   4345                         DataType dt,
   4346                         SRegister rd,
   4347                         const SOperand& operand) {
   4348   os().SetCurrentInstruction(kVcmp, kFpNeon);
   4349   os() << ToCString(kVcmp) << ConditionPrinter(it_block_, cond) << dt << " "
   4350        << rd << ", " << operand;
   4351 }
   4352 
   4353 void Disassembler::vcmp(Condition cond,
   4354                         DataType dt,
   4355                         DRegister rd,
   4356                         const DOperand& operand) {
   4357   os().SetCurrentInstruction(kVcmp, kFpNeon);
   4358   os() << ToCString(kVcmp) << ConditionPrinter(it_block_, cond) << dt << " "
   4359        << rd << ", " << operand;
   4360 }
   4361 
   4362 void Disassembler::vcmpe(Condition cond,
   4363                          DataType dt,
   4364                          SRegister rd,
   4365                          const SOperand& operand) {
   4366   os().SetCurrentInstruction(kVcmpe, kFpNeon);
   4367   os() << ToCString(kVcmpe) << ConditionPrinter(it_block_, cond) << dt << " "
   4368        << rd << ", " << operand;
   4369 }
   4370 
   4371 void Disassembler::vcmpe(Condition cond,
   4372                          DataType dt,
   4373                          DRegister rd,
   4374                          const DOperand& operand) {
   4375   os().SetCurrentInstruction(kVcmpe, kFpNeon);
   4376   os() << ToCString(kVcmpe) << ConditionPrinter(it_block_, cond) << dt << " "
   4377        << rd << ", " << operand;
   4378 }
   4379 
   4380 void Disassembler::vcnt(Condition cond,
   4381                         DataType dt,
   4382                         DRegister rd,
   4383                         DRegister rm) {
   4384   os().SetCurrentInstruction(kVcnt, kFpNeon);
   4385   os() << ToCString(kVcnt) << ConditionPrinter(it_block_, cond) << dt << " "
   4386        << rd << ", " << rm;
   4387 }
   4388 
   4389 void Disassembler::vcnt(Condition cond,
   4390                         DataType dt,
   4391                         QRegister rd,
   4392                         QRegister rm) {
   4393   os().SetCurrentInstruction(kVcnt, kFpNeon);
   4394   os() << ToCString(kVcnt) << ConditionPrinter(it_block_, cond) << dt << " "
   4395        << rd << ", " << rm;
   4396 }
   4397 
   4398 void Disassembler::vcvt(
   4399     Condition cond, DataType dt1, DataType dt2, DRegister rd, SRegister rm) {
   4400   os().SetCurrentInstruction(kVcvt, kFpNeon);
   4401   os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2
   4402        << " " << rd << ", " << rm;
   4403 }
   4404 
   4405 void Disassembler::vcvt(
   4406     Condition cond, DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
   4407   os().SetCurrentInstruction(kVcvt, kFpNeon);
   4408   os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2
   4409        << " " << rd << ", " << rm;
   4410 }
   4411 
   4412 void Disassembler::vcvt(Condition cond,
   4413                         DataType dt1,
   4414                         DataType dt2,
   4415                         DRegister rd,
   4416                         DRegister rm,
   4417                         int32_t fbits) {
   4418   os().SetCurrentInstruction(kVcvt, kFpNeon);
   4419   os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2
   4420        << " " << rd << ", " << rm << ", " << SignedImmediatePrinter(fbits);
   4421 }
   4422 
   4423 void Disassembler::vcvt(Condition cond,
   4424                         DataType dt1,
   4425                         DataType dt2,
   4426                         QRegister rd,
   4427                         QRegister rm,
   4428                         int32_t fbits) {
   4429   os().SetCurrentInstruction(kVcvt, kFpNeon);
   4430   os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2
   4431        << " " << rd << ", " << rm << ", " << SignedImmediatePrinter(fbits);
   4432 }
   4433 
   4434 void Disassembler::vcvt(Condition cond,
   4435                         DataType dt1,
   4436                         DataType dt2,
   4437                         SRegister rd,
   4438                         SRegister rm,
   4439                         int32_t fbits) {
   4440   os().SetCurrentInstruction(kVcvt, kFpNeon);
   4441   os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2
   4442        << " " << rd << ", " << rm << ", " << SignedImmediatePrinter(fbits);
   4443 }
   4444 
   4445 void Disassembler::vcvt(
   4446     Condition cond, DataType dt1, DataType dt2, DRegister rd, DRegister rm) {
   4447   os().SetCurrentInstruction(kVcvt, kFpNeon);
   4448   os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2
   4449        << " " << rd << ", " << rm;
   4450 }
   4451 
   4452 void Disassembler::vcvt(
   4453     Condition cond, DataType dt1, DataType dt2, QRegister rd, QRegister rm) {
   4454   os().SetCurrentInstruction(kVcvt, kFpNeon);
   4455   os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2
   4456        << " " << rd << ", " << rm;
   4457 }
   4458 
   4459 void Disassembler::vcvt(
   4460     Condition cond, DataType dt1, DataType dt2, DRegister rd, QRegister rm) {
   4461   os().SetCurrentInstruction(kVcvt, kFpNeon);
   4462   os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2
   4463        << " " << rd << ", " << rm;
   4464 }
   4465 
   4466 void Disassembler::vcvt(
   4467     Condition cond, DataType dt1, DataType dt2, QRegister rd, DRegister rm) {
   4468   os().SetCurrentInstruction(kVcvt, kFpNeon);
   4469   os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2
   4470        << " " << rd << ", " << rm;
   4471 }
   4472 
   4473 void Disassembler::vcvt(
   4474     Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
   4475   os().SetCurrentInstruction(kVcvt, kFpNeon);
   4476   os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2
   4477        << " " << rd << ", " << rm;
   4478 }
   4479 
   4480 void Disassembler::vcvta(DataType dt1,
   4481                          DataType dt2,
   4482                          DRegister rd,
   4483                          DRegister rm) {
   4484   os().SetCurrentInstruction(kVcvta, kFpNeon);
   4485   os() << ToCString(kVcvta) << dt1 << dt2 << " " << rd << ", " << rm;
   4486 }
   4487 
   4488 void Disassembler::vcvta(DataType dt1,
   4489                          DataType dt2,
   4490                          QRegister rd,
   4491                          QRegister rm) {
   4492   os().SetCurrentInstruction(kVcvta, kFpNeon);
   4493   os() << ToCString(kVcvta) << dt1 << dt2 << " " << rd << ", " << rm;
   4494 }
   4495 
   4496 void Disassembler::vcvta(DataType dt1,
   4497                          DataType dt2,
   4498                          SRegister rd,
   4499                          SRegister rm) {
   4500   os().SetCurrentInstruction(kVcvta, kFpNeon);
   4501   os() << ToCString(kVcvta) << dt1 << dt2 << " " << rd << ", " << rm;
   4502 }
   4503 
   4504 void Disassembler::vcvta(DataType dt1,
   4505                          DataType dt2,
   4506                          SRegister rd,
   4507                          DRegister rm) {
   4508   os().SetCurrentInstruction(kVcvta, kFpNeon);
   4509   os() << ToCString(kVcvta) << dt1 << dt2 << " " << rd << ", " << rm;
   4510 }
   4511 
   4512 void Disassembler::vcvtb(
   4513     Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
   4514   os().SetCurrentInstruction(kVcvtb, kFpNeon);
   4515   os() << ToCString(kVcvtb) << ConditionPrinter(it_block_, cond) << dt1 << dt2
   4516        << " " << rd << ", " << rm;
   4517 }
   4518 
   4519 void Disassembler::vcvtb(
   4520     Condition cond, DataType dt1, DataType dt2, DRegister rd, SRegister rm) {
   4521   os().SetCurrentInstruction(kVcvtb, kFpNeon);
   4522   os() << ToCString(kVcvtb) << ConditionPrinter(it_block_, cond) << dt1 << dt2
   4523        << " " << rd << ", " << rm;
   4524 }
   4525 
   4526 void Disassembler::vcvtb(
   4527     Condition cond, DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
   4528   os().SetCurrentInstruction(kVcvtb, kFpNeon);
   4529   os() << ToCString(kVcvtb) << ConditionPrinter(it_block_, cond) << dt1 << dt2
   4530        << " " << rd << ", " << rm;
   4531 }
   4532 
   4533 void Disassembler::vcvtm(DataType dt1,
   4534                          DataType dt2,
   4535                          DRegister rd,
   4536                          DRegister rm) {
   4537   os().SetCurrentInstruction(kVcvtm, kFpNeon);
   4538   os() << ToCString(kVcvtm) << dt1 << dt2 << " " << rd << ", " << rm;
   4539 }
   4540 
   4541 void Disassembler::vcvtm(DataType dt1,
   4542                          DataType dt2,
   4543                          QRegister rd,
   4544                          QRegister rm) {
   4545   os().SetCurrentInstruction(kVcvtm, kFpNeon);
   4546   os() << ToCString(kVcvtm) << dt1 << dt2 << " " << rd << ", " << rm;
   4547 }
   4548 
   4549 void Disassembler::vcvtm(DataType dt1,
   4550                          DataType dt2,
   4551                          SRegister rd,
   4552                          SRegister rm) {
   4553   os().SetCurrentInstruction(kVcvtm, kFpNeon);
   4554   os() << ToCString(kVcvtm) << dt1 << dt2 << " " << rd << ", " << rm;
   4555 }
   4556 
   4557 void Disassembler::vcvtm(DataType dt1,
   4558                          DataType dt2,
   4559                          SRegister rd,
   4560                          DRegister rm) {
   4561   os().SetCurrentInstruction(kVcvtm, kFpNeon);
   4562   os() << ToCString(kVcvtm) << dt1 << dt2 << " " << rd << ", " << rm;
   4563 }
   4564 
   4565 void Disassembler::vcvtn(DataType dt1,
   4566                          DataType dt2,
   4567                          DRegister rd,
   4568                          DRegister rm) {
   4569   os().SetCurrentInstruction(kVcvtn, kFpNeon);
   4570   os() << ToCString(kVcvtn) << dt1 << dt2 << " " << rd << ", " << rm;
   4571 }
   4572 
   4573 void Disassembler::vcvtn(DataType dt1,
   4574                          DataType dt2,
   4575                          QRegister rd,
   4576                          QRegister rm) {
   4577   os().SetCurrentInstruction(kVcvtn, kFpNeon);
   4578   os() << ToCString(kVcvtn) << dt1 << dt2 << " " << rd << ", " << rm;
   4579 }
   4580 
   4581 void Disassembler::vcvtn(DataType dt1,
   4582                          DataType dt2,
   4583                          SRegister rd,
   4584                          SRegister rm) {
   4585   os().SetCurrentInstruction(kVcvtn, kFpNeon);
   4586   os() << ToCString(kVcvtn) << dt1 << dt2 << " " << rd << ", " << rm;
   4587 }
   4588 
   4589 void Disassembler::vcvtn(DataType dt1,
   4590                          DataType dt2,
   4591                          SRegister rd,
   4592                          DRegister rm) {
   4593   os().SetCurrentInstruction(kVcvtn, kFpNeon);
   4594   os() << ToCString(kVcvtn) << dt1 << dt2 << " " << rd << ", " << rm;
   4595 }
   4596 
   4597 void Disassembler::vcvtp(DataType dt1,
   4598                          DataType dt2,
   4599                          DRegister rd,
   4600                          DRegister rm) {
   4601   os().SetCurrentInstruction(kVcvtp, kFpNeon);
   4602   os() << ToCString(kVcvtp) << dt1 << dt2 << " " << rd << ", " << rm;
   4603 }
   4604 
   4605 void Disassembler::vcvtp(DataType dt1,
   4606                          DataType dt2,
   4607                          QRegister rd,
   4608                          QRegister rm) {
   4609   os().SetCurrentInstruction(kVcvtp, kFpNeon);
   4610   os() << ToCString(kVcvtp) << dt1 << dt2 << " " << rd << ", " << rm;
   4611 }
   4612 
   4613 void Disassembler::vcvtp(DataType dt1,
   4614                          DataType dt2,
   4615                          SRegister rd,
   4616                          SRegister rm) {
   4617   os().SetCurrentInstruction(kVcvtp, kFpNeon);
   4618   os() << ToCString(kVcvtp) << dt1 << dt2 << " " << rd << ", " << rm;
   4619 }
   4620 
   4621 void Disassembler::vcvtp(DataType dt1,
   4622                          DataType dt2,
   4623                          SRegister rd,
   4624                          DRegister rm) {
   4625   os().SetCurrentInstruction(kVcvtp, kFpNeon);
   4626   os() << ToCString(kVcvtp) << dt1 << dt2 << " " << rd << ", " << rm;
   4627 }
   4628 
   4629 void Disassembler::vcvtr(
   4630     Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
   4631   os().SetCurrentInstruction(kVcvtr, kFpNeon);
   4632   os() << ToCString(kVcvtr) << ConditionPrinter(it_block_, cond) << dt1 << dt2
   4633        << " " << rd << ", " << rm;
   4634 }
   4635 
   4636 void Disassembler::vcvtr(
   4637     Condition cond, DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
   4638   os().SetCurrentInstruction(kVcvtr, kFpNeon);
   4639   os() << ToCString(kVcvtr) << ConditionPrinter(it_block_, cond) << dt1 << dt2
   4640        << " " << rd << ", " << rm;
   4641 }
   4642 
   4643 void Disassembler::vcvtt(
   4644     Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
   4645   os().SetCurrentInstruction(kVcvtt, kFpNeon);
   4646   os() << ToCString(kVcvtt) << ConditionPrinter(it_block_, cond) << dt1 << dt2
   4647        << " " << rd << ", " << rm;
   4648 }
   4649 
   4650 void Disassembler::vcvtt(
   4651     Condition cond, DataType dt1, DataType dt2, DRegister rd, SRegister rm) {
   4652   os().SetCurrentInstruction(kVcvtt, kFpNeon);
   4653   os() << ToCString(kVcvtt) << ConditionPrinter(it_block_, cond) << dt1 << dt2
   4654        << " " << rd << ", " << rm;
   4655 }
   4656 
   4657 void Disassembler::vcvtt(
   4658     Condition cond, DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
   4659   os().SetCurrentInstruction(kVcvtt, kFpNeon);
   4660   os() << ToCString(kVcvtt) << ConditionPrinter(it_block_, cond) << dt1 << dt2
   4661        << " " << rd << ", " << rm;
   4662 }
   4663 
   4664 void Disassembler::vdiv(
   4665     Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
   4666   os().SetCurrentInstruction(kVdiv, kFpNeon);
   4667   os() << ToCString(kVdiv) << ConditionPrinter(it_block_, cond) << dt;
   4668   os() << " ";
   4669   if (!rd.Is(rn) || !use_short_hand_form_) {
   4670     os() << rd << ", ";
   4671   }
   4672   os() << rn << ", " << rm;
   4673 }
   4674 
   4675 void Disassembler::vdiv(
   4676     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   4677   os().SetCurrentInstruction(kVdiv, kFpNeon);
   4678   os() << ToCString(kVdiv) << ConditionPrinter(it_block_, cond) << dt;
   4679   os() << " ";
   4680   if (!rd.Is(rn) || !use_short_hand_form_) {
   4681     os() << rd << ", ";
   4682   }
   4683   os() << rn << ", " << rm;
   4684 }
   4685 
   4686 void Disassembler::vdup(Condition cond,
   4687                         DataType dt,
   4688                         QRegister rd,
   4689                         Register rt) {
   4690   os().SetCurrentInstruction(kVdup, kFpNeon);
   4691   os() << ToCString(kVdup) << ConditionPrinter(it_block_, cond) << dt << " "
   4692        << rd << ", " << rt;
   4693 }
   4694 
   4695 void Disassembler::vdup(Condition cond,
   4696                         DataType dt,
   4697                         DRegister rd,
   4698                         Register rt) {
   4699   os().SetCurrentInstruction(kVdup, kFpNeon);
   4700   os() << ToCString(kVdup) << ConditionPrinter(it_block_, cond) << dt << " "
   4701        << rd << ", " << rt;
   4702 }
   4703 
   4704 void Disassembler::vdup(Condition cond,
   4705                         DataType dt,
   4706                         DRegister rd,
   4707                         DRegisterLane rm) {
   4708   os().SetCurrentInstruction(kVdup, kFpNeon);
   4709   os() << ToCString(kVdup) << ConditionPrinter(it_block_, cond) << dt << " "
   4710        << rd << ", " << rm;
   4711 }
   4712 
   4713 void Disassembler::vdup(Condition cond,
   4714                         DataType dt,
   4715                         QRegister rd,
   4716                         DRegisterLane rm) {
   4717   os().SetCurrentInstruction(kVdup, kFpNeon);
   4718   os() << ToCString(kVdup) << ConditionPrinter(it_block_, cond) << dt << " "
   4719        << rd << ", " << rm;
   4720 }
   4721 
   4722 void Disassembler::veor(
   4723     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   4724   os().SetCurrentInstruction(kVeor, kFpNeon);
   4725   os() << ToCString(kVeor) << ConditionPrinter(it_block_, cond) << dt;
   4726   os() << " ";
   4727   if (!rd.Is(rn) || !use_short_hand_form_) {
   4728     os() << rd << ", ";
   4729   }
   4730   os() << rn << ", " << rm;
   4731 }
   4732 
   4733 void Disassembler::veor(
   4734     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   4735   os().SetCurrentInstruction(kVeor, kFpNeon);
   4736   os() << ToCString(kVeor) << ConditionPrinter(it_block_, cond) << dt;
   4737   os() << " ";
   4738   if (!rd.Is(rn) || !use_short_hand_form_) {
   4739     os() << rd << ", ";
   4740   }
   4741   os() << rn << ", " << rm;
   4742 }
   4743 
   4744 void Disassembler::vext(Condition cond,
   4745                         DataType dt,
   4746                         DRegister rd,
   4747                         DRegister rn,
   4748                         DRegister rm,
   4749                         const DOperand& operand) {
   4750   os().SetCurrentInstruction(kVext, kFpNeon);
   4751   os() << ToCString(kVext) << ConditionPrinter(it_block_, cond) << dt;
   4752   os() << " ";
   4753   if (!rd.Is(rn) || !use_short_hand_form_) {
   4754     os() << rd << ", ";
   4755   }
   4756   os() << rn << ", " << rm << ", " << operand;
   4757 }
   4758 
   4759 void Disassembler::vext(Condition cond,
   4760                         DataType dt,
   4761                         QRegister rd,
   4762                         QRegister rn,
   4763                         QRegister rm,
   4764                         const QOperand& operand) {
   4765   os().SetCurrentInstruction(kVext, kFpNeon);
   4766   os() << ToCString(kVext) << ConditionPrinter(it_block_, cond) << dt;
   4767   os() << " ";
   4768   if (!rd.Is(rn) || !use_short_hand_form_) {
   4769     os() << rd << ", ";
   4770   }
   4771   os() << rn << ", " << rm << ", " << operand;
   4772 }
   4773 
   4774 void Disassembler::vfma(
   4775     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   4776   os().SetCurrentInstruction(kVfma, kFpNeon);
   4777   os() << ToCString(kVfma) << ConditionPrinter(it_block_, cond) << dt << " "
   4778        << rd << ", " << rn << ", " << rm;
   4779 }
   4780 
   4781 void Disassembler::vfma(
   4782     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   4783   os().SetCurrentInstruction(kVfma, kFpNeon);
   4784   os() << ToCString(kVfma) << ConditionPrinter(it_block_, cond) << dt << " "
   4785        << rd << ", " << rn << ", " << rm;
   4786 }
   4787 
   4788 void Disassembler::vfma(
   4789     Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
   4790   os().SetCurrentInstruction(kVfma, kFpNeon);
   4791   os() << ToCString(kVfma) << ConditionPrinter(it_block_, cond) << dt << " "
   4792        << rd << ", " << rn << ", " << rm;
   4793 }
   4794 
   4795 void Disassembler::vfms(
   4796     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   4797   os().SetCurrentInstruction(kVfms, kFpNeon);
   4798   os() << ToCString(kVfms) << ConditionPrinter(it_block_, cond) << dt << " "
   4799        << rd << ", " << rn << ", " << rm;
   4800 }
   4801 
   4802 void Disassembler::vfms(
   4803     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   4804   os().SetCurrentInstruction(kVfms, kFpNeon);
   4805   os() << ToCString(kVfms) << ConditionPrinter(it_block_, cond) << dt << " "
   4806        << rd << ", " << rn << ", " << rm;
   4807 }
   4808 
   4809 void Disassembler::vfms(
   4810     Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
   4811   os().SetCurrentInstruction(kVfms, kFpNeon);
   4812   os() << ToCString(kVfms) << ConditionPrinter(it_block_, cond) << dt << " "
   4813        << rd << ", " << rn << ", " << rm;
   4814 }
   4815 
   4816 void Disassembler::vfnma(
   4817     Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
   4818   os().SetCurrentInstruction(kVfnma, kFpNeon);
   4819   os() << ToCString(kVfnma) << ConditionPrinter(it_block_, cond) << dt << " "
   4820        << rd << ", " << rn << ", " << rm;
   4821 }
   4822 
   4823 void Disassembler::vfnma(
   4824     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   4825   os().SetCurrentInstruction(kVfnma, kFpNeon);
   4826   os() << ToCString(kVfnma) << ConditionPrinter(it_block_, cond) << dt << " "
   4827        << rd << ", " << rn << ", " << rm;
   4828 }
   4829 
   4830 void Disassembler::vfnms(
   4831     Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
   4832   os().SetCurrentInstruction(kVfnms, kFpNeon);
   4833   os() << ToCString(kVfnms) << ConditionPrinter(it_block_, cond) << dt << " "
   4834        << rd << ", " << rn << ", " << rm;
   4835 }
   4836 
   4837 void Disassembler::vfnms(
   4838     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   4839   os().SetCurrentInstruction(kVfnms, kFpNeon);
   4840   os() << ToCString(kVfnms) << ConditionPrinter(it_block_, cond) << dt << " "
   4841        << rd << ", " << rn << ", " << rm;
   4842 }
   4843 
   4844 void Disassembler::vhadd(
   4845     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   4846   os().SetCurrentInstruction(kVhadd, kFpNeon);
   4847   os() << ToCString(kVhadd) << ConditionPrinter(it_block_, cond) << dt;
   4848   os() << " ";
   4849   if (!rd.Is(rn) || !use_short_hand_form_) {
   4850     os() << rd << ", ";
   4851   }
   4852   os() << rn << ", " << rm;
   4853 }
   4854 
   4855 void Disassembler::vhadd(
   4856     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   4857   os().SetCurrentInstruction(kVhadd, kFpNeon);
   4858   os() << ToCString(kVhadd) << ConditionPrinter(it_block_, cond) << dt;
   4859   os() << " ";
   4860   if (!rd.Is(rn) || !use_short_hand_form_) {
   4861     os() << rd << ", ";
   4862   }
   4863   os() << rn << ", " << rm;
   4864 }
   4865 
   4866 void Disassembler::vhsub(
   4867     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   4868   os().SetCurrentInstruction(kVhsub, kFpNeon);
   4869   os() << ToCString(kVhsub) << ConditionPrinter(it_block_, cond) << dt;
   4870   os() << " ";
   4871   if (!rd.Is(rn) || !use_short_hand_form_) {
   4872     os() << rd << ", ";
   4873   }
   4874   os() << rn << ", " << rm;
   4875 }
   4876 
   4877 void Disassembler::vhsub(
   4878     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   4879   os().SetCurrentInstruction(kVhsub, kFpNeon);
   4880   os() << ToCString(kVhsub) << ConditionPrinter(it_block_, cond) << dt;
   4881   os() << " ";
   4882   if (!rd.Is(rn) || !use_short_hand_form_) {
   4883     os() << rd << ", ";
   4884   }
   4885   os() << rn << ", " << rm;
   4886 }
   4887 
   4888 void Disassembler::vld1(Condition cond,
   4889                         DataType dt,
   4890                         const NeonRegisterList& nreglist,
   4891                         const AlignedMemOperand& operand) {
   4892   os().SetCurrentInstruction(kVld1, kFpNeon);
   4893   os() << ToCString(kVld1) << ConditionPrinter(it_block_, cond) << dt << " "
   4894        << nreglist << ", " << PrintAlignedMemOperand(kVld1Location, operand);
   4895 }
   4896 
   4897 void Disassembler::vld2(Condition cond,
   4898                         DataType dt,
   4899                         const NeonRegisterList& nreglist,
   4900                         const AlignedMemOperand& operand) {
   4901   os().SetCurrentInstruction(kVld2, kFpNeon);
   4902   os() << ToCString(kVld2) << ConditionPrinter(it_block_, cond) << dt << " "
   4903        << nreglist << ", " << PrintAlignedMemOperand(kVld2Location, operand);
   4904 }
   4905 
   4906 void Disassembler::vld3(Condition cond,
   4907                         DataType dt,
   4908                         const NeonRegisterList& nreglist,
   4909                         const AlignedMemOperand& operand) {
   4910   os().SetCurrentInstruction(kVld3, kFpNeon);
   4911   os() << ToCString(kVld3) << ConditionPrinter(it_block_, cond) << dt << " "
   4912        << nreglist << ", " << PrintAlignedMemOperand(kVld3Location, operand);
   4913 }
   4914 
   4915 void Disassembler::vld3(Condition cond,
   4916                         DataType dt,
   4917                         const NeonRegisterList& nreglist,
   4918                         const MemOperand& operand) {
   4919   os().SetCurrentInstruction(kVld3, kFpNeon);
   4920   os() << ToCString(kVld3) << ConditionPrinter(it_block_, cond) << dt << " "
   4921        << nreglist << ", " << PrintMemOperand(kVld3Location, operand);
   4922 }
   4923 
   4924 void Disassembler::vld4(Condition cond,
   4925                         DataType dt,
   4926                         const NeonRegisterList& nreglist,
   4927                         const AlignedMemOperand& operand) {
   4928   os().SetCurrentInstruction(kVld4, kFpNeon);
   4929   os() << ToCString(kVld4) << ConditionPrinter(it_block_, cond) << dt << " "
   4930        << nreglist << ", " << PrintAlignedMemOperand(kVld4Location, operand);
   4931 }
   4932 
   4933 void Disassembler::vldm(Condition cond,
   4934                         DataType dt,
   4935                         Register rn,
   4936                         WriteBack write_back,
   4937                         DRegisterList dreglist) {
   4938   os().SetCurrentInstruction(kVldm, kLoadStore | kLoadStoreMultiple | kFpNeon);
   4939   os() << ToCString(kVldm) << ConditionPrinter(it_block_, cond) << dt << " "
   4940        << rn << write_back << ", " << dreglist;
   4941 }
   4942 
   4943 void Disassembler::vldm(Condition cond,
   4944                         DataType dt,
   4945                         Register rn,
   4946                         WriteBack write_back,
   4947                         SRegisterList sreglist) {
   4948   os().SetCurrentInstruction(kVldm, kLoadStore | kLoadStoreMultiple | kFpNeon);
   4949   os() << ToCString(kVldm) << ConditionPrinter(it_block_, cond) << dt << " "
   4950        << rn << write_back << ", " << sreglist;
   4951 }
   4952 
   4953 void Disassembler::vldmdb(Condition cond,
   4954                           DataType dt,
   4955                           Register rn,
   4956                           WriteBack write_back,
   4957                           DRegisterList dreglist) {
   4958   os().SetCurrentInstruction(kVldmdb,
   4959                              kLoadStore | kLoadStoreMultiple | kFpNeon);
   4960   os() << ToCString(kVldmdb) << ConditionPrinter(it_block_, cond) << dt << " "
   4961        << rn << write_back << ", " << dreglist;
   4962 }
   4963 
   4964 void Disassembler::vldmdb(Condition cond,
   4965                           DataType dt,
   4966                           Register rn,
   4967                           WriteBack write_back,
   4968                           SRegisterList sreglist) {
   4969   os().SetCurrentInstruction(kVldmdb,
   4970                              kLoadStore | kLoadStoreMultiple | kFpNeon);
   4971   os() << ToCString(kVldmdb) << ConditionPrinter(it_block_, cond) << dt << " "
   4972        << rn << write_back << ", " << sreglist;
   4973 }
   4974 
   4975 void Disassembler::vldmia(Condition cond,
   4976                           DataType dt,
   4977                           Register rn,
   4978                           WriteBack write_back,
   4979                           DRegisterList dreglist) {
   4980   os().SetCurrentInstruction(kVldmia,
   4981                              kLoadStore | kLoadStoreMultiple | kFpNeon);
   4982   os() << ToCString(kVldmia) << ConditionPrinter(it_block_, cond) << dt << " "
   4983        << rn << write_back << ", " << dreglist;
   4984 }
   4985 
   4986 void Disassembler::vldmia(Condition cond,
   4987                           DataType dt,
   4988                           Register rn,
   4989                           WriteBack write_back,
   4990                           SRegisterList sreglist) {
   4991   os().SetCurrentInstruction(kVldmia,
   4992                              kLoadStore | kLoadStoreMultiple | kFpNeon);
   4993   os() << ToCString(kVldmia) << ConditionPrinter(it_block_, cond) << dt << " "
   4994        << rn << write_back << ", " << sreglist;
   4995 }
   4996 
   4997 void Disassembler::vldr(Condition cond,
   4998                         DataType dt,
   4999                         DRegister rd,
   5000                         Location* location) {
   5001   os().SetCurrentInstruction(kVldr, kFpNeon);
   5002   os() << ToCString(kVldr) << ConditionPrinter(it_block_, cond)
   5003        << DtPrinter(dt, Untyped64) << " " << rd << ", "
   5004        << PrintLabel(kLoadDoublePrecisionLocation,
   5005                      location,
   5006                      GetCodeAddress() & ~3);
   5007 }
   5008 
   5009 void Disassembler::vldr(Condition cond,
   5010                         DataType dt,
   5011                         DRegister rd,
   5012                         const MemOperand& operand) {
   5013   os().SetCurrentInstruction(kVldr, kFpNeon);
   5014   os() << ToCString(kVldr) << ConditionPrinter(it_block_, cond)
   5015        << DtPrinter(dt, Untyped64) << " " << rd << ", "
   5016        << PrintMemOperand(kLoadDoublePrecisionLocation, operand);
   5017 }
   5018 
   5019 void Disassembler::vldr(Condition cond,
   5020                         DataType dt,
   5021                         SRegister rd,
   5022                         Location* location) {
   5023   os().SetCurrentInstruction(kVldr, kFpNeon);
   5024   os() << ToCString(kVldr) << ConditionPrinter(it_block_, cond)
   5025        << DtPrinter(dt, Untyped32) << " " << rd << ", "
   5026        << PrintLabel(kLoadSinglePrecisionLocation,
   5027                      location,
   5028                      GetCodeAddress() & ~3);
   5029 }
   5030 
   5031 void Disassembler::vldr(Condition cond,
   5032                         DataType dt,
   5033                         SRegister rd,
   5034                         const MemOperand& operand) {
   5035   os().SetCurrentInstruction(kVldr, kFpNeon);
   5036   os() << ToCString(kVldr) << ConditionPrinter(it_block_, cond)
   5037        << DtPrinter(dt, Untyped32) << " " << rd << ", "
   5038        << PrintMemOperand(kLoadSinglePrecisionLocation, operand);
   5039 }
   5040 
   5041 void Disassembler::vmax(
   5042     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   5043   os().SetCurrentInstruction(kVmax, kFpNeon);
   5044   os() << ToCString(kVmax) << ConditionPrinter(it_block_, cond) << dt;
   5045   os() << " ";
   5046   if (!rd.Is(rn) || !use_short_hand_form_) {
   5047     os() << rd << ", ";
   5048   }
   5049   os() << rn << ", " << rm;
   5050 }
   5051 
   5052 void Disassembler::vmax(
   5053     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   5054   os().SetCurrentInstruction(kVmax, kFpNeon);
   5055   os() << ToCString(kVmax) << ConditionPrinter(it_block_, cond) << dt;
   5056   os() << " ";
   5057   if (!rd.Is(rn) || !use_short_hand_form_) {
   5058     os() << rd << ", ";
   5059   }
   5060   os() << rn << ", " << rm;
   5061 }
   5062 
   5063 void Disassembler::vmaxnm(DataType dt,
   5064                           DRegister rd,
   5065                           DRegister rn,
   5066                           DRegister rm) {
   5067   os().SetCurrentInstruction(kVmaxnm, kFpNeon);
   5068   os() << ToCString(kVmaxnm) << dt << " " << rd << ", " << rn << ", " << rm;
   5069 }
   5070 
   5071 void Disassembler::vmaxnm(DataType dt,
   5072                           QRegister rd,
   5073                           QRegister rn,
   5074                           QRegister rm) {
   5075   os().SetCurrentInstruction(kVmaxnm, kFpNeon);
   5076   os() << ToCString(kVmaxnm) << dt << " " << rd << ", " << rn << ", " << rm;
   5077 }
   5078 
   5079 void Disassembler::vmaxnm(DataType dt,
   5080                           SRegister rd,
   5081                           SRegister rn,
   5082                           SRegister rm) {
   5083   os().SetCurrentInstruction(kVmaxnm, kFpNeon);
   5084   os() << ToCString(kVmaxnm) << dt << " " << rd << ", " << rn << ", " << rm;
   5085 }
   5086 
   5087 void Disassembler::vmin(
   5088     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   5089   os().SetCurrentInstruction(kVmin, kFpNeon);
   5090   os() << ToCString(kVmin) << ConditionPrinter(it_block_, cond) << dt;
   5091   os() << " ";
   5092   if (!rd.Is(rn) || !use_short_hand_form_) {
   5093     os() << rd << ", ";
   5094   }
   5095   os() << rn << ", " << rm;
   5096 }
   5097 
   5098 void Disassembler::vmin(
   5099     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   5100   os().SetCurrentInstruction(kVmin, kFpNeon);
   5101   os() << ToCString(kVmin) << ConditionPrinter(it_block_, cond) << dt;
   5102   os() << " ";
   5103   if (!rd.Is(rn) || !use_short_hand_form_) {
   5104     os() << rd << ", ";
   5105   }
   5106   os() << rn << ", " << rm;
   5107 }
   5108 
   5109 void Disassembler::vminnm(DataType dt,
   5110                           DRegister rd,
   5111                           DRegister rn,
   5112                           DRegister rm) {
   5113   os().SetCurrentInstruction(kVminnm, kFpNeon);
   5114   os() << ToCString(kVminnm) << dt << " " << rd << ", " << rn << ", " << rm;
   5115 }
   5116 
   5117 void Disassembler::vminnm(DataType dt,
   5118                           QRegister rd,
   5119                           QRegister rn,
   5120                           QRegister rm) {
   5121   os().SetCurrentInstruction(kVminnm, kFpNeon);
   5122   os() << ToCString(kVminnm) << dt << " " << rd << ", " << rn << ", " << rm;
   5123 }
   5124 
   5125 void Disassembler::vminnm(DataType dt,
   5126                           SRegister rd,
   5127                           SRegister rn,
   5128                           SRegister rm) {
   5129   os().SetCurrentInstruction(kVminnm, kFpNeon);
   5130   os() << ToCString(kVminnm) << dt << " " << rd << ", " << rn << ", " << rm;
   5131 }
   5132 
   5133 void Disassembler::vmla(
   5134     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegisterLane rm) {
   5135   os().SetCurrentInstruction(kVmla, kFpNeon);
   5136   os() << ToCString(kVmla) << ConditionPrinter(it_block_, cond) << dt << " "
   5137        << rd << ", " << rn << ", " << rm;
   5138 }
   5139 
   5140 void Disassembler::vmla(
   5141     Condition cond, DataType dt, QRegister rd, QRegister rn, DRegisterLane rm) {
   5142   os().SetCurrentInstruction(kVmla, kFpNeon);
   5143   os() << ToCString(kVmla) << ConditionPrinter(it_block_, cond) << dt << " "
   5144        << rd << ", " << rn << ", " << rm;
   5145 }
   5146 
   5147 void Disassembler::vmla(
   5148     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   5149   os().SetCurrentInstruction(kVmla, kFpNeon);
   5150   os() << ToCString(kVmla) << ConditionPrinter(it_block_, cond) << dt << " "
   5151        << rd << ", " << rn << ", " << rm;
   5152 }
   5153 
   5154 void Disassembler::vmla(
   5155     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   5156   os().SetCurrentInstruction(kVmla, kFpNeon);
   5157   os() << ToCString(kVmla) << ConditionPrinter(it_block_, cond) << dt << " "
   5158        << rd << ", " << rn << ", " << rm;
   5159 }
   5160 
   5161 void Disassembler::vmla(
   5162     Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
   5163   os().SetCurrentInstruction(kVmla, kFpNeon);
   5164   os() << ToCString(kVmla) << ConditionPrinter(it_block_, cond) << dt << " "
   5165        << rd << ", " << rn << ", " << rm;
   5166 }
   5167 
   5168 void Disassembler::vmlal(
   5169     Condition cond, DataType dt, QRegister rd, DRegister rn, DRegisterLane rm) {
   5170   os().SetCurrentInstruction(kVmlal, kFpNeon);
   5171   os() << ToCString(kVmlal) << ConditionPrinter(it_block_, cond) << dt << " "
   5172        << rd << ", " << rn << ", " << rm;
   5173 }
   5174 
   5175 void Disassembler::vmlal(
   5176     Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
   5177   os().SetCurrentInstruction(kVmlal, kFpNeon);
   5178   os() << ToCString(kVmlal) << ConditionPrinter(it_block_, cond) << dt << " "
   5179        << rd << ", " << rn << ", " << rm;
   5180 }
   5181 
   5182 void Disassembler::vmls(
   5183     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegisterLane rm) {
   5184   os().SetCurrentInstruction(kVmls, kFpNeon);
   5185   os() << ToCString(kVmls) << ConditionPrinter(it_block_, cond) << dt << " "
   5186        << rd << ", " << rn << ", " << rm;
   5187 }
   5188 
   5189 void Disassembler::vmls(
   5190     Condition cond, DataType dt, QRegister rd, QRegister rn, DRegisterLane rm) {
   5191   os().SetCurrentInstruction(kVmls, kFpNeon);
   5192   os() << ToCString(kVmls) << ConditionPrinter(it_block_, cond) << dt << " "
   5193        << rd << ", " << rn << ", " << rm;
   5194 }
   5195 
   5196 void Disassembler::vmls(
   5197     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   5198   os().SetCurrentInstruction(kVmls, kFpNeon);
   5199   os() << ToCString(kVmls) << ConditionPrinter(it_block_, cond) << dt << " "
   5200        << rd << ", " << rn << ", " << rm;
   5201 }
   5202 
   5203 void Disassembler::vmls(
   5204     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   5205   os().SetCurrentInstruction(kVmls, kFpNeon);
   5206   os() << ToCString(kVmls) << ConditionPrinter(it_block_, cond) << dt << " "
   5207        << rd << ", " << rn << ", " << rm;
   5208 }
   5209 
   5210 void Disassembler::vmls(
   5211     Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
   5212   os().SetCurrentInstruction(kVmls, kFpNeon);
   5213   os() << ToCString(kVmls) << ConditionPrinter(it_block_, cond) << dt << " "
   5214        << rd << ", " << rn << ", " << rm;
   5215 }
   5216 
   5217 void Disassembler::vmlsl(
   5218     Condition cond, DataType dt, QRegister rd, DRegister rn, DRegisterLane rm) {
   5219   os().SetCurrentInstruction(kVmlsl, kFpNeon);
   5220   os() << ToCString(kVmlsl) << ConditionPrinter(it_block_, cond) << dt << " "
   5221        << rd << ", " << rn << ", " << rm;
   5222 }
   5223 
   5224 void Disassembler::vmlsl(
   5225     Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
   5226   os().SetCurrentInstruction(kVmlsl, kFpNeon);
   5227   os() << ToCString(kVmlsl) << ConditionPrinter(it_block_, cond) << dt << " "
   5228        << rd << ", " << rn << ", " << rm;
   5229 }
   5230 
   5231 void Disassembler::vmov(Condition cond, Register rt, SRegister rn) {
   5232   os().SetCurrentInstruction(kVmov, kFpNeon);
   5233   os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << " " << rt
   5234        << ", " << rn;
   5235 }
   5236 
   5237 void Disassembler::vmov(Condition cond, SRegister rn, Register rt) {
   5238   os().SetCurrentInstruction(kVmov, kFpNeon);
   5239   os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << " " << rn
   5240        << ", " << rt;
   5241 }
   5242 
   5243 void Disassembler::vmov(Condition cond,
   5244                         Register rt,
   5245                         Register rt2,
   5246                         DRegister rm) {
   5247   os().SetCurrentInstruction(kVmov, kFpNeon);
   5248   os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << " " << rt
   5249        << ", " << rt2 << ", " << rm;
   5250 }
   5251 
   5252 void Disassembler::vmov(Condition cond,
   5253                         DRegister rm,
   5254                         Register rt,
   5255                         Register rt2) {
   5256   os().SetCurrentInstruction(kVmov, kFpNeon);
   5257   os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << " " << rm
   5258        << ", " << rt << ", " << rt2;
   5259 }
   5260 
   5261 void Disassembler::vmov(
   5262     Condition cond, Register rt, Register rt2, SRegister rm, SRegister rm1) {
   5263   os().SetCurrentInstruction(kVmov, kFpNeon);
   5264   os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << " " << rt
   5265        << ", " << rt2 << ", " << rm << ", " << rm1;
   5266 }
   5267 
   5268 void Disassembler::vmov(
   5269     Condition cond, SRegister rm, SRegister rm1, Register rt, Register rt2) {
   5270   os().SetCurrentInstruction(kVmov, kFpNeon);
   5271   os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << " " << rm
   5272        << ", " << rm1 << ", " << rt << ", " << rt2;
   5273 }
   5274 
   5275 void Disassembler::vmov(Condition cond,
   5276                         DataType dt,
   5277                         DRegisterLane rd,
   5278                         Register rt) {
   5279   os().SetCurrentInstruction(kVmov, kFpNeon);
   5280   os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << dt << " "
   5281        << rd << ", " << rt;
   5282 }
   5283 
   5284 void Disassembler::vmov(Condition cond,
   5285                         DataType dt,
   5286                         DRegister rd,
   5287                         const DOperand& operand) {
   5288   os().SetCurrentInstruction(kVmov, kFpNeon);
   5289   os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << dt << " "
   5290        << rd << ", " << operand;
   5291 }
   5292 
   5293 void Disassembler::vmov(Condition cond,
   5294                         DataType dt,
   5295                         QRegister rd,
   5296                         const QOperand& operand) {
   5297   os().SetCurrentInstruction(kVmov, kFpNeon);
   5298   os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << dt << " "
   5299        << rd << ", " << operand;
   5300 }
   5301 
   5302 void Disassembler::vmov(Condition cond,
   5303                         DataType dt,
   5304                         SRegister rd,
   5305                         const SOperand& operand) {
   5306   os().SetCurrentInstruction(kVmov, kFpNeon);
   5307   os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << dt << " "
   5308        << rd << ", " << operand;
   5309 }
   5310 
   5311 void Disassembler::vmov(Condition cond,
   5312                         DataType dt,
   5313                         Register rt,
   5314                         DRegisterLane rn) {
   5315   os().SetCurrentInstruction(kVmov, kFpNeon);
   5316   os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << dt << " "
   5317        << rt << ", " << rn;
   5318 }
   5319 
   5320 void Disassembler::vmovl(Condition cond,
   5321                          DataType dt,
   5322                          QRegister rd,
   5323                          DRegister rm) {
   5324   os().SetCurrentInstruction(kVmovl, kFpNeon);
   5325   os() << ToCString(kVmovl) << ConditionPrinter(it_block_, cond) << dt << " "
   5326        << rd << ", " << rm;
   5327 }
   5328 
   5329 void Disassembler::vmovn(Condition cond,
   5330                          DataType dt,
   5331                          DRegister rd,
   5332                          QRegister rm) {
   5333   os().SetCurrentInstruction(kVmovn, kFpNeon);
   5334   os() << ToCString(kVmovn) << ConditionPrinter(it_block_, cond) << dt << " "
   5335        << rd << ", " << rm;
   5336 }
   5337 
   5338 void Disassembler::vmrs(Condition cond,
   5339                         RegisterOrAPSR_nzcv rt,
   5340                         SpecialFPRegister spec_reg) {
   5341   os().SetCurrentInstruction(kVmrs, kFpNeon);
   5342   os() << ToCString(kVmrs) << ConditionPrinter(it_block_, cond) << " " << rt
   5343        << ", " << spec_reg;
   5344 }
   5345 
   5346 void Disassembler::vmsr(Condition cond,
   5347                         SpecialFPRegister spec_reg,
   5348                         Register rt) {
   5349   os().SetCurrentInstruction(kVmsr, kFpNeon);
   5350   os() << ToCString(kVmsr) << ConditionPrinter(it_block_, cond) << " "
   5351        << spec_reg << ", " << rt;
   5352 }
   5353 
   5354 void Disassembler::vmul(Condition cond,
   5355                         DataType dt,
   5356                         DRegister rd,
   5357                         DRegister rn,
   5358                         DRegister dm,
   5359                         unsigned index) {
   5360   os().SetCurrentInstruction(kVmul, kFpNeon);
   5361   os() << ToCString(kVmul) << ConditionPrinter(it_block_, cond) << dt;
   5362   os() << " ";
   5363   if (!rd.Is(rn) || !use_short_hand_form_) {
   5364     os() << rd << ", ";
   5365   }
   5366   os() << rn << ", " << IndexedRegisterPrinter(dm, index);
   5367 }
   5368 
   5369 void Disassembler::vmul(Condition cond,
   5370                         DataType dt,
   5371                         QRegister rd,
   5372                         QRegister rn,
   5373                         DRegister dm,
   5374                         unsigned index) {
   5375   os().SetCurrentInstruction(kVmul, kFpNeon);
   5376   os() << ToCString(kVmul) << ConditionPrinter(it_block_, cond) << dt;
   5377   os() << " ";
   5378   if (!rd.Is(rn) || !use_short_hand_form_) {
   5379     os() << rd << ", ";
   5380   }
   5381   os() << rn << ", " << IndexedRegisterPrinter(dm, index);
   5382 }
   5383 
   5384 void Disassembler::vmul(
   5385     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   5386   os().SetCurrentInstruction(kVmul, kFpNeon);
   5387   os() << ToCString(kVmul) << ConditionPrinter(it_block_, cond) << dt;
   5388   os() << " ";
   5389   if (!rd.Is(rn) || !use_short_hand_form_) {
   5390     os() << rd << ", ";
   5391   }
   5392   os() << rn << ", " << rm;
   5393 }
   5394 
   5395 void Disassembler::vmul(
   5396     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   5397   os().SetCurrentInstruction(kVmul, kFpNeon);
   5398   os() << ToCString(kVmul) << ConditionPrinter(it_block_, cond) << dt;
   5399   os() << " ";
   5400   if (!rd.Is(rn) || !use_short_hand_form_) {
   5401     os() << rd << ", ";
   5402   }
   5403   os() << rn << ", " << rm;
   5404 }
   5405 
   5406 void Disassembler::vmul(
   5407     Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
   5408   os().SetCurrentInstruction(kVmul, kFpNeon);
   5409   os() << ToCString(kVmul) << ConditionPrinter(it_block_, cond) << dt;
   5410   os() << " ";
   5411   if (!rd.Is(rn) || !use_short_hand_form_) {
   5412     os() << rd << ", ";
   5413   }
   5414   os() << rn << ", " << rm;
   5415 }
   5416 
   5417 void Disassembler::vmull(Condition cond,
   5418                          DataType dt,
   5419                          QRegister rd,
   5420                          DRegister rn,
   5421                          DRegister dm,
   5422                          unsigned index) {
   5423   os().SetCurrentInstruction(kVmull, kFpNeon);
   5424   os() << ToCString(kVmull) << ConditionPrinter(it_block_, cond) << dt << " "
   5425        << rd << ", " << rn << ", " << IndexedRegisterPrinter(dm, index);
   5426 }
   5427 
   5428 void Disassembler::vmull(
   5429     Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
   5430   os().SetCurrentInstruction(kVmull, kFpNeon);
   5431   os() << ToCString(kVmull) << ConditionPrinter(it_block_, cond) << dt << " "
   5432        << rd << ", " << rn << ", " << rm;
   5433 }
   5434 
   5435 void Disassembler::vmvn(Condition cond,
   5436                         DataType dt,
   5437                         DRegister rd,
   5438                         const DOperand& operand) {
   5439   os().SetCurrentInstruction(kVmvn, kFpNeon);
   5440   os() << ToCString(kVmvn) << ConditionPrinter(it_block_, cond) << dt << " "
   5441        << rd << ", " << operand;
   5442 }
   5443 
   5444 void Disassembler::vmvn(Condition cond,
   5445                         DataType dt,
   5446                         QRegister rd,
   5447                         const QOperand& operand) {
   5448   os().SetCurrentInstruction(kVmvn, kFpNeon);
   5449   os() << ToCString(kVmvn) << ConditionPrinter(it_block_, cond) << dt << " "
   5450        << rd << ", " << operand;
   5451 }
   5452 
   5453 void Disassembler::vneg(Condition cond,
   5454                         DataType dt,
   5455                         DRegister rd,
   5456                         DRegister rm) {
   5457   os().SetCurrentInstruction(kVneg, kFpNeon);
   5458   os() << ToCString(kVneg) << ConditionPrinter(it_block_, cond) << dt << " "
   5459        << rd << ", " << rm;
   5460 }
   5461 
   5462 void Disassembler::vneg(Condition cond,
   5463                         DataType dt,
   5464                         QRegister rd,
   5465                         QRegister rm) {
   5466   os().SetCurrentInstruction(kVneg, kFpNeon);
   5467   os() << ToCString(kVneg) << ConditionPrinter(it_block_, cond) << dt << " "
   5468        << rd << ", " << rm;
   5469 }
   5470 
   5471 void Disassembler::vneg(Condition cond,
   5472                         DataType dt,
   5473                         SRegister rd,
   5474                         SRegister rm) {
   5475   os().SetCurrentInstruction(kVneg, kFpNeon);
   5476   os() << ToCString(kVneg) << ConditionPrinter(it_block_, cond) << dt << " "
   5477        << rd << ", " << rm;
   5478 }
   5479 
   5480 void Disassembler::vnmla(
   5481     Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
   5482   os().SetCurrentInstruction(kVnmla, kFpNeon);
   5483   os() << ToCString(kVnmla) << ConditionPrinter(it_block_, cond) << dt << " "
   5484        << rd << ", " << rn << ", " << rm;
   5485 }
   5486 
   5487 void Disassembler::vnmla(
   5488     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   5489   os().SetCurrentInstruction(kVnmla, kFpNeon);
   5490   os() << ToCString(kVnmla) << ConditionPrinter(it_block_, cond) << dt << " "
   5491        << rd << ", " << rn << ", " << rm;
   5492 }
   5493 
   5494 void Disassembler::vnmls(
   5495     Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
   5496   os().SetCurrentInstruction(kVnmls, kFpNeon);
   5497   os() << ToCString(kVnmls) << ConditionPrinter(it_block_, cond) << dt << " "
   5498        << rd << ", " << rn << ", " << rm;
   5499 }
   5500 
   5501 void Disassembler::vnmls(
   5502     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   5503   os().SetCurrentInstruction(kVnmls, kFpNeon);
   5504   os() << ToCString(kVnmls) << ConditionPrinter(it_block_, cond) << dt << " "
   5505        << rd << ", " << rn << ", " << rm;
   5506 }
   5507 
   5508 void Disassembler::vnmul(
   5509     Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
   5510   os().SetCurrentInstruction(kVnmul, kFpNeon);
   5511   os() << ToCString(kVnmul) << ConditionPrinter(it_block_, cond) << dt;
   5512   os() << " ";
   5513   if (!rd.Is(rn) || !use_short_hand_form_) {
   5514     os() << rd << ", ";
   5515   }
   5516   os() << rn << ", " << rm;
   5517 }
   5518 
   5519 void Disassembler::vnmul(
   5520     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   5521   os().SetCurrentInstruction(kVnmul, kFpNeon);
   5522   os() << ToCString(kVnmul) << ConditionPrinter(it_block_, cond) << dt;
   5523   os() << " ";
   5524   if (!rd.Is(rn) || !use_short_hand_form_) {
   5525     os() << rd << ", ";
   5526   }
   5527   os() << rn << ", " << rm;
   5528 }
   5529 
   5530 void Disassembler::vorn(Condition cond,
   5531                         DataType dt,
   5532                         DRegister rd,
   5533                         DRegister rn,
   5534                         const DOperand& operand) {
   5535   os().SetCurrentInstruction(kVorn, kFpNeon);
   5536   os() << ToCString(kVorn) << ConditionPrinter(it_block_, cond) << dt;
   5537   os() << " ";
   5538   if (!rd.Is(rn) || !use_short_hand_form_) {
   5539     os() << rd << ", ";
   5540   }
   5541   os() << rn << ", " << operand;
   5542 }
   5543 
   5544 void Disassembler::vorn(Condition cond,
   5545                         DataType dt,
   5546                         QRegister rd,
   5547                         QRegister rn,
   5548                         const QOperand& operand) {
   5549   os().SetCurrentInstruction(kVorn, kFpNeon);
   5550   os() << ToCString(kVorn) << ConditionPrinter(it_block_, cond) << dt;
   5551   os() << " ";
   5552   if (!rd.Is(rn) || !use_short_hand_form_) {
   5553     os() << rd << ", ";
   5554   }
   5555   os() << rn << ", " << operand;
   5556 }
   5557 
   5558 void Disassembler::vorr(Condition cond,
   5559                         DataType dt,
   5560                         DRegister rd,
   5561                         DRegister rn,
   5562                         const DOperand& operand) {
   5563   os().SetCurrentInstruction(kVorr, kFpNeon);
   5564   os() << ToCString(kVorr) << ConditionPrinter(it_block_, cond) << dt;
   5565   os() << " ";
   5566   if (!rd.Is(rn) || !use_short_hand_form_) {
   5567     os() << rd << ", ";
   5568   }
   5569   os() << rn << ", " << operand;
   5570 }
   5571 
   5572 void Disassembler::vorr(Condition cond,
   5573                         DataType dt,
   5574                         QRegister rd,
   5575                         QRegister rn,
   5576                         const QOperand& operand) {
   5577   os().SetCurrentInstruction(kVorr, kFpNeon);
   5578   os() << ToCString(kVorr) << ConditionPrinter(it_block_, cond) << dt;
   5579   os() << " ";
   5580   if (!rd.Is(rn) || !use_short_hand_form_) {
   5581     os() << rd << ", ";
   5582   }
   5583   os() << rn << ", " << operand;
   5584 }
   5585 
   5586 void Disassembler::vpadal(Condition cond,
   5587                           DataType dt,
   5588                           DRegister rd,
   5589                           DRegister rm) {
   5590   os().SetCurrentInstruction(kVpadal, kFpNeon);
   5591   os() << ToCString(kVpadal) << ConditionPrinter(it_block_, cond) << dt << " "
   5592        << rd << ", " << rm;
   5593 }
   5594 
   5595 void Disassembler::vpadal(Condition cond,
   5596                           DataType dt,
   5597                           QRegister rd,
   5598                           QRegister rm) {
   5599   os().SetCurrentInstruction(kVpadal, kFpNeon);
   5600   os() << ToCString(kVpadal) << ConditionPrinter(it_block_, cond) << dt << " "
   5601        << rd << ", " << rm;
   5602 }
   5603 
   5604 void Disassembler::vpadd(
   5605     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   5606   os().SetCurrentInstruction(kVpadd, kFpNeon);
   5607   os() << ToCString(kVpadd) << ConditionPrinter(it_block_, cond) << dt;
   5608   os() << " ";
   5609   if (!rd.Is(rn) || !use_short_hand_form_) {
   5610     os() << rd << ", ";
   5611   }
   5612   os() << rn << ", " << rm;
   5613 }
   5614 
   5615 void Disassembler::vpaddl(Condition cond,
   5616                           DataType dt,
   5617                           DRegister rd,
   5618                           DRegister rm) {
   5619   os().SetCurrentInstruction(kVpaddl, kFpNeon);
   5620   os() << ToCString(kVpaddl) << ConditionPrinter(it_block_, cond) << dt << " "
   5621        << rd << ", " << rm;
   5622 }
   5623 
   5624 void Disassembler::vpaddl(Condition cond,
   5625                           DataType dt,
   5626                           QRegister rd,
   5627                           QRegister rm) {
   5628   os().SetCurrentInstruction(kVpaddl, kFpNeon);
   5629   os() << ToCString(kVpaddl) << ConditionPrinter(it_block_, cond) << dt << " "
   5630        << rd << ", " << rm;
   5631 }
   5632 
   5633 void Disassembler::vpmax(
   5634     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   5635   os().SetCurrentInstruction(kVpmax, kFpNeon);
   5636   os() << ToCString(kVpmax) << ConditionPrinter(it_block_, cond) << dt;
   5637   os() << " ";
   5638   if (!rd.Is(rn) || !use_short_hand_form_) {
   5639     os() << rd << ", ";
   5640   }
   5641   os() << rn << ", " << rm;
   5642 }
   5643 
   5644 void Disassembler::vpmin(
   5645     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   5646   os().SetCurrentInstruction(kVpmin, kFpNeon);
   5647   os() << ToCString(kVpmin) << ConditionPrinter(it_block_, cond) << dt;
   5648   os() << " ";
   5649   if (!rd.Is(rn) || !use_short_hand_form_) {
   5650     os() << rd << ", ";
   5651   }
   5652   os() << rn << ", " << rm;
   5653 }
   5654 
   5655 void Disassembler::vpop(Condition cond, DataType dt, DRegisterList dreglist) {
   5656   os().SetCurrentInstruction(kVpop, kLoadStore | kLoadStoreMultiple | kFpNeon);
   5657   os() << ToCString(kVpop) << ConditionPrinter(it_block_, cond) << dt << " "
   5658        << dreglist;
   5659 }
   5660 
   5661 void Disassembler::vpop(Condition cond, DataType dt, SRegisterList sreglist) {
   5662   os().SetCurrentInstruction(kVpop, kLoadStore | kLoadStoreMultiple | kFpNeon);
   5663   os() << ToCString(kVpop) << ConditionPrinter(it_block_, cond) << dt << " "
   5664        << sreglist;
   5665 }
   5666 
   5667 void Disassembler::vpush(Condition cond, DataType dt, DRegisterList dreglist) {
   5668   os().SetCurrentInstruction(kVpush, kLoadStore | kLoadStoreMultiple | kFpNeon);
   5669   os() << ToCString(kVpush) << ConditionPrinter(it_block_, cond) << dt << " "
   5670        << dreglist;
   5671 }
   5672 
   5673 void Disassembler::vpush(Condition cond, DataType dt, SRegisterList sreglist) {
   5674   os().SetCurrentInstruction(kVpush, kLoadStore | kLoadStoreMultiple | kFpNeon);
   5675   os() << ToCString(kVpush) << ConditionPrinter(it_block_, cond) << dt << " "
   5676        << sreglist;
   5677 }
   5678 
   5679 void Disassembler::vqabs(Condition cond,
   5680                          DataType dt,
   5681                          DRegister rd,
   5682                          DRegister rm) {
   5683   os().SetCurrentInstruction(kVqabs, kFpNeon);
   5684   os() << ToCString(kVqabs) << ConditionPrinter(it_block_, cond) << dt << " "
   5685        << rd << ", " << rm;
   5686 }
   5687 
   5688 void Disassembler::vqabs(Condition cond,
   5689                          DataType dt,
   5690                          QRegister rd,
   5691                          QRegister rm) {
   5692   os().SetCurrentInstruction(kVqabs, kFpNeon);
   5693   os() << ToCString(kVqabs) << ConditionPrinter(it_block_, cond) << dt << " "
   5694        << rd << ", " << rm;
   5695 }
   5696 
   5697 void Disassembler::vqadd(
   5698     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   5699   os().SetCurrentInstruction(kVqadd, kFpNeon);
   5700   os() << ToCString(kVqadd) << ConditionPrinter(it_block_, cond) << dt;
   5701   os() << " ";
   5702   if (!rd.Is(rn) || !use_short_hand_form_) {
   5703     os() << rd << ", ";
   5704   }
   5705   os() << rn << ", " << rm;
   5706 }
   5707 
   5708 void Disassembler::vqadd(
   5709     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   5710   os().SetCurrentInstruction(kVqadd, kFpNeon);
   5711   os() << ToCString(kVqadd) << ConditionPrinter(it_block_, cond) << dt;
   5712   os() << " ";
   5713   if (!rd.Is(rn) || !use_short_hand_form_) {
   5714     os() << rd << ", ";
   5715   }
   5716   os() << rn << ", " << rm;
   5717 }
   5718 
   5719 void Disassembler::vqdmlal(
   5720     Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
   5721   os().SetCurrentInstruction(kVqdmlal, kFpNeon);
   5722   os() << ToCString(kVqdmlal) << ConditionPrinter(it_block_, cond) << dt << " "
   5723        << rd << ", " << rn << ", " << rm;
   5724 }
   5725 
   5726 void Disassembler::vqdmlal(Condition cond,
   5727                            DataType dt,
   5728                            QRegister rd,
   5729                            DRegister rn,
   5730                            DRegister dm,
   5731                            unsigned index) {
   5732   os().SetCurrentInstruction(kVqdmlal, kFpNeon);
   5733   os() << ToCString(kVqdmlal) << ConditionPrinter(it_block_, cond) << dt << " "
   5734        << rd << ", " << rn << ", " << IndexedRegisterPrinter(dm, index);
   5735 }
   5736 
   5737 void Disassembler::vqdmlsl(
   5738     Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
   5739   os().SetCurrentInstruction(kVqdmlsl, kFpNeon);
   5740   os() << ToCString(kVqdmlsl) << ConditionPrinter(it_block_, cond) << dt << " "
   5741        << rd << ", " << rn << ", " << rm;
   5742 }
   5743 
   5744 void Disassembler::vqdmlsl(Condition cond,
   5745                            DataType dt,
   5746                            QRegister rd,
   5747                            DRegister rn,
   5748                            DRegister dm,
   5749                            unsigned index) {
   5750   os().SetCurrentInstruction(kVqdmlsl, kFpNeon);
   5751   os() << ToCString(kVqdmlsl) << ConditionPrinter(it_block_, cond) << dt << " "
   5752        << rd << ", " << rn << ", " << IndexedRegisterPrinter(dm, index);
   5753 }
   5754 
   5755 void Disassembler::vqdmulh(
   5756     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   5757   os().SetCurrentInstruction(kVqdmulh, kFpNeon);
   5758   os() << ToCString(kVqdmulh) << ConditionPrinter(it_block_, cond) << dt;
   5759   os() << " ";
   5760   if (!rd.Is(rn) || !use_short_hand_form_) {
   5761     os() << rd << ", ";
   5762   }
   5763   os() << rn << ", " << rm;
   5764 }
   5765 
   5766 void Disassembler::vqdmulh(
   5767     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   5768   os().SetCurrentInstruction(kVqdmulh, kFpNeon);
   5769   os() << ToCString(kVqdmulh) << ConditionPrinter(it_block_, cond) << dt;
   5770   os() << " ";
   5771   if (!rd.Is(rn) || !use_short_hand_form_) {
   5772     os() << rd << ", ";
   5773   }
   5774   os() << rn << ", " << rm;
   5775 }
   5776 
   5777 void Disassembler::vqdmulh(
   5778     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegisterLane rm) {
   5779   os().SetCurrentInstruction(kVqdmulh, kFpNeon);
   5780   os() << ToCString(kVqdmulh) << ConditionPrinter(it_block_, cond) << dt;
   5781   os() << " ";
   5782   if (!rd.Is(rn) || !use_short_hand_form_) {
   5783     os() << rd << ", ";
   5784   }
   5785   os() << rn << ", " << rm;
   5786 }
   5787 
   5788 void Disassembler::vqdmulh(
   5789     Condition cond, DataType dt, QRegister rd, QRegister rn, DRegisterLane rm) {
   5790   os().SetCurrentInstruction(kVqdmulh, kFpNeon);
   5791   os() << ToCString(kVqdmulh) << ConditionPrinter(it_block_, cond) << dt;
   5792   os() << " ";
   5793   if (!rd.Is(rn) || !use_short_hand_form_) {
   5794     os() << rd << ", ";
   5795   }
   5796   os() << rn << ", " << rm;
   5797 }
   5798 
   5799 void Disassembler::vqdmull(
   5800     Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
   5801   os().SetCurrentInstruction(kVqdmull, kFpNeon);
   5802   os() << ToCString(kVqdmull) << ConditionPrinter(it_block_, cond) << dt << " "
   5803        << rd << ", " << rn << ", " << rm;
   5804 }
   5805 
   5806 void Disassembler::vqdmull(
   5807     Condition cond, DataType dt, QRegister rd, DRegister rn, DRegisterLane rm) {
   5808   os().SetCurrentInstruction(kVqdmull, kFpNeon);
   5809   os() << ToCString(kVqdmull) << ConditionPrinter(it_block_, cond) << dt << " "
   5810        << rd << ", " << rn << ", " << rm;
   5811 }
   5812 
   5813 void Disassembler::vqmovn(Condition cond,
   5814                           DataType dt,
   5815                           DRegister rd,
   5816                           QRegister rm) {
   5817   os().SetCurrentInstruction(kVqmovn, kFpNeon);
   5818   os() << ToCString(kVqmovn) << ConditionPrinter(it_block_, cond) << dt << " "
   5819        << rd << ", " << rm;
   5820 }
   5821 
   5822 void Disassembler::vqmovun(Condition cond,
   5823                            DataType dt,
   5824                            DRegister rd,
   5825                            QRegister rm) {
   5826   os().SetCurrentInstruction(kVqmovun, kFpNeon);
   5827   os() << ToCString(kVqmovun) << ConditionPrinter(it_block_, cond) << dt << " "
   5828        << rd << ", " << rm;
   5829 }
   5830 
   5831 void Disassembler::vqneg(Condition cond,
   5832                          DataType dt,
   5833                          DRegister rd,
   5834                          DRegister rm) {
   5835   os().SetCurrentInstruction(kVqneg, kFpNeon);
   5836   os() << ToCString(kVqneg) << ConditionPrinter(it_block_, cond) << dt << " "
   5837        << rd << ", " << rm;
   5838 }
   5839 
   5840 void Disassembler::vqneg(Condition cond,
   5841                          DataType dt,
   5842                          QRegister rd,
   5843                          QRegister rm) {
   5844   os().SetCurrentInstruction(kVqneg, kFpNeon);
   5845   os() << ToCString(kVqneg) << ConditionPrinter(it_block_, cond) << dt << " "
   5846        << rd << ", " << rm;
   5847 }
   5848 
   5849 void Disassembler::vqrdmulh(
   5850     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   5851   os().SetCurrentInstruction(kVqrdmulh, kFpNeon);
   5852   os() << ToCString(kVqrdmulh) << ConditionPrinter(it_block_, cond) << dt;
   5853   os() << " ";
   5854   if (!rd.Is(rn) || !use_short_hand_form_) {
   5855     os() << rd << ", ";
   5856   }
   5857   os() << rn << ", " << rm;
   5858 }
   5859 
   5860 void Disassembler::vqrdmulh(
   5861     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   5862   os().SetCurrentInstruction(kVqrdmulh, kFpNeon);
   5863   os() << ToCString(kVqrdmulh) << ConditionPrinter(it_block_, cond) << dt;
   5864   os() << " ";
   5865   if (!rd.Is(rn) || !use_short_hand_form_) {
   5866     os() << rd << ", ";
   5867   }
   5868   os() << rn << ", " << rm;
   5869 }
   5870 
   5871 void Disassembler::vqrdmulh(
   5872     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegisterLane rm) {
   5873   os().SetCurrentInstruction(kVqrdmulh, kFpNeon);
   5874   os() << ToCString(kVqrdmulh) << ConditionPrinter(it_block_, cond) << dt;
   5875   os() << " ";
   5876   if (!rd.Is(rn) || !use_short_hand_form_) {
   5877     os() << rd << ", ";
   5878   }
   5879   os() << rn << ", " << rm;
   5880 }
   5881 
   5882 void Disassembler::vqrdmulh(
   5883     Condition cond, DataType dt, QRegister rd, QRegister rn, DRegisterLane rm) {
   5884   os().SetCurrentInstruction(kVqrdmulh, kFpNeon);
   5885   os() << ToCString(kVqrdmulh) << ConditionPrinter(it_block_, cond) << dt;
   5886   os() << " ";
   5887   if (!rd.Is(rn) || !use_short_hand_form_) {
   5888     os() << rd << ", ";
   5889   }
   5890   os() << rn << ", " << rm;
   5891 }
   5892 
   5893 void Disassembler::vqrshl(
   5894     Condition cond, DataType dt, DRegister rd, DRegister rm, DRegister rn) {
   5895   os().SetCurrentInstruction(kVqrshl, kFpNeon);
   5896   os() << ToCString(kVqrshl) << ConditionPrinter(it_block_, cond) << dt;
   5897   os() << " ";
   5898   if (!rd.Is(rm) || !use_short_hand_form_) {
   5899     os() << rd << ", ";
   5900   }
   5901   os() << rm << ", " << rn;
   5902 }
   5903 
   5904 void Disassembler::vqrshl(
   5905     Condition cond, DataType dt, QRegister rd, QRegister rm, QRegister rn) {
   5906   os().SetCurrentInstruction(kVqrshl, kFpNeon);
   5907   os() << ToCString(kVqrshl) << ConditionPrinter(it_block_, cond) << dt;
   5908   os() << " ";
   5909   if (!rd.Is(rm) || !use_short_hand_form_) {
   5910     os() << rd << ", ";
   5911   }
   5912   os() << rm << ", " << rn;
   5913 }
   5914 
   5915 void Disassembler::vqrshrn(Condition cond,
   5916                            DataType dt,
   5917                            DRegister rd,
   5918                            QRegister rm,
   5919                            const QOperand& operand) {
   5920   os().SetCurrentInstruction(kVqrshrn, kFpNeon);
   5921   os() << ToCString(kVqrshrn) << ConditionPrinter(it_block_, cond) << dt << " "
   5922        << rd << ", " << rm << ", " << operand;
   5923 }
   5924 
   5925 void Disassembler::vqrshrun(Condition cond,
   5926                             DataType dt,
   5927                             DRegister rd,
   5928                             QRegister rm,
   5929                             const QOperand& operand) {
   5930   os().SetCurrentInstruction(kVqrshrun, kFpNeon);
   5931   os() << ToCString(kVqrshrun) << ConditionPrinter(it_block_, cond) << dt << " "
   5932        << rd << ", " << rm << ", " << operand;
   5933 }
   5934 
   5935 void Disassembler::vqshl(Condition cond,
   5936                          DataType dt,
   5937                          DRegister rd,
   5938                          DRegister rm,
   5939                          const DOperand& operand) {
   5940   os().SetCurrentInstruction(kVqshl, kFpNeon);
   5941   os() << ToCString(kVqshl) << ConditionPrinter(it_block_, cond) << dt;
   5942   os() << " ";
   5943   if (!rd.Is(rm) || !use_short_hand_form_) {
   5944     os() << rd << ", ";
   5945   }
   5946   os() << rm << ", " << operand;
   5947 }
   5948 
   5949 void Disassembler::vqshl(Condition cond,
   5950                          DataType dt,
   5951                          QRegister rd,
   5952                          QRegister rm,
   5953                          const QOperand& operand) {
   5954   os().SetCurrentInstruction(kVqshl, kFpNeon);
   5955   os() << ToCString(kVqshl) << ConditionPrinter(it_block_, cond) << dt;
   5956   os() << " ";
   5957   if (!rd.Is(rm) || !use_short_hand_form_) {
   5958     os() << rd << ", ";
   5959   }
   5960   os() << rm << ", " << operand;
   5961 }
   5962 
   5963 void Disassembler::vqshlu(Condition cond,
   5964                           DataType dt,
   5965                           DRegister rd,
   5966                           DRegister rm,
   5967                           const DOperand& operand) {
   5968   os().SetCurrentInstruction(kVqshlu, kFpNeon);
   5969   os() << ToCString(kVqshlu) << ConditionPrinter(it_block_, cond) << dt;
   5970   os() << " ";
   5971   if (!rd.Is(rm) || !use_short_hand_form_) {
   5972     os() << rd << ", ";
   5973   }
   5974   os() << rm << ", " << operand;
   5975 }
   5976 
   5977 void Disassembler::vqshlu(Condition cond,
   5978                           DataType dt,
   5979                           QRegister rd,
   5980                           QRegister rm,
   5981                           const QOperand& operand) {
   5982   os().SetCurrentInstruction(kVqshlu, kFpNeon);
   5983   os() << ToCString(kVqshlu) << ConditionPrinter(it_block_, cond) << dt;
   5984   os() << " ";
   5985   if (!rd.Is(rm) || !use_short_hand_form_) {
   5986     os() << rd << ", ";
   5987   }
   5988   os() << rm << ", " << operand;
   5989 }
   5990 
   5991 void Disassembler::vqshrn(Condition cond,
   5992                           DataType dt,
   5993                           DRegister rd,
   5994                           QRegister rm,
   5995                           const QOperand& operand) {
   5996   os().SetCurrentInstruction(kVqshrn, kFpNeon);
   5997   os() << ToCString(kVqshrn) << ConditionPrinter(it_block_, cond) << dt << " "
   5998        << rd << ", " << rm << ", " << operand;
   5999 }
   6000 
   6001 void Disassembler::vqshrun(Condition cond,
   6002                            DataType dt,
   6003                            DRegister rd,
   6004                            QRegister rm,
   6005                            const QOperand& operand) {
   6006   os().SetCurrentInstruction(kVqshrun, kFpNeon);
   6007   os() << ToCString(kVqshrun) << ConditionPrinter(it_block_, cond) << dt << " "
   6008        << rd << ", " << rm << ", " << operand;
   6009 }
   6010 
   6011 void Disassembler::vqsub(
   6012     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   6013   os().SetCurrentInstruction(kVqsub, kFpNeon);
   6014   os() << ToCString(kVqsub) << ConditionPrinter(it_block_, cond) << dt;
   6015   os() << " ";
   6016   if (!rd.Is(rn) || !use_short_hand_form_) {
   6017     os() << rd << ", ";
   6018   }
   6019   os() << rn << ", " << rm;
   6020 }
   6021 
   6022 void Disassembler::vqsub(
   6023     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   6024   os().SetCurrentInstruction(kVqsub, kFpNeon);
   6025   os() << ToCString(kVqsub) << ConditionPrinter(it_block_, cond) << dt;
   6026   os() << " ";
   6027   if (!rd.Is(rn) || !use_short_hand_form_) {
   6028     os() << rd << ", ";
   6029   }
   6030   os() << rn << ", " << rm;
   6031 }
   6032 
   6033 void Disassembler::vraddhn(
   6034     Condition cond, DataType dt, DRegister rd, QRegister rn, QRegister rm) {
   6035   os().SetCurrentInstruction(kVraddhn, kFpNeon);
   6036   os() << ToCString(kVraddhn) << ConditionPrinter(it_block_, cond) << dt << " "
   6037        << rd << ", " << rn << ", " << rm;
   6038 }
   6039 
   6040 void Disassembler::vrecpe(Condition cond,
   6041                           DataType dt,
   6042                           DRegister rd,
   6043                           DRegister rm) {
   6044   os().SetCurrentInstruction(kVrecpe, kFpNeon);
   6045   os() << ToCString(kVrecpe) << ConditionPrinter(it_block_, cond) << dt << " "
   6046        << rd << ", " << rm;
   6047 }
   6048 
   6049 void Disassembler::vrecpe(Condition cond,
   6050                           DataType dt,
   6051                           QRegister rd,
   6052                           QRegister rm) {
   6053   os().SetCurrentInstruction(kVrecpe, kFpNeon);
   6054   os() << ToCString(kVrecpe) << ConditionPrinter(it_block_, cond) << dt << " "
   6055        << rd << ", " << rm;
   6056 }
   6057 
   6058 void Disassembler::vrecps(
   6059     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   6060   os().SetCurrentInstruction(kVrecps, kFpNeon);
   6061   os() << ToCString(kVrecps) << ConditionPrinter(it_block_, cond) << dt;
   6062   os() << " ";
   6063   if (!rd.Is(rn) || !use_short_hand_form_) {
   6064     os() << rd << ", ";
   6065   }
   6066   os() << rn << ", " << rm;
   6067 }
   6068 
   6069 void Disassembler::vrecps(
   6070     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   6071   os().SetCurrentInstruction(kVrecps, kFpNeon);
   6072   os() << ToCString(kVrecps) << ConditionPrinter(it_block_, cond) << dt;
   6073   os() << " ";
   6074   if (!rd.Is(rn) || !use_short_hand_form_) {
   6075     os() << rd << ", ";
   6076   }
   6077   os() << rn << ", " << rm;
   6078 }
   6079 
   6080 void Disassembler::vrev16(Condition cond,
   6081                           DataType dt,
   6082                           DRegister rd,
   6083                           DRegister rm) {
   6084   os().SetCurrentInstruction(kVrev16, kFpNeon);
   6085   os() << ToCString(kVrev16) << ConditionPrinter(it_block_, cond) << dt << " "
   6086        << rd << ", " << rm;
   6087 }
   6088 
   6089 void Disassembler::vrev16(Condition cond,
   6090                           DataType dt,
   6091                           QRegister rd,
   6092                           QRegister rm) {
   6093   os().SetCurrentInstruction(kVrev16, kFpNeon);
   6094   os() << ToCString(kVrev16) << ConditionPrinter(it_block_, cond) << dt << " "
   6095        << rd << ", " << rm;
   6096 }
   6097 
   6098 void Disassembler::vrev32(Condition cond,
   6099                           DataType dt,
   6100                           DRegister rd,
   6101                           DRegister rm) {
   6102   os().SetCurrentInstruction(kVrev32, kFpNeon);
   6103   os() << ToCString(kVrev32) << ConditionPrinter(it_block_, cond) << dt << " "
   6104        << rd << ", " << rm;
   6105 }
   6106 
   6107 void Disassembler::vrev32(Condition cond,
   6108                           DataType dt,
   6109                           QRegister rd,
   6110                           QRegister rm) {
   6111   os().SetCurrentInstruction(kVrev32, kFpNeon);
   6112   os() << ToCString(kVrev32) << ConditionPrinter(it_block_, cond) << dt << " "
   6113        << rd << ", " << rm;
   6114 }
   6115 
   6116 void Disassembler::vrev64(Condition cond,
   6117                           DataType dt,
   6118                           DRegister rd,
   6119                           DRegister rm) {
   6120   os().SetCurrentInstruction(kVrev64, kFpNeon);
   6121   os() << ToCString(kVrev64) << ConditionPrinter(it_block_, cond) << dt << " "
   6122        << rd << ", " << rm;
   6123 }
   6124 
   6125 void Disassembler::vrev64(Condition cond,
   6126                           DataType dt,
   6127                           QRegister rd,
   6128                           QRegister rm) {
   6129   os().SetCurrentInstruction(kVrev64, kFpNeon);
   6130   os() << ToCString(kVrev64) << ConditionPrinter(it_block_, cond) << dt << " "
   6131        << rd << ", " << rm;
   6132 }
   6133 
   6134 void Disassembler::vrhadd(
   6135     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   6136   os().SetCurrentInstruction(kVrhadd, kFpNeon);
   6137   os() << ToCString(kVrhadd) << ConditionPrinter(it_block_, cond) << dt;
   6138   os() << " ";
   6139   if (!rd.Is(rn) || !use_short_hand_form_) {
   6140     os() << rd << ", ";
   6141   }
   6142   os() << rn << ", " << rm;
   6143 }
   6144 
   6145 void Disassembler::vrhadd(
   6146     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   6147   os().SetCurrentInstruction(kVrhadd, kFpNeon);
   6148   os() << ToCString(kVrhadd) << ConditionPrinter(it_block_, cond) << dt;
   6149   os() << " ";
   6150   if (!rd.Is(rn) || !use_short_hand_form_) {
   6151     os() << rd << ", ";
   6152   }
   6153   os() << rn << ", " << rm;
   6154 }
   6155 
   6156 void Disassembler::vrinta(DataType dt1,
   6157                           DataType dt2,
   6158                           DRegister rd,
   6159                           DRegister rm) {
   6160   os().SetCurrentInstruction(kVrinta, kFpNeon);
   6161   os() << ToCString(kVrinta) << dt1 << dt2 << " " << rd << ", " << rm;
   6162 }
   6163 
   6164 void Disassembler::vrinta(DataType dt1,
   6165                           DataType dt2,
   6166                           QRegister rd,
   6167                           QRegister rm) {
   6168   os().SetCurrentInstruction(kVrinta, kFpNeon);
   6169   os() << ToCString(kVrinta) << dt1 << dt2 << " " << rd << ", " << rm;
   6170 }
   6171 
   6172 void Disassembler::vrinta(DataType dt1,
   6173                           DataType dt2,
   6174                           SRegister rd,
   6175                           SRegister rm) {
   6176   os().SetCurrentInstruction(kVrinta, kFpNeon);
   6177   os() << ToCString(kVrinta) << dt1 << dt2 << " " << rd << ", " << rm;
   6178 }
   6179 
   6180 void Disassembler::vrintm(DataType dt1,
   6181                           DataType dt2,
   6182                           DRegister rd,
   6183                           DRegister rm) {
   6184   os().SetCurrentInstruction(kVrintm, kFpNeon);
   6185   os() << ToCString(kVrintm) << dt1 << dt2 << " " << rd << ", " << rm;
   6186 }
   6187 
   6188 void Disassembler::vrintm(DataType dt1,
   6189                           DataType dt2,
   6190                           QRegister rd,
   6191                           QRegister rm) {
   6192   os().SetCurrentInstruction(kVrintm, kFpNeon);
   6193   os() << ToCString(kVrintm) << dt1 << dt2 << " " << rd << ", " << rm;
   6194 }
   6195 
   6196 void Disassembler::vrintm(DataType dt1,
   6197                           DataType dt2,
   6198                           SRegister rd,
   6199                           SRegister rm) {
   6200   os().SetCurrentInstruction(kVrintm, kFpNeon);
   6201   os() << ToCString(kVrintm) << dt1 << dt2 << " " << rd << ", " << rm;
   6202 }
   6203 
   6204 void Disassembler::vrintn(DataType dt1,
   6205                           DataType dt2,
   6206                           DRegister rd,
   6207                           DRegister rm) {
   6208   os().SetCurrentInstruction(kVrintn, kFpNeon);
   6209   os() << ToCString(kVrintn) << dt1 << dt2 << " " << rd << ", " << rm;
   6210 }
   6211 
   6212 void Disassembler::vrintn(DataType dt1,
   6213                           DataType dt2,
   6214                           QRegister rd,
   6215                           QRegister rm) {
   6216   os().SetCurrentInstruction(kVrintn, kFpNeon);
   6217   os() << ToCString(kVrintn) << dt1 << dt2 << " " << rd << ", " << rm;
   6218 }
   6219 
   6220 void Disassembler::vrintn(DataType dt1,
   6221                           DataType dt2,
   6222                           SRegister rd,
   6223                           SRegister rm) {
   6224   os().SetCurrentInstruction(kVrintn, kFpNeon);
   6225   os() << ToCString(kVrintn) << dt1 << dt2 << " " << rd << ", " << rm;
   6226 }
   6227 
   6228 void Disassembler::vrintp(DataType dt1,
   6229                           DataType dt2,
   6230                           DRegister rd,
   6231                           DRegister rm) {
   6232   os().SetCurrentInstruction(kVrintp, kFpNeon);
   6233   os() << ToCString(kVrintp) << dt1 << dt2 << " " << rd << ", " << rm;
   6234 }
   6235 
   6236 void Disassembler::vrintp(DataType dt1,
   6237                           DataType dt2,
   6238                           QRegister rd,
   6239                           QRegister rm) {
   6240   os().SetCurrentInstruction(kVrintp, kFpNeon);
   6241   os() << ToCString(kVrintp) << dt1 << dt2 << " " << rd << ", " << rm;
   6242 }
   6243 
   6244 void Disassembler::vrintp(DataType dt1,
   6245                           DataType dt2,
   6246                           SRegister rd,
   6247                           SRegister rm) {
   6248   os().SetCurrentInstruction(kVrintp, kFpNeon);
   6249   os() << ToCString(kVrintp) << dt1 << dt2 << " " << rd << ", " << rm;
   6250 }
   6251 
   6252 void Disassembler::vrintr(
   6253     Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
   6254   os().SetCurrentInstruction(kVrintr, kFpNeon);
   6255   os() << ToCString(kVrintr) << ConditionPrinter(it_block_, cond) << dt1 << dt2
   6256        << " " << rd << ", " << rm;
   6257 }
   6258 
   6259 void Disassembler::vrintr(
   6260     Condition cond, DataType dt1, DataType dt2, DRegister rd, DRegister rm) {
   6261   os().SetCurrentInstruction(kVrintr, kFpNeon);
   6262   os() << ToCString(kVrintr) << ConditionPrinter(it_block_, cond) << dt1 << dt2
   6263        << " " << rd << ", " << rm;
   6264 }
   6265 
   6266 void Disassembler::vrintx(
   6267     Condition cond, DataType dt1, DataType dt2, DRegister rd, DRegister rm) {
   6268   os().SetCurrentInstruction(kVrintx, kFpNeon);
   6269   os() << ToCString(kVrintx) << ConditionPrinter(it_block_, cond) << dt1 << dt2
   6270        << " " << rd << ", " << rm;
   6271 }
   6272 
   6273 void Disassembler::vrintx(DataType dt1,
   6274                           DataType dt2,
   6275                           QRegister rd,
   6276                           QRegister rm) {
   6277   os().SetCurrentInstruction(kVrintx, kFpNeon);
   6278   os() << ToCString(kVrintx) << dt1 << dt2 << " " << rd << ", " << rm;
   6279 }
   6280 
   6281 void Disassembler::vrintx(
   6282     Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
   6283   os().SetCurrentInstruction(kVrintx, kFpNeon);
   6284   os() << ToCString(kVrintx) << ConditionPrinter(it_block_, cond) << dt1 << dt2
   6285        << " " << rd << ", " << rm;
   6286 }
   6287 
   6288 void Disassembler::vrintz(
   6289     Condition cond, DataType dt1, DataType dt2, DRegister rd, DRegister rm) {
   6290   os().SetCurrentInstruction(kVrintz, kFpNeon);
   6291   os() << ToCString(kVrintz) << ConditionPrinter(it_block_, cond) << dt1 << dt2
   6292        << " " << rd << ", " << rm;
   6293 }
   6294 
   6295 void Disassembler::vrintz(DataType dt1,
   6296                           DataType dt2,
   6297                           QRegister rd,
   6298                           QRegister rm) {
   6299   os().SetCurrentInstruction(kVrintz, kFpNeon);
   6300   os() << ToCString(kVrintz) << dt1 << dt2 << " " << rd << ", " << rm;
   6301 }
   6302 
   6303 void Disassembler::vrintz(
   6304     Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
   6305   os().SetCurrentInstruction(kVrintz, kFpNeon);
   6306   os() << ToCString(kVrintz) << ConditionPrinter(it_block_, cond) << dt1 << dt2
   6307        << " " << rd << ", " << rm;
   6308 }
   6309 
   6310 void Disassembler::vrshl(
   6311     Condition cond, DataType dt, DRegister rd, DRegister rm, DRegister rn) {
   6312   os().SetCurrentInstruction(kVrshl, kFpNeon);
   6313   os() << ToCString(kVrshl) << ConditionPrinter(it_block_, cond) << dt;
   6314   os() << " ";
   6315   if (!rd.Is(rm) || !use_short_hand_form_) {
   6316     os() << rd << ", ";
   6317   }
   6318   os() << rm << ", " << rn;
   6319 }
   6320 
   6321 void Disassembler::vrshl(
   6322     Condition cond, DataType dt, QRegister rd, QRegister rm, QRegister rn) {
   6323   os().SetCurrentInstruction(kVrshl, kFpNeon);
   6324   os() << ToCString(kVrshl) << ConditionPrinter(it_block_, cond) << dt;
   6325   os() << " ";
   6326   if (!rd.Is(rm) || !use_short_hand_form_) {
   6327     os() << rd << ", ";
   6328   }
   6329   os() << rm << ", " << rn;
   6330 }
   6331 
   6332 void Disassembler::vrshr(Condition cond,
   6333                          DataType dt,
   6334                          DRegister rd,
   6335                          DRegister rm,
   6336                          const DOperand& operand) {
   6337   os().SetCurrentInstruction(kVrshr, kFpNeon);
   6338   os() << ToCString(kVrshr) << ConditionPrinter(it_block_, cond) << dt;
   6339   os() << " ";
   6340   if (!rd.Is(rm) || !use_short_hand_form_) {
   6341     os() << rd << ", ";
   6342   }
   6343   os() << rm << ", " << operand;
   6344 }
   6345 
   6346 void Disassembler::vrshr(Condition cond,
   6347                          DataType dt,
   6348                          QRegister rd,
   6349                          QRegister rm,
   6350                          const QOperand& operand) {
   6351   os().SetCurrentInstruction(kVrshr, kFpNeon);
   6352   os() << ToCString(kVrshr) << ConditionPrinter(it_block_, cond) << dt;
   6353   os() << " ";
   6354   if (!rd.Is(rm) || !use_short_hand_form_) {
   6355     os() << rd << ", ";
   6356   }
   6357   os() << rm << ", " << operand;
   6358 }
   6359 
   6360 void Disassembler::vrshrn(Condition cond,
   6361                           DataType dt,
   6362                           DRegister rd,
   6363                           QRegister rm,
   6364                           const QOperand& operand) {
   6365   os().SetCurrentInstruction(kVrshrn, kFpNeon);
   6366   os() << ToCString(kVrshrn) << ConditionPrinter(it_block_, cond) << dt << " "
   6367        << rd << ", " << rm << ", " << operand;
   6368 }
   6369 
   6370 void Disassembler::vrsqrte(Condition cond,
   6371                            DataType dt,
   6372                            DRegister rd,
   6373                            DRegister rm) {
   6374   os().SetCurrentInstruction(kVrsqrte, kFpNeon);
   6375   os() << ToCString(kVrsqrte) << ConditionPrinter(it_block_, cond) << dt << " "
   6376        << rd << ", " << rm;
   6377 }
   6378 
   6379 void Disassembler::vrsqrte(Condition cond,
   6380                            DataType dt,
   6381                            QRegister rd,
   6382                            QRegister rm) {
   6383   os().SetCurrentInstruction(kVrsqrte, kFpNeon);
   6384   os() << ToCString(kVrsqrte) << ConditionPrinter(it_block_, cond) << dt << " "
   6385        << rd << ", " << rm;
   6386 }
   6387 
   6388 void Disassembler::vrsqrts(
   6389     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   6390   os().SetCurrentInstruction(kVrsqrts, kFpNeon);
   6391   os() << ToCString(kVrsqrts) << ConditionPrinter(it_block_, cond) << dt;
   6392   os() << " ";
   6393   if (!rd.Is(rn) || !use_short_hand_form_) {
   6394     os() << rd << ", ";
   6395   }
   6396   os() << rn << ", " << rm;
   6397 }
   6398 
   6399 void Disassembler::vrsqrts(
   6400     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   6401   os().SetCurrentInstruction(kVrsqrts, kFpNeon);
   6402   os() << ToCString(kVrsqrts) << ConditionPrinter(it_block_, cond) << dt;
   6403   os() << " ";
   6404   if (!rd.Is(rn) || !use_short_hand_form_) {
   6405     os() << rd << ", ";
   6406   }
   6407   os() << rn << ", " << rm;
   6408 }
   6409 
   6410 void Disassembler::vrsra(Condition cond,
   6411                          DataType dt,
   6412                          DRegister rd,
   6413                          DRegister rm,
   6414                          const DOperand& operand) {
   6415   os().SetCurrentInstruction(kVrsra, kFpNeon);
   6416   os() << ToCString(kVrsra) << ConditionPrinter(it_block_, cond) << dt;
   6417   os() << " ";
   6418   if (!rd.Is(rm) || !use_short_hand_form_) {
   6419     os() << rd << ", ";
   6420   }
   6421   os() << rm << ", " << operand;
   6422 }
   6423 
   6424 void Disassembler::vrsra(Condition cond,
   6425                          DataType dt,
   6426                          QRegister rd,
   6427                          QRegister rm,
   6428                          const QOperand& operand) {
   6429   os().SetCurrentInstruction(kVrsra, kFpNeon);
   6430   os() << ToCString(kVrsra) << ConditionPrinter(it_block_, cond) << dt;
   6431   os() << " ";
   6432   if (!rd.Is(rm) || !use_short_hand_form_) {
   6433     os() << rd << ", ";
   6434   }
   6435   os() << rm << ", " << operand;
   6436 }
   6437 
   6438 void Disassembler::vrsubhn(
   6439     Condition cond, DataType dt, DRegister rd, QRegister rn, QRegister rm) {
   6440   os().SetCurrentInstruction(kVrsubhn, kFpNeon);
   6441   os() << ToCString(kVrsubhn) << ConditionPrinter(it_block_, cond) << dt << " "
   6442        << rd << ", " << rn << ", " << rm;
   6443 }
   6444 
   6445 void Disassembler::vseleq(DataType dt,
   6446                           DRegister rd,
   6447                           DRegister rn,
   6448                           DRegister rm) {
   6449   os().SetCurrentInstruction(kVseleq, kFpNeon);
   6450   os() << ToCString(kVseleq) << dt << " " << rd << ", " << rn << ", " << rm;
   6451 }
   6452 
   6453 void Disassembler::vseleq(DataType dt,
   6454                           SRegister rd,
   6455                           SRegister rn,
   6456                           SRegister rm) {
   6457   os().SetCurrentInstruction(kVseleq, kFpNeon);
   6458   os() << ToCString(kVseleq) << dt << " " << rd << ", " << rn << ", " << rm;
   6459 }
   6460 
   6461 void Disassembler::vselge(DataType dt,
   6462                           DRegister rd,
   6463                           DRegister rn,
   6464                           DRegister rm) {
   6465   os().SetCurrentInstruction(kVselge, kFpNeon);
   6466   os() << ToCString(kVselge) << dt << " " << rd << ", " << rn << ", " << rm;
   6467 }
   6468 
   6469 void Disassembler::vselge(DataType dt,
   6470                           SRegister rd,
   6471                           SRegister rn,
   6472                           SRegister rm) {
   6473   os().SetCurrentInstruction(kVselge, kFpNeon);
   6474   os() << ToCString(kVselge) << dt << " " << rd << ", " << rn << ", " << rm;
   6475 }
   6476 
   6477 void Disassembler::vselgt(DataType dt,
   6478                           DRegister rd,
   6479                           DRegister rn,
   6480                           DRegister rm) {
   6481   os().SetCurrentInstruction(kVselgt, kFpNeon);
   6482   os() << ToCString(kVselgt) << dt << " " << rd << ", " << rn << ", " << rm;
   6483 }
   6484 
   6485 void Disassembler::vselgt(DataType dt,
   6486                           SRegister rd,
   6487                           SRegister rn,
   6488                           SRegister rm) {
   6489   os().SetCurrentInstruction(kVselgt, kFpNeon);
   6490   os() << ToCString(kVselgt) << dt << " " << rd << ", " << rn << ", " << rm;
   6491 }
   6492 
   6493 void Disassembler::vselvs(DataType dt,
   6494                           DRegister rd,
   6495                           DRegister rn,
   6496                           DRegister rm) {
   6497   os().SetCurrentInstruction(kVselvs, kFpNeon);
   6498   os() << ToCString(kVselvs) << dt << " " << rd << ", " << rn << ", " << rm;
   6499 }
   6500 
   6501 void Disassembler::vselvs(DataType dt,
   6502                           SRegister rd,
   6503                           SRegister rn,
   6504                           SRegister rm) {
   6505   os().SetCurrentInstruction(kVselvs, kFpNeon);
   6506   os() << ToCString(kVselvs) << dt << " " << rd << ", " << rn << ", " << rm;
   6507 }
   6508 
   6509 void Disassembler::vshl(Condition cond,
   6510                         DataType dt,
   6511                         DRegister rd,
   6512                         DRegister rm,
   6513                         const DOperand& operand) {
   6514   os().SetCurrentInstruction(kVshl, kFpNeon);
   6515   os() << ToCString(kVshl) << ConditionPrinter(it_block_, cond) << dt;
   6516   os() << " ";
   6517   if (!rd.Is(rm) || !use_short_hand_form_) {
   6518     os() << rd << ", ";
   6519   }
   6520   os() << rm << ", " << operand;
   6521 }
   6522 
   6523 void Disassembler::vshl(Condition cond,
   6524                         DataType dt,
   6525                         QRegister rd,
   6526                         QRegister rm,
   6527                         const QOperand& operand) {
   6528   os().SetCurrentInstruction(kVshl, kFpNeon);
   6529   os() << ToCString(kVshl) << ConditionPrinter(it_block_, cond) << dt;
   6530   os() << " ";
   6531   if (!rd.Is(rm) || !use_short_hand_form_) {
   6532     os() << rd << ", ";
   6533   }
   6534   os() << rm << ", " << operand;
   6535 }
   6536 
   6537 void Disassembler::vshll(Condition cond,
   6538                          DataType dt,
   6539                          QRegister rd,
   6540                          DRegister rm,
   6541                          const DOperand& operand) {
   6542   os().SetCurrentInstruction(kVshll, kFpNeon);
   6543   os() << ToCString(kVshll) << ConditionPrinter(it_block_, cond) << dt << " "
   6544        << rd << ", " << rm << ", " << operand;
   6545 }
   6546 
   6547 void Disassembler::vshr(Condition cond,
   6548                         DataType dt,
   6549                         DRegister rd,
   6550                         DRegister rm,
   6551                         const DOperand& operand) {
   6552   os().SetCurrentInstruction(kVshr, kFpNeon);
   6553   os() << ToCString(kVshr) << ConditionPrinter(it_block_, cond) << dt;
   6554   os() << " ";
   6555   if (!rd.Is(rm) || !use_short_hand_form_) {
   6556     os() << rd << ", ";
   6557   }
   6558   os() << rm << ", " << operand;
   6559 }
   6560 
   6561 void Disassembler::vshr(Condition cond,
   6562                         DataType dt,
   6563                         QRegister rd,
   6564                         QRegister rm,
   6565                         const QOperand& operand) {
   6566   os().SetCurrentInstruction(kVshr, kFpNeon);
   6567   os() << ToCString(kVshr) << ConditionPrinter(it_block_, cond) << dt;
   6568   os() << " ";
   6569   if (!rd.Is(rm) || !use_short_hand_form_) {
   6570     os() << rd << ", ";
   6571   }
   6572   os() << rm << ", " << operand;
   6573 }
   6574 
   6575 void Disassembler::vshrn(Condition cond,
   6576                          DataType dt,
   6577                          DRegister rd,
   6578                          QRegister rm,
   6579                          const QOperand& operand) {
   6580   os().SetCurrentInstruction(kVshrn, kFpNeon);
   6581   os() << ToCString(kVshrn) << ConditionPrinter(it_block_, cond) << dt << " "
   6582        << rd << ", " << rm << ", " << operand;
   6583 }
   6584 
   6585 void Disassembler::vsli(Condition cond,
   6586                         DataType dt,
   6587                         DRegister rd,
   6588                         DRegister rm,
   6589                         const DOperand& operand) {
   6590   os().SetCurrentInstruction(kVsli, kFpNeon);
   6591   os() << ToCString(kVsli) << ConditionPrinter(it_block_, cond) << dt;
   6592   os() << " ";
   6593   if (!rd.Is(rm) || !use_short_hand_form_) {
   6594     os() << rd << ", ";
   6595   }
   6596   os() << rm << ", " << operand;
   6597 }
   6598 
   6599 void Disassembler::vsli(Condition cond,
   6600                         DataType dt,
   6601                         QRegister rd,
   6602                         QRegister rm,
   6603                         const QOperand& operand) {
   6604   os().SetCurrentInstruction(kVsli, kFpNeon);
   6605   os() << ToCString(kVsli) << ConditionPrinter(it_block_, cond) << dt;
   6606   os() << " ";
   6607   if (!rd.Is(rm) || !use_short_hand_form_) {
   6608     os() << rd << ", ";
   6609   }
   6610   os() << rm << ", " << operand;
   6611 }
   6612 
   6613 void Disassembler::vsqrt(Condition cond,
   6614                          DataType dt,
   6615                          SRegister rd,
   6616                          SRegister rm) {
   6617   os().SetCurrentInstruction(kVsqrt, kFpNeon);
   6618   os() << ToCString(kVsqrt) << ConditionPrinter(it_block_, cond) << dt << " "
   6619        << rd << ", " << rm;
   6620 }
   6621 
   6622 void Disassembler::vsqrt(Condition cond,
   6623                          DataType dt,
   6624                          DRegister rd,
   6625                          DRegister rm) {
   6626   os().SetCurrentInstruction(kVsqrt, kFpNeon);
   6627   os() << ToCString(kVsqrt) << ConditionPrinter(it_block_, cond) << dt << " "
   6628        << rd << ", " << rm;
   6629 }
   6630 
   6631 void Disassembler::vsra(Condition cond,
   6632                         DataType dt,
   6633                         DRegister rd,
   6634                         DRegister rm,
   6635                         const DOperand& operand) {
   6636   os().SetCurrentInstruction(kVsra, kFpNeon);
   6637   os() << ToCString(kVsra) << ConditionPrinter(it_block_, cond) << dt;
   6638   os() << " ";
   6639   if (!rd.Is(rm) || !use_short_hand_form_) {
   6640     os() << rd << ", ";
   6641   }
   6642   os() << rm << ", " << operand;
   6643 }
   6644 
   6645 void Disassembler::vsra(Condition cond,
   6646                         DataType dt,
   6647                         QRegister rd,
   6648                         QRegister rm,
   6649                         const QOperand& operand) {
   6650   os().SetCurrentInstruction(kVsra, kFpNeon);
   6651   os() << ToCString(kVsra) << ConditionPrinter(it_block_, cond) << dt;
   6652   os() << " ";
   6653   if (!rd.Is(rm) || !use_short_hand_form_) {
   6654     os() << rd << ", ";
   6655   }
   6656   os() << rm << ", " << operand;
   6657 }
   6658 
   6659 void Disassembler::vsri(Condition cond,
   6660                         DataType dt,
   6661                         DRegister rd,
   6662                         DRegister rm,
   6663                         const DOperand& operand) {
   6664   os().SetCurrentInstruction(kVsri, kFpNeon);
   6665   os() << ToCString(kVsri) << ConditionPrinter(it_block_, cond) << dt;
   6666   os() << " ";
   6667   if (!rd.Is(rm) || !use_short_hand_form_) {
   6668     os() << rd << ", ";
   6669   }
   6670   os() << rm << ", " << operand;
   6671 }
   6672 
   6673 void Disassembler::vsri(Condition cond,
   6674                         DataType dt,
   6675                         QRegister rd,
   6676                         QRegister rm,
   6677                         const QOperand& operand) {
   6678   os().SetCurrentInstruction(kVsri, kFpNeon);
   6679   os() << ToCString(kVsri) << ConditionPrinter(it_block_, cond) << dt;
   6680   os() << " ";
   6681   if (!rd.Is(rm) || !use_short_hand_form_) {
   6682     os() << rd << ", ";
   6683   }
   6684   os() << rm << ", " << operand;
   6685 }
   6686 
   6687 void Disassembler::vst1(Condition cond,
   6688                         DataType dt,
   6689                         const NeonRegisterList& nreglist,
   6690                         const AlignedMemOperand& operand) {
   6691   os().SetCurrentInstruction(kVst1, kFpNeon);
   6692   os() << ToCString(kVst1) << ConditionPrinter(it_block_, cond) << dt << " "
   6693        << nreglist << ", " << PrintAlignedMemOperand(kVst1Location, operand);
   6694 }
   6695 
   6696 void Disassembler::vst2(Condition cond,
   6697                         DataType dt,
   6698                         const NeonRegisterList& nreglist,
   6699                         const AlignedMemOperand& operand) {
   6700   os().SetCurrentInstruction(kVst2, kFpNeon);
   6701   os() << ToCString(kVst2) << ConditionPrinter(it_block_, cond) << dt << " "
   6702        << nreglist << ", " << PrintAlignedMemOperand(kVst2Location, operand);
   6703 }
   6704 
   6705 void Disassembler::vst3(Condition cond,
   6706                         DataType dt,
   6707                         const NeonRegisterList& nreglist,
   6708                         const AlignedMemOperand& operand) {
   6709   os().SetCurrentInstruction(kVst3, kFpNeon);
   6710   os() << ToCString(kVst3) << ConditionPrinter(it_block_, cond) << dt << " "
   6711        << nreglist << ", " << PrintAlignedMemOperand(kVst3Location, operand);
   6712 }
   6713 
   6714 void Disassembler::vst3(Condition cond,
   6715                         DataType dt,
   6716                         const NeonRegisterList& nreglist,
   6717                         const MemOperand& operand) {
   6718   os().SetCurrentInstruction(kVst3, kFpNeon);
   6719   os() << ToCString(kVst3) << ConditionPrinter(it_block_, cond) << dt << " "
   6720        << nreglist << ", " << PrintMemOperand(kVst3Location, operand);
   6721 }
   6722 
   6723 void Disassembler::vst4(Condition cond,
   6724                         DataType dt,
   6725                         const NeonRegisterList& nreglist,
   6726                         const AlignedMemOperand& operand) {
   6727   os().SetCurrentInstruction(kVst4, kFpNeon);
   6728   os() << ToCString(kVst4) << ConditionPrinter(it_block_, cond) << dt << " "
   6729        << nreglist << ", " << PrintAlignedMemOperand(kVst4Location, operand);
   6730 }
   6731 
   6732 void Disassembler::vstm(Condition cond,
   6733                         DataType dt,
   6734                         Register rn,
   6735                         WriteBack write_back,
   6736                         DRegisterList dreglist) {
   6737   os().SetCurrentInstruction(kVstm, kLoadStore | kLoadStoreMultiple | kFpNeon);
   6738   os() << ToCString(kVstm) << ConditionPrinter(it_block_, cond) << dt << " "
   6739        << rn << write_back << ", " << dreglist;
   6740 }
   6741 
   6742 void Disassembler::vstm(Condition cond,
   6743                         DataType dt,
   6744                         Register rn,
   6745                         WriteBack write_back,
   6746                         SRegisterList sreglist) {
   6747   os().SetCurrentInstruction(kVstm, kLoadStore | kLoadStoreMultiple | kFpNeon);
   6748   os() << ToCString(kVstm) << ConditionPrinter(it_block_, cond) << dt << " "
   6749        << rn << write_back << ", " << sreglist;
   6750 }
   6751 
   6752 void Disassembler::vstmdb(Condition cond,
   6753                           DataType dt,
   6754                           Register rn,
   6755                           WriteBack write_back,
   6756                           DRegisterList dreglist) {
   6757   os().SetCurrentInstruction(kVstmdb,
   6758                              kLoadStore | kLoadStoreMultiple | kFpNeon);
   6759   os() << ToCString(kVstmdb) << ConditionPrinter(it_block_, cond) << dt << " "
   6760        << rn << write_back << ", " << dreglist;
   6761 }
   6762 
   6763 void Disassembler::vstmdb(Condition cond,
   6764                           DataType dt,
   6765                           Register rn,
   6766                           WriteBack write_back,
   6767                           SRegisterList sreglist) {
   6768   os().SetCurrentInstruction(kVstmdb,
   6769                              kLoadStore | kLoadStoreMultiple | kFpNeon);
   6770   os() << ToCString(kVstmdb) << ConditionPrinter(it_block_, cond) << dt << " "
   6771        << rn << write_back << ", " << sreglist;
   6772 }
   6773 
   6774 void Disassembler::vstmia(Condition cond,
   6775                           DataType dt,
   6776                           Register rn,
   6777                           WriteBack write_back,
   6778                           DRegisterList dreglist) {
   6779   os().SetCurrentInstruction(kVstmia,
   6780                              kLoadStore | kLoadStoreMultiple | kFpNeon);
   6781   os() << ToCString(kVstmia) << ConditionPrinter(it_block_, cond) << dt << " "
   6782        << rn << write_back << ", " << dreglist;
   6783 }
   6784 
   6785 void Disassembler::vstmia(Condition cond,
   6786                           DataType dt,
   6787                           Register rn,
   6788                           WriteBack write_back,
   6789                           SRegisterList sreglist) {
   6790   os().SetCurrentInstruction(kVstmia,
   6791                              kLoadStore | kLoadStoreMultiple | kFpNeon);
   6792   os() << ToCString(kVstmia) << ConditionPrinter(it_block_, cond) << dt << " "
   6793        << rn << write_back << ", " << sreglist;
   6794 }
   6795 
   6796 void Disassembler::vstr(Condition cond,
   6797                         DataType dt,
   6798                         DRegister rd,
   6799                         const MemOperand& operand) {
   6800   os().SetCurrentInstruction(kVstr, kFpNeon);
   6801   os() << ToCString(kVstr) << ConditionPrinter(it_block_, cond)
   6802        << DtPrinter(dt, Untyped64) << " " << rd << ", "
   6803        << PrintMemOperand(kStoreDoublePrecisionLocation, operand);
   6804 }
   6805 
   6806 void Disassembler::vstr(Condition cond,
   6807                         DataType dt,
   6808                         SRegister rd,
   6809                         const MemOperand& operand) {
   6810   os().SetCurrentInstruction(kVstr, kFpNeon);
   6811   os() << ToCString(kVstr) << ConditionPrinter(it_block_, cond)
   6812        << DtPrinter(dt, Untyped32) << " " << rd << ", "
   6813        << PrintMemOperand(kStoreSinglePrecisionLocation, operand);
   6814 }
   6815 
   6816 void Disassembler::vsub(
   6817     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   6818   os().SetCurrentInstruction(kVsub, kFpNeon);
   6819   os() << ToCString(kVsub) << ConditionPrinter(it_block_, cond) << dt;
   6820   os() << " ";
   6821   if (!rd.Is(rn) || !use_short_hand_form_) {
   6822     os() << rd << ", ";
   6823   }
   6824   os() << rn << ", " << rm;
   6825 }
   6826 
   6827 void Disassembler::vsub(
   6828     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   6829   os().SetCurrentInstruction(kVsub, kFpNeon);
   6830   os() << ToCString(kVsub) << ConditionPrinter(it_block_, cond) << dt;
   6831   os() << " ";
   6832   if (!rd.Is(rn) || !use_short_hand_form_) {
   6833     os() << rd << ", ";
   6834   }
   6835   os() << rn << ", " << rm;
   6836 }
   6837 
   6838 void Disassembler::vsub(
   6839     Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
   6840   os().SetCurrentInstruction(kVsub, kFpNeon);
   6841   os() << ToCString(kVsub) << ConditionPrinter(it_block_, cond) << dt;
   6842   os() << " ";
   6843   if (!rd.Is(rn) || !use_short_hand_form_) {
   6844     os() << rd << ", ";
   6845   }
   6846   os() << rn << ", " << rm;
   6847 }
   6848 
   6849 void Disassembler::vsubhn(
   6850     Condition cond, DataType dt, DRegister rd, QRegister rn, QRegister rm) {
   6851   os().SetCurrentInstruction(kVsubhn, kFpNeon);
   6852   os() << ToCString(kVsubhn) << ConditionPrinter(it_block_, cond) << dt << " "
   6853        << rd << ", " << rn << ", " << rm;
   6854 }
   6855 
   6856 void Disassembler::vsubl(
   6857     Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
   6858   os().SetCurrentInstruction(kVsubl, kFpNeon);
   6859   os() << ToCString(kVsubl) << ConditionPrinter(it_block_, cond) << dt << " "
   6860        << rd << ", " << rn << ", " << rm;
   6861 }
   6862 
   6863 void Disassembler::vsubw(
   6864     Condition cond, DataType dt, QRegister rd, QRegister rn, DRegister rm) {
   6865   os().SetCurrentInstruction(kVsubw, kFpNeon);
   6866   os() << ToCString(kVsubw) << ConditionPrinter(it_block_, cond) << dt;
   6867   os() << " ";
   6868   if (!rd.Is(rn) || !use_short_hand_form_) {
   6869     os() << rd << ", ";
   6870   }
   6871   os() << rn << ", " << rm;
   6872 }
   6873 
   6874 void Disassembler::vswp(Condition cond,
   6875                         DataType dt,
   6876                         DRegister rd,
   6877                         DRegister rm) {
   6878   os().SetCurrentInstruction(kVswp, kFpNeon);
   6879   os() << ToCString(kVswp) << ConditionPrinter(it_block_, cond) << dt << " "
   6880        << rd << ", " << rm;
   6881 }
   6882 
   6883 void Disassembler::vswp(Condition cond,
   6884                         DataType dt,
   6885                         QRegister rd,
   6886                         QRegister rm) {
   6887   os().SetCurrentInstruction(kVswp, kFpNeon);
   6888   os() << ToCString(kVswp) << ConditionPrinter(it_block_, cond) << dt << " "
   6889        << rd << ", " << rm;
   6890 }
   6891 
   6892 void Disassembler::vtbl(Condition cond,
   6893                         DataType dt,
   6894                         DRegister rd,
   6895                         const NeonRegisterList& nreglist,
   6896                         DRegister rm) {
   6897   os().SetCurrentInstruction(kVtbl, kFpNeon);
   6898   os() << ToCString(kVtbl) << ConditionPrinter(it_block_, cond) << dt << " "
   6899        << rd << ", " << nreglist << ", " << rm;
   6900 }
   6901 
   6902 void Disassembler::vtbx(Condition cond,
   6903                         DataType dt,
   6904                         DRegister rd,
   6905                         const NeonRegisterList& nreglist,
   6906                         DRegister rm) {
   6907   os().SetCurrentInstruction(kVtbx, kFpNeon);
   6908   os() << ToCString(kVtbx) << ConditionPrinter(it_block_, cond) << dt << " "
   6909        << rd << ", " << nreglist << ", " << rm;
   6910 }
   6911 
   6912 void Disassembler::vtrn(Condition cond,
   6913                         DataType dt,
   6914                         DRegister rd,
   6915                         DRegister rm) {
   6916   os().SetCurrentInstruction(kVtrn, kFpNeon);
   6917   os() << ToCString(kVtrn) << ConditionPrinter(it_block_, cond) << dt << " "
   6918        << rd << ", " << rm;
   6919 }
   6920 
   6921 void Disassembler::vtrn(Condition cond,
   6922                         DataType dt,
   6923                         QRegister rd,
   6924                         QRegister rm) {
   6925   os().SetCurrentInstruction(kVtrn, kFpNeon);
   6926   os() << ToCString(kVtrn) << ConditionPrinter(it_block_, cond) << dt << " "
   6927        << rd << ", " << rm;
   6928 }
   6929 
   6930 void Disassembler::vtst(
   6931     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   6932   os().SetCurrentInstruction(kVtst, kFpNeon);
   6933   os() << ToCString(kVtst) << ConditionPrinter(it_block_, cond) << dt;
   6934   os() << " ";
   6935   if (!rd.Is(rn) || !use_short_hand_form_) {
   6936     os() << rd << ", ";
   6937   }
   6938   os() << rn << ", " << rm;
   6939 }
   6940 
   6941 void Disassembler::vtst(
   6942     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   6943   os().SetCurrentInstruction(kVtst, kFpNeon);
   6944   os() << ToCString(kVtst) << ConditionPrinter(it_block_, cond) << dt;
   6945   os() << " ";
   6946   if (!rd.Is(rn) || !use_short_hand_form_) {
   6947     os() << rd << ", ";
   6948   }
   6949   os() << rn << ", " << rm;
   6950 }
   6951 
   6952 void Disassembler::vuzp(Condition cond,
   6953                         DataType dt,
   6954                         DRegister rd,
   6955                         DRegister rm) {
   6956   os().SetCurrentInstruction(kVuzp, kFpNeon);
   6957   os() << ToCString(kVuzp) << ConditionPrinter(it_block_, cond) << dt << " "
   6958        << rd << ", " << rm;
   6959 }
   6960 
   6961 void Disassembler::vuzp(Condition cond,
   6962                         DataType dt,
   6963                         QRegister rd,
   6964                         QRegister rm) {
   6965   os().SetCurrentInstruction(kVuzp, kFpNeon);
   6966   os() << ToCString(kVuzp) << ConditionPrinter(it_block_, cond) << dt << " "
   6967        << rd << ", " << rm;
   6968 }
   6969 
   6970 void Disassembler::vzip(Condition cond,
   6971                         DataType dt,
   6972                         DRegister rd,
   6973                         DRegister rm) {
   6974   os().SetCurrentInstruction(kVzip, kFpNeon);
   6975   os() << ToCString(kVzip) << ConditionPrinter(it_block_, cond) << dt << " "
   6976        << rd << ", " << rm;
   6977 }
   6978 
   6979 void Disassembler::vzip(Condition cond,
   6980                         DataType dt,
   6981                         QRegister rd,
   6982                         QRegister rm) {
   6983   os().SetCurrentInstruction(kVzip, kFpNeon);
   6984   os() << ToCString(kVzip) << ConditionPrinter(it_block_, cond) << dt << " "
   6985        << rd << ", " << rm;
   6986 }
   6987 
   6988 void Disassembler::yield(Condition cond, EncodingSize size) {
   6989   os().SetCurrentInstruction(kYield, kNoAttribute);
   6990   os() << ToCString(kYield) << ConditionPrinter(it_block_, cond) << size;
   6991 }
   6992 
   6993 int Disassembler::T32Size(uint32_t instr) {
   6994   if ((instr & 0xe0000000) == 0xe0000000) {
   6995     switch (instr & 0x08000000) {
   6996       case 0x00000000:
   6997         if ((instr & 0x10000000) == 0x10000000) return 4;
   6998         return 2;
   6999       case 0x08000000:
   7000         return 4;
   7001       default:
   7002         return 2;
   7003     }
   7004   }
   7005   return 2;
   7006 }
   7007 
   7008 void Disassembler::DecodeT32(uint32_t instr) {
   7009   T32CodeAddressIncrementer incrementer(instr, &code_address_);
   7010   ITBlockScope it_scope(&it_block_);
   7011 
   7012   switch (instr & 0xe0000000) {
   7013     case 0x00000000: {
   7014       // 0x00000000
   7015       switch (instr & 0x18000000) {
   7016         case 0x18000000: {
   7017           // 0x18000000
   7018           switch (instr & 0x06000000) {
   7019             case 0x00000000: {
   7020               // 0x18000000
   7021               unsigned rd = (instr >> 16) & 0x7;
   7022               unsigned rn = (instr >> 19) & 0x7;
   7023               unsigned rm = (instr >> 22) & 0x7;
   7024               if (InITBlock()) {
   7025                 // ADD<c>{<q>} <Rd>, <Rn>, <Rm> ; T1
   7026                 add(CurrentCond(),
   7027                     Narrow,
   7028                     Register(rd),
   7029                     Register(rn),
   7030                     Register(rm));
   7031               } else if (OutsideITBlock()) {
   7032                 // ADDS{<q>} {<Rd>}, <Rn>, <Rm> ; T1
   7033                 adds(Condition::None(),
   7034                      Narrow,
   7035                      Register(rd),
   7036                      Register(rn),
   7037                      Register(rm));
   7038               } else {
   7039                 UnallocatedT32(instr);
   7040               }
   7041               break;
   7042             }
   7043             case 0x02000000: {
   7044               // 0x1a000000
   7045               unsigned rd = (instr >> 16) & 0x7;
   7046               unsigned rn = (instr >> 19) & 0x7;
   7047               unsigned rm = (instr >> 22) & 0x7;
   7048               if (InITBlock()) {
   7049                 // SUB<c>{<q>} <Rd>, <Rn>, <Rm> ; T1
   7050                 sub(CurrentCond(),
   7051                     Narrow,
   7052                     Register(rd),
   7053                     Register(rn),
   7054                     Register(rm));
   7055               } else if (OutsideITBlock()) {
   7056                 // SUBS{<q>} {<Rd>}, <Rn>, <Rm> ; T1
   7057                 subs(Condition::None(),
   7058                      Narrow,
   7059                      Register(rd),
   7060                      Register(rn),
   7061                      Register(rm));
   7062               } else {
   7063                 UnallocatedT32(instr);
   7064               }
   7065               break;
   7066             }
   7067             case 0x04000000: {
   7068               // 0x1c000000
   7069               unsigned rd = (instr >> 16) & 0x7;
   7070               unsigned rn = (instr >> 19) & 0x7;
   7071               uint32_t imm = (instr >> 22) & 0x7;
   7072               if (InITBlock()) {
   7073                 // ADD<c>{<q>} <Rd>, <Rn>, #<imm3> ; T1
   7074                 add(CurrentCond(), Narrow, Register(rd), Register(rn), imm);
   7075               } else if (OutsideITBlock()) {
   7076                 // ADDS{<q>} <Rd>, <Rn>, #<imm3> ; T1
   7077                 adds(Condition::None(),
   7078                      Narrow,
   7079                      Register(rd),
   7080                      Register(rn),
   7081                      imm);
   7082               } else {
   7083                 UnallocatedT32(instr);
   7084               }
   7085               break;
   7086             }
   7087             case 0x06000000: {
   7088               // 0x1e000000
   7089               unsigned rd = (instr >> 16) & 0x7;
   7090               unsigned rn = (instr >> 19) & 0x7;
   7091               uint32_t imm = (instr >> 22) & 0x7;
   7092               if (InITBlock()) {
   7093                 // SUB<c>{<q>} <Rd>, <Rn>, #<imm3> ; T1
   7094                 sub(CurrentCond(), Narrow, Register(rd), Register(rn), imm);
   7095               } else if (OutsideITBlock()) {
   7096                 // SUBS{<q>} <Rd>, <Rn>, #<imm3> ; T1
   7097                 subs(Condition::None(),
   7098                      Narrow,
   7099                      Register(rd),
   7100                      Register(rn),
   7101                      imm);
   7102               } else {
   7103                 UnallocatedT32(instr);
   7104               }
   7105               break;
   7106             }
   7107           }
   7108           break;
   7109         }
   7110         default: {
   7111           if (((instr & 0x18000000) == 0x18000000)) {
   7112             UnallocatedT32(instr);
   7113             return;
   7114           }
   7115           if (((Uint32((instr >> 27)) & Uint32(0x3)) == Uint32(0x2)) &&
   7116               InITBlock()) {
   7117             unsigned rd = (instr >> 16) & 0x7;
   7118             unsigned rm = (instr >> 19) & 0x7;
   7119             uint32_t amount = (instr >> 22) & 0x1f;
   7120             if (amount == 0) amount = 32;
   7121             // ASR<c>{<q>} {<Rd>}, <Rm>, #<imm> ; T2
   7122             asr(CurrentCond(), Narrow, Register(rd), Register(rm), amount);
   7123             return;
   7124           }
   7125           if (((Uint32((instr >> 27)) & Uint32(0x3)) == Uint32(0x2)) &&
   7126               !InITBlock()) {
   7127             unsigned rd = (instr >> 16) & 0x7;
   7128             unsigned rm = (instr >> 19) & 0x7;
   7129             uint32_t amount = (instr >> 22) & 0x1f;
   7130             if (amount == 0) amount = 32;
   7131             // ASRS{<q>} {<Rd>}, <Rm>, #<imm> ; T2
   7132             asrs(Condition::None(), Narrow, Register(rd), Register(rm), amount);
   7133             return;
   7134           }
   7135           if (((Uint32((instr >> 27)) & Uint32(0x3)) == Uint32(0x0)) &&
   7136               ((instr & 0x07c00000) != 0x00000000) && InITBlock()) {
   7137             unsigned rd = (instr >> 16) & 0x7;
   7138             unsigned rm = (instr >> 19) & 0x7;
   7139             uint32_t amount = (instr >> 22) & 0x1f;
   7140             // LSL<c>{<q>} {<Rd>}, <Rm>, #<imm> ; T2
   7141             lsl(CurrentCond(), Narrow, Register(rd), Register(rm), amount);
   7142             return;
   7143           }
   7144           if (((Uint32((instr >> 27)) & Uint32(0x3)) == Uint32(0x0)) &&
   7145               ((instr & 0x07c00000) != 0x00000000) && !InITBlock()) {
   7146             unsigned rd = (instr >> 16) & 0x7;
   7147             unsigned rm = (instr >> 19) & 0x7;
   7148             uint32_t amount = (instr >> 22) & 0x1f;
   7149             // LSLS{<q>} {<Rd>}, <Rm>, #<imm> ; T2
   7150             lsls(Condition::None(), Narrow, Register(rd), Register(rm), amount);
   7151             return;
   7152           }
   7153           if (((Uint32((instr >> 27)) & Uint32(0x3)) == Uint32(0x1)) &&
   7154               InITBlock()) {
   7155             unsigned rd = (instr >> 16) & 0x7;
   7156             unsigned rm = (instr >> 19) & 0x7;
   7157             uint32_t amount = (instr >> 22) & 0x1f;
   7158             if (amount == 0) amount = 32;
   7159             // LSR<c>{<q>} {<Rd>}, <Rm>, #<imm> ; T2
   7160             lsr(CurrentCond(), Narrow, Register(rd), Register(rm), amount);
   7161             return;
   7162           }
   7163           if (((Uint32((instr >> 27)) & Uint32(0x3)) == Uint32(0x1)) &&
   7164               !InITBlock()) {
   7165             unsigned rd = (instr >> 16) & 0x7;
   7166             unsigned rm = (instr >> 19) & 0x7;
   7167             uint32_t amount = (instr >> 22) & 0x1f;
   7168             if (amount == 0) amount = 32;
   7169             // LSRS{<q>} {<Rd>}, <Rm>, #<imm> ; T2
   7170             lsrs(Condition::None(), Narrow, Register(rd), Register(rm), amount);
   7171             return;
   7172           }
   7173           unsigned rd = (instr >> 16) & 0x7;
   7174           unsigned rm = (instr >> 19) & 0x7;
   7175           ImmediateShiftOperand shift_operand((instr >> 27) & 0x3,
   7176                                               (instr >> 22) & 0x1f);
   7177           if (InITBlock()) {
   7178             // MOV<c>{<q>} <Rd>, <Rm> {, <shift> #<amount> } ; T2
   7179             mov(CurrentCond(),
   7180                 Narrow,
   7181                 Register(rd),
   7182                 Operand(Register(rm),
   7183                         shift_operand.GetType(),
   7184                         shift_operand.GetAmount()));
   7185           } else if (OutsideITBlock()) {
   7186             // MOVS{<q>} <Rd>, <Rm> {, <shift> #<amount> } ; T2
   7187             movs(Condition::None(),
   7188                  Narrow,
   7189                  Register(rd),
   7190                  Operand(Register(rm),
   7191                          shift_operand.GetType(),
   7192                          shift_operand.GetAmount()));
   7193           } else {
   7194             UnallocatedT32(instr);
   7195           }
   7196           break;
   7197         }
   7198       }
   7199       break;
   7200     }
   7201     case 0x20000000: {
   7202       // 0x20000000
   7203       switch (instr & 0x18000000) {
   7204         case 0x00000000: {
   7205           // 0x20000000
   7206           unsigned rd = (instr >> 24) & 0x7;
   7207           uint32_t imm = (instr >> 16) & 0xff;
   7208           if (InITBlock()) {
   7209             // MOV<c>{<q>} <Rd>, #<imm8> ; T1
   7210             mov(CurrentCond(), Narrow, Register(rd), imm);
   7211           } else if (OutsideITBlock()) {
   7212             // MOVS{<q>} <Rd>, #<imm8> ; T1
   7213             movs(Condition::None(), Narrow, Register(rd), imm);
   7214           } else {
   7215             UnallocatedT32(instr);
   7216           }
   7217           break;
   7218         }
   7219         case 0x08000000: {
   7220           // 0x28000000
   7221           unsigned rn = (instr >> 24) & 0x7;
   7222           uint32_t imm = (instr >> 16) & 0xff;
   7223           // CMP{<c>}{<q>} <Rn>, #<imm8> ; T1
   7224           cmp(CurrentCond(), Narrow, Register(rn), imm);
   7225           break;
   7226         }
   7227         case 0x10000000: {
   7228           // 0x30000000
   7229           unsigned rd = (instr >> 24) & 0x7;
   7230           uint32_t imm = (instr >> 16) & 0xff;
   7231           if (InITBlock() && ((imm <= 7))) {
   7232             // ADD<c>{<q>} <Rdn>, #<imm8> ; T2
   7233             add(CurrentCond(), Register(rd), imm);
   7234           } else if (InITBlock() && ((imm > 7))) {
   7235             // ADD<c>{<q>} {<Rdn>}, <Rdn>, #<imm8> ; T2
   7236             add(CurrentCond(), Narrow, Register(rd), Register(rd), imm);
   7237           } else if (OutsideITBlock() && ((imm <= 7))) {
   7238             // ADDS{<q>} <Rdn>, #<imm8> ; T2
   7239             adds(Register(rd), imm);
   7240           } else if (OutsideITBlock() && ((imm > 7))) {
   7241             // ADDS{<q>} {<Rdn>}, <Rdn>, #<imm8> ; T2
   7242             adds(Condition::None(), Narrow, Register(rd), Register(rd), imm);
   7243           } else {
   7244             UnallocatedT32(instr);
   7245           }
   7246           break;
   7247         }
   7248         case 0x18000000: {
   7249           // 0x38000000
   7250           unsigned rd = (instr >> 24) & 0x7;
   7251           uint32_t imm = (instr >> 16) & 0xff;
   7252           if (InITBlock() && ((imm <= 7))) {
   7253             // SUB<c>{<q>} <Rdn>, #<imm8> ; T2
   7254             sub(CurrentCond(), Register(rd), imm);
   7255           } else if (InITBlock() && ((imm > 7))) {
   7256             // SUB<c>{<q>} {<Rdn>}, <Rdn>, #<imm8> ; T2
   7257             sub(CurrentCond(), Narrow, Register(rd), Register(rd), imm);
   7258           } else if (OutsideITBlock() && ((imm <= 7))) {
   7259             // SUBS{<q>} <Rdn>, #<imm8> ; T2
   7260             subs(Register(rd), imm);
   7261           } else if (OutsideITBlock() && ((imm > 7))) {
   7262             // SUBS{<q>} {<Rdn>}, <Rdn>, #<imm8> ; T2
   7263             subs(Condition::None(), Narrow, Register(rd), Register(rd), imm);
   7264           } else {
   7265             UnallocatedT32(instr);
   7266           }
   7267           break;
   7268         }
   7269       }
   7270       break;
   7271     }
   7272     case 0x40000000: {
   7273       // 0x40000000
   7274       switch (instr & 0x18000000) {
   7275         case 0x00000000: {
   7276           // 0x40000000
   7277           switch (instr & 0x07000000) {
   7278             case 0x00000000: {
   7279               // 0x40000000
   7280               switch (instr & 0x00c00000) {
   7281                 case 0x00000000: {
   7282                   // 0x40000000
   7283                   unsigned rd = (instr >> 16) & 0x7;
   7284                   unsigned rm = (instr >> 19) & 0x7;
   7285                   if (InITBlock()) {
   7286                     // AND<c>{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1
   7287                     and_(CurrentCond(),
   7288                          Narrow,
   7289                          Register(rd),
   7290                          Register(rd),
   7291                          Register(rm));
   7292                   } else if (OutsideITBlock()) {
   7293                     // ANDS{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1
   7294                     ands(Condition::None(),
   7295                          Narrow,
   7296                          Register(rd),
   7297                          Register(rd),
   7298                          Register(rm));
   7299                   } else {
   7300                     UnallocatedT32(instr);
   7301                   }
   7302                   break;
   7303                 }
   7304                 case 0x00400000: {
   7305                   // 0x40400000
   7306                   unsigned rd = (instr >> 16) & 0x7;
   7307                   unsigned rm = (instr >> 19) & 0x7;
   7308                   if (InITBlock()) {
   7309                     // EOR<c>{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1
   7310                     eor(CurrentCond(),
   7311                         Narrow,
   7312                         Register(rd),
   7313                         Register(rd),
   7314                         Register(rm));
   7315                   } else if (OutsideITBlock()) {
   7316                     // EORS{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1
   7317                     eors(Condition::None(),
   7318                          Narrow,
   7319                          Register(rd),
   7320                          Register(rd),
   7321                          Register(rm));
   7322                   } else {
   7323                     UnallocatedT32(instr);
   7324                   }
   7325                   break;
   7326                 }
   7327                 case 0x00800000: {
   7328                   // 0x40800000
   7329                   if (InITBlock()) {
   7330                     unsigned rd = (instr >> 16) & 0x7;
   7331                     unsigned rs = (instr >> 19) & 0x7;
   7332                     // LSL<c>{<q>} {<Rdm>}, <Rdm>, <Rs> ; T1
   7333                     lsl(CurrentCond(),
   7334                         Narrow,
   7335                         Register(rd),
   7336                         Register(rd),
   7337                         Register(rs));
   7338                     return;
   7339                   }
   7340                   if (!InITBlock()) {
   7341                     unsigned rd = (instr >> 16) & 0x7;
   7342                     unsigned rs = (instr >> 19) & 0x7;
   7343                     // LSLS{<q>} {<Rdm>}, <Rdm>, <Rs> ; T1
   7344                     lsls(Condition::None(),
   7345                          Narrow,
   7346                          Register(rd),
   7347                          Register(rd),
   7348                          Register(rs));
   7349                     return;
   7350                   }
   7351                   unsigned rd = (instr >> 16) & 0x7;
   7352                   unsigned rm = (instr >> 16) & 0x7;
   7353                   unsigned rs = (instr >> 19) & 0x7;
   7354                   if (InITBlock()) {
   7355                     // MOV<c>{<q>} <Rdm>, <Rdm>, LSL <Rs> ; T1
   7356                     mov(CurrentCond(),
   7357                         Narrow,
   7358                         Register(rd),
   7359                         Operand(Register(rm), LSL, Register(rs)));
   7360                   } else if (OutsideITBlock()) {
   7361                     // MOVS{<q>} <Rdm>, <Rdm>, LSL <Rs> ; T1
   7362                     movs(Condition::None(),
   7363                          Narrow,
   7364                          Register(rd),
   7365                          Operand(Register(rm), LSL, Register(rs)));
   7366                   } else {
   7367                     UnallocatedT32(instr);
   7368                   }
   7369                   break;
   7370                 }
   7371                 case 0x00c00000: {
   7372                   // 0x40c00000
   7373                   if (InITBlock()) {
   7374                     unsigned rd = (instr >> 16) & 0x7;
   7375                     unsigned rs = (instr >> 19) & 0x7;
   7376                     // LSR<c>{<q>} {<Rdm>}, <Rdm>, <Rs> ; T1
   7377                     lsr(CurrentCond(),
   7378                         Narrow,
   7379                         Register(rd),
   7380                         Register(rd),
   7381                         Register(rs));
   7382                     return;
   7383                   }
   7384                   if (!InITBlock()) {
   7385                     unsigned rd = (instr >> 16) & 0x7;
   7386                     unsigned rs = (instr >> 19) & 0x7;
   7387                     // LSRS{<q>} {<Rdm>}, <Rdm>, <Rs> ; T1
   7388                     lsrs(Condition::None(),
   7389                          Narrow,
   7390                          Register(rd),
   7391                          Register(rd),
   7392                          Register(rs));
   7393                     return;
   7394                   }
   7395                   unsigned rd = (instr >> 16) & 0x7;
   7396                   unsigned rm = (instr >> 16) & 0x7;
   7397                   unsigned rs = (instr >> 19) & 0x7;
   7398                   if (InITBlock()) {
   7399                     // MOV<c>{<q>} <Rdm>, <Rdm>, LSR <Rs> ; T1
   7400                     mov(CurrentCond(),
   7401                         Narrow,
   7402                         Register(rd),
   7403                         Operand(Register(rm), LSR, Register(rs)));
   7404                   } else if (OutsideITBlock()) {
   7405                     // MOVS{<q>} <Rdm>, <Rdm>, LSR <Rs> ; T1
   7406                     movs(Condition::None(),
   7407                          Narrow,
   7408                          Register(rd),
   7409                          Operand(Register(rm), LSR, Register(rs)));
   7410                   } else {
   7411                     UnallocatedT32(instr);
   7412                   }
   7413                   break;
   7414                 }
   7415               }
   7416               break;
   7417             }
   7418             case 0x01000000: {
   7419               // 0x41000000
   7420               switch (instr & 0x00c00000) {
   7421                 case 0x00000000: {
   7422                   // 0x41000000
   7423                   if (InITBlock()) {
   7424                     unsigned rd = (instr >> 16) & 0x7;
   7425                     unsigned rs = (instr >> 19) & 0x7;
   7426                     // ASR<c>{<q>} {<Rdm>}, <Rdm>, <Rs> ; T1
   7427                     asr(CurrentCond(),
   7428                         Narrow,
   7429                         Register(rd),
   7430                         Register(rd),
   7431                         Register(rs));
   7432                     return;
   7433                   }
   7434                   if (!InITBlock()) {
   7435                     unsigned rd = (instr >> 16) & 0x7;
   7436                     unsigned rs = (instr >> 19) & 0x7;
   7437                     // ASRS{<q>} {<Rdm>}, <Rdm>, <Rs> ; T1
   7438                     asrs(Condition::None(),
   7439                          Narrow,
   7440                          Register(rd),
   7441                          Register(rd),
   7442                          Register(rs));
   7443                     return;
   7444                   }
   7445                   unsigned rd = (instr >> 16) & 0x7;
   7446                   unsigned rm = (instr >> 16) & 0x7;
   7447                   unsigned rs = (instr >> 19) & 0x7;
   7448                   if (InITBlock()) {
   7449                     // MOV<c>{<q>} <Rdm>, <Rdm>, ASR <Rs> ; T1
   7450                     mov(CurrentCond(),
   7451                         Narrow,
   7452                         Register(rd),
   7453                         Operand(Register(rm), ASR, Register(rs)));
   7454                   } else if (OutsideITBlock()) {
   7455                     // MOVS{<q>} <Rdm>, <Rdm>, ASR <Rs> ; T1
   7456                     movs(Condition::None(),
   7457                          Narrow,
   7458                          Register(rd),
   7459                          Operand(Register(rm), ASR, Register(rs)));
   7460                   } else {
   7461                     UnallocatedT32(instr);
   7462                   }
   7463                   break;
   7464                 }
   7465                 case 0x00400000: {
   7466                   // 0x41400000
   7467                   unsigned rd = (instr >> 16) & 0x7;
   7468                   unsigned rm = (instr >> 19) & 0x7;
   7469                   if (InITBlock()) {
   7470                     // ADC<c>{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1
   7471                     adc(CurrentCond(),
   7472                         Narrow,
   7473                         Register(rd),
   7474                         Register(rd),
   7475                         Register(rm));
   7476                   } else if (OutsideITBlock()) {
   7477                     // ADCS{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1
   7478                     adcs(Condition::None(),
   7479                          Narrow,
   7480                          Register(rd),
   7481                          Register(rd),
   7482                          Register(rm));
   7483                   } else {
   7484                     UnallocatedT32(instr);
   7485                   }
   7486                   break;
   7487                 }
   7488                 case 0x00800000: {
   7489                   // 0x41800000
   7490                   unsigned rd = (instr >> 16) & 0x7;
   7491                   unsigned rm = (instr >> 19) & 0x7;
   7492                   if (InITBlock()) {
   7493                     // SBC<c>{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1
   7494                     sbc(CurrentCond(),
   7495                         Narrow,
   7496                         Register(rd),
   7497                         Register(rd),
   7498                         Register(rm));
   7499                   } else if (OutsideITBlock()) {
   7500                     // SBCS{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1
   7501                     sbcs(Condition::None(),
   7502                          Narrow,
   7503                          Register(rd),
   7504                          Register(rd),
   7505                          Register(rm));
   7506                   } else {
   7507                     UnallocatedT32(instr);
   7508                   }
   7509                   break;
   7510                 }
   7511                 case 0x00c00000: {
   7512                   // 0x41c00000
   7513                   if (InITBlock()) {
   7514                     unsigned rd = (instr >> 16) & 0x7;
   7515                     unsigned rs = (instr >> 19) & 0x7;
   7516                     // ROR<c>{<q>} {<Rdm>}, <Rdm>, <Rs> ; T1
   7517                     ror(CurrentCond(),
   7518                         Narrow,
   7519                         Register(rd),
   7520                         Register(rd),
   7521                         Register(rs));
   7522                     return;
   7523                   }
   7524                   if (!InITBlock()) {
   7525                     unsigned rd = (instr >> 16) & 0x7;
   7526                     unsigned rs = (instr >> 19) & 0x7;
   7527                     // RORS{<q>} {<Rdm>}, <Rdm>, <Rs> ; T1
   7528                     rors(Condition::None(),
   7529                          Narrow,
   7530                          Register(rd),
   7531                          Register(rd),
   7532                          Register(rs));
   7533                     return;
   7534                   }
   7535                   unsigned rd = (instr >> 16) & 0x7;
   7536                   unsigned rm = (instr >> 16) & 0x7;
   7537                   unsigned rs = (instr >> 19) & 0x7;
   7538                   if (InITBlock()) {
   7539                     // MOV<c>{<q>} <Rdm>, <Rdm>, ROR <Rs> ; T1
   7540                     mov(CurrentCond(),
   7541                         Narrow,
   7542                         Register(rd),
   7543                         Operand(Register(rm), ROR, Register(rs)));
   7544                   } else if (OutsideITBlock()) {
   7545                     // MOVS{<q>} <Rdm>, <Rdm>, ROR <Rs> ; T1
   7546                     movs(Condition::None(),
   7547                          Narrow,
   7548                          Register(rd),
   7549                          Operand(Register(rm), ROR, Register(rs)));
   7550                   } else {
   7551                     UnallocatedT32(instr);
   7552                   }
   7553                   break;
   7554                 }
   7555               }
   7556               break;
   7557             }
   7558             case 0x02000000: {
   7559               // 0x42000000
   7560               switch (instr & 0x00c00000) {
   7561                 case 0x00000000: {
   7562                   // 0x42000000
   7563                   unsigned rn = (instr >> 16) & 0x7;
   7564                   unsigned rm = (instr >> 19) & 0x7;
   7565                   // TST{<c>}{<q>} <Rn>, <Rm> ; T1
   7566                   tst(CurrentCond(), Narrow, Register(rn), Register(rm));
   7567                   break;
   7568                 }
   7569                 case 0x00400000: {
   7570                   // 0x42400000
   7571                   unsigned rd = (instr >> 16) & 0x7;
   7572                   unsigned rn = (instr >> 19) & 0x7;
   7573                   if (InITBlock()) {
   7574                     // RSB<c>{<q>} {<Rd>}, <Rn>, #0 ; T1
   7575                     rsb(CurrentCond(),
   7576                         Narrow,
   7577                         Register(rd),
   7578                         Register(rn),
   7579                         UINT32_C(0));
   7580                   } else if (OutsideITBlock()) {
   7581                     // RSBS{<q>} {<Rd>}, <Rn>, #0 ; T1
   7582                     rsbs(Condition::None(),
   7583                          Narrow,
   7584                          Register(rd),
   7585                          Register(rn),
   7586                          UINT32_C(0));
   7587                   } else {
   7588                     UnallocatedT32(instr);
   7589                   }
   7590                   break;
   7591                 }
   7592                 case 0x00800000: {
   7593                   // 0x42800000
   7594                   unsigned rn = (instr >> 16) & 0x7;
   7595                   unsigned rm = (instr >> 19) & 0x7;
   7596                   // CMP{<c>}{<q>} <Rn>, <Rm> ; T1
   7597                   cmp(CurrentCond(), Narrow, Register(rn), Register(rm));
   7598                   break;
   7599                 }
   7600                 case 0x00c00000: {
   7601                   // 0x42c00000
   7602                   unsigned rn = (instr >> 16) & 0x7;
   7603                   unsigned rm = (instr >> 19) & 0x7;
   7604                   // CMN{<c>}{<q>} <Rn>, <Rm> ; T1
   7605                   cmn(CurrentCond(), Narrow, Register(rn), Register(rm));
   7606                   break;
   7607                 }
   7608               }
   7609               break;
   7610             }
   7611             case 0x03000000: {
   7612               // 0x43000000
   7613               switch (instr & 0x00c00000) {
   7614                 case 0x00000000: {
   7615                   // 0x43000000
   7616                   unsigned rd = (instr >> 16) & 0x7;
   7617                   unsigned rm = (instr >> 19) & 0x7;
   7618                   if (InITBlock()) {
   7619                     // ORR<c>{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1
   7620                     orr(CurrentCond(),
   7621                         Narrow,
   7622                         Register(rd),
   7623                         Register(rd),
   7624                         Register(rm));
   7625                   } else if (OutsideITBlock()) {
   7626                     // ORRS{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1
   7627                     orrs(Condition::None(),
   7628                          Narrow,
   7629                          Register(rd),
   7630                          Register(rd),
   7631                          Register(rm));
   7632                   } else {
   7633                     UnallocatedT32(instr);
   7634                   }
   7635                   break;
   7636                 }
   7637                 case 0x00400000: {
   7638                   // 0x43400000
   7639                   unsigned rd = (instr >> 16) & 0x7;
   7640                   unsigned rn = (instr >> 19) & 0x7;
   7641                   if (InITBlock()) {
   7642                     // MUL<c>{<q>} <Rdm>, <Rn>, {<Rdm>} ; T1
   7643                     mul(CurrentCond(),
   7644                         Narrow,
   7645                         Register(rd),
   7646                         Register(rn),
   7647                         Register(rd));
   7648                   } else if (OutsideITBlock()) {
   7649                     // MULS{<q>} <Rdm>, <Rn>, {<Rdm>} ; T1
   7650                     muls(Condition::None(),
   7651                          Register(rd),
   7652                          Register(rn),
   7653                          Register(rd));
   7654                   } else {
   7655                     UnallocatedT32(instr);
   7656                   }
   7657                   break;
   7658                 }
   7659                 case 0x00800000: {
   7660                   // 0x43800000
   7661                   unsigned rd = (instr >> 16) & 0x7;
   7662                   unsigned rm = (instr >> 19) & 0x7;
   7663                   if (InITBlock()) {
   7664                     // BIC<c>{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1
   7665                     bic(CurrentCond(),
   7666                         Narrow,
   7667                         Register(rd),
   7668                         Register(rd),
   7669                         Register(rm));
   7670                   } else if (OutsideITBlock()) {
   7671                     // BICS{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1
   7672                     bics(Condition::None(),
   7673                          Narrow,
   7674                          Register(rd),
   7675                          Register(rd),
   7676                          Register(rm));
   7677                   } else {
   7678                     UnallocatedT32(instr);
   7679                   }
   7680                   break;
   7681                 }
   7682                 case 0x00c00000: {
   7683                   // 0x43c00000
   7684                   unsigned rd = (instr >> 16) & 0x7;
   7685                   unsigned rm = (instr >> 19) & 0x7;
   7686                   if (InITBlock()) {
   7687                     // MVN<c>{<q>} <Rd>, <Rm> ; T1
   7688                     mvn(CurrentCond(), Narrow, Register(rd), Register(rm));
   7689                   } else if (OutsideITBlock()) {
   7690                     // MVNS{<q>} <Rd>, <Rm> ; T1
   7691                     mvns(Condition::None(), Narrow, Register(rd), Register(rm));
   7692                   } else {
   7693                     UnallocatedT32(instr);
   7694                   }
   7695                   break;
   7696                 }
   7697               }
   7698               break;
   7699             }
   7700             case 0x04000000: {
   7701               // 0x44000000
   7702               switch (instr & 0x00780000) {
   7703                 case 0x00680000: {
   7704                   // 0x44680000
   7705                   unsigned rd = ((instr >> 16) & 0x7) | ((instr >> 20) & 0x8);
   7706                   // ADD{<c>}{<q>} {<Rdm>}, SP, <Rdm> ; T1
   7707                   add(CurrentCond(), Narrow, Register(rd), sp, Register(rd));
   7708                   break;
   7709                 }
   7710                 default: {
   7711                   switch (instr & 0x00870000) {
   7712                     case 0x00850000: {
   7713                       // 0x44850000
   7714                       if (((instr & 0x780000) == 0x680000)) {
   7715                         UnallocatedT32(instr);
   7716                         return;
   7717                       }
   7718                       unsigned rm = (instr >> 19) & 0xf;
   7719                       // ADD{<c>}{<q>} {SP}, SP, <Rm> ; T2
   7720                       add(CurrentCond(), Narrow, sp, sp, Register(rm));
   7721                       break;
   7722                     }
   7723                     default: {
   7724                       if (((instr & 0x780000) == 0x680000) ||
   7725                           ((instr & 0x870000) == 0x850000)) {
   7726                         UnallocatedT32(instr);
   7727                         return;
   7728                       }
   7729                       unsigned rd =
   7730                           ((instr >> 16) & 0x7) | ((instr >> 20) & 0x8);
   7731                       unsigned rm = (instr >> 19) & 0xf;
   7732                       if (InITBlock()) {
   7733                         // ADD<c>{<q>} <Rdn>, <Rm> ; T2
   7734                         add(CurrentCond(), Register(rd), Register(rm));
   7735                       } else {
   7736                         // ADD{<c>}{<q>} {<Rdn>}, <Rdn>, <Rm> ; T2
   7737                         add(CurrentCond(),
   7738                             Narrow,
   7739                             Register(rd),
   7740                             Register(rd),
   7741                             Register(rm));
   7742                       }
   7743                       break;
   7744                     }
   7745                   }
   7746                   break;
   7747                 }
   7748               }
   7749               break;
   7750             }
   7751             case 0x05000000: {
   7752               // 0x45000000
   7753               unsigned rn = ((instr >> 16) & 0x7) | ((instr >> 20) & 0x8);
   7754               unsigned rm = (instr >> 19) & 0xf;
   7755               // CMP{<c>}{<q>} <Rn>, <Rm> ; T2
   7756               cmp(CurrentCond(), Narrow, Register(rn), Register(rm));
   7757               break;
   7758             }
   7759             case 0x06000000: {
   7760               // 0x46000000
   7761               unsigned rd = ((instr >> 16) & 0x7) | ((instr >> 20) & 0x8);
   7762               unsigned rm = (instr >> 19) & 0xf;
   7763               // MOV{<c>}{<q>} <Rd>, <Rm> ; T1
   7764               mov(CurrentCond(), Narrow, Register(rd), Register(rm));
   7765               break;
   7766             }
   7767             case 0x07000000: {
   7768               // 0x47000000
   7769               switch (instr & 0x00800000) {
   7770                 case 0x00000000: {
   7771                   // 0x47000000
   7772                   unsigned rm = (instr >> 19) & 0xf;
   7773                   // BX{<c>}{<q>} <Rm> ; T1
   7774                   bx(CurrentCond(), Register(rm));
   7775                   if (((instr & 0xff870000) != 0x47000000)) {
   7776                     UnpredictableT32(instr);
   7777                   }
   7778                   break;
   7779                 }
   7780                 case 0x00800000: {
   7781                   // 0x47800000
   7782                   unsigned rm = (instr >> 19) & 0xf;
   7783                   // BLX{<c>}{<q>} <Rm> ; T1
   7784                   blx(CurrentCond(), Register(rm));
   7785                   if (((instr & 0xff870000) != 0x47800000)) {
   7786                     UnpredictableT32(instr);
   7787                   }
   7788                   break;
   7789                 }
   7790               }
   7791               break;
   7792             }
   7793           }
   7794           break;
   7795         }
   7796         case 0x08000000: {
   7797           // 0x48000000
   7798           unsigned rt = (instr >> 24) & 0x7;
   7799           int32_t imm = ((instr >> 16) & 0xff) << 2;
   7800           Location location(imm, kT32PcDelta);
   7801           // LDR{<c>}{<q>} <Rt>, <label> ; T1
   7802           ldr(CurrentCond(), Narrow, Register(rt), &location);
   7803           break;
   7804         }
   7805         case 0x10000000: {
   7806           // 0x50000000
   7807           switch (instr & 0x06000000) {
   7808             case 0x00000000: {
   7809               // 0x50000000
   7810               unsigned rt = (instr >> 16) & 0x7;
   7811               unsigned rn = (instr >> 19) & 0x7;
   7812               Sign sign(plus);
   7813               unsigned rm = (instr >> 22) & 0x7;
   7814               AddrMode addrmode = Offset;
   7815               // STR{<c>}{<q>} <Rt>, [<Rn>, #{+}<Rm>] ; T1
   7816               str(CurrentCond(),
   7817                   Narrow,
   7818                   Register(rt),
   7819                   MemOperand(Register(rn), sign, Register(rm), addrmode));
   7820               break;
   7821             }
   7822             case 0x02000000: {
   7823               // 0x52000000
   7824               unsigned rt = (instr >> 16) & 0x7;
   7825               unsigned rn = (instr >> 19) & 0x7;
   7826               Sign sign(plus);
   7827               unsigned rm = (instr >> 22) & 0x7;
   7828               AddrMode addrmode = Offset;
   7829               // STRH{<c>}{<q>} <Rt>, [<Rn>, #{+}<Rm>] ; T1
   7830               strh(CurrentCond(),
   7831                    Narrow,
   7832                    Register(rt),
   7833                    MemOperand(Register(rn), sign, Register(rm), addrmode));
   7834               break;
   7835             }
   7836             case 0x04000000: {
   7837               // 0x54000000
   7838               unsigned rt = (instr >> 16) & 0x7;
   7839               unsigned rn = (instr >> 19) & 0x7;
   7840               Sign sign(plus);
   7841               unsigned rm = (instr >> 22) & 0x7;
   7842               AddrMode addrmode = Offset;
   7843               // STRB{<c>}{<q>} <Rt>, [<Rn>, #{+}<Rm>] ; T1
   7844               strb(CurrentCond(),
   7845                    Narrow,
   7846                    Register(rt),
   7847                    MemOperand(Register(rn), sign, Register(rm), addrmode));
   7848               break;
   7849             }
   7850             case 0x06000000: {
   7851               // 0x56000000
   7852               unsigned rt = (instr >> 16) & 0x7;
   7853               unsigned rn = (instr >> 19) & 0x7;
   7854               Sign sign(plus);
   7855               unsigned rm = (instr >> 22) & 0x7;
   7856               AddrMode addrmode = Offset;
   7857               // LDRSB{<c>}{<q>} <Rt>, [<Rn>, #{+}<Rm>] ; T1
   7858               ldrsb(CurrentCond(),
   7859                     Narrow,
   7860                     Register(rt),
   7861                     MemOperand(Register(rn), sign, Register(rm), addrmode));
   7862               break;
   7863             }
   7864           }
   7865           break;
   7866         }
   7867         case 0x18000000: {
   7868           // 0x58000000
   7869           switch (instr & 0x06000000) {
   7870             case 0x00000000: {
   7871               // 0x58000000
   7872               unsigned rt = (instr >> 16) & 0x7;
   7873               unsigned rn = (instr >> 19) & 0x7;
   7874               Sign sign(plus);
   7875               unsigned rm = (instr >> 22) & 0x7;
   7876               AddrMode addrmode = Offset;
   7877               // LDR{<c>}{<q>} <Rt>, [<Rn>, #{+}<Rm>] ; T1
   7878               ldr(CurrentCond(),
   7879                   Narrow,
   7880                   Register(rt),
   7881                   MemOperand(Register(rn), sign, Register(rm), addrmode));
   7882               break;
   7883             }
   7884             case 0x02000000: {
   7885               // 0x5a000000
   7886               unsigned rt = (instr >> 16) & 0x7;
   7887               unsigned rn = (instr >> 19) & 0x7;
   7888               Sign sign(plus);
   7889               unsigned rm = (instr >> 22) & 0x7;
   7890               AddrMode addrmode = Offset;
   7891               // LDRH{<c>}{<q>} <Rt>, [<Rn>, #{+}<Rm>] ; T1
   7892               ldrh(CurrentCond(),
   7893                    Narrow,
   7894                    Register(rt),
   7895                    MemOperand(Register(rn), sign, Register(rm), addrmode));
   7896               break;
   7897             }
   7898             case 0x04000000: {
   7899               // 0x5c000000
   7900               unsigned rt = (instr >> 16) & 0x7;
   7901               unsigned rn = (instr >> 19) & 0x7;
   7902               Sign sign(plus);
   7903               unsigned rm = (instr >> 22) & 0x7;
   7904               AddrMode addrmode = Offset;
   7905               // LDRB{<c>}{<q>} <Rt>, [<Rn>, #{+}<Rm>] ; T1
   7906               ldrb(CurrentCond(),
   7907                    Narrow,
   7908                    Register(rt),
   7909                    MemOperand(Register(rn), sign, Register(rm), addrmode));
   7910               break;
   7911             }
   7912             case 0x06000000: {
   7913               // 0x5e000000
   7914               unsigned rt = (instr >> 16) & 0x7;
   7915               unsigned rn = (instr >> 19) & 0x7;
   7916               Sign sign(plus);
   7917               unsigned rm = (instr >> 22) & 0x7;
   7918               AddrMode addrmode = Offset;
   7919               // LDRSH{<c>}{<q>} <Rt>, [<Rn>, #{+}<Rm>] ; T1
   7920               ldrsh(CurrentCond(),
   7921                     Narrow,
   7922                     Register(rt),
   7923                     MemOperand(Register(rn), sign, Register(rm), addrmode));
   7924               break;
   7925             }
   7926           }
   7927           break;
   7928         }
   7929       }
   7930       break;
   7931     }
   7932     case 0x60000000: {
   7933       // 0x60000000
   7934       switch (instr & 0x18000000) {
   7935         case 0x00000000: {
   7936           // 0x60000000
   7937           unsigned rt = (instr >> 16) & 0x7;
   7938           unsigned rn = (instr >> 19) & 0x7;
   7939           int32_t offset = ((instr >> 22) & 0x1f) << 2;
   7940           // STR{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm>}] ; T1
   7941           str(CurrentCond(),
   7942               Narrow,
   7943               Register(rt),
   7944               MemOperand(Register(rn), plus, offset, Offset));
   7945           break;
   7946         }
   7947         case 0x08000000: {
   7948           // 0x68000000
   7949           unsigned rt = (instr >> 16) & 0x7;
   7950           unsigned rn = (instr >> 19) & 0x7;
   7951           int32_t offset = ((instr >> 22) & 0x1f) << 2;
   7952           // LDR{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm>}] ; T1
   7953           ldr(CurrentCond(),
   7954               Narrow,
   7955               Register(rt),
   7956               MemOperand(Register(rn), plus, offset, Offset));
   7957           break;
   7958         }
   7959         case 0x10000000: {
   7960           // 0x70000000
   7961           unsigned rt = (instr >> 16) & 0x7;
   7962           unsigned rn = (instr >> 19) & 0x7;
   7963           int32_t offset = (instr >> 22) & 0x1f;
   7964           // STRB{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm>}] ; T1
   7965           strb(CurrentCond(),
   7966                Narrow,
   7967                Register(rt),
   7968                MemOperand(Register(rn), plus, offset, Offset));
   7969           break;
   7970         }
   7971         case 0x18000000: {
   7972           // 0x78000000
   7973           unsigned rt = (instr >> 16) & 0x7;
   7974           unsigned rn = (instr >> 19) & 0x7;
   7975           int32_t offset = (instr >> 22) & 0x1f;
   7976           // LDRB{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm>}] ; T1
   7977           ldrb(CurrentCond(),
   7978                Narrow,
   7979                Register(rt),
   7980                MemOperand(Register(rn), plus, offset, Offset));
   7981           break;
   7982         }
   7983       }
   7984       break;
   7985     }
   7986     case 0x80000000: {
   7987       // 0x80000000
   7988       switch (instr & 0x18000000) {
   7989         case 0x00000000: {
   7990           // 0x80000000
   7991           unsigned rt = (instr >> 16) & 0x7;
   7992           unsigned rn = (instr >> 19) & 0x7;
   7993           int32_t offset = ((instr >> 22) & 0x1f) << 1;
   7994           // STRH{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm>}] ; T1
   7995           strh(CurrentCond(),
   7996                Narrow,
   7997                Register(rt),
   7998                MemOperand(Register(rn), plus, offset, Offset));
   7999           break;
   8000         }
   8001         case 0x08000000: {
   8002           // 0x88000000
   8003           unsigned rt = (instr >> 16) & 0x7;
   8004           unsigned rn = (instr >> 19) & 0x7;
   8005           int32_t offset = ((instr >> 22) & 0x1f) << 1;
   8006           // LDRH{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm>}] ; T1
   8007           ldrh(CurrentCond(),
   8008                Narrow,
   8009                Register(rt),
   8010                MemOperand(Register(rn), plus, offset, Offset));
   8011           break;
   8012         }
   8013         case 0x10000000: {
   8014           // 0x90000000
   8015           unsigned rt = (instr >> 24) & 0x7;
   8016           int32_t offset = ((instr >> 16) & 0xff) << 2;
   8017           // STR{<c>}{<q>} <Rt>, [SP{, #{+}<imm>}] ; T2
   8018           str(CurrentCond(),
   8019               Narrow,
   8020               Register(rt),
   8021               MemOperand(sp, plus, offset, Offset));
   8022           break;
   8023         }
   8024         case 0x18000000: {
   8025           // 0x98000000
   8026           unsigned rt = (instr >> 24) & 0x7;
   8027           int32_t offset = ((instr >> 16) & 0xff) << 2;
   8028           // LDR{<c>}{<q>} <Rt>, [SP{, #{+}<imm>}] ; T2
   8029           ldr(CurrentCond(),
   8030               Narrow,
   8031               Register(rt),
   8032               MemOperand(sp, plus, offset, Offset));
   8033           break;
   8034         }
   8035       }
   8036       break;
   8037     }
   8038     case 0xa0000000: {
   8039       // 0xa0000000
   8040       switch (instr & 0x18000000) {
   8041         case 0x00000000: {
   8042           // 0xa0000000
   8043           unsigned rd = (instr >> 24) & 0x7;
   8044           int32_t imm = ((instr >> 16) & 0xff) << 2;
   8045           Location location(imm, kT32PcDelta);
   8046           // ADR{<c>}{<q>} <Rd>, <label> ; T1
   8047           adr(CurrentCond(), Narrow, Register(rd), &location);
   8048           break;
   8049         }
   8050         case 0x08000000: {
   8051           // 0xa8000000
   8052           unsigned rd = (instr >> 24) & 0x7;
   8053           uint32_t imm = ((instr >> 16) & 0xff) << 2;
   8054           // ADD{<c>}{<q>} <Rd>, SP, #<imm8> ; T1
   8055           add(CurrentCond(), Narrow, Register(rd), sp, imm);
   8056           break;
   8057         }
   8058         case 0x10000000: {
   8059           // 0xb0000000
   8060           switch (instr & 0x04000000) {
   8061             case 0x00000000: {
   8062               // 0xb0000000
   8063               switch (instr & 0x01000000) {
   8064                 case 0x00000000: {
   8065                   // 0xb0000000
   8066                   switch (instr & 0x02800000) {
   8067                     case 0x00000000: {
   8068                       // 0xb0000000
   8069                       uint32_t imm = ((instr >> 16) & 0x7f) << 2;
   8070                       // ADD{<c>}{<q>} {SP}, SP, #<imm7> ; T2
   8071                       add(CurrentCond(), Narrow, sp, sp, imm);
   8072                       break;
   8073                     }
   8074                     case 0x00800000: {
   8075                       // 0xb0800000
   8076                       uint32_t imm = ((instr >> 16) & 0x7f) << 2;
   8077                       // SUB{<c>}{<q>} {SP}, SP, #<imm7> ; T1
   8078                       sub(CurrentCond(), Narrow, sp, sp, imm);
   8079                       break;
   8080                     }
   8081                     case 0x02000000: {
   8082                       // 0xb2000000
   8083                       switch (instr & 0x00400000) {
   8084                         case 0x00000000: {
   8085                           // 0xb2000000
   8086                           unsigned rd = (instr >> 16) & 0x7;
   8087                           unsigned rm = (instr >> 19) & 0x7;
   8088                           // SXTH{<c>}{<q>} {<Rd>}, <Rm> ; T1
   8089                           sxth(CurrentCond(),
   8090                                Narrow,
   8091                                Register(rd),
   8092                                Register(rm));
   8093                           break;
   8094                         }
   8095                         case 0x00400000: {
   8096                           // 0xb2400000
   8097                           unsigned rd = (instr >> 16) & 0x7;
   8098                           unsigned rm = (instr >> 19) & 0x7;
   8099                           // SXTB{<c>}{<q>} {<Rd>}, <Rm> ; T1
   8100                           sxtb(CurrentCond(),
   8101                                Narrow,
   8102                                Register(rd),
   8103                                Register(rm));
   8104                           break;
   8105                         }
   8106                       }
   8107                       break;
   8108                     }
   8109                     case 0x02800000: {
   8110                       // 0xb2800000
   8111                       switch (instr & 0x00400000) {
   8112                         case 0x00000000: {
   8113                           // 0xb2800000
   8114                           unsigned rd = (instr >> 16) & 0x7;
   8115                           unsigned rm = (instr >> 19) & 0x7;
   8116                           // UXTH{<c>}{<q>} {<Rd>}, <Rm> ; T1
   8117                           uxth(CurrentCond(),
   8118                                Narrow,
   8119                                Register(rd),
   8120                                Register(rm));
   8121                           break;
   8122                         }
   8123                         case 0x00400000: {
   8124                           // 0xb2c00000
   8125                           unsigned rd = (instr >> 16) & 0x7;
   8126                           unsigned rm = (instr >> 19) & 0x7;
   8127                           // UXTB{<c>}{<q>} {<Rd>}, <Rm> ; T1
   8128                           uxtb(CurrentCond(),
   8129                                Narrow,
   8130                                Register(rd),
   8131                                Register(rm));
   8132                           break;
   8133                         }
   8134                       }
   8135                       break;
   8136                     }
   8137                   }
   8138                   break;
   8139                 }
   8140                 case 0x01000000: {
   8141                   // 0xb1000000
   8142                   unsigned rn = (instr >> 16) & 0x7;
   8143                   int32_t imm =
   8144                       (((instr >> 19) & 0x1f) | ((instr >> 20) & 0x20)) << 1;
   8145                   Location location(imm, kT32PcDelta);
   8146                   // CBZ{<q>} <Rn>, <label> ; T1
   8147                   cbz(Register(rn), &location);
   8148                   break;
   8149                 }
   8150               }
   8151               break;
   8152             }
   8153             case 0x04000000: {
   8154               // 0xb4000000
   8155               switch (instr & 0x02000000) {
   8156                 case 0x00000000: {
   8157                   // 0xb4000000
   8158                   RegisterList registers((((instr >> 24) & 0x1) << kLRRegNum) |
   8159                                          ((instr >> 16) & 0xff));
   8160                   // PUSH{<c>}{<q>} <registers> ; T1
   8161                   push(CurrentCond(), Narrow, registers);
   8162                   break;
   8163                 }
   8164                 case 0x02000000: {
   8165                   // 0xb6000000
   8166                   switch (instr & 0x01e00000) {
   8167                     case 0x00400000: {
   8168                       // 0xb6400000
   8169                       UnimplementedT32_16("SETEND", instr);
   8170                       break;
   8171                     }
   8172                     case 0x00600000: {
   8173                       // 0xb6600000
   8174                       switch (instr & 0x00100000) {
   8175                         case 0x00000000: {
   8176                           // 0xb6600000
   8177                           UnimplementedT32_16("CPSIE", instr);
   8178                           break;
   8179                         }
   8180                         case 0x00100000: {
   8181                           // 0xb6700000
   8182                           UnimplementedT32_16("CPSID", instr);
   8183                           break;
   8184                         }
   8185                       }
   8186                       break;
   8187                     }
   8188                     default:
   8189                       UnallocatedT32(instr);
   8190                       break;
   8191                   }
   8192                   break;
   8193                 }
   8194               }
   8195               break;
   8196             }
   8197           }
   8198           break;
   8199         }
   8200         case 0x18000000: {
   8201           // 0xb8000000
   8202           switch (instr & 0x04000000) {
   8203             case 0x00000000: {
   8204               // 0xb8000000
   8205               switch (instr & 0x01000000) {
   8206                 case 0x00000000: {
   8207                   // 0xb8000000
   8208                   switch (instr & 0x02c00000) {
   8209                     case 0x02000000: {
   8210                       // 0xba000000
   8211                       unsigned rd = (instr >> 16) & 0x7;
   8212                       unsigned rm = (instr >> 19) & 0x7;
   8213                       // REV{<c>}{<q>} <Rd>, <Rm> ; T1
   8214                       rev(CurrentCond(), Narrow, Register(rd), Register(rm));
   8215                       break;
   8216                     }
   8217                     case 0x02400000: {
   8218                       // 0xba400000
   8219                       unsigned rd = (instr >> 16) & 0x7;
   8220                       unsigned rm = (instr >> 19) & 0x7;
   8221                       // REV16{<c>}{<q>} <Rd>, <Rm> ; T1
   8222                       rev16(CurrentCond(), Narrow, Register(rd), Register(rm));
   8223                       break;
   8224                     }
   8225                     case 0x02800000: {
   8226                       // 0xba800000
   8227                       uint32_t imm = (instr >> 16) & 0x3f;
   8228                       // HLT{<q>} {#}<imm> ; T1
   8229                       hlt(Condition::None(), imm);
   8230                       break;
   8231                     }
   8232                     case 0x02c00000: {
   8233                       // 0xbac00000
   8234                       unsigned rd = (instr >> 16) & 0x7;
   8235                       unsigned rm = (instr >> 19) & 0x7;
   8236                       // REVSH{<c>}{<q>} <Rd>, <Rm> ; T1
   8237                       revsh(CurrentCond(), Narrow, Register(rd), Register(rm));
   8238                       break;
   8239                     }
   8240                     default:
   8241                       UnallocatedT32(instr);
   8242                       break;
   8243                   }
   8244                   break;
   8245                 }
   8246                 case 0x01000000: {
   8247                   // 0xb9000000
   8248                   unsigned rn = (instr >> 16) & 0x7;
   8249                   int32_t imm =
   8250                       (((instr >> 19) & 0x1f) | ((instr >> 20) & 0x20)) << 1;
   8251                   Location location(imm, kT32PcDelta);
   8252                   // CBNZ{<q>} <Rn>, <label> ; T1
   8253                   cbnz(Register(rn), &location);
   8254                   break;
   8255                 }
   8256               }
   8257               break;
   8258             }
   8259             case 0x04000000: {
   8260               // 0xbc000000
   8261               switch (instr & 0x02000000) {
   8262                 case 0x00000000: {
   8263                   // 0xbc000000
   8264                   RegisterList registers((((instr >> 24) & 0x1) << kPCRegNum) |
   8265                                          ((instr >> 16) & 0xff));
   8266                   // POP{<c>}{<q>} <registers> ; T1
   8267                   pop(CurrentCond(), Narrow, registers);
   8268                   break;
   8269                 }
   8270                 case 0x02000000: {
   8271                   // 0xbe000000
   8272                   switch (instr & 0x01000000) {
   8273                     case 0x00000000: {
   8274                       // 0xbe000000
   8275                       uint32_t imm = (instr >> 16) & 0xff;
   8276                       // BKPT{<q>} {#}<imm> ; T1
   8277                       bkpt(Condition::None(), imm);
   8278                       break;
   8279                     }
   8280                     case 0x01000000: {
   8281                       // 0xbf000000
   8282                       switch (instr & 0x000f0000) {
   8283                         case 0x00000000: {
   8284                           // 0xbf000000
   8285                           switch (instr & 0x00f00000) {
   8286                             case 0x00000000: {
   8287                               // 0xbf000000
   8288                               // NOP{<c>}{<q>} ; T1
   8289                               nop(CurrentCond(), Narrow);
   8290                               break;
   8291                             }
   8292                             case 0x00100000: {
   8293                               // 0xbf100000
   8294                               // YIELD{<c>}{<q>} ; T1
   8295                               yield(CurrentCond(), Narrow);
   8296                               break;
   8297                             }
   8298                             case 0x00200000: {
   8299                               // 0xbf200000
   8300                               UnimplementedT32_16("WFE", instr);
   8301                               break;
   8302                             }
   8303                             case 0x00300000: {
   8304                               // 0xbf300000
   8305                               UnimplementedT32_16("WFI", instr);
   8306                               break;
   8307                             }
   8308                             case 0x00400000: {
   8309                               // 0xbf400000
   8310                               UnimplementedT32_16("SEV", instr);
   8311                               break;
   8312                             }
   8313                             case 0x00500000: {
   8314                               // 0xbf500000
   8315                               UnimplementedT32_16("SEVL", instr);
   8316                               break;
   8317                             }
   8318                             default:
   8319                               UnallocatedT32(instr);
   8320                               break;
   8321                           }
   8322                           break;
   8323                         }
   8324                         default: {
   8325                           if (((instr & 0xf0000) == 0x0)) {
   8326                             UnallocatedT32(instr);
   8327                             return;
   8328                           }
   8329                           unsigned firstcond = (instr >> 20) & 0xf;
   8330                           unsigned mask = (instr >> 16) & 0xf;
   8331                           bool wasInITBlock = InITBlock();
   8332                           SetIT(Condition(firstcond), mask);
   8333                           it(Condition(firstcond), mask);
   8334                           if (wasInITBlock || (firstcond == 15) ||
   8335                               ((firstcond == al) &&
   8336                                (BitCount(Uint32(mask)) != 1))) {
   8337                             UnpredictableT32(instr);
   8338                           }
   8339                           break;
   8340                         }
   8341                       }
   8342                       break;
   8343                     }
   8344                   }
   8345                   break;
   8346                 }
   8347               }
   8348               break;
   8349             }
   8350           }
   8351           break;
   8352         }
   8353       }
   8354       break;
   8355     }
   8356     case 0xc0000000: {
   8357       // 0xc0000000
   8358       switch (instr & 0x10000000) {
   8359         case 0x00000000: {
   8360           // 0xc0000000
   8361           switch (instr & 0x08000000) {
   8362             case 0x00000000: {
   8363               // 0xc0000000
   8364               unsigned rn = (instr >> 24) & 0x7;
   8365               RegisterList registers(((instr >> 16) & 0xff));
   8366               // STM{<c>}{<q>} <Rn>!, <registers> ; T1
   8367               stm(CurrentCond(),
   8368                   Narrow,
   8369                   Register(rn),
   8370                   WriteBack(WRITE_BACK),
   8371                   registers);
   8372               break;
   8373             }
   8374             case 0x08000000: {
   8375               // 0xc8000000
   8376               unsigned rn = (instr >> 24) & 0x7;
   8377               RegisterList registers(((instr >> 16) & 0xff));
   8378               // LDM{<c>}{<q>} <Rn>{!}, <registers> ; T1
   8379               ldm(CurrentCond(),
   8380                   Narrow,
   8381                   Register(rn),
   8382                   WriteBack(!registers.Includes(Register(rn))),
   8383                   registers);
   8384               break;
   8385             }
   8386           }
   8387           break;
   8388         }
   8389         case 0x10000000: {
   8390           // 0xd0000000
   8391           switch (instr & 0x0e000000) {
   8392             case 0x0e000000: {
   8393               // 0xde000000
   8394               switch (instr & 0x01000000) {
   8395                 case 0x00000000: {
   8396                   // 0xde000000
   8397                   uint32_t imm = (instr >> 16) & 0xff;
   8398                   // UDF{<c>}{<q>} {#}<imm> ; T1
   8399                   udf(CurrentCond(), Narrow, imm);
   8400                   break;
   8401                 }
   8402                 case 0x01000000: {
   8403                   // 0xdf000000
   8404                   uint32_t imm = (instr >> 16) & 0xff;
   8405                   // SVC{<c>}{<q>} {#}<imm> ; T1
   8406                   svc(CurrentCond(), imm);
   8407                   break;
   8408                 }
   8409               }
   8410               break;
   8411             }
   8412             default: {
   8413               if (((instr & 0xe000000) == 0xe000000)) {
   8414                 UnallocatedT32(instr);
   8415                 return;
   8416               }
   8417               Condition condition((instr >> 24) & 0xf);
   8418               int32_t imm = SignExtend<int32_t>((instr >> 16) & 0xff, 8) << 1;
   8419               Location location(imm, kT32PcDelta);
   8420               // B<c>{<q>} <label> ; T1
   8421               b(condition, Narrow, &location);
   8422               break;
   8423             }
   8424           }
   8425           break;
   8426         }
   8427       }
   8428       break;
   8429     }
   8430     case 0xe0000000: {
   8431       // 0xe0000000
   8432       switch (instr & 0x08000000) {
   8433         case 0x00000000: {
   8434           // 0xe0000000
   8435           switch (instr & 0x10000000) {
   8436             case 0x00000000: {
   8437               // 0xe0000000
   8438               int32_t imm = SignExtend<int32_t>((instr >> 16) & 0x7ff, 11) << 1;
   8439               Location location(imm, kT32PcDelta);
   8440               // B{<c>}{<q>} <label> ; T2
   8441               b(CurrentCond(), Narrow, &location);
   8442               break;
   8443             }
   8444             case 0x10000000: {
   8445               // 0xf0000000
   8446               switch (instr & 0x00008000) {
   8447                 case 0x00000000: {
   8448                   // 0xf0000000
   8449                   switch (instr & 0x03f00000) {
   8450                     case 0x00000000: {
   8451                       // 0xf0000000
   8452                       unsigned rd = (instr >> 8) & 0xf;
   8453                       unsigned rn = (instr >> 16) & 0xf;
   8454                       uint32_t imm = ImmediateT32::Decode(
   8455                           (instr & 0xff) | ((instr >> 4) & 0x700) |
   8456                           ((instr >> 15) & 0x800));
   8457                       // AND{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
   8458                       and_(CurrentCond(),
   8459                            Best,
   8460                            Register(rd),
   8461                            Register(rn),
   8462                            imm);
   8463                       break;
   8464                     }
   8465                     case 0x00100000: {
   8466                       // 0xf0100000
   8467                       switch (instr & 0x00000f00) {
   8468                         case 0x00000f00: {
   8469                           // 0xf0100f00
   8470                           unsigned rn = (instr >> 16) & 0xf;
   8471                           uint32_t imm = ImmediateT32::Decode(
   8472                               (instr & 0xff) | ((instr >> 4) & 0x700) |
   8473                               ((instr >> 15) & 0x800));
   8474                           // TST{<c>}{<q>} <Rn>, #<const> ; T1
   8475                           tst(CurrentCond(), Best, Register(rn), imm);
   8476                           break;
   8477                         }
   8478                         default: {
   8479                           if (((instr & 0xf00) == 0xf00)) {
   8480                             UnallocatedT32(instr);
   8481                             return;
   8482                           }
   8483                           unsigned rd = (instr >> 8) & 0xf;
   8484                           unsigned rn = (instr >> 16) & 0xf;
   8485                           uint32_t imm = ImmediateT32::Decode(
   8486                               (instr & 0xff) | ((instr >> 4) & 0x700) |
   8487                               ((instr >> 15) & 0x800));
   8488                           // ANDS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
   8489                           ands(CurrentCond(),
   8490                                Best,
   8491                                Register(rd),
   8492                                Register(rn),
   8493                                imm);
   8494                           break;
   8495                         }
   8496                       }
   8497                       break;
   8498                     }
   8499                     case 0x00200000: {
   8500                       // 0xf0200000
   8501                       unsigned rd = (instr >> 8) & 0xf;
   8502                       unsigned rn = (instr >> 16) & 0xf;
   8503                       uint32_t imm = ImmediateT32::Decode(
   8504                           (instr & 0xff) | ((instr >> 4) & 0x700) |
   8505                           ((instr >> 15) & 0x800));
   8506                       // BIC{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
   8507                       bic(CurrentCond(), Best, Register(rd), Register(rn), imm);
   8508                       break;
   8509                     }
   8510                     case 0x00300000: {
   8511                       // 0xf0300000
   8512                       unsigned rd = (instr >> 8) & 0xf;
   8513                       unsigned rn = (instr >> 16) & 0xf;
   8514                       uint32_t imm = ImmediateT32::Decode(
   8515                           (instr & 0xff) | ((instr >> 4) & 0x700) |
   8516                           ((instr >> 15) & 0x800));
   8517                       // BICS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
   8518                       bics(CurrentCond(),
   8519                            Best,
   8520                            Register(rd),
   8521                            Register(rn),
   8522                            imm);
   8523                       break;
   8524                     }
   8525                     case 0x00400000: {
   8526                       // 0xf0400000
   8527                       switch (instr & 0x000f0000) {
   8528                         case 0x000f0000: {
   8529                           // 0xf04f0000
   8530                           unsigned rd = (instr >> 8) & 0xf;
   8531                           uint32_t imm = ImmediateT32::Decode(
   8532                               (instr & 0xff) | ((instr >> 4) & 0x700) |
   8533                               ((instr >> 15) & 0x800));
   8534                           if (InITBlock() &&
   8535                               (instr & 0x00100000) == 0x00000000 &&
   8536                               ((rd < kNumberOfT32LowRegisters) &&
   8537                                (imm <= 255))) {
   8538                             // MOV<c>.W <Rd>, #<const> ; T2
   8539                             mov(CurrentCond(), Wide, Register(rd), imm);
   8540                           } else if ((instr & 0x00100000) == 0x00000000) {
   8541                             // MOV{<c>}{<q>} <Rd>, #<const> ; T2
   8542                             mov(CurrentCond(), Best, Register(rd), imm);
   8543                           } else {
   8544                             UnallocatedT32(instr);
   8545                           }
   8546                           break;
   8547                         }
   8548                         default: {
   8549                           if (((instr & 0xf0000) == 0xf0000)) {
   8550                             UnallocatedT32(instr);
   8551                             return;
   8552                           }
   8553                           unsigned rd = (instr >> 8) & 0xf;
   8554                           unsigned rn = (instr >> 16) & 0xf;
   8555                           uint32_t imm = ImmediateT32::Decode(
   8556                               (instr & 0xff) | ((instr >> 4) & 0x700) |
   8557                               ((instr >> 15) & 0x800));
   8558                           // ORR{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
   8559                           orr(CurrentCond(),
   8560                               Best,
   8561                               Register(rd),
   8562                               Register(rn),
   8563                               imm);
   8564                           break;
   8565                         }
   8566                       }
   8567                       break;
   8568                     }
   8569                     case 0x00500000: {
   8570                       // 0xf0500000
   8571                       switch (instr & 0x000f0000) {
   8572                         case 0x000f0000: {
   8573                           // 0xf05f0000
   8574                           unsigned rd = (instr >> 8) & 0xf;
   8575                           uint32_t imm = ImmediateT32::Decode(
   8576                               (instr & 0xff) | ((instr >> 4) & 0x700) |
   8577                               ((instr >> 15) & 0x800));
   8578                           if (OutsideITBlock() &&
   8579                               (instr & 0x00100000) == 0x00100000 &&
   8580                               ((rd < kNumberOfT32LowRegisters) &&
   8581                                (imm <= 255))) {
   8582                             // MOVS.W <Rd>, #<const> ; T2
   8583                             movs(Condition::None(), Wide, Register(rd), imm);
   8584                           } else if ((instr & 0x00100000) == 0x00100000) {
   8585                             // MOVS{<c>}{<q>} <Rd>, #<const> ; T2
   8586                             movs(CurrentCond(), Best, Register(rd), imm);
   8587                           } else {
   8588                             UnallocatedT32(instr);
   8589                           }
   8590                           break;
   8591                         }
   8592                         default: {
   8593                           if (((instr & 0xf0000) == 0xf0000)) {
   8594                             UnallocatedT32(instr);
   8595                             return;
   8596                           }
   8597                           unsigned rd = (instr >> 8) & 0xf;
   8598                           unsigned rn = (instr >> 16) & 0xf;
   8599                           uint32_t imm = ImmediateT32::Decode(
   8600                               (instr & 0xff) | ((instr >> 4) & 0x700) |
   8601                               ((instr >> 15) & 0x800));
   8602                           // ORRS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
   8603                           orrs(CurrentCond(),
   8604                                Best,
   8605                                Register(rd),
   8606                                Register(rn),
   8607                                imm);
   8608                           break;
   8609                         }
   8610                       }
   8611                       break;
   8612                     }
   8613                     case 0x00600000: {
   8614                       // 0xf0600000
   8615                       switch (instr & 0x000f0000) {
   8616                         case 0x000f0000: {
   8617                           // 0xf06f0000
   8618                           unsigned rd = (instr >> 8) & 0xf;
   8619                           uint32_t imm = ImmediateT32::Decode(
   8620                               (instr & 0xff) | ((instr >> 4) & 0x700) |
   8621                               ((instr >> 15) & 0x800));
   8622                           // MVN{<c>}{<q>} <Rd>, #<const> ; T1
   8623                           mvn(CurrentCond(), Best, Register(rd), imm);
   8624                           break;
   8625                         }
   8626                         default: {
   8627                           if (((instr & 0xf0000) == 0xf0000)) {
   8628                             UnallocatedT32(instr);
   8629                             return;
   8630                           }
   8631                           unsigned rd = (instr >> 8) & 0xf;
   8632                           unsigned rn = (instr >> 16) & 0xf;
   8633                           uint32_t imm = ImmediateT32::Decode(
   8634                               (instr & 0xff) | ((instr >> 4) & 0x700) |
   8635                               ((instr >> 15) & 0x800));
   8636                           // ORN{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
   8637                           orn(CurrentCond(), Register(rd), Register(rn), imm);
   8638                           break;
   8639                         }
   8640                       }
   8641                       break;
   8642                     }
   8643                     case 0x00700000: {
   8644                       // 0xf0700000
   8645                       switch (instr & 0x000f0000) {
   8646                         case 0x000f0000: {
   8647                           // 0xf07f0000
   8648                           unsigned rd = (instr >> 8) & 0xf;
   8649                           uint32_t imm = ImmediateT32::Decode(
   8650                               (instr & 0xff) | ((instr >> 4) & 0x700) |
   8651                               ((instr >> 15) & 0x800));
   8652                           // MVNS{<c>}{<q>} <Rd>, #<const> ; T1
   8653                           mvns(CurrentCond(), Best, Register(rd), imm);
   8654                           break;
   8655                         }
   8656                         default: {
   8657                           if (((instr & 0xf0000) == 0xf0000)) {
   8658                             UnallocatedT32(instr);
   8659                             return;
   8660                           }
   8661                           unsigned rd = (instr >> 8) & 0xf;
   8662                           unsigned rn = (instr >> 16) & 0xf;
   8663                           uint32_t imm = ImmediateT32::Decode(
   8664                               (instr & 0xff) | ((instr >> 4) & 0x700) |
   8665                               ((instr >> 15) & 0x800));
   8666                           // ORNS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
   8667                           orns(CurrentCond(), Register(rd), Register(rn), imm);
   8668                           break;
   8669                         }
   8670                       }
   8671                       break;
   8672                     }
   8673                     case 0x00800000: {
   8674                       // 0xf0800000
   8675                       unsigned rd = (instr >> 8) & 0xf;
   8676                       unsigned rn = (instr >> 16) & 0xf;
   8677                       uint32_t imm = ImmediateT32::Decode(
   8678                           (instr & 0xff) | ((instr >> 4) & 0x700) |
   8679                           ((instr >> 15) & 0x800));
   8680                       // EOR{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
   8681                       eor(CurrentCond(), Best, Register(rd), Register(rn), imm);
   8682                       break;
   8683                     }
   8684                     case 0x00900000: {
   8685                       // 0xf0900000
   8686                       switch (instr & 0x00000f00) {
   8687                         case 0x00000f00: {
   8688                           // 0xf0900f00
   8689                           unsigned rn = (instr >> 16) & 0xf;
   8690                           uint32_t imm = ImmediateT32::Decode(
   8691                               (instr & 0xff) | ((instr >> 4) & 0x700) |
   8692                               ((instr >> 15) & 0x800));
   8693                           // TEQ{<c>}{<q>} <Rn>, #<const> ; T1
   8694                           teq(CurrentCond(), Register(rn), imm);
   8695                           break;
   8696                         }
   8697                         default: {
   8698                           if (((instr & 0xf00) == 0xf00)) {
   8699                             UnallocatedT32(instr);
   8700                             return;
   8701                           }
   8702                           unsigned rd = (instr >> 8) & 0xf;
   8703                           unsigned rn = (instr >> 16) & 0xf;
   8704                           uint32_t imm = ImmediateT32::Decode(
   8705                               (instr & 0xff) | ((instr >> 4) & 0x700) |
   8706                               ((instr >> 15) & 0x800));
   8707                           // EORS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
   8708                           eors(CurrentCond(),
   8709                                Best,
   8710                                Register(rd),
   8711                                Register(rn),
   8712                                imm);
   8713                           break;
   8714                         }
   8715                       }
   8716                       break;
   8717                     }
   8718                     case 0x01000000: {
   8719                       // 0xf1000000
   8720                       switch (instr & 0x000f0000) {
   8721                         case 0x000d0000: {
   8722                           // 0xf10d0000
   8723                           unsigned rd = (instr >> 8) & 0xf;
   8724                           uint32_t imm = ImmediateT32::Decode(
   8725                               (instr & 0xff) | ((instr >> 4) & 0x700) |
   8726                               ((instr >> 15) & 0x800));
   8727                           if ((instr & 0x00100000) == 0x00000000 &&
   8728                               (((rd < kNumberOfT32LowRegisters) &&
   8729                                 ((imm <= 1020) && ((imm & 3) == 0))) ||
   8730                                ((rd == sp.GetCode()) &&
   8731                                 ((imm <= 508) && ((imm & 3) == 0))))) {
   8732                             // ADD{<c>}.W {<Rd>}, SP, #<const> ; T3
   8733                             add(CurrentCond(), Wide, Register(rd), sp, imm);
   8734                           } else if ((instr & 0x00100000) == 0x00000000) {
   8735                             // ADD{<c>}{<q>} {<Rd>}, SP, #<const> ; T3
   8736                             add(CurrentCond(), Best, Register(rd), sp, imm);
   8737                           } else {
   8738                             UnallocatedT32(instr);
   8739                           }
   8740                           break;
   8741                         }
   8742                         default: {
   8743                           if (((instr & 0xf0000) == 0xd0000)) {
   8744                             UnallocatedT32(instr);
   8745                             return;
   8746                           }
   8747                           unsigned rd = (instr >> 8) & 0xf;
   8748                           unsigned rn = (instr >> 16) & 0xf;
   8749                           uint32_t imm = ImmediateT32::Decode(
   8750                               (instr & 0xff) | ((instr >> 4) & 0x700) |
   8751                               ((instr >> 15) & 0x800));
   8752                           if (InITBlock() &&
   8753                               (instr & 0x00100000) == 0x00000000 &&
   8754                               (((rd < kNumberOfT32LowRegisters) &&
   8755                                 (rn < kNumberOfT32LowRegisters) &&
   8756                                 (imm <= 7)) ||
   8757                                ((rd == rn) && (rd < kNumberOfT32LowRegisters) &&
   8758                                 (imm <= 255)))) {
   8759                             // ADD<c>.W {<Rd>}, <Rn>, #<const> ; T3
   8760                             add(CurrentCond(),
   8761                                 Wide,
   8762                                 Register(rd),
   8763                                 Register(rn),
   8764                                 imm);
   8765                           } else if ((instr & 0x00100000) == 0x00000000) {
   8766                             // ADD{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T3
   8767                             add(CurrentCond(),
   8768                                 Best,
   8769                                 Register(rd),
   8770                                 Register(rn),
   8771                                 imm);
   8772                           } else {
   8773                             UnallocatedT32(instr);
   8774                           }
   8775                           break;
   8776                         }
   8777                       }
   8778                       break;
   8779                     }
   8780                     case 0x01100000: {
   8781                       // 0xf1100000
   8782                       switch (instr & 0x00000f00) {
   8783                         case 0x00000f00: {
   8784                           // 0xf1100f00
   8785                           unsigned rn = (instr >> 16) & 0xf;
   8786                           uint32_t imm = ImmediateT32::Decode(
   8787                               (instr & 0xff) | ((instr >> 4) & 0x700) |
   8788                               ((instr >> 15) & 0x800));
   8789                           // CMN{<c>}{<q>} <Rn>, #<const> ; T1
   8790                           cmn(CurrentCond(), Best, Register(rn), imm);
   8791                           break;
   8792                         }
   8793                         default: {
   8794                           switch (instr & 0x000f0000) {
   8795                             case 0x000d0000: {
   8796                               // 0xf11d0000
   8797                               if (((instr & 0xf00) == 0xf00)) {
   8798                                 UnallocatedT32(instr);
   8799                                 return;
   8800                               }
   8801                               unsigned rd = (instr >> 8) & 0xf;
   8802                               uint32_t imm = ImmediateT32::Decode(
   8803                                   (instr & 0xff) | ((instr >> 4) & 0x700) |
   8804                                   ((instr >> 15) & 0x800));
   8805                               // ADDS{<c>}{<q>} {<Rd>}, SP, #<const> ; T3
   8806                               adds(CurrentCond(), Best, Register(rd), sp, imm);
   8807                               break;
   8808                             }
   8809                             default: {
   8810                               if (((instr & 0xf0000) == 0xd0000) ||
   8811                                   ((instr & 0xf00) == 0xf00)) {
   8812                                 UnallocatedT32(instr);
   8813                                 return;
   8814                               }
   8815                               unsigned rd = (instr >> 8) & 0xf;
   8816                               unsigned rn = (instr >> 16) & 0xf;
   8817                               uint32_t imm = ImmediateT32::Decode(
   8818                                   (instr & 0xff) | ((instr >> 4) & 0x700) |
   8819                                   ((instr >> 15) & 0x800));
   8820                               if (OutsideITBlock() &&
   8821                                   (instr & 0x00100000) == 0x00100000 &&
   8822                                   (((rd < kNumberOfT32LowRegisters) &&
   8823                                     (rn < kNumberOfT32LowRegisters) &&
   8824                                     (imm <= 7)) ||
   8825                                    ((rd == rn) &&
   8826                                     (rd < kNumberOfT32LowRegisters) &&
   8827                                     (imm <= 255)))) {
   8828                                 // ADDS.W {<Rd>}, <Rn>, #<const> ; T3
   8829                                 adds(Condition::None(),
   8830                                      Wide,
   8831                                      Register(rd),
   8832                                      Register(rn),
   8833                                      imm);
   8834                               } else if ((instr & 0x00100000) == 0x00100000) {
   8835                                 // ADDS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T3
   8836                                 adds(CurrentCond(),
   8837                                      Best,
   8838                                      Register(rd),
   8839                                      Register(rn),
   8840                                      imm);
   8841                               } else {
   8842                                 UnallocatedT32(instr);
   8843                               }
   8844                               break;
   8845                             }
   8846                           }
   8847                           break;
   8848                         }
   8849                       }
   8850                       break;
   8851                     }
   8852                     case 0x01400000: {
   8853                       // 0xf1400000
   8854                       unsigned rd = (instr >> 8) & 0xf;
   8855                       unsigned rn = (instr >> 16) & 0xf;
   8856                       uint32_t imm = ImmediateT32::Decode(
   8857                           (instr & 0xff) | ((instr >> 4) & 0x700) |
   8858                           ((instr >> 15) & 0x800));
   8859                       // ADC{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
   8860                       adc(CurrentCond(), Best, Register(rd), Register(rn), imm);
   8861                       break;
   8862                     }
   8863                     case 0x01500000: {
   8864                       // 0xf1500000
   8865                       unsigned rd = (instr >> 8) & 0xf;
   8866                       unsigned rn = (instr >> 16) & 0xf;
   8867                       uint32_t imm = ImmediateT32::Decode(
   8868                           (instr & 0xff) | ((instr >> 4) & 0x700) |
   8869                           ((instr >> 15) & 0x800));
   8870                       // ADCS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
   8871                       adcs(CurrentCond(),
   8872                            Best,
   8873                            Register(rd),
   8874                            Register(rn),
   8875                            imm);
   8876                       break;
   8877                     }
   8878                     case 0x01600000: {
   8879                       // 0xf1600000
   8880                       unsigned rd = (instr >> 8) & 0xf;
   8881                       unsigned rn = (instr >> 16) & 0xf;
   8882                       uint32_t imm = ImmediateT32::Decode(
   8883                           (instr & 0xff) | ((instr >> 4) & 0x700) |
   8884                           ((instr >> 15) & 0x800));
   8885                       // SBC{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
   8886                       sbc(CurrentCond(), Best, Register(rd), Register(rn), imm);
   8887                       break;
   8888                     }
   8889                     case 0x01700000: {
   8890                       // 0xf1700000
   8891                       unsigned rd = (instr >> 8) & 0xf;
   8892                       unsigned rn = (instr >> 16) & 0xf;
   8893                       uint32_t imm = ImmediateT32::Decode(
   8894                           (instr & 0xff) | ((instr >> 4) & 0x700) |
   8895                           ((instr >> 15) & 0x800));
   8896                       // SBCS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
   8897                       sbcs(CurrentCond(),
   8898                            Best,
   8899                            Register(rd),
   8900                            Register(rn),
   8901                            imm);
   8902                       break;
   8903                     }
   8904                     case 0x01a00000: {
   8905                       // 0xf1a00000
   8906                       switch (instr & 0x000f0000) {
   8907                         case 0x000d0000: {
   8908                           // 0xf1ad0000
   8909                           unsigned rd = (instr >> 8) & 0xf;
   8910                           uint32_t imm = ImmediateT32::Decode(
   8911                               (instr & 0xff) | ((instr >> 4) & 0x700) |
   8912                               ((instr >> 15) & 0x800));
   8913                           if ((instr & 0x00100000) == 0x00000000 &&
   8914                               ((rd == sp.GetCode()) &&
   8915                                ((imm <= 508) && ((imm & 3) == 0)))) {
   8916                             // SUB{<c>}.W {<Rd>}, SP, #<const> ; T2
   8917                             sub(CurrentCond(), Wide, Register(rd), sp, imm);
   8918                           } else if ((instr & 0x00100000) == 0x00000000) {
   8919                             // SUB{<c>}{<q>} {<Rd>}, SP, #<const> ; T2
   8920                             sub(CurrentCond(), Best, Register(rd), sp, imm);
   8921                           } else {
   8922                             UnallocatedT32(instr);
   8923                           }
   8924                           break;
   8925                         }
   8926                         default: {
   8927                           if (((instr & 0xf0000) == 0xd0000)) {
   8928                             UnallocatedT32(instr);
   8929                             return;
   8930                           }
   8931                           unsigned rd = (instr >> 8) & 0xf;
   8932                           unsigned rn = (instr >> 16) & 0xf;
   8933                           uint32_t imm = ImmediateT32::Decode(
   8934                               (instr & 0xff) | ((instr >> 4) & 0x700) |
   8935                               ((instr >> 15) & 0x800));
   8936                           if (InITBlock() &&
   8937                               (instr & 0x00100000) == 0x00000000 &&
   8938                               (((rd < kNumberOfT32LowRegisters) &&
   8939                                 (rn < kNumberOfT32LowRegisters) &&
   8940                                 (imm <= 7)) ||
   8941                                ((rd == rn) && (rd < kNumberOfT32LowRegisters) &&
   8942                                 (imm <= 255)))) {
   8943                             // SUB<c>.W {<Rd>}, <Rn>, #<const> ; T3
   8944                             sub(CurrentCond(),
   8945                                 Wide,
   8946                                 Register(rd),
   8947                                 Register(rn),
   8948                                 imm);
   8949                           } else if ((instr & 0x00100000) == 0x00000000) {
   8950                             // SUB{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T3
   8951                             sub(CurrentCond(),
   8952                                 Best,
   8953                                 Register(rd),
   8954                                 Register(rn),
   8955                                 imm);
   8956                           } else {
   8957                             UnallocatedT32(instr);
   8958                           }
   8959                           break;
   8960                         }
   8961                       }
   8962                       break;
   8963                     }
   8964                     case 0x01b00000: {
   8965                       // 0xf1b00000
   8966                       switch (instr & 0x00000f00) {
   8967                         case 0x00000f00: {
   8968                           // 0xf1b00f00
   8969                           unsigned rn = (instr >> 16) & 0xf;
   8970                           uint32_t imm = ImmediateT32::Decode(
   8971                               (instr & 0xff) | ((instr >> 4) & 0x700) |
   8972                               ((instr >> 15) & 0x800));
   8973                           if ((rn < kNumberOfT32LowRegisters) && (imm <= 255)) {
   8974                             // CMP{<c>}.W <Rn>, #<const> ; T2
   8975                             cmp(CurrentCond(), Wide, Register(rn), imm);
   8976                           } else {
   8977                             // CMP{<c>}{<q>} <Rn>, #<const> ; T2
   8978                             cmp(CurrentCond(), Best, Register(rn), imm);
   8979                           }
   8980                           break;
   8981                         }
   8982                         default: {
   8983                           switch (instr & 0x000f0000) {
   8984                             case 0x000d0000: {
   8985                               // 0xf1bd0000
   8986                               if (((instr & 0xf00) == 0xf00)) {
   8987                                 UnallocatedT32(instr);
   8988                                 return;
   8989                               }
   8990                               unsigned rd = (instr >> 8) & 0xf;
   8991                               uint32_t imm = ImmediateT32::Decode(
   8992                                   (instr & 0xff) | ((instr >> 4) & 0x700) |
   8993                                   ((instr >> 15) & 0x800));
   8994                               // SUBS{<c>}{<q>} {<Rd>}, SP, #<const> ; T2
   8995                               subs(CurrentCond(), Best, Register(rd), sp, imm);
   8996                               break;
   8997                             }
   8998                             default: {
   8999                               if (((instr & 0xf0000) == 0xd0000) ||
   9000                                   ((instr & 0xf00) == 0xf00)) {
   9001                                 UnallocatedT32(instr);
   9002                                 return;
   9003                               }
   9004                               unsigned rd = (instr >> 8) & 0xf;
   9005                               unsigned rn = (instr >> 16) & 0xf;
   9006                               uint32_t imm = ImmediateT32::Decode(
   9007                                   (instr & 0xff) | ((instr >> 4) & 0x700) |
   9008                                   ((instr >> 15) & 0x800));
   9009                               if (OutsideITBlock() &&
   9010                                   (instr & 0x00100000) == 0x00100000 &&
   9011                                   (((rd < kNumberOfT32LowRegisters) &&
   9012                                     (rn < kNumberOfT32LowRegisters) &&
   9013                                     (imm <= 7)) ||
   9014                                    ((rd == rn) &&
   9015                                     (rd < kNumberOfT32LowRegisters) &&
   9016                                     (imm <= 255)))) {
   9017                                 // SUBS.W {<Rd>}, <Rn>, #<const> ; T3
   9018                                 subs(Condition::None(),
   9019                                      Wide,
   9020                                      Register(rd),
   9021                                      Register(rn),
   9022                                      imm);
   9023                               } else if ((instr & 0x00100000) == 0x00100000) {
   9024                                 // SUBS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T3
   9025                                 subs(CurrentCond(),
   9026                                      Best,
   9027                                      Register(rd),
   9028                                      Register(rn),
   9029                                      imm);
   9030                               } else {
   9031                                 UnallocatedT32(instr);
   9032                               }
   9033                               break;
   9034                             }
   9035                           }
   9036                           break;
   9037                         }
   9038                       }
   9039                       break;
   9040                     }
   9041                     case 0x01c00000: {
   9042                       // 0xf1c00000
   9043                       unsigned rd = (instr >> 8) & 0xf;
   9044                       unsigned rn = (instr >> 16) & 0xf;
   9045                       uint32_t imm = ImmediateT32::Decode(
   9046                           (instr & 0xff) | ((instr >> 4) & 0x700) |
   9047                           ((instr >> 15) & 0x800));
   9048                       if (InITBlock() && (instr & 0x00100000) == 0x00000000 &&
   9049                           (imm == 0) &&
   9050                           ((rd < kNumberOfT32LowRegisters) &&
   9051                            (rn < kNumberOfT32LowRegisters) && (imm == 0))) {
   9052                         // RSB<c>.W {<Rd>}, <Rn>, #0 ; T2
   9053                         rsb(CurrentCond(),
   9054                             Wide,
   9055                             Register(rd),
   9056                             Register(rn),
   9057                             UINT32_C(0));
   9058                       } else if ((instr & 0x00100000) == 0x00000000) {
   9059                         // RSB{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T2
   9060                         rsb(CurrentCond(),
   9061                             Best,
   9062                             Register(rd),
   9063                             Register(rn),
   9064                             imm);
   9065                       } else {
   9066                         UnallocatedT32(instr);
   9067                       }
   9068                       break;
   9069                     }
   9070                     case 0x01d00000: {
   9071                       // 0xf1d00000
   9072                       unsigned rd = (instr >> 8) & 0xf;
   9073                       unsigned rn = (instr >> 16) & 0xf;
   9074                       uint32_t imm = ImmediateT32::Decode(
   9075                           (instr & 0xff) | ((instr >> 4) & 0x700) |
   9076                           ((instr >> 15) & 0x800));
   9077                       if (OutsideITBlock() &&
   9078                           (instr & 0x00100000) == 0x00100000 && (imm == 0) &&
   9079                           ((rd < kNumberOfT32LowRegisters) &&
   9080                            (rn < kNumberOfT32LowRegisters) && (imm == 0))) {
   9081                         // RSBS.W {<Rd>}, <Rn>, #0 ; T2
   9082                         rsbs(Condition::None(),
   9083                              Wide,
   9084                              Register(rd),
   9085                              Register(rn),
   9086                              UINT32_C(0));
   9087                       } else if ((instr & 0x00100000) == 0x00100000) {
   9088                         // RSBS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T2
   9089                         rsbs(CurrentCond(),
   9090                              Best,
   9091                              Register(rd),
   9092                              Register(rn),
   9093                              imm);
   9094                       } else {
   9095                         UnallocatedT32(instr);
   9096                       }
   9097                       break;
   9098                     }
   9099                     case 0x02000000: {
   9100                       // 0xf2000000
   9101                       switch (instr & 0x000d0000) {
   9102                         case 0x000d0000: {
   9103                           // 0xf20d0000
   9104                           switch (instr & 0x00020000) {
   9105                             case 0x00000000: {
   9106                               // 0xf20d0000
   9107                               unsigned rd = (instr >> 8) & 0xf;
   9108                               uint32_t imm = (instr & 0xff) |
   9109                                              ((instr >> 4) & 0x700) |
   9110                                              ((instr >> 15) & 0x800);
   9111                               if (((rd >= kNumberOfT32LowRegisters) ||
   9112                                    ((imm > 1020) || ((imm & 3) != 0))) &&
   9113                                   ((rd != sp.GetCode()) ||
   9114                                    ((imm > 508) || ((imm & 3) != 0))) &&
   9115                                   (!ImmediateT32::IsImmediateT32(imm))) {
   9116                                 // ADD{<c>}{<q>} {<Rd>}, SP, #<imm12> ; T4
   9117                                 add(CurrentCond(), Best, Register(rd), sp, imm);
   9118                               } else {
   9119                                 // ADDW{<c>}{<q>} {<Rd>}, SP, #<imm12> ; T4
   9120                                 addw(CurrentCond(), Register(rd), sp, imm);
   9121                               }
   9122                               break;
   9123                             }
   9124                             case 0x00020000: {
   9125                               // 0xf20f0000
   9126                               unsigned rd = (instr >> 8) & 0xf;
   9127                               int32_t imm = (instr & 0xff) |
   9128                                             ((instr >> 4) & 0x700) |
   9129                                             ((instr >> 15) & 0x800);
   9130                               Location location(imm, kT32PcDelta);
   9131                               if ((imm >= 0) && (imm <= 4095) &&
   9132                                   ((rd < kNumberOfT32LowRegisters) &&
   9133                                    (imm >= 0) && (imm <= 1020) &&
   9134                                    ((imm & 3) == 0))) {
   9135                                 // ADR{<c>}.W <Rd>, <label> ; T3
   9136                                 adr(CurrentCond(),
   9137                                     Wide,
   9138                                     Register(rd),
   9139                                     &location);
   9140                               } else if ((imm >= 0) && (imm <= 4095)) {
   9141                                 // ADR{<c>}{<q>} <Rd>, <label> ; T3
   9142                                 adr(CurrentCond(),
   9143                                     Best,
   9144                                     Register(rd),
   9145                                     &location);
   9146                               } else {
   9147                                 UnallocatedT32(instr);
   9148                               }
   9149                               break;
   9150                             }
   9151                           }
   9152                           break;
   9153                         }
   9154                         default: {
   9155                           if (((instr & 0xd0000) == 0xd0000)) {
   9156                             UnallocatedT32(instr);
   9157                             return;
   9158                           }
   9159                           unsigned rd = (instr >> 8) & 0xf;
   9160                           unsigned rn = (instr >> 16) & 0xf;
   9161                           uint32_t imm = (instr & 0xff) |
   9162                                          ((instr >> 4) & 0x700) |
   9163                                          ((instr >> 15) & 0x800);
   9164                           if ((InITBlock() ||
   9165                                (rd >= kNumberOfT32LowRegisters) ||
   9166                                (rn >= kNumberOfT32LowRegisters) || (imm > 7)) &&
   9167                               (InITBlock() || (rd != rn) ||
   9168                                (rd >= kNumberOfT32LowRegisters) ||
   9169                                (imm > 255)) &&
   9170                               (!ImmediateT32::IsImmediateT32(imm))) {
   9171                             // ADD{<c>}{<q>} {<Rd>}, <Rn>, #<imm12> ; T4
   9172                             add(CurrentCond(),
   9173                                 Best,
   9174                                 Register(rd),
   9175                                 Register(rn),
   9176                                 imm);
   9177                           } else {
   9178                             // ADDW{<c>}{<q>} {<Rd>}, <Rn>, #<imm12> ; T4
   9179                             addw(CurrentCond(),
   9180                                  Register(rd),
   9181                                  Register(rn),
   9182                                  imm);
   9183                           }
   9184                           break;
   9185                         }
   9186                       }
   9187                       break;
   9188                     }
   9189                     case 0x02400000: {
   9190                       // 0xf2400000
   9191                       unsigned rd = (instr >> 8) & 0xf;
   9192                       uint32_t imm = (instr & 0xff) | ((instr >> 4) & 0x700) |
   9193                                      ((instr >> 15) & 0x800) |
   9194                                      ((instr >> 4) & 0xf000);
   9195                       if ((InITBlock() || (rd >= kNumberOfT32LowRegisters) ||
   9196                            (imm > 255)) &&
   9197                           (!ImmediateT32::IsImmediateT32(imm))) {
   9198                         // MOV{<c>}{<q>} <Rd>, #<imm16> ; T3
   9199                         mov(CurrentCond(), Best, Register(rd), imm);
   9200                       } else {
   9201                         // MOVW{<c>}{<q>} <Rd>, #<imm16> ; T3
   9202                         movw(CurrentCond(), Register(rd), imm);
   9203                       }
   9204                       break;
   9205                     }
   9206                     case 0x02a00000: {
   9207                       // 0xf2a00000
   9208                       switch (instr & 0x000d0000) {
   9209                         case 0x000d0000: {
   9210                           // 0xf2ad0000
   9211                           switch (instr & 0x00020000) {
   9212                             case 0x00000000: {
   9213                               // 0xf2ad0000
   9214                               unsigned rd = (instr >> 8) & 0xf;
   9215                               uint32_t imm = (instr & 0xff) |
   9216                                              ((instr >> 4) & 0x700) |
   9217                                              ((instr >> 15) & 0x800);
   9218                               if (((rd != sp.GetCode()) ||
   9219                                    ((imm > 508) || ((imm & 3) != 0))) &&
   9220                                   (!ImmediateT32::IsImmediateT32(imm))) {
   9221                                 // SUB{<c>}{<q>} {<Rd>}, SP, #<imm12> ; T3
   9222                                 sub(CurrentCond(), Best, Register(rd), sp, imm);
   9223                               } else {
   9224                                 // SUBW{<c>}{<q>} {<Rd>}, SP, #<imm12> ; T3
   9225                                 subw(CurrentCond(), Register(rd), sp, imm);
   9226                               }
   9227                               break;
   9228                             }
   9229                             case 0x00020000: {
   9230                               // 0xf2af0000
   9231                               if (((((Uint32((instr >> 26)) & Uint32(0x1))
   9232                                      << 11) |
   9233                                     ((Uint32((instr >> 12)) & Uint32(0x7))
   9234                                      << 8) |
   9235                                     (Uint32(instr) & Uint32(0xff))) ==
   9236                                    Uint32(0x0))) {
   9237                                 unsigned rd = (instr >> 8) & 0xf;
   9238                                 uint32_t imm = (instr & 0xff) |
   9239                                                ((instr >> 4) & 0x700) |
   9240                                                ((instr >> 15) & 0x800);
   9241                                 // SUB{<c>}{<q>} <Rd>, PC, #<imm12> ; T2
   9242                                 sub(CurrentCond(), Best, Register(rd), pc, imm);
   9243                                 return;
   9244                               }
   9245                               unsigned rd = (instr >> 8) & 0xf;
   9246                               int32_t imm = (instr & 0xff) |
   9247                                             ((instr >> 4) & 0x700) |
   9248                                             ((instr >> 15) & 0x800);
   9249                               Location location(-imm, kT32PcDelta);
   9250                               // ADR{<c>}{<q>} <Rd>, <label> ; T2
   9251                               adr(CurrentCond(), Best, Register(rd), &location);
   9252                               break;
   9253                             }
   9254                           }
   9255                           break;
   9256                         }
   9257                         default: {
   9258                           if (((instr & 0xd0000) == 0xd0000)) {
   9259                             UnallocatedT32(instr);
   9260                             return;
   9261                           }
   9262                           unsigned rd = (instr >> 8) & 0xf;
   9263                           unsigned rn = (instr >> 16) & 0xf;
   9264                           uint32_t imm = (instr & 0xff) |
   9265                                          ((instr >> 4) & 0x700) |
   9266                                          ((instr >> 15) & 0x800);
   9267                           if ((InITBlock() ||
   9268                                (rd >= kNumberOfT32LowRegisters) ||
   9269                                (rn >= kNumberOfT32LowRegisters) || (imm > 7)) &&
   9270                               (InITBlock() || (rd != rn) ||
   9271                                (rd >= kNumberOfT32LowRegisters) ||
   9272                                (imm > 255)) &&
   9273                               (!ImmediateT32::IsImmediateT32(imm))) {
   9274                             // SUB{<c>}{<q>} {<Rd>}, <Rn>, #<imm12> ; T4
   9275                             sub(CurrentCond(),
   9276                                 Best,
   9277                                 Register(rd),
   9278                                 Register(rn),
   9279                                 imm);
   9280                           } else {
   9281                             // SUBW{<c>}{<q>} {<Rd>}, <Rn>, #<imm12> ; T4
   9282                             subw(CurrentCond(),
   9283                                  Register(rd),
   9284                                  Register(rn),
   9285                                  imm);
   9286                           }
   9287                           break;
   9288                         }
   9289                       }
   9290                       break;
   9291                     }
   9292                     case 0x02c00000: {
   9293                       // 0xf2c00000
   9294                       unsigned rd = (instr >> 8) & 0xf;
   9295                       uint32_t imm = (instr & 0xff) | ((instr >> 4) & 0x700) |
   9296                                      ((instr >> 15) & 0x800) |
   9297                                      ((instr >> 4) & 0xf000);
   9298                       // MOVT{<c>}{<q>} <Rd>, #<imm16> ; T1
   9299                       movt(CurrentCond(), Register(rd), imm);
   9300                       break;
   9301                     }
   9302                     case 0x03000000: {
   9303                       // 0xf3000000
   9304                       unsigned rd = (instr >> 8) & 0xf;
   9305                       uint32_t imm = (instr & 0x1f) + 1;
   9306                       unsigned rn = (instr >> 16) & 0xf;
   9307                       uint32_t amount =
   9308                           ((instr >> 6) & 0x3) | ((instr >> 10) & 0x1c);
   9309                       // SSAT{<c>}{<q>} <Rd>, #<imm>, <Rn> {, LSL #<amount> } ; T1 NOLINT(whitespace/line_length)
   9310                       ssat(CurrentCond(),
   9311                            Register(rd),
   9312                            imm,
   9313                            Operand(Register(rn), LSL, amount));
   9314                       if (((instr & 0xfff08020) != 0xf3000000)) {
   9315                         UnpredictableT32(instr);
   9316                       }
   9317                       break;
   9318                     }
   9319                     case 0x03200000: {
   9320                       // 0xf3200000
   9321                       switch (instr & 0x000070c0) {
   9322                         case 0x00000000: {
   9323                           // 0xf3200000
   9324                           unsigned rd = (instr >> 8) & 0xf;
   9325                           uint32_t imm = (instr & 0xf) + 1;
   9326                           unsigned rn = (instr >> 16) & 0xf;
   9327                           // SSAT16{<c>}{<q>} <Rd>, #<imm>, <Rn> ; T1
   9328                           ssat16(CurrentCond(),
   9329                                  Register(rd),
   9330                                  imm,
   9331                                  Register(rn));
   9332                           if (((instr & 0xfff0f0f0) != 0xf3200000)) {
   9333                             UnpredictableT32(instr);
   9334                           }
   9335                           break;
   9336                         }
   9337                         default: {
   9338                           if (((instr & 0x70c0) == 0x0)) {
   9339                             UnallocatedT32(instr);
   9340                             return;
   9341                           }
   9342                           unsigned rd = (instr >> 8) & 0xf;
   9343                           uint32_t imm = (instr & 0x1f) + 1;
   9344                           unsigned rn = (instr >> 16) & 0xf;
   9345                           uint32_t amount =
   9346                               ((instr >> 6) & 0x3) | ((instr >> 10) & 0x1c);
   9347                           // SSAT{<c>}{<q>} <Rd>, #<imm>, <Rn>, ASR #<amount> ; T1 NOLINT(whitespace/line_length)
   9348                           ssat(CurrentCond(),
   9349                                Register(rd),
   9350                                imm,
   9351                                Operand(Register(rn), ASR, amount));
   9352                           if (((instr & 0xfff08020) != 0xf3200000)) {
   9353                             UnpredictableT32(instr);
   9354                           }
   9355                           break;
   9356                         }
   9357                       }
   9358                       break;
   9359                     }
   9360                     case 0x03400000: {
   9361                       // 0xf3400000
   9362                       unsigned rd = (instr >> 8) & 0xf;
   9363                       unsigned rn = (instr >> 16) & 0xf;
   9364                       uint32_t lsb =
   9365                           ((instr >> 6) & 0x3) | ((instr >> 10) & 0x1c);
   9366                       uint32_t widthm1 = instr & 0x1f;
   9367                       uint32_t width = widthm1 + 1;
   9368                       // SBFX{<c>}{<q>} <Rd>, <Rn>, #<lsb>, #<width> ; T1
   9369                       sbfx(CurrentCond(),
   9370                            Register(rd),
   9371                            Register(rn),
   9372                            lsb,
   9373                            width);
   9374                       if (((instr & 0xfff08020) != 0xf3400000)) {
   9375                         UnpredictableT32(instr);
   9376                       }
   9377                       break;
   9378                     }
   9379                     case 0x03600000: {
   9380                       // 0xf3600000
   9381                       switch (instr & 0x000f0000) {
   9382                         case 0x000f0000: {
   9383                           // 0xf36f0000
   9384                           unsigned rd = (instr >> 8) & 0xf;
   9385                           uint32_t lsb =
   9386                               ((instr >> 6) & 0x3) | ((instr >> 10) & 0x1c);
   9387                           uint32_t msb = instr & 0x1f;
   9388                           uint32_t width = msb - lsb + 1;
   9389                           // BFC{<c>}{<q>} <Rd>, #<lsb>, #<width> ; T1
   9390                           bfc(CurrentCond(), Register(rd), lsb, width);
   9391                           if (((instr & 0xffff8020) != 0xf36f0000)) {
   9392                             UnpredictableT32(instr);
   9393                           }
   9394                           break;
   9395                         }
   9396                         default: {
   9397                           if (((instr & 0xf0000) == 0xf0000)) {
   9398                             UnallocatedT32(instr);
   9399                             return;
   9400                           }
   9401                           unsigned rd = (instr >> 8) & 0xf;
   9402                           unsigned rn = (instr >> 16) & 0xf;
   9403                           uint32_t lsb =
   9404                               ((instr >> 6) & 0x3) | ((instr >> 10) & 0x1c);
   9405                           uint32_t msb = instr & 0x1f;
   9406                           uint32_t width = msb - lsb + 1;
   9407                           // BFI{<c>}{<q>} <Rd>, <Rn>, #<lsb>, #<width> ; T1
   9408                           bfi(CurrentCond(),
   9409                               Register(rd),
   9410                               Register(rn),
   9411                               lsb,
   9412                               width);
   9413                           if (((instr & 0xfff08020) != 0xf3600000)) {
   9414                             UnpredictableT32(instr);
   9415                           }
   9416                           break;
   9417                         }
   9418                       }
   9419                       break;
   9420                     }
   9421                     case 0x03800000: {
   9422                       // 0xf3800000
   9423                       unsigned rd = (instr >> 8) & 0xf;
   9424                       uint32_t imm = instr & 0x1f;
   9425                       unsigned rn = (instr >> 16) & 0xf;
   9426                       uint32_t amount =
   9427                           ((instr >> 6) & 0x3) | ((instr >> 10) & 0x1c);
   9428                       // USAT{<c>}{<q>} <Rd>, #<imm>, <Rn> {, LSL #<amount> } ; T1 NOLINT(whitespace/line_length)
   9429                       usat(CurrentCond(),
   9430                            Register(rd),
   9431                            imm,
   9432                            Operand(Register(rn), LSL, amount));
   9433                       if (((instr & 0xfff08020) != 0xf3800000)) {
   9434                         UnpredictableT32(instr);
   9435                       }
   9436                       break;
   9437                     }
   9438                     case 0x03a00000: {
   9439                       // 0xf3a00000
   9440                       switch (instr & 0x000070c0) {
   9441                         case 0x00000000: {
   9442                           // 0xf3a00000
   9443                           unsigned rd = (instr >> 8) & 0xf;
   9444                           uint32_t imm = instr & 0xf;
   9445                           unsigned rn = (instr >> 16) & 0xf;
   9446                           // USAT16{<c>}{<q>} <Rd>, #<imm>, <Rn> ; T1
   9447                           usat16(CurrentCond(),
   9448                                  Register(rd),
   9449                                  imm,
   9450                                  Register(rn));
   9451                           if (((instr & 0xfff0f0f0) != 0xf3a00000)) {
   9452                             UnpredictableT32(instr);
   9453                           }
   9454                           break;
   9455                         }
   9456                         default: {
   9457                           if (((instr & 0x70c0) == 0x0)) {
   9458                             UnallocatedT32(instr);
   9459                             return;
   9460                           }
   9461                           unsigned rd = (instr >> 8) & 0xf;
   9462                           uint32_t imm = instr & 0x1f;
   9463                           unsigned rn = (instr >> 16) & 0xf;
   9464                           uint32_t amount =
   9465                               ((instr >> 6) & 0x3) | ((instr >> 10) & 0x1c);
   9466                           // USAT{<c>}{<q>} <Rd>, #<imm>, <Rn>, ASR #<amount> ; T1 NOLINT(whitespace/line_length)
   9467                           usat(CurrentCond(),
   9468                                Register(rd),
   9469                                imm,
   9470                                Operand(Register(rn), ASR, amount));
   9471                           if (((instr & 0xfff08020) != 0xf3a00000)) {
   9472                             UnpredictableT32(instr);
   9473                           }
   9474                           break;
   9475                         }
   9476                       }
   9477                       break;
   9478                     }
   9479                     case 0x03c00000: {
   9480                       // 0xf3c00000
   9481                       unsigned rd = (instr >> 8) & 0xf;
   9482                       unsigned rn = (instr >> 16) & 0xf;
   9483                       uint32_t lsb =
   9484                           ((instr >> 6) & 0x3) | ((instr >> 10) & 0x1c);
   9485                       uint32_t widthm1 = instr & 0x1f;
   9486                       uint32_t width = widthm1 + 1;
   9487                       // UBFX{<c>}{<q>} <Rd>, <Rn>, #<lsb>, #<width> ; T1
   9488                       ubfx(CurrentCond(),
   9489                            Register(rd),
   9490                            Register(rn),
   9491                            lsb,
   9492                            width);
   9493                       if (((instr & 0xfff08020) != 0xf3c00000)) {
   9494                         UnpredictableT32(instr);
   9495                       }
   9496                       break;
   9497                     }
   9498                     default:
   9499                       UnallocatedT32(instr);
   9500                       break;
   9501                   }
   9502                   break;
   9503                 }
   9504                 case 0x00008000: {
   9505                   // 0xf0008000
   9506                   switch (instr & 0x00005000) {
   9507                     case 0x00000000: {
   9508                       // 0xf0008000
   9509                       switch (instr & 0x03800000) {
   9510                         case 0x03800000: {
   9511                           // 0xf3808000
   9512                           switch (instr & 0x04600000) {
   9513                             case 0x00000000: {
   9514                               // 0xf3808000
   9515                               switch (instr & 0x00000020) {
   9516                                 case 0x00000000: {
   9517                                   // 0xf3808000
   9518                                   unsigned spec_reg = ((instr >> 8) & 0xf) |
   9519                                                       ((instr >> 16) & 0x10);
   9520                                   unsigned rn = (instr >> 16) & 0xf;
   9521                                   // MSR{<c>}{<q>} <spec_reg>, <Rn> ; T1
   9522                                   msr(CurrentCond(),
   9523                                       MaskedSpecialRegister(spec_reg),
   9524                                       Register(rn));
   9525                                   if (((instr & 0xffe0f0ff) != 0xf3808000)) {
   9526                                     UnpredictableT32(instr);
   9527                                   }
   9528                                   break;
   9529                                 }
   9530                                 case 0x00000020: {
   9531                                   // 0xf3808020
   9532                                   UnimplementedT32_32("MSR", instr);
   9533                                   break;
   9534                                 }
   9535                               }
   9536                               break;
   9537                             }
   9538                             case 0x00200000: {
   9539                               // 0xf3a08000
   9540                               switch (instr & 0x00100000) {
   9541                                 case 0x00000000: {
   9542                                   // 0xf3a08000
   9543                                   switch (instr & 0x00000700) {
   9544                                     case 0x00000000: {
   9545                                       // 0xf3a08000
   9546                                       switch (instr & 0x000000f0) {
   9547                                         case 0x00000000: {
   9548                                           // 0xf3a08000
   9549                                           switch (instr & 0x0000000f) {
   9550                                             case 0x00000000: {
   9551                                               // 0xf3a08000
   9552                                               // NOP{<c>}.W ; T2
   9553                                               nop(CurrentCond(), Wide);
   9554                                               if (((instr & 0xffffffff) !=
   9555                                                    0xf3af8000)) {
   9556                                                 UnpredictableT32(instr);
   9557                                               }
   9558                                               break;
   9559                                             }
   9560                                             case 0x00000001: {
   9561                                               // 0xf3a08001
   9562                                               // YIELD{<c>}.W ; T2
   9563                                               yield(CurrentCond(), Wide);
   9564                                               if (((instr & 0xffffffff) !=
   9565                                                    0xf3af8001)) {
   9566                                                 UnpredictableT32(instr);
   9567                                               }
   9568                                               break;
   9569                                             }
   9570                                             case 0x00000002: {
   9571                                               // 0xf3a08002
   9572                                               UnimplementedT32_32("WFE", instr);
   9573                                               break;
   9574                                             }
   9575                                             case 0x00000003: {
   9576                                               // 0xf3a08003
   9577                                               UnimplementedT32_32("WFI", instr);
   9578                                               break;
   9579                                             }
   9580                                             case 0x00000004: {
   9581                                               // 0xf3a08004
   9582                                               UnimplementedT32_32("SEV", instr);
   9583                                               break;
   9584                                             }
   9585                                             case 0x00000005: {
   9586                                               // 0xf3a08005
   9587                                               UnimplementedT32_32("SEVL",
   9588                                                                   instr);
   9589                                               break;
   9590                                             }
   9591                                             default:
   9592                                               UnallocatedT32(instr);
   9593                                               break;
   9594                                           }
   9595                                           break;
   9596                                         }
   9597                                         case 0x000000f0: {
   9598                                           // 0xf3a080f0
   9599                                           UnimplementedT32_32("DBG", instr);
   9600                                           break;
   9601                                         }
   9602                                         default:
   9603                                           UnallocatedT32(instr);
   9604                                           break;
   9605                                       }
   9606                                       break;
   9607                                     }
   9608                                     case 0x00000100: {
   9609                                       // 0xf3a08100
   9610                                       if ((instr & 0x000000e0) == 0x00000000) {
   9611                                         UnimplementedT32_32("CPS", instr);
   9612                                       } else {
   9613                                         UnallocatedT32(instr);
   9614                                       }
   9615                                       break;
   9616                                     }
   9617                                     case 0x00000400: {
   9618                                       // 0xf3a08400
   9619                                       if ((instr & 0x0000001f) == 0x00000000) {
   9620                                         UnimplementedT32_32("CPSIE", instr);
   9621                                       } else {
   9622                                         UnallocatedT32(instr);
   9623                                       }
   9624                                       break;
   9625                                     }
   9626                                     case 0x00000500: {
   9627                                       // 0xf3a08500
   9628                                       UnimplementedT32_32("CPSIE", instr);
   9629                                       break;
   9630                                     }
   9631                                     case 0x00000600: {
   9632                                       // 0xf3a08600
   9633                                       if ((instr & 0x0000001f) == 0x00000000) {
   9634                                         UnimplementedT32_32("CPSID", instr);
   9635                                       } else {
   9636                                         UnallocatedT32(instr);
   9637                                       }
   9638                                       break;
   9639                                     }
   9640                                     case 0x00000700: {
   9641                                       // 0xf3a08700
   9642                                       UnimplementedT32_32("CPSID", instr);
   9643                                       break;
   9644                                     }
   9645                                     default:
   9646                                       UnallocatedT32(instr);
   9647                                       break;
   9648                                   }
   9649                                   break;
   9650                                 }
   9651                                 case 0x00100000: {
   9652                                   // 0xf3b08000
   9653                                   switch (instr & 0x000000f0) {
   9654                                     case 0x00000020: {
   9655                                       // 0xf3b08020
   9656                                       // CLREX{<c>}{<q>} ; T1
   9657                                       clrex(CurrentCond());
   9658                                       if (((instr & 0xffffffff) !=
   9659                                            0xf3bf8f2f)) {
   9660                                         UnpredictableT32(instr);
   9661                                       }
   9662                                       break;
   9663                                     }
   9664                                     case 0x00000040: {
   9665                                       // 0xf3b08040
   9666                                       MemoryBarrier option(instr & 0xf);
   9667                                       // DSB{<c>}{<q>} {<option>} ; T1
   9668                                       dsb(CurrentCond(), option);
   9669                                       if (((instr & 0xfffffff0) !=
   9670                                            0xf3bf8f40)) {
   9671                                         UnpredictableT32(instr);
   9672                                       }
   9673                                       break;
   9674                                     }
   9675                                     case 0x00000050: {
   9676                                       // 0xf3b08050
   9677                                       MemoryBarrier option(instr & 0xf);
   9678                                       // DMB{<c>}{<q>} {<option>} ; T1
   9679                                       dmb(CurrentCond(), option);
   9680                                       if (((instr & 0xfffffff0) !=
   9681                                            0xf3bf8f50)) {
   9682                                         UnpredictableT32(instr);
   9683                                       }
   9684                                       break;
   9685                                     }
   9686                                     case 0x00000060: {
   9687                                       // 0xf3b08060
   9688                                       MemoryBarrier option(instr & 0xf);
   9689                                       // ISB{<c>}{<q>} {<option>} ; T1
   9690                                       isb(CurrentCond(), option);
   9691                                       if (((instr & 0xfffffff0) !=
   9692                                            0xf3bf8f60)) {
   9693                                         UnpredictableT32(instr);
   9694                                       }
   9695                                       break;
   9696                                     }
   9697                                     default:
   9698                                       UnallocatedT32(instr);
   9699                                       break;
   9700                                   }
   9701                                   break;
   9702                                 }
   9703                               }
   9704                               break;
   9705                             }
   9706                             case 0x00400000: {
   9707                               // 0xf3c08000
   9708                               switch (instr & 0x00100000) {
   9709                                 case 0x00000000: {
   9710                                   // 0xf3c08000
   9711                                   unsigned rm = (instr >> 16) & 0xf;
   9712                                   // BXJ{<c>}{<q>} <Rm> ; T1
   9713                                   bxj(CurrentCond(), Register(rm));
   9714                                   if (((instr & 0xfff0ffff) != 0xf3c08f00)) {
   9715                                     UnpredictableT32(instr);
   9716                                   }
   9717                                   break;
   9718                                 }
   9719                                 case 0x00100000: {
   9720                                   // 0xf3d08000
   9721                                   switch (instr & 0x000000ff) {
   9722                                     case 0x00000000: {
   9723                                       // 0xf3d08000
   9724                                       if ((instr & 0x000f0000) == 0x000e0000) {
   9725                                         UnimplementedT32_32("ERET", instr);
   9726                                       } else {
   9727                                         UnallocatedT32(instr);
   9728                                       }
   9729                                       break;
   9730                                     }
   9731                                     default: {
   9732                                       if (((instr & 0xff) == 0x0)) {
   9733                                         UnallocatedT32(instr);
   9734                                         return;
   9735                                       }
   9736                                       uint32_t imm = instr & 0xff;
   9737                                       // SUBS{<c>}{<q>} PC, LR, #<imm8> ; T5
   9738                                       subs(CurrentCond(), Best, pc, lr, imm);
   9739                                       if (((instr & 0xffffff00) !=
   9740                                            0xf3de8f00)) {
   9741                                         UnpredictableT32(instr);
   9742                                       }
   9743                                       break;
   9744                                     }
   9745                                   }
   9746                                   break;
   9747                                 }
   9748                               }
   9749                               break;
   9750                             }
   9751                             case 0x00600000: {
   9752                               // 0xf3e08000
   9753                               switch (instr & 0x00000020) {
   9754                                 case 0x00000000: {
   9755                                   // 0xf3e08000
   9756                                   unsigned rd = (instr >> 8) & 0xf;
   9757                                   unsigned spec_reg = (instr >> 20) & 0x1;
   9758                                   // MRS{<c>}{<q>} <Rd>, <spec_reg> ; T1
   9759                                   mrs(CurrentCond(),
   9760                                       Register(rd),
   9761                                       SpecialRegister(spec_reg));
   9762                                   if (((instr & 0xffeff0ff) != 0xf3ef8000)) {
   9763                                     UnpredictableT32(instr);
   9764                                   }
   9765                                   break;
   9766                                 }
   9767                                 case 0x00000020: {
   9768                                   // 0xf3e08020
   9769                                   UnimplementedT32_32("MRS", instr);
   9770                                   break;
   9771                                 }
   9772                               }
   9773                               break;
   9774                             }
   9775                             case 0x04000000: {
   9776                               // 0xf7808000
   9777                               switch (instr & 0x001f2fff) {
   9778                                 case 0x000f0001: {
   9779                                   // 0xf78f8001
   9780                                   UnimplementedT32_32("DCPS1", instr);
   9781                                   break;
   9782                                 }
   9783                                 case 0x000f0002: {
   9784                                   // 0xf78f8002
   9785                                   UnimplementedT32_32("DCPS2", instr);
   9786                                   break;
   9787                                 }
   9788                                 case 0x000f0003: {
   9789                                   // 0xf78f8003
   9790                                   UnimplementedT32_32("DCPS3", instr);
   9791                                   break;
   9792                                 }
   9793                                 default:
   9794                                   UnallocatedT32(instr);
   9795                                   break;
   9796                               }
   9797                               break;
   9798                             }
   9799                             case 0x04600000: {
   9800                               // 0xf7e08000
   9801                               switch (instr & 0x00102000) {
   9802                                 case 0x00000000: {
   9803                                   // 0xf7e08000
   9804                                   uint32_t imm =
   9805                                       (instr & 0xfff) | ((instr >> 4) & 0xf000);
   9806                                   // HVC{<q>} {#}<imm16> ; T1
   9807                                   hvc(Condition::None(), imm);
   9808                                   break;
   9809                                 }
   9810                                 case 0x00100000: {
   9811                                   // 0xf7f08000
   9812                                   UnimplementedT32_32("SMC", instr);
   9813                                   break;
   9814                                 }
   9815                                 case 0x00102000: {
   9816                                   // 0xf7f0a000
   9817                                   uint32_t imm =
   9818                                       (instr & 0xfff) | ((instr >> 4) & 0xf000);
   9819                                   if ((imm <= 255)) {
   9820                                     // UDF{<c>}.W {#}<imm> ; T2
   9821                                     udf(CurrentCond(), Wide, imm);
   9822                                   } else {
   9823                                     // UDF{<c>}{<q>} {#}<imm> ; T2
   9824                                     udf(CurrentCond(), Best, imm);
   9825                                   }
   9826                                   break;
   9827                                 }
   9828                                 default:
   9829                                   UnallocatedT32(instr);
   9830                                   break;
   9831                               }
   9832                               break;
   9833                             }
   9834                             default:
   9835                               UnallocatedT32(instr);
   9836                               break;
   9837                           }
   9838                           break;
   9839                         }
   9840                         default: {
   9841                           if (((instr & 0x3800000) == 0x3800000)) {
   9842                             UnallocatedT32(instr);
   9843                             return;
   9844                           }
   9845                           Condition condition((instr >> 22) & 0xf);
   9846                           int32_t imm =
   9847                               SignExtend<int32_t>((instr & 0x7ff) |
   9848                                                       ((instr >> 5) & 0x1f800) |
   9849                                                       ((instr << 4) & 0x20000) |
   9850                                                       ((instr << 7) & 0x40000) |
   9851                                                       ((instr >> 7) & 0x80000),
   9852                                                   20)
   9853                               << 1;
   9854                           Location location(imm, kT32PcDelta);
   9855                           if (OutsideITBlock() && (imm >= -1048576) &&
   9856                               (imm <= 1048574) && ((imm & 1) == 0) &&
   9857                               ((imm >= -256) && (imm <= 254) &&
   9858                                ((imm & 1) == 0))) {
   9859                             // B<c>.W <label> ; T3
   9860                             b(condition, Wide, &location);
   9861                           } else if (OutsideITBlock() && (imm >= -1048576) &&
   9862                                      (imm <= 1048574) && ((imm & 1) == 0)) {
   9863                             // B<c>{<q>} <label> ; T3
   9864                             b(condition, Best, &location);
   9865                           } else {
   9866                             UnallocatedT32(instr);
   9867                           }
   9868                           break;
   9869                         }
   9870                       }
   9871                       break;
   9872                     }
   9873                     case 0x00001000: {
   9874                       // 0xf0009000
   9875                       uint32_t encoded_imm =
   9876                           (instr & 0x7ff) | ((instr >> 5) & 0x1ff800) |
   9877                           ((instr << 10) & 0x200000) |
   9878                           ((instr << 9) & 0x400000) | ((instr >> 3) & 0x800000);
   9879                       uint32_t S = encoded_imm & (1 << 23);
   9880                       encoded_imm ^= ((S >> 1) | (S >> 2)) ^ (3 << 21);
   9881                       int32_t imm = SignExtend<int32_t>(encoded_imm << 1, 25);
   9882                       Location location(imm, kT32PcDelta);
   9883                       if ((imm >= -16777216) && (imm <= 16777214) &&
   9884                           ((imm & 1) == 0) &&
   9885                           (OutsideITBlockOrLast() && (imm >= -2048) &&
   9886                            (imm <= 2046) && ((imm & 1) == 0))) {
   9887                         // B{<c>}.W <label> ; T4
   9888                         b(CurrentCond(), Wide, &location);
   9889                       } else if (OutsideITBlockOrLast() && (imm >= -16777216) &&
   9890                                  (imm <= 16777214) && ((imm & 1) == 0)) {
   9891                         // B{<c>}{<q>} <label> ; T4
   9892                         b(CurrentCond(), Best, &location);
   9893                       } else {
   9894                         UnallocatedT32(instr);
   9895                       }
   9896                       break;
   9897                     }
   9898                     case 0x00004000: {
   9899                       // 0xf000c000
   9900                       if ((instr & 0x00000001) == 0x00000000) {
   9901                         uint32_t encoded_imm = ((instr >> 1) & 0x3ff) |
   9902                                                ((instr >> 6) & 0xffc00) |
   9903                                                ((instr << 9) & 0x100000) |
   9904                                                ((instr << 8) & 0x200000) |
   9905                                                ((instr >> 4) & 0x400000);
   9906                         uint32_t S = encoded_imm & (1 << 22);
   9907                         encoded_imm ^= ((S >> 1) | (S >> 2)) ^ (3 << 20);
   9908                         int32_t imm = SignExtend<int32_t>(encoded_imm << 2, 25);
   9909                         Location location(imm, kT32PcDelta);
   9910                         // BLX{<c>}{<q>} <label> ; T2
   9911                         blx(CurrentCond(), &location);
   9912                       } else {
   9913                         UnallocatedT32(instr);
   9914                       }
   9915                       break;
   9916                     }
   9917                     case 0x00005000: {
   9918                       // 0xf000d000
   9919                       uint32_t encoded_imm =
   9920                           (instr & 0x7ff) | ((instr >> 5) & 0x1ff800) |
   9921                           ((instr << 10) & 0x200000) |
   9922                           ((instr << 9) & 0x400000) | ((instr >> 3) & 0x800000);
   9923                       uint32_t S = encoded_imm & (1 << 23);
   9924                       encoded_imm ^= ((S >> 1) | (S >> 2)) ^ (3 << 21);
   9925                       int32_t imm = SignExtend<int32_t>(encoded_imm << 1, 25);
   9926                       Location location(imm, kT32PcDelta);
   9927                       // BL{<c>}{<q>} <label> ; T1
   9928                       bl(CurrentCond(), &location);
   9929                       break;
   9930                     }
   9931                   }
   9932                   break;
   9933                 }
   9934               }
   9935               break;
   9936             }
   9937           }
   9938           break;
   9939         }
   9940         case 0x08000000: {
   9941           // 0xe8000000
   9942           switch (instr & 0x06000000) {
   9943             case 0x00000000: {
   9944               // 0xe8000000
   9945               switch (instr & 0x10100000) {
   9946                 case 0x00000000: {
   9947                   // 0xe8000000
   9948                   switch (instr & 0x01400000) {
   9949                     case 0x00000000: {
   9950                       // 0xe8000000
   9951                       switch (instr & 0x00800000) {
   9952                         case 0x00000000: {
   9953                           // 0xe8000000
   9954                           UnimplementedT32_32("SRSDB", instr);
   9955                           break;
   9956                         }
   9957                         case 0x00800000: {
   9958                           // 0xe8800000
   9959                           unsigned rn = (instr >> 16) & 0xf;
   9960                           WriteBack write_back((instr >> 21) & 0x1);
   9961                           RegisterList registers(
   9962                               (((instr >> 14) & 0x1) << kLRRegNum) |
   9963                               (instr & 0x1fff));
   9964                           if ((rn < kNumberOfT32LowRegisters) &&
   9965                               write_back.DoesWriteBack() &&
   9966                               ((registers.GetList() & ~0xff) == 0)) {
   9967                             // STM{<c>}.W <Rn>{!}, <registers> ; T2
   9968                             stm(CurrentCond(),
   9969                                 Wide,
   9970                                 Register(rn),
   9971                                 write_back,
   9972                                 registers);
   9973                             if (((instr & 0xffd0a000) != 0xe8800000)) {
   9974                               UnpredictableT32(instr);
   9975                             }
   9976                           } else {
   9977                             // STM{<c>}{<q>} <Rn>{!}, <registers> ; T2
   9978                             stm(CurrentCond(),
   9979                                 Best,
   9980                                 Register(rn),
   9981                                 write_back,
   9982                                 registers);
   9983                             if (((instr & 0xffd0a000) != 0xe8800000)) {
   9984                               UnpredictableT32(instr);
   9985                             }
   9986                           }
   9987                           break;
   9988                         }
   9989                       }
   9990                       break;
   9991                     }
   9992                     case 0x00400000: {
   9993                       // 0xe8400000
   9994                       switch (instr & 0x00200000) {
   9995                         case 0x00000000: {
   9996                           // 0xe8400000
   9997                           switch (instr & 0x00800000) {
   9998                             case 0x00000000: {
   9999                               // 0xe8400000
   10000                               unsigned rd = (instr >> 8) & 0xf;
   10001                               unsigned rt = (instr >> 12) & 0xf;
   10002                               unsigned rn = (instr >> 16) & 0xf;
   10003                               int32_t offset = (instr & 0xff) << 2;
   10004                               // STREX{<c>}{<q>} <Rd>, <Rt>, [<Rn>{, #<imm>}] ; T1 NOLINT(whitespace/line_length)
   10005                               strex(CurrentCond(),
   10006                                     Register(rd),
   10007                                     Register(rt),
   10008                                     MemOperand(Register(rn),
   10009                                                plus,
   10010                                                offset,
   10011                                                Offset));
   10012                               break;
   10013                             }
   10014                             case 0x00800000: {
   10015                               // 0xe8c00000
   10016                               switch (instr & 0x000000f0) {
   10017                                 case 0x00000040: {
   10018                                   // 0xe8c00040
   10019                                   unsigned rd = instr & 0xf;
   10020                                   unsigned rt = (instr >> 12) & 0xf;
   10021                                   unsigned rn = (instr >> 16) & 0xf;
   10022                                   // STREXB{<c>}{<q>} <Rd>, <Rt>, [<Rn>] ; T1
   10023                                   strexb(CurrentCond(),
   10024                                          Register(rd),
   10025                                          Register(rt),
   10026                                          MemOperand(Register(rn), Offset));
   10027                                   if (((instr & 0xfff00ff0) != 0xe8c00f40)) {
   10028                                     UnpredictableT32(instr);
   10029                                   }
   10030                                   break;
   10031                                 }
   10032                                 case 0x00000050: {
   10033                                   // 0xe8c00050
   10034                                   unsigned rd = instr & 0xf;
   10035                                   unsigned rt = (instr >> 12) & 0xf;
   10036                                   unsigned rn = (instr >> 16) & 0xf;
   10037                                   // STREXH{<c>}{<q>} <Rd>, <Rt>, [<Rn>] ; T1
   10038                                   strexh(CurrentCond(),
   10039                                          Register(rd),
   10040                                          Register(rt),
   10041                                          MemOperand(Register(rn), Offset));
   10042                                   if (((instr & 0xfff00ff0) != 0xe8c00f50)) {
   10043                                     UnpredictableT32(instr);
   10044                                   }
   10045                                   break;
   10046                                 }
   10047                                 case 0x00000070: {
   10048                                   // 0xe8c00070
   10049                                   unsigned rd = instr & 0xf;
   10050                                   unsigned rt = (instr >> 12) & 0xf;
   10051                                   unsigned rt2 = (instr >> 8) & 0xf;
   10052                                   unsigned rn = (instr >> 16) & 0xf;
   10053                                   // STREXD{<c>}{<q>} <Rd>, <Rt>, <Rt2>, [<Rn>] ; T1 NOLINT(whitespace/line_length)
   10054                                   strexd(CurrentCond(),
   10055                                          Register(rd),
   10056                                          Register(rt),
   10057                                          Register(rt2),
   10058                                          MemOperand(Register(rn), Offset));
   10059                                   break;
   10060                                 }
   10061                                 case 0x00000080: {
   10062                                   // 0xe8c00080
   10063                                   unsigned rt = (instr >> 12) & 0xf;
   10064                                   unsigned rn = (instr >> 16) & 0xf;
   10065                                   // STLB{<c>}{<q>} <Rt>, [<Rn>] ; T1
   10066                                   stlb(CurrentCond(),
   10067                                        Register(rt),
   10068                                        MemOperand(Register(rn), Offset));
   10069                                   if (((instr & 0xfff00fff) != 0xe8c00f8f)) {
   10070                                     UnpredictableT32(instr);
   10071                                   }
   10072                                   break;
   10073                                 }
   10074                                 case 0x00000090: {
   10075                                   // 0xe8c00090
   10076                                   unsigned rt = (instr >> 12) & 0xf;
   10077                                   unsigned rn = (instr >> 16) & 0xf;
   10078                                   // STLH{<c>}{<q>} <Rt>, [<Rn>] ; T1
   10079                                   stlh(CurrentCond(),
   10080                                        Register(rt),
   10081                                        MemOperand(Register(rn), Offset));
   10082                                   if (((instr & 0xfff00fff) != 0xe8c00f9f)) {
   10083                                     UnpredictableT32(instr);
   10084                                   }
   10085                                   break;
   10086                                 }
   10087                                 case 0x000000a0: {
   10088                                   // 0xe8c000a0
   10089                                   unsigned rt = (instr >> 12) & 0xf;
   10090                                   unsigned rn = (instr >> 16) & 0xf;
   10091                                   // STL{<c>}{<q>} <Rt>, [<Rn>] ; T1
   10092                                   stl(CurrentCond(),
   10093                                       Register(rt),
   10094                                       MemOperand(Register(rn), Offset));
   10095                                   if (((instr & 0xfff00fff) != 0xe8c00faf)) {
   10096                                     UnpredictableT32(instr);
   10097                                   }
   10098                                   break;
   10099                                 }
   10100                                 case 0x000000c0: {
   10101                                   // 0xe8c000c0
   10102                                   unsigned rd = instr & 0xf;
   10103                                   unsigned rt = (instr >> 12) & 0xf;
   10104                                   unsigned rn = (instr >> 16) & 0xf;
   10105                                   // STLEXB{<c>}{<q>} <Rd>, <Rt>, [<Rn>] ; T1
   10106                                   stlexb(CurrentCond(),
   10107                                          Register(rd),
   10108                                          Register(rt),
   10109                                          MemOperand(Register(rn), Offset));
   10110                                   if (((instr & 0xfff00ff0) != 0xe8c00fc0)) {
   10111                                     UnpredictableT32(instr);
   10112                                   }
   10113                                   break;
   10114                                 }
   10115                                 case 0x000000d0: {
   10116                                   // 0xe8c000d0
   10117                                   unsigned rd = instr & 0xf;
   10118                                   unsigned rt = (instr >> 12) & 0xf;
   10119                                   unsigned rn = (instr >> 16) & 0xf;
   10120                                   // STLEXH{<c>}{<q>} <Rd>, <Rt>, [<Rn>] ; T1
   10121                                   stlexh(CurrentCond(),
   10122                                          Register(rd),
   10123                                          Register(rt),
   10124                                          MemOperand(Register(rn), Offset));
   10125                                   if (((instr & 0xfff00ff0) != 0xe8c00fd0)) {
   10126                                     UnpredictableT32(instr);
   10127                                   }
   10128                                   break;
   10129                                 }
   10130                                 case 0x000000e0: {
   10131                                   // 0xe8c000e0
   10132                                   unsigned rd = instr & 0xf;
   10133                                   unsigned rt = (instr >> 12) & 0xf;
   10134                                   unsigned rn = (instr >> 16) & 0xf;
   10135                                   // STLEX{<c>}{<q>} <Rd>, <Rt>, [<Rn>] ; T1
   10136                                   stlex(CurrentCond(),
   10137                                         Register(rd),
   10138                                         Register(rt),
   10139                                         MemOperand(Register(rn), Offset));
   10140                                   if (((instr & 0xfff00ff0) != 0xe8c00fe0)) {
   10141                                     UnpredictableT32(instr);
   10142                                   }
   10143                                   break;
   10144                                 }
   10145                                 case 0x000000f0: {
   10146                                   // 0xe8c000f0
   10147                                   unsigned rd = instr & 0xf;
   10148                                   unsigned rt = (instr >> 12) & 0xf;
   10149                                   unsigned rt2 = (instr >> 8) & 0xf;
   10150                                   unsigned rn = (instr >> 16) & 0xf;
   10151                                   // STLEXD{<c>}{<q>} <Rd>, <Rt>, <Rt2>, [<Rn>] ; T1 NOLINT(whitespace/line_length)
   10152                                   stlexd(CurrentCond(),
   10153                                          Register(rd),
   10154                                          Register(rt),
   10155                                          Register(rt2),
   10156                                          MemOperand(Register(rn), Offset));
   10157                                   break;
   10158                                 }
   10159                                 default:
   10160                                   UnallocatedT32(instr);
   10161                                   break;
   10162                               }
   10163                               break;
   10164                             }
   10165                           }
   10166                           break;
   10167                         }
   10168                         case 0x00200000: {
   10169                           // 0xe8600000
   10170                           if (((instr & 0xf0000) == 0xf0000)) {
   10171                             UnallocatedT32(instr);
   10172                             return;
   10173                           }
   10174                           unsigned rt = (instr >> 12) & 0xf;
   10175                           unsigned rt2 = (instr >> 8) & 0xf;
   10176                           unsigned rn = (instr >> 16) & 0xf;
   10177                           Sign sign((((instr >> 23) & 0x1) == 0) ? minus
   10178                                                                  : plus);
   10179                           int32_t offset = (instr & 0xff) << 2;
   10180                           // STRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>], #{+/-}<imm> ; T1 NOLINT(whitespace/line_length)
   10181                           strd(CurrentCond(),
   10182                                Register(rt),
   10183                                Register(rt2),
   10184                                MemOperand(Register(rn),
   10185                                           sign,
   10186                                           offset,
   10187                                           PostIndex));
   10188                           break;
   10189                         }
   10190                       }
   10191                       break;
   10192                     }
   10193                     case 0x01000000: {
   10194                       // 0xe9000000
   10195                       switch (instr & 0x00800000) {
   10196                         case 0x00000000: {
   10197                           // 0xe9000000
   10198                           if (((Uint32((instr >> 21)) & Uint32(0x1)) ==
   10199                                Uint32(0x1)) &&
   10200                               ((Uint32((instr >> 16)) & Uint32(0xf)) ==
   10201                                Uint32(0xd)) &&
   10202                               (BitCount(((Uint32((instr >> 14)) & Uint32(0x1))
   10203                                          << 13) |
   10204                                         (Uint32(instr) & Uint32(0x1fff))) >
   10205                                Int64(1))) {
   10206                             RegisterList registers(
   10207                                 (((instr >> 14) & 0x1) << kLRRegNum) |
   10208                                 (instr & 0x1fff));
   10209                             if (registers.IsR0toR7orLR()) {
   10210                               // PUSH{<c>}.W <registers> ; T1
   10211                               push(CurrentCond(), Wide, registers);
   10212                               if (((instr & 0xffffa000) != 0xe92d0000)) {
   10213                                 UnpredictableT32(instr);
   10214                               }
   10215                             } else {
   10216                               // PUSH{<c>}{<q>} <registers> ; T1
   10217                               push(CurrentCond(), Best, registers);
   10218                               if (((instr & 0xffffa000) != 0xe92d0000)) {
   10219                                 UnpredictableT32(instr);
   10220                               }
   10221                             }
   10222                             return;
   10223                           }
   10224                           unsigned rn = (instr >> 16) & 0xf;
   10225                           WriteBack write_back((instr >> 21) & 0x1);
   10226                           RegisterList registers(
   10227                               (((instr >> 14) & 0x1) << kLRRegNum) |
   10228                               (instr & 0x1fff));
   10229                           // STMDB{<c>}{<q>} <Rn>{!}, <registers> ; T1
   10230                           stmdb(CurrentCond(),
   10231                                 Best,
   10232                                 Register(rn),
   10233                                 write_back,
   10234                                 registers);
   10235                           if (((instr & 0xffd0a000) != 0xe9000000)) {
   10236                             UnpredictableT32(instr);
   10237                           }
   10238                           break;
   10239                         }
   10240                         case 0x00800000: {
   10241                           // 0xe9800000
   10242                           UnimplementedT32_32("SRS{IA}", instr);
   10243                           break;
   10244                         }
   10245                       }
   10246                       break;
   10247                     }
   10248                     case 0x01400000: {
   10249                       // 0xe9400000
   10250                       switch (instr & 0x00200000) {
   10251                         case 0x00000000: {
   10252                           // 0xe9400000
   10253                           if (((instr & 0xf0000) == 0xf0000)) {
   10254                             UnallocatedT32(instr);
   10255                             return;
   10256                           }
   10257                           unsigned rt = (instr >> 12) & 0xf;
   10258                           unsigned rt2 = (instr >> 8) & 0xf;
   10259                           unsigned rn = (instr >> 16) & 0xf;
   10260                           Sign sign((((instr >> 23) & 0x1) == 0) ? minus
   10261                                                                  : plus);
   10262                           int32_t offset = (instr & 0xff) << 2;
   10263                           // STRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>{, #{+/-}<imm>}] ; T1 NOLINT(whitespace/line_length)
   10264                           strd(CurrentCond(),
   10265                                Register(rt),
   10266                                Register(rt2),
   10267                                MemOperand(Register(rn), sign, offset, Offset));
   10268                           break;
   10269                         }
   10270                         case 0x00200000: {
   10271                           // 0xe9600000
   10272                           if (((instr & 0xf0000) == 0xf0000)) {
   10273                             UnallocatedT32(instr);
   10274                             return;
   10275                           }
   10276                           unsigned rt = (instr >> 12) & 0xf;
   10277                           unsigned rt2 = (instr >> 8) & 0xf;
   10278                           unsigned rn = (instr >> 16) & 0xf;
   10279                           Sign sign((((instr >> 23) & 0x1) == 0) ? minus
   10280                                                                  : plus);
   10281                           int32_t offset = (instr & 0xff) << 2;
   10282                           // STRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>{, #{+/-}<imm>}]! ; T1 NOLINT(whitespace/line_length)
   10283                           strd(CurrentCond(),
   10284                                Register(rt),
   10285                                Register(rt2),
   10286                                MemOperand(Register(rn),
   10287                                           sign,
   10288                                           offset,
   10289                                           PreIndex));
   10290                           break;
   10291                         }
   10292                       }
   10293                       break;
   10294                     }
   10295                   }
   10296                   break;
   10297                 }
   10298                 case 0x00100000: {
   10299                   // 0xe8100000
   10300                   switch (instr & 0x00400000) {
   10301                     case 0x00000000: {
   10302                       // 0xe8100000
   10303                       switch (instr & 0x01800000) {
   10304                         case 0x00000000: {
   10305                           // 0xe8100000
   10306                           UnimplementedT32_32("RFEDB", instr);
   10307                           break;
   10308                         }
   10309                         case 0x00800000: {
   10310                           // 0xe8900000
   10311                           if (((Uint32((instr >> 21)) & Uint32(0x1)) ==
   10312                                Uint32(0x1)) &&
   10313                               ((Uint32((instr >> 16)) & Uint32(0xf)) ==
   10314                                Uint32(0xd)) &&
   10315                               (BitCount(((Uint32((instr >> 15)) & Uint32(0x1))
   10316                                          << 14) |
   10317                                         ((Uint32((instr >> 14)) & Uint32(0x1))
   10318                                          << 13) |
   10319                                         (Uint32(instr) & Uint32(0x1fff))) >
   10320                                Int64(1))) {
   10321                             RegisterList registers(
   10322                                 (((instr >> 15) & 0x1) << kPCRegNum) |
   10323                                 (((instr >> 14) & 0x1) << kLRRegNum) |
   10324                                 (instr & 0x1fff));
   10325                             if (registers.IsR0toR7orPC()) {
   10326                               // POP{<c>}.W <registers> ; T2
   10327                               pop(CurrentCond(), Wide, registers);
   10328                               if (((instr & 0xffff2000) != 0xe8bd0000)) {
   10329                                 UnpredictableT32(instr);
   10330                               }
   10331                             } else {
   10332                               // POP{<c>}{<q>} <registers> ; T2
   10333                               pop(CurrentCond(), Best, registers);
   10334                               if (((instr & 0xffff2000) != 0xe8bd0000)) {
   10335                                 UnpredictableT32(instr);
   10336                               }
   10337                             }
   10338                             return;
   10339                           }
   10340                           unsigned rn = (instr >> 16) & 0xf;
   10341                           WriteBack write_back((instr >> 21) & 0x1);
   10342                           RegisterList registers(
   10343                               (((instr >> 15) & 0x1) << kPCRegNum) |
   10344                               (((instr >> 14) & 0x1) << kLRRegNum) |
   10345                               (instr & 0x1fff));
   10346                           if ((rn < kNumberOfT32LowRegisters) &&
   10347                               (((registers.GetList() & (1 << rn)) == 0) ==
   10348                                write_back.DoesWriteBack()) &&
   10349                               ((registers.GetList() & ~0xff) == 0)) {
   10350                             // LDM{<c>}.W <Rn>{!}, <registers> ; T2
   10351                             ldm(CurrentCond(),
   10352                                 Wide,
   10353                                 Register(rn),
   10354                                 write_back,
   10355                                 registers);
   10356                             if (((instr & 0xffd02000) != 0xe8900000)) {
   10357                               UnpredictableT32(instr);
   10358                             }
   10359                           } else {
   10360                             // LDM{<c>}{<q>} <Rn>{!}, <registers> ; T2
   10361                             ldm(CurrentCond(),
   10362                                 Best,
   10363                                 Register(rn),
   10364                                 write_back,
   10365                                 registers);
   10366                             if (((instr & 0xffd02000) != 0xe8900000)) {
   10367                               UnpredictableT32(instr);
   10368                             }
   10369                           }
   10370                           break;
   10371                         }
   10372                         case 0x01000000: {
   10373                           // 0xe9100000
   10374                           unsigned rn = (instr >> 16) & 0xf;
   10375                           WriteBack write_back((instr >> 21) & 0x1);
   10376                           RegisterList registers(
   10377                               (((instr >> 15) & 0x1) << kPCRegNum) |
   10378                               (((instr >> 14) & 0x1) << kLRRegNum) |
   10379                               (instr & 0x1fff));
   10380                           // LDMDB{<c>}{<q>} <Rn>{!}, <registers> ; T1
   10381                           ldmdb(CurrentCond(),
   10382                                 Register(rn),
   10383                                 write_back,
   10384                                 registers);
   10385                           if (((instr & 0xffd02000) != 0xe9100000)) {
   10386                             UnpredictableT32(instr);
   10387                           }
   10388                           break;
   10389                         }
   10390                         case 0x01800000: {
   10391                           // 0xe9900000
   10392                           UnimplementedT32_32("RFE{IA}", instr);
   10393                           break;
   10394                         }
   10395                       }
   10396                       break;
   10397                     }
   10398                     case 0x00400000: {
   10399                       // 0xe8500000
   10400                       switch (instr & 0x01200000) {
   10401                         case 0x00000000: {
   10402                           // 0xe8500000
   10403                           switch (instr & 0x00800000) {
   10404                             case 0x00000000: {
   10405                               // 0xe8500000
   10406                               unsigned rt = (instr >> 12) & 0xf;
   10407                               unsigned rn = (instr >> 16) & 0xf;
   10408                               int32_t offset = (instr & 0xff) << 2;
   10409                               // LDREX{<c>}{<q>} <Rt>, [<Rn>{, #<imm>}] ; T1
   10410                               ldrex(CurrentCond(),
   10411                                     Register(rt),
   10412                                     MemOperand(Register(rn),
   10413                                                plus,
   10414                                                offset,
   10415                                                Offset));
   10416                               if (((instr & 0xfff00f00) != 0xe8500f00)) {
   10417                                 UnpredictableT32(instr);
   10418                               }
   10419                               break;
   10420                             }
   10421                             case 0x00800000: {
   10422                               // 0xe8d00000
   10423                               switch (instr & 0x000000f0) {
   10424                                 case 0x00000000: {
   10425                                   // 0xe8d00000
   10426                                   unsigned rn = (instr >> 16) & 0xf;
   10427                                   unsigned rm = instr & 0xf;
   10428                                   // TBB{<c>}{<q>} [<Rn>, <Rm>] ; T1
   10429                                   tbb(CurrentCond(),
   10430                                       Register(rn),
   10431                                       Register(rm));
   10432                                   if (((instr & 0xfff0fff0) != 0xe8d0f000)) {
   10433                                     UnpredictableT32(instr);
   10434                                   }
   10435                                   break;
   10436                                 }
   10437                                 case 0x00000010: {
   10438                                   // 0xe8d00010
   10439                                   unsigned rn = (instr >> 16) & 0xf;
   10440                                   unsigned rm = instr & 0xf;
   10441                                   // TBH{<c>}{<q>} [<Rn>, <Rm>, LSL #1] ; T1
   10442                                   tbh(CurrentCond(),
   10443                                       Register(rn),
   10444                                       Register(rm));
   10445                                   if (((instr & 0xfff0fff0) != 0xe8d0f010)) {
   10446                                     UnpredictableT32(instr);
   10447                                   }
   10448                                   break;
   10449                                 }
   10450                                 case 0x00000040: {
   10451                                   // 0xe8d00040
   10452                                   unsigned rt = (instr >> 12) & 0xf;
   10453                                   unsigned rn = (instr >> 16) & 0xf;
   10454                                   // LDREXB{<c>}{<q>} <Rt>, [<Rn>] ; T1
   10455                                   ldrexb(CurrentCond(),
   10456                                          Register(rt),
   10457                                          MemOperand(Register(rn), Offset));
   10458                                   if (((instr & 0xfff00fff) != 0xe8d00f4f)) {
   10459                                     UnpredictableT32(instr);
   10460                                   }
   10461                                   break;
   10462                                 }
   10463                                 case 0x00000050: {
   10464                                   // 0xe8d00050
   10465                                   unsigned rt = (instr >> 12) & 0xf;
   10466                                   unsigned rn = (instr >> 16) & 0xf;
   10467                                   // LDREXH{<c>}{<q>} <Rt>, [<Rn>] ; T1
   10468                                   ldrexh(CurrentCond(),
   10469                                          Register(rt),
   10470                                          MemOperand(Register(rn), Offset));
   10471                                   if (((instr & 0xfff00fff) != 0xe8d00f5f)) {
   10472                                     UnpredictableT32(instr);
   10473                                   }
   10474                                   break;
   10475                                 }
   10476                                 case 0x00000070: {
   10477                                   // 0xe8d00070
   10478                                   unsigned rt = (instr >> 12) & 0xf;
   10479                                   unsigned rt2 = (instr >> 8) & 0xf;
   10480                                   unsigned rn = (instr >> 16) & 0xf;
   10481                                   // LDREXD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>] ; T1
   10482                                   ldrexd(CurrentCond(),
   10483                                          Register(rt),
   10484                                          Register(rt2),
   10485                                          MemOperand(Register(rn), Offset));
   10486                                   if (((instr & 0xfff000ff) != 0xe8d0007f)) {
   10487                                     UnpredictableT32(instr);
   10488                                   }
   10489                                   break;
   10490                                 }
   10491                                 case 0x00000080: {
   10492                                   // 0xe8d00080
   10493                                   unsigned rt = (instr >> 12) & 0xf;
   10494                                   unsigned rn = (instr >> 16) & 0xf;
   10495                                   // LDAB{<c>}{<q>} <Rt>, [<Rn>] ; T1
   10496                                   ldab(CurrentCond(),
   10497                                        Register(rt),
   10498                                        MemOperand(Register(rn), Offset));
   10499                                   if (((instr & 0xfff00fff) != 0xe8d00f8f)) {
   10500                                     UnpredictableT32(instr);
   10501                                   }
   10502                                   break;
   10503                                 }
   10504                                 case 0x00000090: {
   10505                                   // 0xe8d00090
   10506                                   unsigned rt = (instr >> 12) & 0xf;
   10507                                   unsigned rn = (instr >> 16) & 0xf;
   10508                                   // LDAH{<c>}{<q>} <Rt>, [<Rn>] ; T1
   10509                                   ldah(CurrentCond(),
   10510                                        Register(rt),
   10511                                        MemOperand(Register(rn), Offset));
   10512                                   if (((instr & 0xfff00fff) != 0xe8d00f9f)) {
   10513                                     UnpredictableT32(instr);
   10514                                   }
   10515                                   break;
   10516                                 }
   10517                                 case 0x000000a0: {
   10518                                   // 0xe8d000a0
   10519                                   unsigned rt = (instr >> 12) & 0xf;
   10520                                   unsigned rn = (instr >> 16) & 0xf;
   10521                                   // LDA{<c>}{<q>} <Rt>, [<Rn>] ; T1
   10522                                   lda(CurrentCond(),
   10523                                       Register(rt),
   10524                                       MemOperand(Register(rn), Offset));
   10525                                   if (((instr & 0xfff00fff) != 0xe8d00faf)) {
   10526                                     UnpredictableT32(instr);
   10527                                   }
   10528                                   break;
   10529                                 }
   10530                                 case 0x000000c0: {
   10531                                   // 0xe8d000c0
   10532                                   unsigned rt = (instr >> 12) & 0xf;
   10533                                   unsigned rn = (instr >> 16) & 0xf;
   10534                                   // LDAEXB{<c>}{<q>} <Rt>, [<Rn>] ; T1
   10535                                   ldaexb(CurrentCond(),
   10536                                          Register(rt),
   10537                                          MemOperand(Register(rn), Offset));
   10538                                   if (((instr & 0xfff00fff) != 0xe8d00fcf)) {
   10539                                     UnpredictableT32(instr);
   10540                                   }
   10541                                   break;
   10542                                 }
   10543                                 case 0x000000d0: {
   10544                                   // 0xe8d000d0
   10545                                   unsigned rt = (instr >> 12) & 0xf;
   10546                                   unsigned rn = (instr >> 16) & 0xf;
   10547                                   // LDAEXH{<c>}{<q>} <Rt>, [<Rn>] ; T1
   10548                                   ldaexh(CurrentCond(),
   10549                                          Register(rt),
   10550                                          MemOperand(Register(rn), Offset));
   10551                                   if (((instr & 0xfff00fff) != 0xe8d00fdf)) {
   10552                                     UnpredictableT32(instr);
   10553                                   }
   10554                                   break;
   10555                                 }
   10556                                 case 0x000000e0: {
   10557                                   // 0xe8d000e0
   10558                                   unsigned rt = (instr >> 12) & 0xf;
   10559                                   unsigned rn = (instr >> 16) & 0xf;
   10560                                   // LDAEX{<c>}{<q>} <Rt>, [<Rn>] ; T1
   10561                                   ldaex(CurrentCond(),
   10562                                         Register(rt),
   10563                                         MemOperand(Register(rn), Offset));
   10564                                   if (((instr & 0xfff00fff) != 0xe8d00fef)) {
   10565                                     UnpredictableT32(instr);
   10566                                   }
   10567                                   break;
   10568                                 }
   10569                                 case 0x000000f0: {
   10570                                   // 0xe8d000f0
   10571                                   unsigned rt = (instr >> 12) & 0xf;
   10572                                   unsigned rt2 = (instr >> 8) & 0xf;
   10573                                   unsigned rn = (instr >> 16) & 0xf;
   10574                                   // LDAEXD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>] ; T1
   10575                                   ldaexd(CurrentCond(),
   10576                                          Register(rt),
   10577                                          Register(rt2),
   10578                                          MemOperand(Register(rn), Offset));
   10579                                   if (((instr & 0xfff000ff) != 0xe8d000ff)) {
   10580                                     UnpredictableT32(instr);
   10581                                   }
   10582                                   break;
   10583                                 }
   10584                                 default:
   10585                                   UnallocatedT32(instr);
   10586                                   break;
   10587                               }
   10588                               break;
   10589                             }
   10590                           }
   10591                           break;
   10592                         }
   10593                         case 0x00200000: {
   10594                           // 0xe8700000
   10595                           switch (instr & 0x000f0000) {
   10596                             case 0x000f0000: {
   10597                               // 0xe87f0000
   10598                               if (((instr & 0x1200000) == 0x0)) {
   10599                                 UnallocatedT32(instr);
   10600                                 return;
   10601                               }
   10602                               unsigned rt = (instr >> 12) & 0xf;
   10603                               unsigned rt2 = (instr >> 8) & 0xf;
   10604                               uint32_t U = (instr >> 23) & 0x1;
   10605                               int32_t imm = instr & 0xff;
   10606                               imm <<= 2;
   10607                               if (U == 0) imm = -imm;
   10608                               bool minus_zero = (imm == 0) && (U == 0);
   10609                               Location location(imm, kT32PcDelta);
   10610                               // LDRD{<c>}{<q>} <Rt>, <Rt2>, <label> ; T1
   10611                               if (minus_zero) {
   10612                                 ldrd(CurrentCond(),
   10613                                      Register(rt),
   10614                                      Register(rt2),
   10615                                      MemOperand(pc, minus, 0));
   10616                               } else {
   10617                                 ldrd(CurrentCond(),
   10618                                      Register(rt),
   10619                                      Register(rt2),
   10620                                      &location);
   10621                               }
   10622                               if (((instr & 0xff7f0000) != 0xe95f0000)) {
   10623                                 UnpredictableT32(instr);
   10624                               }
   10625                               break;
   10626                             }
   10627                             default: {
   10628                               if (((instr & 0xf0000) == 0xf0000)) {
   10629                                 UnallocatedT32(instr);
   10630                                 return;
   10631                               }
   10632                               unsigned rt = (instr >> 12) & 0xf;
   10633                               unsigned rt2 = (instr >> 8) & 0xf;
   10634                               unsigned rn = (instr >> 16) & 0xf;
   10635                               Sign sign((((instr >> 23) & 0x1) == 0) ? minus
   10636                                                                      : plus);
   10637                               int32_t offset = (instr & 0xff) << 2;
   10638                               // LDRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>], #{+/-}<imm> ; T1 NOLINT(whitespace/line_length)
   10639                               ldrd(CurrentCond(),
   10640                                    Register(rt),
   10641                                    Register(rt2),
   10642                                    MemOperand(Register(rn),
   10643                                               sign,
   10644                                               offset,
   10645                                               PostIndex));
   10646                               break;
   10647                             }
   10648                           }
   10649                           break;
   10650                         }
   10651                         case 0x01000000: {
   10652                           // 0xe9500000
   10653                           switch (instr & 0x000f0000) {
   10654                             case 0x000f0000: {
   10655                               // 0xe95f0000
   10656                               if (((instr & 0x1200000) == 0x0)) {
   10657                                 UnallocatedT32(instr);
   10658                                 return;
   10659                               }
   10660                               unsigned rt = (instr >> 12) & 0xf;
   10661                               unsigned rt2 = (instr >> 8) & 0xf;
   10662                               uint32_t U = (instr >> 23) & 0x1;
   10663                               int32_t imm = instr & 0xff;
   10664                               imm <<= 2;
   10665                               if (U == 0) imm = -imm;
   10666                               bool minus_zero = (imm == 0) && (U == 0);
   10667                               Location location(imm, kT32PcDelta);
   10668                               // LDRD{<c>}{<q>} <Rt>, <Rt2>, <label> ; T1
   10669                               if (minus_zero) {
   10670                                 ldrd(CurrentCond(),
   10671                                      Register(rt),
   10672                                      Register(rt2),
   10673                                      MemOperand(pc, minus, 0));
   10674                               } else {
   10675                                 ldrd(CurrentCond(),
   10676                                      Register(rt),
   10677                                      Register(rt2),
   10678                                      &location);
   10679                               }
   10680                               if (((instr & 0xff7f0000) != 0xe95f0000)) {
   10681                                 UnpredictableT32(instr);
   10682                               }
   10683                               break;
   10684                             }
   10685                             default: {
   10686                               if (((instr & 0xf0000) == 0xf0000)) {
   10687                                 UnallocatedT32(instr);
   10688                                 return;
   10689                               }
   10690                               unsigned rt = (instr >> 12) & 0xf;
   10691                               unsigned rt2 = (instr >> 8) & 0xf;
   10692                               unsigned rn = (instr >> 16) & 0xf;
   10693                               Sign sign((((instr >> 23) & 0x1) == 0) ? minus
   10694                                                                      : plus);
   10695                               int32_t offset = (instr & 0xff) << 2;
   10696                               // LDRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>{, #{+/-}<imm>}] ; T1 NOLINT(whitespace/line_length)
   10697                               ldrd(CurrentCond(),
   10698                                    Register(rt),
   10699                                    Register(rt2),
   10700                                    MemOperand(Register(rn),
   10701                                               sign,
   10702                                               offset,
   10703                                               Offset));
   10704                               break;
   10705                             }
   10706                           }
   10707                           break;
   10708                         }
   10709                         case 0x01200000: {
   10710                           // 0xe9700000
   10711                           switch (instr & 0x000f0000) {
   10712                             case 0x000f0000: {
   10713                               // 0xe97f0000
   10714                               if (((instr & 0x1200000) == 0x0)) {
   10715                                 UnallocatedT32(instr);
   10716                                 return;
   10717                               }
   10718                               unsigned rt = (instr >> 12) & 0xf;
   10719                               unsigned rt2 = (instr >> 8) & 0xf;
   10720                               uint32_t U = (instr >> 23) & 0x1;
   10721                               int32_t imm = instr & 0xff;
   10722                               imm <<= 2;
   10723                               if (U == 0) imm = -imm;
   10724                               bool minus_zero = (imm == 0) && (U == 0);
   10725                               Location location(imm, kT32PcDelta);
   10726                               // LDRD{<c>}{<q>} <Rt>, <Rt2>, <label> ; T1
   10727                               if (minus_zero) {
   10728                                 ldrd(CurrentCond(),
   10729                                      Register(rt),
   10730                                      Register(rt2),
   10731                                      MemOperand(pc, minus, 0));
   10732                               } else {
   10733                                 ldrd(CurrentCond(),
   10734                                      Register(rt),
   10735                                      Register(rt2),
   10736                                      &location);
   10737                               }
   10738                               if (((instr & 0xff7f0000) != 0xe95f0000)) {
   10739                                 UnpredictableT32(instr);
   10740                               }
   10741                               break;
   10742                             }
   10743                             default: {
   10744                               if (((instr & 0xf0000) == 0xf0000)) {
   10745                                 UnallocatedT32(instr);
   10746                                 return;
   10747                               }
   10748                               unsigned rt = (instr >> 12) & 0xf;
   10749                               unsigned rt2 = (instr >> 8) & 0xf;
   10750                               unsigned rn = (instr >> 16) & 0xf;
   10751                               Sign sign((((instr >> 23) & 0x1) == 0) ? minus
   10752                                                                      : plus);
   10753                               int32_t offset = (instr & 0xff) << 2;
   10754                               // LDRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>{, #{+/-}<imm>}]! ; T1 NOLINT(whitespace/line_length)
   10755                               ldrd(CurrentCond(),
   10756                                    Register(rt),
   10757                                    Register(rt2),
   10758                                    MemOperand(Register(rn),
   10759                                               sign,
   10760                                               offset,
   10761                                               PreIndex));
   10762                               break;
   10763                             }
   10764                           }
   10765                           break;
   10766                         }
   10767                       }
   10768                       break;
   10769                     }
   10770                   }
   10771                   break;
   10772                 }
   10773                 case 0x10000000: {
   10774                   // 0xf8000000
   10775                   switch (instr & 0x01a00000) {
   10776                     case 0x00000000: {
   10777                       // 0xf8000000
   10778                       switch (instr & 0x00400d00) {
   10779                         case 0x00000000: {
   10780                           // 0xf8000000
   10781                           if ((instr & 0x000002c0) == 0x00000000) {
   10782                             if (((instr & 0xf0000) == 0xf0000)) {
   10783                               UnallocatedT32(instr);
   10784                               return;
   10785                             }
   10786                             unsigned rt = (instr >> 12) & 0xf;
   10787                             unsigned rn = (instr >> 16) & 0xf;
   10788                             Sign sign(plus);
   10789                             unsigned rm = instr & 0xf;
   10790                             Shift shift = LSL;
   10791                             uint32_t amount = (instr >> 4) & 0x3;
   10792                             AddrMode addrmode = Offset;
   10793                             if ((rt < kNumberOfT32LowRegisters) &&
   10794                                 (rn < kNumberOfT32LowRegisters) &&
   10795                                 (rm < kNumberOfT32LowRegisters) &&
   10796                                 shift.IsLSL() && (amount == 0) &&
   10797                                 sign.IsPlus()) {
   10798                               // STRB{<c>}.W <Rt>, [<Rn>, #{+}<Rm>] ; T2
   10799                               strb(CurrentCond(),
   10800                                    Wide,
   10801                                    Register(rt),
   10802                                    MemOperand(Register(rn),
   10803                                               sign,
   10804                                               Register(rm),
   10805                                               addrmode));
   10806                             } else {
   10807                               // STRB{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>{, LSL #<imm>}] ; T2 NOLINT(whitespace/line_length)
   10808                               strb(CurrentCond(),
   10809                                    Best,
   10810                                    Register(rt),
   10811                                    MemOperand(Register(rn),
   10812                                               sign,
   10813                                               Register(rm),
   10814                                               shift,
   10815                                               amount,
   10816                                               addrmode));
   10817                             }
   10818                           } else {
   10819                             UnallocatedT32(instr);
   10820                           }
   10821                           break;
   10822                         }
   10823                         case 0x00000900: {
   10824                           // 0xf8000900
   10825                           if (((instr & 0xf0000) == 0xf0000)) {
   10826                             UnallocatedT32(instr);
   10827                             return;
   10828                           }
   10829                           unsigned rt = (instr >> 12) & 0xf;
   10830                           unsigned rn = (instr >> 16) & 0xf;
   10831                           Sign sign((((instr >> 9) & 0x1) == 0) ? minus : plus);
   10832                           int32_t offset = instr & 0xff;
   10833                           // STRB{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_2> ; T3
   10834                           strb(CurrentCond(),
   10835                                Best,
   10836                                Register(rt),
   10837                                MemOperand(Register(rn),
   10838                                           sign,
   10839                                           offset,
   10840                                           PostIndex));
   10841                           break;
   10842                         }
   10843                         case 0x00000c00: {
   10844                           // 0xf8000c00
   10845                           switch (instr & 0x00000200) {
   10846                             case 0x00000000: {
   10847                               // 0xf8000c00
   10848                               if (((instr & 0xf0000) == 0xf0000)) {
   10849                                 UnallocatedT32(instr);
   10850                                 return;
   10851                               }
   10852                               unsigned rt = (instr >> 12) & 0xf;
   10853                               unsigned rn = (instr >> 16) & 0xf;
   10854                               int32_t offset = instr & 0xff;
   10855                               // STRB{<c>}{<q>} <Rt>, [<Rn>{, #-<imm_2>}] ; T3
   10856                               strb(CurrentCond(),
   10857                                    Best,
   10858                                    Register(rt),
   10859                                    MemOperand(Register(rn),
   10860                                               minus,
   10861                                               offset,
   10862                                               Offset));
   10863                               break;
   10864                             }
   10865                             case 0x00000200: {
   10866                               // 0xf8000e00
   10867                               if (((instr & 0xf0000) == 0xf0000)) {
   10868                                 UnallocatedT32(instr);
   10869                                 return;
   10870                               }
   10871                               UnimplementedT32_32("STRBT", instr);
   10872                               break;
   10873                             }
   10874                           }
   10875                           break;
   10876                         }
   10877                         case 0x00000d00: {
   10878                           // 0xf8000d00
   10879                           if (((instr & 0xf0000) == 0xf0000)) {
   10880                             UnallocatedT32(instr);
   10881                             return;
   10882                           }
   10883                           unsigned rt = (instr >> 12) & 0xf;
   10884                           unsigned rn = (instr >> 16) & 0xf;
   10885                           Sign sign((((instr >> 9) & 0x1) == 0) ? minus : plus);
   10886                           int32_t offset = instr & 0xff;
   10887                           // STRB{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_2>}]! ; T3
   10888                           strb(CurrentCond(),
   10889                                Best,
   10890                                Register(rt),
   10891                                MemOperand(Register(rn),
   10892                                           sign,
   10893                                           offset,
   10894                                           PreIndex));
   10895                           break;
   10896                         }
   10897                         case 0x00400000: {
   10898                           // 0xf8400000
   10899                           if ((instr & 0x000002c0) == 0x00000000) {
   10900                             if (((instr & 0xf0000) == 0xf0000)) {
   10901                               UnallocatedT32(instr);
   10902                               return;
   10903                             }
   10904                             unsigned rt = (instr >> 12) & 0xf;
   10905                             unsigned rn = (instr >> 16) & 0xf;
   10906                             Sign sign(plus);
   10907                             unsigned rm = instr & 0xf;
   10908                             Shift shift = LSL;
   10909                             uint32_t amount = (instr >> 4) & 0x3;
   10910                             AddrMode addrmode = Offset;
   10911                             if ((rt < kNumberOfT32LowRegisters) &&
   10912                                 (rn < kNumberOfT32LowRegisters) &&
   10913                                 (rm < kNumberOfT32LowRegisters) &&
   10914                                 shift.IsLSL() && (amount == 0) &&
   10915                                 sign.IsPlus()) {
   10916                               // STR{<c>}.W <Rt>, [<Rn>, #{+}<Rm>] ; T2
   10917                               str(CurrentCond(),
   10918                                   Wide,
   10919                                   Register(rt),
   10920                                   MemOperand(Register(rn),
   10921                                              sign,
   10922                                              Register(rm),
   10923                                              addrmode));
   10924                             } else {
   10925                               // STR{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>{, LSL #<imm>}] ; T2 NOLINT(whitespace/line_length)
   10926                               str(CurrentCond(),
   10927                                   Best,
   10928                                   Register(rt),
   10929                                   MemOperand(Register(rn),
   10930                                              sign,
   10931                                              Register(rm),
   10932                                              shift,
   10933                                              amount,
   10934                                              addrmode));
   10935                             }
   10936                           } else {
   10937                             UnallocatedT32(instr);
   10938                           }
   10939                           break;
   10940                         }
   10941                         case 0x00400900: {
   10942                           // 0xf8400900
   10943                           if (((instr & 0xf0000) == 0xf0000)) {
   10944                             UnallocatedT32(instr);
   10945                             return;
   10946                           }
   10947                           unsigned rt = (instr >> 12) & 0xf;
   10948                           unsigned rn = (instr >> 16) & 0xf;
   10949                           Sign sign((((instr >> 9) & 0x1) == 0) ? minus : plus);
   10950                           int32_t offset = instr & 0xff;
   10951                           // STR{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_2> ; T4
   10952                           str(CurrentCond(),
   10953                               Best,
   10954                               Register(rt),
   10955                               MemOperand(Register(rn),
   10956                                          sign,
   10957                                          offset,
   10958                                          PostIndex));
   10959                           break;
   10960                         }
   10961                         case 0x00400c00: {
   10962                           // 0xf8400c00
   10963                           switch (instr & 0x00000200) {
   10964                             case 0x00000000: {
   10965                               // 0xf8400c00
   10966                               if (((instr & 0xf0000) == 0xf0000)) {
   10967                                 UnallocatedT32(instr);
   10968                                 return;
   10969                               }
   10970                               unsigned rt = (instr >> 12) & 0xf;
   10971                               unsigned rn = (instr >> 16) & 0xf;
   10972                               int32_t offset = instr & 0xff;
   10973                               // STR{<c>}{<q>} <Rt>, [<Rn>{, #-<imm_2>}] ; T4
   10974                               str(CurrentCond(),
   10975                                   Best,
   10976                                   Register(rt),
   10977                                   MemOperand(Register(rn),
   10978                                              minus,
   10979                                              offset,
   10980                                              Offset));
   10981                               break;
   10982                             }
   10983                             case 0x00000200: {
   10984                               // 0xf8400e00
   10985                               if (((instr & 0xf0000) == 0xf0000)) {
   10986                                 UnallocatedT32(instr);
   10987                                 return;
   10988                               }
   10989                               UnimplementedT32_32("STRT", instr);
   10990                               break;
   10991                             }
   10992                           }
   10993                           break;
   10994                         }
   10995                         case 0x00400d00: {
   10996                           // 0xf8400d00
   10997                           if (((instr & 0xf0000) == 0xf0000)) {
   10998                             UnallocatedT32(instr);
   10999                             return;
   11000                           }
   11001                           if (((Uint32((instr >> 16)) & Uint32(0xf)) ==
   11002                                Uint32(0xd)) &&
   11003                               ((Uint32((instr >> 9)) & Uint32(0x1)) ==
   11004                                Uint32(0x0)) &&
   11005                               ((Uint32(instr) & Uint32(0xff)) == Uint32(0x4))) {
   11006                             unsigned rt = (instr >> 12) & 0xf;
   11007                             if ((rt <= 7) || (rt == kLRRegNum)) {
   11008                               // PUSH{<c>}.W <single_register_list> ; T4
   11009                               push(CurrentCond(), Wide, Register(rt));
   11010                             } else {
   11011                               // PUSH{<c>}{<q>} <single_register_list> ; T4
   11012                               push(CurrentCond(), Best, Register(rt));
   11013                             }
   11014                             return;
   11015                           }
   11016                           unsigned rt = (instr >> 12) & 0xf;
   11017                           unsigned rn = (instr >> 16) & 0xf;
   11018                           Sign sign((((instr >> 9) & 0x1) == 0) ? minus : plus);
   11019                           int32_t offset = instr & 0xff;
   11020                           // STR{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_2>}]! ; T4
   11021                           str(CurrentCond(),
   11022                               Best,
   11023                               Register(rt),
   11024                               MemOperand(Register(rn), sign, offset, PreIndex));
   11025                           break;
   11026                         }
   11027                         default:
   11028                           UnallocatedT32(instr);
   11029                           break;
   11030                       }
   11031                       break;
   11032                     }
   11033                     case 0x00200000: {
   11034                       // 0xf8200000
   11035                       switch (instr & 0x00400d00) {
   11036                         case 0x00000000: {
   11037                           // 0xf8200000
   11038                           if ((instr & 0x000002c0) == 0x00000000) {
   11039                             if (((instr & 0xf0000) == 0xf0000)) {
   11040                               UnallocatedT32(instr);
   11041                               return;
   11042                             }
   11043                             unsigned rt = (instr >> 12) & 0xf;
   11044                             unsigned rn = (instr >> 16) & 0xf;
   11045                             Sign sign(plus);
   11046                             unsigned rm = instr & 0xf;
   11047                             Shift shift = LSL;
   11048                             uint32_t amount = (instr >> 4) & 0x3;
   11049                             AddrMode addrmode = Offset;
   11050                             if ((rt < kNumberOfT32LowRegisters) &&
   11051                                 (rn < kNumberOfT32LowRegisters) &&
   11052                                 (rm < kNumberOfT32LowRegisters) &&
   11053                                 shift.IsLSL() && (amount == 0) &&
   11054                                 sign.IsPlus()) {
   11055                               // STRH{<c>}.W <Rt>, [<Rn>, #{+}<Rm>] ; T2
   11056                               strh(CurrentCond(),
   11057                                    Wide,
   11058                                    Register(rt),
   11059                                    MemOperand(Register(rn),
   11060                                               sign,
   11061                                               Register(rm),
   11062                                               addrmode));
   11063                             } else {
   11064                               // STRH{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>{, LSL #<imm>}] ; T2 NOLINT(whitespace/line_length)
   11065                               strh(CurrentCond(),
   11066                                    Best,
   11067                                    Register(rt),
   11068                                    MemOperand(Register(rn),
   11069                                               sign,
   11070                                               Register(rm),
   11071                                               shift,
   11072                                               amount,
   11073                                               addrmode));
   11074                             }
   11075                           } else {
   11076                             UnallocatedT32(instr);
   11077                           }
   11078                           break;
   11079                         }
   11080                         case 0x00000900: {
   11081                           // 0xf8200900
   11082                           if (((instr & 0xf0000) == 0xf0000)) {
   11083                             UnallocatedT32(instr);
   11084                             return;
   11085                           }
   11086                           unsigned rt = (instr >> 12) & 0xf;
   11087                           unsigned rn = (instr >> 16) & 0xf;
   11088                           Sign sign((((instr >> 9) & 0x1) == 0) ? minus : plus);
   11089                           int32_t offset = instr & 0xff;
   11090                           // STRH{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_2> ; T3
   11091                           strh(CurrentCond(),
   11092                                Best,
   11093                                Register(rt),
   11094                                MemOperand(Register(rn),
   11095                                           sign,
   11096                                           offset,
   11097                                           PostIndex));
   11098                           break;
   11099                         }
   11100                         case 0x00000c00: {
   11101                           // 0xf8200c00
   11102                           switch (instr & 0x00000200) {
   11103                             case 0x00000000: {
   11104                               // 0xf8200c00
   11105                               if (((instr & 0xf0000) == 0xf0000)) {
   11106                                 UnallocatedT32(instr);
   11107                                 return;
   11108                               }
   11109                               unsigned rt = (instr >> 12) & 0xf;
   11110                               unsigned rn = (instr >> 16) & 0xf;
   11111                               int32_t offset = instr & 0xff;
   11112                               // STRH{<c>}{<q>} <Rt>, [<Rn>{, #-<imm_2>}] ; T3
   11113                               strh(CurrentCond(),
   11114                                    Best,
   11115                                    Register(rt),
   11116                                    MemOperand(Register(rn),
   11117                                               minus,
   11118                                               offset,
   11119                                               Offset));
   11120                               break;
   11121                             }
   11122                             case 0x00000200: {
   11123                               // 0xf8200e00
   11124                               if (((instr & 0xf0000) == 0xf0000)) {
   11125                                 UnallocatedT32(instr);
   11126                                 return;
   11127                               }
   11128                               UnimplementedT32_32("STRHT", instr);
   11129                               break;
   11130                             }
   11131                           }
   11132                           break;
   11133                         }
   11134                         case 0x00000d00: {
   11135                           // 0xf8200d00
   11136                           if (((instr & 0xf0000) == 0xf0000)) {
   11137                             UnallocatedT32(instr);
   11138                             return;
   11139                           }
   11140                           unsigned rt = (instr >> 12) & 0xf;
   11141                           unsigned rn = (instr >> 16) & 0xf;
   11142                           Sign sign((((instr >> 9) & 0x1) == 0) ? minus : plus);
   11143                           int32_t offset = instr & 0xff;
   11144                           // STRH{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_2>}]! ; T3
   11145                           strh(CurrentCond(),
   11146                                Best,
   11147                                Register(rt),
   11148                                MemOperand(Register(rn),
   11149                                           sign,
   11150                                           offset,
   11151                                           PreIndex));
   11152                           break;
   11153                         }
   11154                         default:
   11155                           UnallocatedT32(instr);
   11156                           break;
   11157                       }
   11158                       break;
   11159                     }
   11160                     case 0x00800000: {
   11161                       // 0xf8800000
   11162                       switch (instr & 0x00400000) {
   11163                         case 0x00000000: {
   11164                           // 0xf8800000
   11165                           if (((instr & 0xf0000) == 0xf0000)) {
   11166                             UnallocatedT32(instr);
   11167                             return;
   11168                           }
   11169                           unsigned rt = (instr >> 12) & 0xf;
   11170                           unsigned rn = (instr >> 16) & 0xf;
   11171                           int32_t offset = instr & 0xfff;
   11172                           if ((rt < kNumberOfT32LowRegisters) &&
   11173                               (rn < kNumberOfT32LowRegisters) &&
   11174                               ((offset >= 0) && (offset <= 31))) {
   11175                             // STRB{<c>}.W <Rt>, [<Rn>{, #{+}<imm_1>}] ; T2
   11176                             strb(CurrentCond(),
   11177                                  Wide,
   11178                                  Register(rt),
   11179                                  MemOperand(Register(rn),
   11180                                             plus,
   11181                                             offset,
   11182                                             Offset));
   11183                           } else {
   11184                             // STRB{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm_1>}] ; T2
   11185                             strb(CurrentCond(),
   11186                                  Best,
   11187                                  Register(rt),
   11188                                  MemOperand(Register(rn),
   11189                                             plus,
   11190                                             offset,
   11191                                             Offset));
   11192                           }
   11193                           break;
   11194                         }
   11195                         case 0x00400000: {
   11196                           // 0xf8c00000
   11197                           if (((instr & 0xf0000) == 0xf0000)) {
   11198                             UnallocatedT32(instr);
   11199                             return;
   11200                           }
   11201                           unsigned rt = (instr >> 12) & 0xf;
   11202                           unsigned rn = (instr >> 16) & 0xf;
   11203                           int32_t offset = instr & 0xfff;
   11204                           if (((rt < kNumberOfT32LowRegisters) &&
   11205                                (rn < kNumberOfT32LowRegisters) &&
   11206                                ((offset >= 0) && (offset <= 124) &&
   11207                                 ((offset & 3) == 0))) ||
   11208                               ((rt < kNumberOfT32LowRegisters) &&
   11209                                (rn == sp.GetCode()) &&
   11210                                ((offset >= 0) && (offset <= 1020) &&
   11211                                 ((offset & 3) == 0)))) {
   11212                             // STR{<c>}.W <Rt>, [<Rn>{, #{+}<imm_1>}] ; T3
   11213                             str(CurrentCond(),
   11214                                 Wide,
   11215                                 Register(rt),
   11216                                 MemOperand(Register(rn), plus, offset, Offset));
   11217                           } else {
   11218                             // STR{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm_1>}] ; T3
   11219                             str(CurrentCond(),
   11220                                 Best,
   11221                                 Register(rt),
   11222                                 MemOperand(Register(rn), plus, offset, Offset));
   11223                           }
   11224                           break;
   11225                         }
   11226                       }
   11227                       break;
   11228                     }
   11229                     case 0x00a00000: {
   11230                       // 0xf8a00000
   11231                       if ((instr & 0x00400000) == 0x00000000) {
   11232                         if (((instr & 0xf0000) == 0xf0000)) {
   11233                           UnallocatedT32(instr);
   11234                           return;
   11235                         }
   11236                         unsigned rt = (instr >> 12) & 0xf;
   11237                         unsigned rn = (instr >> 16) & 0xf;
   11238                         int32_t offset = instr & 0xfff;
   11239                         if ((rt < kNumberOfT32LowRegisters) &&
   11240                             (rn < kNumberOfT32LowRegisters) &&
   11241                             ((offset >= 0) && (offset <= 62) &&
   11242                              ((offset & 1) == 0))) {
   11243                           // STRH{<c>}.W <Rt>, [<Rn>{, #{+}<imm_1>}] ; T2
   11244                           strh(CurrentCond(),
   11245                                Wide,
   11246                                Register(rt),
   11247                                MemOperand(Register(rn), plus, offset, Offset));
   11248                         } else {
   11249                           // STRH{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm_1>}] ; T2
   11250                           strh(CurrentCond(),
   11251                                Best,
   11252                                Register(rt),
   11253                                MemOperand(Register(rn), plus, offset, Offset));
   11254                         }
   11255                       } else {
   11256                         UnallocatedT32(instr);
   11257                       }
   11258                       break;
   11259                     }
   11260                     case 0x01000000: {
   11261                       // 0xf9000000
   11262                       switch (instr & 0x0000000d) {
   11263                         case 0x0000000d: {
   11264                           // 0xf900000d
   11265                           switch (instr & 0x00000002) {
   11266                             case 0x00000000: {
   11267                               // 0xf900000d
   11268                               switch (instr & 0x00000f00) {
   11269                                 case 0x00000000: {
   11270                                   // 0xf900000d
   11271                                   DataType dt =
   11272                                       Dt_size_7_Decode((instr >> 6) & 0x3);
   11273                                   if (dt.Is(kDataTypeValueInvalid)) {
   11274                                     UnallocatedT32(instr);
   11275                                     return;
   11276                                   }
   11277                                   Alignment align =
   11278                                       Align_align_4_Decode((instr >> 4) & 0x3);
   11279                                   if (dt.Is(kDataTypeValueInvalid) ||
   11280                                       align.Is(kBadAlignment)) {
   11281                                     UnallocatedT32(instr);
   11282                                     return;
   11283                                   }
   11284                                   unsigned first =
   11285                                       ExtractDRegister(instr, 22, 12);
   11286                                   unsigned length;
   11287                                   SpacingType spacing;
   11288                                   switch ((instr >> 8) & 0xf) {
   11289                                     default:
   11290                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
   11291                                     case 0x0:
   11292                                       length = 4;
   11293                                       spacing = kSingle;
   11294                                       break;
   11295                                     case 0x1:
   11296                                       length = 4;
   11297                                       spacing = kDouble;
   11298                                       break;
   11299                                   }
   11300                                   unsigned last =
   11301                                       first +
   11302                                       (length - 1) *
   11303                                           (spacing == kSingle ? 1 : 2);
   11304                                   TransferType transfer = kMultipleLanes;
   11305                                   unsigned rn = (instr >> 16) & 0xf;
   11306                                   // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
   11307                                   vst4(CurrentCond(),
   11308                                        dt,
   11309                                        NeonRegisterList(DRegister(first),
   11310                                                         DRegister(last),
   11311                                                         spacing,
   11312                                                         transfer),
   11313                                        AlignedMemOperand(Register(rn),
   11314                                                          align,
   11315                                                          PostIndex));
   11316                                   break;
   11317                                 }
   11318                                 case 0x00000100: {
   11319                                   // 0xf900010d
   11320                                   DataType dt =
   11321                                       Dt_size_7_Decode((instr >> 6) & 0x3);
   11322                                   if (dt.Is(kDataTypeValueInvalid)) {
   11323                                     UnallocatedT32(instr);
   11324                                     return;
   11325                                   }
   11326                                   Alignment align =
   11327                                       Align_align_4_Decode((instr >> 4) & 0x3);
   11328                                   if (dt.Is(kDataTypeValueInvalid) ||
   11329                                       align.Is(kBadAlignment)) {
   11330                                     UnallocatedT32(instr);
   11331                                     return;
   11332                                   }
   11333                                   unsigned first =
   11334                                       ExtractDRegister(instr, 22, 12);
   11335                                   unsigned length;
   11336                                   SpacingType spacing;
   11337                                   switch ((instr >> 8) & 0xf) {
   11338                                     default:
   11339                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
   11340                                     case 0x0:
   11341                                       length = 4;
   11342                                       spacing = kSingle;
   11343                                       break;
   11344                                     case 0x1:
   11345                                       length = 4;
   11346                                       spacing = kDouble;
   11347                                       break;
   11348                                   }
   11349                                   unsigned last =
   11350                                       first +
   11351                                       (length - 1) *
   11352                                           (spacing == kSingle ? 1 : 2);
   11353                                   TransferType transfer = kMultipleLanes;
   11354                                   unsigned rn = (instr >> 16) & 0xf;
   11355                                   // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
   11356                                   vst4(CurrentCond(),
   11357                                        dt,
   11358                                        NeonRegisterList(DRegister(first),
   11359                                                         DRegister(last),
   11360                                                         spacing,
   11361                                                         transfer),
   11362                                        AlignedMemOperand(Register(rn),
   11363                                                          align,
   11364                                                          PostIndex));
   11365                                   break;
   11366                                 }
   11367                                 case 0x00000200: {
   11368                                   // 0xf900020d
   11369                                   if (((instr & 0xe20) == 0x620) ||
   11370                                       ((instr & 0xf30) == 0xa30)) {
   11371                                     UnallocatedT32(instr);
   11372                                     return;
   11373                                   }
   11374                                   DataType dt =
   11375                                       Dt_size_6_Decode((instr >> 6) & 0x3);
   11376                                   if (dt.Is(kDataTypeValueInvalid)) {
   11377                                     UnallocatedT32(instr);
   11378                                     return;
   11379                                   }
   11380                                   Alignment align =
   11381                                       Align_align_5_Decode((instr >> 4) & 0x3);
   11382                                   if (dt.Is(kDataTypeValueInvalid) ||
   11383                                       align.Is(kBadAlignment)) {
   11384                                     UnallocatedT32(instr);
   11385                                     return;
   11386                                   }
   11387                                   unsigned first =
   11388                                       ExtractDRegister(instr, 22, 12);
   11389                                   unsigned length;
   11390                                   SpacingType spacing = kSingle;
   11391                                   switch ((instr >> 8) & 0xf) {
   11392                                     default:
   11393                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
   11394                                     case 0x7:
   11395                                       length = 1;
   11396                                       break;
   11397                                     case 0xa:
   11398                                       length = 2;
   11399                                       break;
   11400                                     case 0x6:
   11401                                       length = 3;
   11402                                       break;
   11403                                     case 0x2:
   11404                                       length = 4;
   11405                                       break;
   11406                                   }
   11407                                   unsigned last = first + length - 1;
   11408                                   TransferType transfer = kMultipleLanes;
   11409                                   unsigned rn = (instr >> 16) & 0xf;
   11410                                   // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
   11411                                   vst1(CurrentCond(),
   11412                                        dt,
   11413                                        NeonRegisterList(DRegister(first),
   11414                                                         DRegister(last),
   11415                                                         spacing,
   11416                                                         transfer),
   11417                                        AlignedMemOperand(Register(rn),
   11418                                                          align,
   11419                                                          PostIndex));
   11420                                   break;
   11421                                 }
   11422                                 case 0x00000300: {
   11423                                   // 0xf900030d
   11424                                   if (((instr & 0xe30) == 0x830)) {
   11425                                     UnallocatedT32(instr);
   11426                                     return;
   11427                                   }
   11428                                   DataType dt =
   11429                                       Dt_size_7_Decode((instr >> 6) & 0x3);
   11430                                   if (dt.Is(kDataTypeValueInvalid)) {
   11431                                     UnallocatedT32(instr);
   11432                                     return;
   11433                                   }
   11434                                   Alignment align =
   11435                                       Align_align_2_Decode((instr >> 4) & 0x3);
   11436                                   if (dt.Is(kDataTypeValueInvalid) ||
   11437                                       align.Is(kBadAlignment)) {
   11438                                     UnallocatedT32(instr);
   11439                                     return;
   11440                                   }
   11441                                   unsigned first =
   11442                                       ExtractDRegister(instr, 22, 12);
   11443                                   unsigned length;
   11444                                   SpacingType spacing;
   11445                                   switch ((instr >> 8) & 0xf) {
   11446                                     default:
   11447                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
   11448                                     case 0x8:
   11449                                       length = 2;
   11450                                       spacing = kSingle;
   11451                                       break;
   11452                                     case 0x9:
   11453                                       length = 2;
   11454                                       spacing = kDouble;
   11455                                       break;
   11456                                     case 0x3:
   11457                                       length = 4;
   11458                                       spacing = kSingle;
   11459                                       break;
   11460                                   }
   11461                                   unsigned last =
   11462                                       first +
   11463                                       (length - 1) *
   11464                                           (spacing == kSingle ? 1 : 2);
   11465                                   TransferType transfer = kMultipleLanes;
   11466                                   unsigned rn = (instr >> 16) & 0xf;
   11467                                   // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
   11468                                   vst2(CurrentCond(),
   11469                                        dt,
   11470                                        NeonRegisterList(DRegister(first),
   11471                                                         DRegister(last),
   11472                                                         spacing,
   11473                                                         transfer),
   11474                                        AlignedMemOperand(Register(rn),
   11475                                                          align,
   11476                                                          PostIndex));
   11477                                   break;
   11478                                 }
   11479                                 case 0x00000400: {
   11480                                   // 0xf900040d
   11481                                   if (((instr & 0x20) == 0x20)) {
   11482                                     UnallocatedT32(instr);
   11483                                     return;
   11484                                   }
   11485                                   DataType dt =
   11486                                       Dt_size_7_Decode((instr >> 6) & 0x3);
   11487                                   if (dt.Is(kDataTypeValueInvalid)) {
   11488                                     UnallocatedT32(instr);
   11489                                     return;
   11490                                   }
   11491                                   Alignment align =
   11492                                       Align_align_3_Decode((instr >> 4) & 0x3);
   11493                                   if (dt.Is(kDataTypeValueInvalid) ||
   11494                                       align.Is(kBadAlignment)) {
   11495                                     UnallocatedT32(instr);
   11496                                     return;
   11497                                   }
   11498                                   unsigned first =
   11499                                       ExtractDRegister(instr, 22, 12);
   11500                                   unsigned length;
   11501                                   SpacingType spacing;
   11502                                   switch ((instr >> 8) & 0xf) {
   11503                                     default:
   11504                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
   11505                                     case 0x4:
   11506                                       length = 3;
   11507                                       spacing = kSingle;
   11508                                       break;
   11509                                     case 0x5:
   11510                                       length = 3;
   11511                                       spacing = kDouble;
   11512                                       break;
   11513                                   }
   11514                                   unsigned last =
   11515                                       first +
   11516                                       (length - 1) *
   11517                                           (spacing == kSingle ? 1 : 2);
   11518                                   TransferType transfer = kMultipleLanes;
   11519                                   unsigned rn = (instr >> 16) & 0xf;
   11520                                   // VST3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
   11521                                   vst3(CurrentCond(),
   11522                                        dt,
   11523                                        NeonRegisterList(DRegister(first),
   11524                                                         DRegister(last),
   11525                                                         spacing,
   11526                                                         transfer),
   11527                                        AlignedMemOperand(Register(rn),
   11528                                                          align,
   11529                                                          PostIndex));
   11530                                   break;
   11531                                 }
   11532                                 case 0x00000500: {
   11533                                   // 0xf900050d
   11534                                   if (((instr & 0x20) == 0x20)) {
   11535                                     UnallocatedT32(instr);
   11536                                     return;
   11537                                   }
   11538                                   DataType dt =
   11539                                       Dt_size_7_Decode((instr >> 6) & 0x3);
   11540                                   if (dt.Is(kDataTypeValueInvalid)) {
   11541                                     UnallocatedT32(instr);
   11542                                     return;
   11543                                   }
   11544                                   Alignment align =
   11545                                       Align_align_3_Decode((instr >> 4) & 0x3);
   11546                                   if (dt.Is(kDataTypeValueInvalid) ||
   11547                                       align.Is(kBadAlignment)) {
   11548                                     UnallocatedT32(instr);
   11549                                     return;
   11550                                   }
   11551                                   unsigned first =
   11552                                       ExtractDRegister(instr, 22, 12);
   11553                                   unsigned length;
   11554                                   SpacingType spacing;
   11555                                   switch ((instr >> 8) & 0xf) {
   11556                                     default:
   11557                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
   11558                                     case 0x4:
   11559                                       length = 3;
   11560                                       spacing = kSingle;
   11561                                       break;
   11562                                     case 0x5:
   11563                                       length = 3;
   11564                                       spacing = kDouble;
   11565                                       break;
   11566                                   }
   11567                                   unsigned last =
   11568                                       first +
   11569                                       (length - 1) *
   11570                                           (spacing == kSingle ? 1 : 2);
   11571                                   TransferType transfer = kMultipleLanes;
   11572                                   unsigned rn = (instr >> 16) & 0xf;
   11573                                   // VST3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
   11574                                   vst3(CurrentCond(),
   11575                                        dt,
   11576                                        NeonRegisterList(DRegister(first),
   11577                                                         DRegister(last),
   11578                                                         spacing,
   11579                                                         transfer),
   11580                                        AlignedMemOperand(Register(rn),
   11581                                                          align,
   11582                                                          PostIndex));
   11583                                   break;
   11584                                 }
   11585                                 case 0x00000600: {
   11586                                   // 0xf900060d
   11587                                   if (((instr & 0xe20) == 0x620) ||
   11588                                       ((instr & 0xf30) == 0xa30)) {
   11589                                     UnallocatedT32(instr);
   11590                                     return;
   11591                                   }
   11592                                   DataType dt =
   11593                                       Dt_size_6_Decode((instr >> 6) & 0x3);
   11594                                   if (dt.Is(kDataTypeValueInvalid)) {
   11595                                     UnallocatedT32(instr);
   11596                                     return;
   11597                                   }
   11598                                   Alignment align =
   11599                                       Align_align_5_Decode((instr >> 4) & 0x3);
   11600                                   if (dt.Is(kDataTypeValueInvalid) ||
   11601                                       align.Is(kBadAlignment)) {
   11602                                     UnallocatedT32(instr);
   11603                                     return;
   11604                                   }
   11605                                   unsigned first =
   11606                                       ExtractDRegister(instr, 22, 12);
   11607                                   unsigned length;
   11608                                   SpacingType spacing = kSingle;
   11609                                   switch ((instr >> 8) & 0xf) {
   11610                                     default:
   11611                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
   11612                                     case 0x7:
   11613                                       length = 1;
   11614                                       break;
   11615                                     case 0xa:
   11616                                       length = 2;
   11617                                       break;
   11618                                     case 0x6:
   11619                                       length = 3;
   11620                                       break;
   11621                                     case 0x2:
   11622                                       length = 4;
   11623                                       break;
   11624                                   }
   11625                                   unsigned last = first + length - 1;
   11626                                   TransferType transfer = kMultipleLanes;
   11627                                   unsigned rn = (instr >> 16) & 0xf;
   11628                                   // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
   11629                                   vst1(CurrentCond(),
   11630                                        dt,
   11631                                        NeonRegisterList(DRegister(first),
   11632                                                         DRegister(last),
   11633                                                         spacing,
   11634                                                         transfer),
   11635                                        AlignedMemOperand(Register(rn),
   11636                                                          align,
   11637                                                          PostIndex));
   11638                                   break;
   11639                                 }
   11640                                 case 0x00000700: {
   11641                                   // 0xf900070d
   11642                                   if (((instr & 0xe20) == 0x620) ||
   11643                                       ((instr & 0xf30) == 0xa30)) {
   11644                                     UnallocatedT32(instr);
   11645                                     return;
   11646                                   }
   11647                                   DataType dt =
   11648                                       Dt_size_6_Decode((instr >> 6) & 0x3);
   11649                                   if (dt.Is(kDataTypeValueInvalid)) {
   11650                                     UnallocatedT32(instr);
   11651                                     return;
   11652                                   }
   11653                                   Alignment align =
   11654                                       Align_align_5_Decode((instr >> 4) & 0x3);
   11655                                   if (dt.Is(kDataTypeValueInvalid) ||
   11656                                       align.Is(kBadAlignment)) {
   11657                                     UnallocatedT32(instr);
   11658                                     return;
   11659                                   }
   11660                                   unsigned first =
   11661                                       ExtractDRegister(instr, 22, 12);
   11662                                   unsigned length;
   11663                                   SpacingType spacing = kSingle;
   11664                                   switch ((instr >> 8) & 0xf) {
   11665                                     default:
   11666                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
   11667                                     case 0x7:
   11668                                       length = 1;
   11669                                       break;
   11670                                     case 0xa:
   11671                                       length = 2;
   11672                                       break;
   11673                                     case 0x6:
   11674                                       length = 3;
   11675                                       break;
   11676                                     case 0x2:
   11677                                       length = 4;
   11678                                       break;
   11679                                   }
   11680                                   unsigned last = first + length - 1;
   11681                                   TransferType transfer = kMultipleLanes;
   11682                                   unsigned rn = (instr >> 16) & 0xf;
   11683                                   // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
   11684                                   vst1(CurrentCond(),
   11685                                        dt,
   11686                                        NeonRegisterList(DRegister(first),
   11687                                                         DRegister(last),
   11688                                                         spacing,
   11689                                                         transfer),
   11690                                        AlignedMemOperand(Register(rn),
   11691                                                          align,
   11692                                                          PostIndex));
   11693                                   break;
   11694                                 }
   11695                                 case 0x00000800: {
   11696                                   // 0xf900080d
   11697                                   if (((instr & 0xe30) == 0x830)) {
   11698                                     UnallocatedT32(instr);
   11699                                     return;
   11700                                   }
   11701                                   DataType dt =
   11702                                       Dt_size_7_Decode((instr >> 6) & 0x3);
   11703                                   if (dt.Is(kDataTypeValueInvalid)) {
   11704                                     UnallocatedT32(instr);
   11705                                     return;
   11706                                   }
   11707                                   Alignment align =
   11708                                       Align_align_2_Decode((instr >> 4) & 0x3);
   11709                                   if (dt.Is(kDataTypeValueInvalid) ||
   11710                                       align.Is(kBadAlignment)) {
   11711                                     UnallocatedT32(instr);
   11712                                     return;
   11713                                   }
   11714                                   unsigned first =
   11715                                       ExtractDRegister(instr, 22, 12);
   11716                                   unsigned length;
   11717                                   SpacingType spacing;
   11718                                   switch ((instr >> 8) & 0xf) {
   11719                                     default:
   11720                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
   11721                                     case 0x8:
   11722                                       length = 2;
   11723                                       spacing = kSingle;
   11724                                       break;
   11725                                     case 0x9:
   11726                                       length = 2;
   11727                                       spacing = kDouble;
   11728                                       break;
   11729                                     case 0x3:
   11730                                       length = 4;
   11731                                       spacing = kSingle;
   11732                                       break;
   11733                                   }
   11734                                   unsigned last =
   11735                                       first +
   11736                                       (length - 1) *
   11737                                           (spacing == kSingle ? 1 : 2);
   11738                                   TransferType transfer = kMultipleLanes;
   11739                                   unsigned rn = (instr >> 16) & 0xf;
   11740                                   // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
   11741                                   vst2(CurrentCond(),
   11742                                        dt,
   11743                                        NeonRegisterList(DRegister(first),
   11744                                                         DRegister(last),
   11745                                                         spacing,
   11746                                                         transfer),
   11747                                        AlignedMemOperand(Register(rn),
   11748                                                          align,
   11749                                                          PostIndex));
   11750                                   break;
   11751                                 }
   11752                                 case 0x00000900: {
   11753                                   // 0xf900090d
   11754                                   if (((instr & 0xe30) == 0x830)) {
   11755                                     UnallocatedT32(instr);
   11756                                     return;
   11757                                   }
   11758                                   DataType dt =
   11759                                       Dt_size_7_Decode((instr >> 6) & 0x3);
   11760                                   if (dt.Is(kDataTypeValueInvalid)) {
   11761                                     UnallocatedT32(instr);
   11762                                     return;
   11763                                   }
   11764                                   Alignment align =
   11765                                       Align_align_2_Decode((instr >> 4) & 0x3);
   11766                                   if (dt.Is(kDataTypeValueInvalid) ||
   11767                                       align.Is(kBadAlignment)) {
   11768                                     UnallocatedT32(instr);
   11769                                     return;
   11770                                   }
   11771                                   unsigned first =
   11772                                       ExtractDRegister(instr, 22, 12);
   11773                                   unsigned length;
   11774                                   SpacingType spacing;
   11775                                   switch ((instr >> 8) & 0xf) {
   11776                                     default:
   11777                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
   11778                                     case 0x8:
   11779                                       length = 2;
   11780                                       spacing = kSingle;
   11781                                       break;
   11782                                     case 0x9:
   11783                                       length = 2;
   11784                                       spacing = kDouble;
   11785                                       break;
   11786                                     case 0x3:
   11787                                       length = 4;
   11788                                       spacing = kSingle;
   11789                                       break;
   11790                                   }
   11791                                   unsigned last =
   11792                                       first +
   11793                                       (length - 1) *
   11794                                           (spacing == kSingle ? 1 : 2);
   11795                                   TransferType transfer = kMultipleLanes;
   11796                                   unsigned rn = (instr >> 16) & 0xf;
   11797                                   // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
   11798                                   vst2(CurrentCond(),
   11799                                        dt,
   11800                                        NeonRegisterList(DRegister(first),
   11801                                                         DRegister(last),
   11802                                                         spacing,
   11803                                                         transfer),
   11804                                        AlignedMemOperand(Register(rn),
   11805                                                          align,
   11806                                                          PostIndex));
   11807                                   break;
   11808                                 }
   11809                                 case 0x00000a00: {
   11810                                   // 0xf9000a0d
   11811                                   if (((instr & 0xe20) == 0x620) ||
   11812                                       ((instr & 0xf30) == 0xa30)) {
   11813                                     UnallocatedT32(instr);
   11814                                     return;
   11815                                   }
   11816                                   DataType dt =
   11817                                       Dt_size_6_Decode((instr >> 6) & 0x3);
   11818                                   if (dt.Is(kDataTypeValueInvalid)) {
   11819                                     UnallocatedT32(instr);
   11820                                     return;
   11821                                   }
   11822                                   Alignment align =
   11823                                       Align_align_5_Decode((instr >> 4) & 0x3);
   11824                                   if (dt.Is(kDataTypeValueInvalid) ||
   11825                                       align.Is(kBadAlignment)) {
   11826                                     UnallocatedT32(instr);
   11827                                     return;
   11828                                   }
   11829                                   unsigned first =
   11830                                       ExtractDRegister(instr, 22, 12);
   11831                                   unsigned length;
   11832                                   SpacingType spacing = kSingle;
   11833                                   switch ((instr >> 8) & 0xf) {
   11834                                     default:
   11835                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
   11836                                     case 0x7:
   11837                                       length = 1;
   11838                                       break;
   11839                                     case 0xa:
   11840                                       length = 2;
   11841                                       break;
   11842                                     case 0x6:
   11843                                       length = 3;
   11844                                       break;
   11845                                     case 0x2:
   11846                                       length = 4;
   11847                                       break;
   11848                                   }
   11849                                   unsigned last = first + length - 1;
   11850                                   TransferType transfer = kMultipleLanes;
   11851                                   unsigned rn = (instr >> 16) & 0xf;
   11852                                   // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
   11853                                   vst1(CurrentCond(),
   11854                                        dt,
   11855                                        NeonRegisterList(DRegister(first),
   11856                                                         DRegister(last),
   11857                                                         spacing,
   11858                                                         transfer),
   11859                                        AlignedMemOperand(Register(rn),
   11860                                                          align,
   11861                                                          PostIndex));
   11862                                   break;
   11863                                 }
   11864                                 default:
   11865                                   UnallocatedT32(instr);
   11866                                   break;
   11867                               }
   11868                               break;
   11869                             }
   11870                             case 0x00000002: {
   11871                               // 0xf900000f
   11872                               switch (instr & 0x00000f00) {
   11873                                 case 0x00000000: {
   11874                                   // 0xf900000d
   11875                                   DataType dt =
   11876                                       Dt_size_7_Decode((instr >> 6) & 0x3);
   11877                                   if (dt.Is(kDataTypeValueInvalid)) {
   11878                                     UnallocatedT32(instr);
   11879                                     return;
   11880                                   }
   11881                                   Alignment align =
   11882                                       Align_align_4_Decode((instr >> 4) & 0x3);
   11883                                   if (dt.Is(kDataTypeValueInvalid) ||
   11884                                       align.Is(kBadAlignment)) {
   11885                                     UnallocatedT32(instr);
   11886                                     return;
   11887                                   }
   11888                                   unsigned first =
   11889                                       ExtractDRegister(instr, 22, 12);
   11890                                   unsigned length;
   11891                                   SpacingType spacing;
   11892                                   switch ((instr >> 8) & 0xf) {
   11893                                     default:
   11894                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
   11895                                     case 0x0:
   11896                                       length = 4;
   11897                                       spacing = kSingle;
   11898                                       break;
   11899                                     case 0x1:
   11900                                       length = 4;
   11901                                       spacing = kDouble;
   11902                                       break;
   11903                                   }
   11904                                   unsigned last =
   11905                                       first +
   11906                                       (length - 1) *
   11907                                           (spacing == kSingle ? 1 : 2);
   11908                                   TransferType transfer = kMultipleLanes;
   11909                                   unsigned rn = (instr >> 16) & 0xf;
   11910                                   // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
   11911                                   vst4(CurrentCond(),
   11912                                        dt,
   11913                                        NeonRegisterList(DRegister(first),
   11914                                                         DRegister(last),
   11915                                                         spacing,
   11916                                                         transfer),
   11917                                        AlignedMemOperand(Register(rn),
   11918                                                          align,
   11919                                                          Offset));
   11920                                   break;
   11921                                 }
   11922                                 case 0x00000100: {
   11923                                   // 0xf900010d
   11924                                   DataType dt =
   11925                                       Dt_size_7_Decode((instr >> 6) & 0x3);
   11926                                   if (dt.Is(kDataTypeValueInvalid)) {
   11927                                     UnallocatedT32(instr);
   11928                                     return;
   11929                                   }
   11930                                   Alignment align =
   11931                                       Align_align_4_Decode((instr >> 4) & 0x3);
   11932                                   if (dt.Is(kDataTypeValueInvalid) ||
   11933                                       align.Is(kBadAlignment)) {
   11934                                     UnallocatedT32(instr);
   11935                                     return;
   11936                                   }
   11937                                   unsigned first =
   11938                                       ExtractDRegister(instr, 22, 12);
   11939                                   unsigned length;
   11940                                   SpacingType spacing;
   11941                                   switch ((instr >> 8) & 0xf) {
   11942                                     default:
   11943                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
   11944                                     case 0x0:
   11945                                       length = 4;
   11946                                       spacing = kSingle;
   11947                                       break;
   11948                                     case 0x1:
   11949                                       length = 4;
   11950                                       spacing = kDouble;
   11951                                       break;
   11952                                   }
   11953                                   unsigned last =
   11954                                       first +
   11955                                       (length - 1) *
   11956                                           (spacing == kSingle ? 1 : 2);
   11957                                   TransferType transfer = kMultipleLanes;
   11958                                   unsigned rn = (instr >> 16) & 0xf;
   11959                                   // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
   11960                                   vst4(CurrentCond(),
   11961                                        dt,
   11962                                        NeonRegisterList(DRegister(first),
   11963                                                         DRegister(last),
   11964                                                         spacing,
   11965                                                         transfer),
   11966                                        AlignedMemOperand(Register(rn),
   11967                                                          align,
   11968                                                          Offset));
   11969                                   break;
   11970                                 }
   11971                                 case 0x00000200: {
   11972                                   // 0xf900020d
   11973                                   if (((instr & 0xe20) == 0x620) ||
   11974                                       ((instr & 0xf30) == 0xa30)) {
   11975                                     UnallocatedT32(instr);
   11976                                     return;
   11977                                   }
   11978                                   DataType dt =
   11979                                       Dt_size_6_Decode((instr >> 6) & 0x3);
   11980                                   if (dt.Is(kDataTypeValueInvalid)) {
   11981                                     UnallocatedT32(instr);
   11982                                     return;
   11983                                   }
   11984                                   Alignment align =
   11985                                       Align_align_5_Decode((instr >> 4) & 0x3);
   11986                                   if (dt.Is(kDataTypeValueInvalid) ||
   11987                                       align.Is(kBadAlignment)) {
   11988                                     UnallocatedT32(instr);
   11989                                     return;
   11990                                   }
   11991                                   unsigned first =
   11992                                       ExtractDRegister(instr, 22, 12);
   11993                                   unsigned length;
   11994                                   SpacingType spacing = kSingle;
   11995                                   switch ((instr >> 8) & 0xf) {
   11996                                     default:
   11997                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
   11998                                     case 0x7:
   11999                                       length = 1;
   12000                                       break;
   12001                                     case 0xa:
   12002                                       length = 2;
   12003                                       break;
   12004                                     case 0x6:
   12005                                       length = 3;
   12006                                       break;
   12007                                     case 0x2:
   12008                                       length = 4;
   12009                                       break;
   12010                                   }
   12011                                   unsigned last = first + length - 1;
   12012                                   TransferType transfer = kMultipleLanes;
   12013                                   unsigned rn = (instr >> 16) & 0xf;
   12014                                   // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
   12015                                   vst1(CurrentCond(),
   12016                                        dt,
   12017                                        NeonRegisterList(DRegister(first),
   12018                                                         DRegister(last),
   12019                                                         spacing,
   12020                                                         transfer),
   12021                                        AlignedMemOperand(Register(rn),
   12022                                                          align,
   12023                                                          Offset));
   12024                                   break;
   12025                                 }
   12026                                 case 0x00000300: {
   12027                                   // 0xf900030d
   12028                                   if (((instr & 0xe30) == 0x830)) {
   12029                                     UnallocatedT32(instr);
   12030                                     return;
   12031                                   }
   12032                                   DataType dt =
   12033                                       Dt_size_7_Decode((instr >> 6) & 0x3);
   12034                                   if (dt.Is(kDataTypeValueInvalid)) {
   12035                                     UnallocatedT32(instr);
   12036                                     return;
   12037                                   }
   12038                                   Alignment align =
   12039                                       Align_align_2_Decode((instr >> 4) & 0x3);
   12040                                   if (dt.Is(kDataTypeValueInvalid) ||
   12041                                       align.Is(kBadAlignment)) {
   12042                                     UnallocatedT32(instr);
   12043                                     return;
   12044                                   }
   12045                                   unsigned first =
   12046                                       ExtractDRegister(instr, 22, 12);
   12047                                   unsigned length;
   12048                                   SpacingType spacing;
   12049                                   switch ((instr >> 8) & 0xf) {
   12050                                     default:
   12051                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
   12052                                     case 0x8:
   12053                                       length = 2;
   12054                                       spacing = kSingle;
   12055                                       break;
   12056                                     case 0x9:
   12057                                       length = 2;
   12058                                       spacing = kDouble;
   12059                                       break;
   12060                                     case 0x3:
   12061                                       length = 4;
   12062                                       spacing = kSingle;
   12063                                       break;
   12064                                   }
   12065                                   unsigned last =
   12066                                       first +
   12067                                       (length - 1) *
   12068                                           (spacing == kSingle ? 1 : 2);
   12069                                   TransferType transfer = kMultipleLanes;
   12070                                   unsigned rn = (instr >> 16) & 0xf;
   12071                                   // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
   12072                                   vst2(CurrentCond(),
   12073                                        dt,
   12074                                        NeonRegisterList(DRegister(first),
   12075                                                         DRegister(last),
   12076                                                         spacing,
   12077                                                         transfer),
   12078                                        AlignedMemOperand(Register(rn),
   12079                                                          align,
   12080                                                          Offset));
   12081                                   break;
   12082                                 }
   12083                                 case 0x00000400: {
   12084                                   // 0xf900040d
   12085                                   if (((instr & 0x20) == 0x20)) {
   12086                                     UnallocatedT32(instr);
   12087                                     return;
   12088                                   }
   12089                                   DataType dt =
   12090                                       Dt_size_7_Decode((instr >> 6) & 0x3);
   12091                                   if (dt.Is(kDataTypeValueInvalid)) {
   12092                                     UnallocatedT32(instr);
   12093                                     return;
   12094                                   }
   12095                                   Alignment align =
   12096                                       Align_align_3_Decode((instr >> 4) & 0x3);
   12097                                   if (dt.Is(kDataTypeValueInvalid) ||
   12098                                       align.Is(kBadAlignment)) {
   12099                                     UnallocatedT32(instr);
   12100                                     return;
   12101                                   }
   12102                                   unsigned first =
   12103                                       ExtractDRegister(instr, 22, 12);
   12104                                   unsigned length;
   12105                                   SpacingType spacing;
   12106                                   switch ((instr >> 8) & 0xf) {
   12107                                     default:
   12108                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
   12109                                     case 0x4:
   12110                                       length = 3;
   12111                                       spacing = kSingle;
   12112                                       break;
   12113                                     case 0x5:
   12114                                       length = 3;
   12115                                       spacing = kDouble;
   12116                                       break;
   12117                                   }
   12118                                   unsigned last =
   12119                                       first +
   12120                                       (length - 1) *
   12121                                           (spacing == kSingle ? 1 : 2);
   12122                                   TransferType transfer = kMultipleLanes;
   12123                                   unsigned rn = (instr >> 16) & 0xf;
   12124                                   // VST3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
   12125                                   vst3(CurrentCond(),
   12126                                        dt,
   12127                                        NeonRegisterList(DRegister(first),
   12128                                                         DRegister(last),
   12129                                                         spacing,
   12130                                                         transfer),
   12131                                        AlignedMemOperand(Register(rn),
   12132                                                          align,
   12133                                                          Offset));
   12134                                   break;
   12135                                 }
   12136                                 case 0x00000500: {
   12137                                   // 0xf900050d
   12138                                   if (((instr & 0x20) == 0x20)) {
   12139                                     UnallocatedT32(instr);
   12140                                     return;
   12141                                   }
   12142                                   DataType dt =
   12143                                       Dt_size_7_Decode((instr >> 6) & 0x3);
   12144                                   if (dt.Is(kDataTypeValueInvalid)) {
   12145                                     UnallocatedT32(instr);
   12146                                     return;
   12147                                   }
   12148                                   Alignment align =
   12149                                       Align_align_3_Decode((instr >> 4) & 0x3);
   12150                                   if (dt.Is(kDataTypeValueInvalid) ||
   12151                                       align.Is(kBadAlignment)) {
   12152                                     UnallocatedT32(instr);
   12153                                     return;
   12154                                   }
   12155                                   unsigned first =
   12156                                       ExtractDRegister(instr, 22, 12);
   12157                                   unsigned length;
   12158                                   SpacingType spacing;
   12159                                   switch ((instr >> 8) & 0xf) {
   12160                                     default:
   12161                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
   12162                                     case 0x4:
   12163                                       length = 3;
   12164                                       spacing = kSingle;
   12165                                       break;
   12166                                     case 0x5:
   12167                                       length = 3;
   12168                                       spacing = kDouble;
   12169                                       break;
   12170                                   }
   12171                                   unsigned last =
   12172                                       first +
   12173                                       (length - 1) *
   12174                                           (spacing == kSingle ? 1 : 2);
   12175                                   TransferType transfer = kMultipleLanes;
   12176                                   unsigned rn = (instr >> 16) & 0xf;
   12177                                   // VST3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
   12178                                   vst3(CurrentCond(),
   12179                                        dt,
   12180                                        NeonRegisterList(DRegister(first),
   12181                                                         DRegister(last),
   12182                                                         spacing,
   12183                                                         transfer),
   12184                                        AlignedMemOperand(Register(rn),
   12185                                                          align,
   12186                                                          Offset));
   12187                                   break;
   12188                                 }
   12189                                 case 0x00000600: {
   12190                                   // 0xf900060d
   12191                                   if (((instr & 0xe20) == 0x620) ||
   12192                                       ((instr & 0xf30) == 0xa30)) {
   12193                                     UnallocatedT32(instr);
   12194                                     return;
   12195                                   }
   12196                                   DataType dt =
   12197                                       Dt_size_6_Decode((instr >> 6) & 0x3);
   12198                                   if (dt.Is(kDataTypeValueInvalid)) {
   12199                                     UnallocatedT32(instr);
   12200                                     return;
   12201                                   }
   12202                                   Alignment align =
   12203                                       Align_align_5_Decode((instr >> 4) & 0x3);
   12204                                   if (dt.Is(kDataTypeValueInvalid) ||
   12205                                       align.Is(kBadAlignment)) {
   12206                                     UnallocatedT32(instr);
   12207                                     return;
   12208                                   }
   12209                                   unsigned first =
   12210                                       ExtractDRegister(instr, 22, 12);
   12211                                   unsigned length;
   12212                                   SpacingType spacing = kSingle;
   12213                                   switch ((instr >> 8) & 0xf) {
   12214                                     default:
   12215                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
   12216                                     case 0x7:
   12217                                       length = 1;
   12218                                       break;
   12219                                     case 0xa:
   12220                                       length = 2;
   12221                                       break;
   12222                                     case 0x6:
   12223                                       length = 3;
   12224                                       break;
   12225                                     case 0x2:
   12226                                       length = 4;
   12227                                       break;
   12228                                   }
   12229                                   unsigned last = first + length - 1;
   12230                                   TransferType transfer = kMultipleLanes;
   12231                                   unsigned rn = (instr >> 16) & 0xf;
   12232                                   // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
   12233                                   vst1(CurrentCond(),
   12234                                        dt,
   12235                                        NeonRegisterList(DRegister(first),
   12236                                                         DRegister(last),
   12237                                                         spacing,
   12238                                                         transfer),
   12239                                        AlignedMemOperand(Register(rn),
   12240                                                          align,
   12241                                                          Offset));
   12242                                   break;
   12243                                 }
   12244                                 case 0x00000700: {
   12245                                   // 0xf900070d
   12246                                   if (((instr & 0xe20) == 0x620) ||
   12247                                       ((instr & 0xf30) == 0xa30)) {
   12248                                     UnallocatedT32(instr);
   12249                                     return;
   12250                                   }
   12251                                   DataType dt =
   12252                                       Dt_size_6_Decode((instr >> 6) & 0x3);
   12253                                   if (dt.Is(kDataTypeValueInvalid)) {
   12254                                     UnallocatedT32(instr);
   12255                                     return;
   12256                                   }
   12257                                   Alignment align =
   12258                                       Align_align_5_Decode((instr >> 4) & 0x3);
   12259                                   if (dt.Is(kDataTypeValueInvalid) ||
   12260                                       align.Is(kBadAlignment)) {
   12261                                     UnallocatedT32(instr);
   12262                                     return;
   12263                                   }
   12264                                   unsigned first =
   12265                                       ExtractDRegister(instr, 22, 12);
   12266                                   unsigned length;
   12267                                   SpacingType spacing = kSingle;
   12268                                   switch ((instr >> 8) & 0xf) {
   12269                                     default:
   12270                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
   12271                                     case 0x7:
   12272                                       length = 1;
   12273                                       break;
   12274                                     case 0xa:
   12275                                       length = 2;
   12276                                       break;
   12277                                     case 0x6:
   12278                                       length = 3;
   12279                                       break;
   12280                                     case 0x2:
   12281                                       length = 4;
   12282                                       break;
   12283                                   }
   12284                                   unsigned last = first + length - 1;
   12285                                   TransferType transfer = kMultipleLanes;
   12286                                   unsigned rn = (instr >> 16) & 0xf;
   12287                                   // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
   12288                                   vst1(CurrentCond(),
   12289                                        dt,
   12290                                        NeonRegisterList(DRegister(first),
   12291                                                         DRegister(last),
   12292                                                         spacing,
   12293                                                         transfer),
   12294                                        AlignedMemOperand(Register(rn),
   12295                                                          align,
   12296                                                          Offset));
   12297                                   break;
   12298                                 }
   12299                                 case 0x00000800: {
   12300                                   // 0xf900080d
   12301                                   if (((instr & 0xe30) == 0x830)) {
   12302                                     UnallocatedT32(instr);
   12303                                     return;
   12304                                   }
   12305                                   DataType dt =
   12306                                       Dt_size_7_Decode((instr >> 6) & 0x3);
   12307                                   if (dt.Is(kDataTypeValueInvalid)) {
   12308                                     UnallocatedT32(instr);
   12309                                     return;
   12310                                   }
   12311                                   Alignment align =
   12312                                       Align_align_2_Decode((instr >> 4) & 0x3);
   12313                                   if (dt.Is(kDataTypeValueInvalid) ||
   12314                                       align.Is(kBadAlignment)) {
   12315                                     UnallocatedT32(instr);
   12316                                     return;
   12317                                   }
   12318                                   unsigned first =
   12319                                       ExtractDRegister(instr, 22, 12);
   12320                                   unsigned length;
   12321                                   SpacingType spacing;
   12322                                   switch ((instr >> 8) & 0xf) {
   12323                                     default:
   12324                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
   12325                                     case 0x8:
   12326                                       length = 2;
   12327                                       spacing = kSingle;
   12328                                       break;
   12329                                     case 0x9:
   12330                                       length = 2;
   12331                                       spacing = kDouble;
   12332                                       break;
   12333                                     case 0x3:
   12334                                       length = 4;
   12335                                       spacing = kSingle;
   12336                                       break;
   12337                                   }
   12338                                   unsigned last =
   12339                                       first +
   12340                                       (length - 1) *
   12341                                           (spacing == kSingle ? 1 : 2);
   12342                                   TransferType transfer = kMultipleLanes;
   12343                                   unsigned rn = (instr >> 16) & 0xf;
   12344                                   // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
   12345                                   vst2(CurrentCond(),
   12346                                        dt,
   12347                                        NeonRegisterList(DRegister(first),
   12348                                                         DRegister(last),
   12349                                                         spacing,
   12350                                                         transfer),
   12351                                        AlignedMemOperand(Register(rn),
   12352                                                          align,
   12353                                                          Offset));
   12354                                   break;
   12355                                 }
   12356                                 case 0x00000900: {
   12357                                   // 0xf900090d
   12358                                   if (((instr & 0xe30) == 0x830)) {
   12359                                     UnallocatedT32(instr);
   12360                                     return;
   12361                                   }
   12362                                   DataType dt =
   12363                                       Dt_size_7_Decode((instr >> 6) & 0x3);
   12364                                   if (dt.Is(kDataTypeValueInvalid)) {
   12365                                     UnallocatedT32(instr);
   12366                                     return;
   12367                                   }
   12368                                   Alignment align =
   12369                                       Align_align_2_Decode((instr >> 4) & 0x3);
   12370                                   if (dt.Is(kDataTypeValueInvalid) ||
   12371                                       align.Is(kBadAlignment)) {
   12372                                     UnallocatedT32(instr);
   12373                                     return;
   12374                                   }
   12375                                   unsigned first =
   12376                                       ExtractDRegister(instr, 22, 12);
   12377                                   unsigned length;
   12378                                   SpacingType spacing;
   12379                                   switch ((instr >> 8) & 0xf) {
   12380                                     default:
   12381                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
   12382                                     case 0x8:
   12383                                       length = 2;
   12384                                       spacing = kSingle;
   12385                                       break;
   12386                                     case 0x9:
   12387                                       length = 2;
   12388                                       spacing = kDouble;
   12389                                       break;
   12390                                     case 0x3:
   12391                                       length = 4;
   12392                                       spacing = kSingle;
   12393                                       break;
   12394                                   }
   12395                                   unsigned last =
   12396                                       first +
   12397                                       (length - 1) *
   12398                                           (spacing == kSingle ? 1 : 2);
   12399                                   TransferType transfer = kMultipleLanes;
   12400                                   unsigned rn = (instr >> 16) & 0xf;
   12401                                   // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
   12402                                   vst2(CurrentCond(),
   12403                                        dt,
   12404                                        NeonRegisterList(DRegister(first),
   12405                                                         DRegister(last),
   12406                                                         spacing,
   12407                                                         transfer),
   12408                                        AlignedMemOperand(Register(rn),
   12409                                                          align,
   12410                                                          Offset));
   12411                                   break;
   12412                                 }
   12413                                 case 0x00000a00: {
   12414                                   // 0xf9000a0d
   12415                                   if (((instr & 0xe20) == 0x620) ||
   12416                                       ((instr & 0xf30) == 0xa30)) {
   12417                                     UnallocatedT32(instr);
   12418                                     return;
   12419                                   }
   12420                                   DataType dt =
   12421                                       Dt_size_6_Decode((instr >> 6) & 0x3);
   12422                                   if (dt.Is(kDataTypeValueInvalid)) {
   12423                                     UnallocatedT32(instr);
   12424                                     return;
   12425                                   }
   12426                                   Alignment align =
   12427                                       Align_align_5_Decode((instr >> 4) & 0x3);
   12428                                   if (dt.Is(kDataTypeValueInvalid) ||
   12429                                       align.Is(kBadAlignment)) {
   12430                                     UnallocatedT32(instr);
   12431                                     return;
   12432                                   }
   12433                                   unsigned first =
   12434                                       ExtractDRegister(instr, 22, 12);
   12435                                   unsigned length;
   12436                                   SpacingType spacing = kSingle;
   12437                                   switch ((instr >> 8) & 0xf) {
   12438                                     default:
   12439                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
   12440                                     case 0x7:
   12441                                       length = 1;
   12442                                       break;
   12443                                     case 0xa:
   12444                                       length = 2;
   12445                                       break;
   12446                                     case 0x6:
   12447                                       length = 3;
   12448                                       break;
   12449                                     case 0x2:
   12450                                       length = 4;
   12451                                       break;
   12452                                   }
   12453                                   unsigned last = first + length - 1;
   12454                                   TransferType transfer = kMultipleLanes;
   12455                                   unsigned rn = (instr >> 16) & 0xf;
   12456                                   // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
   12457                                   vst1(CurrentCond(),
   12458                                        dt,
   12459                                        NeonRegisterList(DRegister(first),
   12460                                                         DRegister(last),
   12461                                                         spacing,
   12462                                                         transfer),
   12463                                        AlignedMemOperand(Register(rn),
   12464                                                          align,
   12465                                                          Offset));
   12466                                   break;
   12467                                 }
   12468                                 default:
   12469                                   UnallocatedT32(instr);
   12470                                   break;
   12471                               }
   12472                               break;
   12473                             }
   12474                           }
   12475                           break;
   12476                         }
   12477                         default: {
   12478                           switch (instr & 0x00000f00) {
   12479                             case 0x00000000: {
   12480                               // 0xf9000000
   12481                               if (((instr & 0xd) == 0xd)) {
   12482                                 UnallocatedT32(instr);
   12483                                 return;
   12484                               }
   12485                               DataType dt =
   12486                                   Dt_size_7_Decode((instr >> 6) & 0x3);
   12487                               if (dt.Is(kDataTypeValueInvalid)) {
   12488                                 UnallocatedT32(instr);
   12489                                 return;
   12490                               }
   12491                               Alignment align =
   12492                                   Align_align_4_Decode((instr >> 4) & 0x3);
   12493                               if (dt.Is(kDataTypeValueInvalid) ||
   12494                                   align.Is(kBadAlignment)) {
   12495                                 UnallocatedT32(instr);
   12496                                 return;
   12497                               }
   12498                               unsigned first = ExtractDRegister(instr, 22, 12);
   12499                               unsigned length;
   12500                               SpacingType spacing;
   12501                               switch ((instr >> 8) & 0xf) {
   12502                                 default:
   12503                                   VIXL_UNREACHABLE_OR_FALLTHROUGH();
   12504                                 case 0x0:
   12505                                   length = 4;
   12506                                   spacing = kSingle;
   12507                                   break;
   12508                                 case 0x1:
   12509                                   length = 4;
   12510                                   spacing = kDouble;
   12511                                   break;
   12512                               }
   12513                               unsigned last =
   12514                                   first +
   12515                                   (length - 1) * (spacing == kSingle ? 1 : 2);
   12516                               TransferType transfer = kMultipleLanes;
   12517                               unsigned rn = (instr >> 16) & 0xf;
   12518                               unsigned rm = instr & 0xf;
   12519                               // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
   12520                               vst4(CurrentCond(),
   12521                                    dt,
   12522                                    NeonRegisterList(DRegister(first),
   12523                                                     DRegister(last),
   12524                                                     spacing,
   12525                                                     transfer),
   12526                                    AlignedMemOperand(Register(rn),
   12527                                                      align,
   12528                                                      Register(rm),
   12529                                                      PostIndex));
   12530                               break;
   12531                             }
   12532                             case 0x00000100: {
   12533                               // 0xf9000100
   12534                               if (((instr & 0xd) == 0xd)) {
   12535                                 UnallocatedT32(instr);
   12536                                 return;
   12537                               }
   12538                               DataType dt =
   12539                                   Dt_size_7_Decode((instr >> 6) & 0x3);
   12540                               if (dt.Is(kDataTypeValueInvalid)) {
   12541                                 UnallocatedT32(instr);
   12542                                 return;
   12543                               }
   12544                               Alignment align =
   12545                                   Align_align_4_Decode((instr >> 4) & 0x3);
   12546                               if (dt.Is(kDataTypeValueInvalid) ||
   12547                                   align.Is(kBadAlignment)) {
   12548                                 UnallocatedT32(instr);
   12549                                 return;
   12550                               }
   12551                               unsigned first = ExtractDRegister(instr, 22, 12);
   12552                               unsigned length;
   12553                               SpacingType spacing;
   12554                               switch ((instr >> 8) & 0xf) {
   12555                                 default:
   12556                                   VIXL_UNREACHABLE_OR_FALLTHROUGH();
   12557                                 case 0x0:
   12558                                   length = 4;
   12559                                   spacing = kSingle;
   12560                                   break;
   12561                                 case 0x1:
   12562                                   length = 4;
   12563                                   spacing = kDouble;
   12564                                   break;
   12565                               }
   12566                               unsigned last =
   12567                                   first +
   12568                                   (length - 1) * (spacing == kSingle ? 1 : 2);
   12569                               TransferType transfer = kMultipleLanes;
   12570                               unsigned rn = (instr >> 16) & 0xf;
   12571                               unsigned rm = instr & 0xf;
   12572                               // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
   12573                               vst4(CurrentCond(),
   12574                                    dt,
   12575                                    NeonRegisterList(DRegister(first),
   12576                                                     DRegister(last),
   12577                                                     spacing,
   12578                                                     transfer),
   12579                                    AlignedMemOperand(Register(rn),
   12580                                                      align,
   12581                                                      Register(rm),
   12582                                                      PostIndex));
   12583                               break;
   12584                             }
   12585                             case 0x00000200: {
   12586                               // 0xf9000200
   12587                               if (((instr & 0xd) == 0xd) ||
   12588                                   ((instr & 0xe20) == 0x620) ||
   12589                                   ((instr & 0xf30) == 0xa30)) {
   12590                                 UnallocatedT32(instr);
   12591                                 return;
   12592                               }
   12593                               DataType dt =
   12594                                   Dt_size_6_Decode((instr >> 6) & 0x3);
   12595                               if (dt.Is(kDataTypeValueInvalid)) {
   12596                                 UnallocatedT32(instr);
   12597                                 return;
   12598                               }
   12599                               Alignment align =
   12600                                   Align_align_5_Decode((instr >> 4) & 0x3);
   12601                               if (dt.Is(kDataTypeValueInvalid) ||
   12602                                   align.Is(kBadAlignment)) {
   12603                                 UnallocatedT32(instr);
   12604                                 return;
   12605                               }
   12606                               unsigned first = ExtractDRegister(instr, 22, 12);
   12607                               unsigned length;
   12608                               SpacingType spacing = kSingle;
   12609                               switch ((instr >> 8) & 0xf) {
   12610                                 default:
   12611                                   VIXL_UNREACHABLE_OR_FALLTHROUGH();
   12612                                 case 0x7:
   12613                                   length = 1;
   12614                                   break;
   12615                                 case 0xa:
   12616                                   length = 2;
   12617                                   break;
   12618                                 case 0x6:
   12619                                   length = 3;
   12620                                   break;
   12621                                 case 0x2:
   12622                                   length = 4;
   12623                                   break;
   12624                               }
   12625                               unsigned last = first + length - 1;
   12626                               TransferType transfer = kMultipleLanes;
   12627                               unsigned rn = (instr >> 16) & 0xf;
   12628                               unsigned rm = instr & 0xf;
   12629                               // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
   12630                               vst1(CurrentCond(),
   12631                                    dt,
   12632                                    NeonRegisterList(DRegister(first),
   12633                                                     DRegister(last),
   12634                                                     spacing,
   12635                                                     transfer),
   12636                                    AlignedMemOperand(Register(rn),
   12637                                                      align,
   12638                                                      Register(rm),
   12639                                                      PostIndex));
   12640                               break;
   12641                             }
   12642                             case 0x00000300: {
   12643                               // 0xf9000300
   12644                               if (((instr & 0xd) == 0xd) ||
   12645                                   ((instr & 0xe30) == 0x830)) {
   12646                                 UnallocatedT32(instr);
   12647                                 return;
   12648                               }
   12649                               DataType dt =
   12650                                   Dt_size_7_Decode((instr >> 6) & 0x3);
   12651                               if (dt.Is(kDataTypeValueInvalid)) {
   12652                                 UnallocatedT32(instr);
   12653                                 return;
   12654                               }
   12655                               Alignment align =
   12656                                   Align_align_2_Decode((instr >> 4) & 0x3);
   12657                               if (dt.Is(kDataTypeValueInvalid) ||
   12658                                   align.Is(kBadAlignment)) {
   12659                                 UnallocatedT32(instr);
   12660                                 return;
   12661                               }
   12662                               unsigned first = ExtractDRegister(instr, 22, 12);
   12663                               unsigned length;
   12664                               SpacingType spacing;
   12665                               switch ((instr >> 8) & 0xf) {
   12666                                 default:
   12667                                   VIXL_UNREACHABLE_OR_FALLTHROUGH();
   12668                                 case 0x8:
   12669                                   length = 2;
   12670                                   spacing = kSingle;
   12671                                   break;
   12672                                 case 0x9:
   12673                                   length = 2;
   12674                                   spacing = kDouble;
   12675                                   break;
   12676                                 case 0x3:
   12677                                   length = 4;
   12678                                   spacing = kSingle;
   12679                                   break;
   12680                               }
   12681                               unsigned last =
   12682                                   first +
   12683                                   (length - 1) * (spacing == kSingle ? 1 : 2);
   12684                               TransferType transfer = kMultipleLanes;
   12685                               unsigned rn = (instr >> 16) & 0xf;
   12686                               unsigned rm = instr & 0xf;
   12687                               // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
   12688                               vst2(CurrentCond(),
   12689                                    dt,
   12690                                    NeonRegisterList(DRegister(first),
   12691                                                     DRegister(last),
   12692                                                     spacing,
   12693                                                     transfer),
   12694                                    AlignedMemOperand(Register(rn),
   12695                                                      align,
   12696                                                      Register(rm),
   12697                                                      PostIndex));
   12698                               break;
   12699                             }
   12700                             case 0x00000400: {
   12701                               // 0xf9000400
   12702                               if (((instr & 0xd) == 0xd) ||
   12703                                   ((instr & 0x20) == 0x20)) {
   12704                                 UnallocatedT32(instr);
   12705                                 return;
   12706                               }
   12707                               DataType dt =
   12708                                   Dt_size_7_Decode((instr >> 6) & 0x3);
   12709                               if (dt.Is(kDataTypeValueInvalid)) {
   12710                                 UnallocatedT32(instr);
   12711                                 return;
   12712                               }
   12713                               Alignment align =
   12714                                   Align_align_3_Decode((instr >> 4) & 0x3);
   12715                               if (dt.Is(kDataTypeValueInvalid) ||
   12716                                   align.Is(kBadAlignment)) {
   12717                                 UnallocatedT32(instr);
   12718                                 return;
   12719                               }
   12720                               unsigned first = ExtractDRegister(instr, 22, 12);
   12721                               unsigned length;
   12722                               SpacingType spacing;
   12723                               switch ((instr >> 8) & 0xf) {
   12724                                 default:
   12725                                   VIXL_UNREACHABLE_OR_FALLTHROUGH();
   12726                                 case 0x4:
   12727                                   length = 3;
   12728                                   spacing = kSingle;
   12729                                   break;
   12730                                 case 0x5:
   12731                                   length = 3;
   12732                                   spacing = kDouble;
   12733                                   break;
   12734                               }
   12735                               unsigned last =
   12736                                   first +
   12737                                   (length - 1) * (spacing == kSingle ? 1 : 2);
   12738                               TransferType transfer = kMultipleLanes;
   12739                               unsigned rn = (instr >> 16) & 0xf;
   12740                               unsigned rm = instr & 0xf;
   12741                               // VST3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
   12742                               vst3(CurrentCond(),
   12743                                    dt,
   12744                                    NeonRegisterList(DRegister(first),
   12745                                                     DRegister(last),
   12746                                                     spacing,
   12747                                                     transfer),
   12748                                    AlignedMemOperand(Register(rn),
   12749                                                      align,
   12750                                                      Register(rm),
   12751                                                      PostIndex));
   12752                               break;
   12753                             }
   12754                             case 0x00000500: {
   12755                               // 0xf9000500
   12756                               if (((instr & 0xd) == 0xd) ||
   12757                                   ((instr & 0x20) == 0x20)) {
   12758                                 UnallocatedT32(instr);
   12759                                 return;
   12760                               }
   12761                               DataType dt =
   12762                                   Dt_size_7_Decode((instr >> 6) & 0x3);
   12763                               if (dt.Is(kDataTypeValueInvalid)) {
   12764                                 UnallocatedT32(instr);
   12765                                 return;
   12766                               }
   12767                               Alignment align =
   12768                                   Align_align_3_Decode((instr >> 4) & 0x3);
   12769                               if (dt.Is(kDataTypeValueInvalid) ||
   12770                                   align.Is(kBadAlignment)) {
   12771                                 UnallocatedT32(instr);
   12772                                 return;
   12773                               }
   12774                               unsigned first = ExtractDRegister(instr, 22, 12);
   12775                               unsigned length;
   12776                               SpacingType spacing;
   12777                               switch ((instr >> 8) & 0xf) {
   12778                                 default:
   12779                                   VIXL_UNREACHABLE_OR_FALLTHROUGH();
   12780                                 case 0x4:
   12781                                   length = 3;
   12782                                   spacing = kSingle;
   12783                                   break;
   12784                                 case 0x5:
   12785                                   length = 3;
   12786                                   spacing = kDouble;
   12787                                   break;
   12788                               }
   12789                               unsigned last =
   12790                                   first +
   12791                                   (length - 1) * (spacing == kSingle ? 1 : 2);
   12792                               TransferType transfer = kMultipleLanes;
   12793                               unsigned rn = (instr >> 16) & 0xf;
   12794                               unsigned rm = instr & 0xf;
   12795                               // VST3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
   12796                               vst3(CurrentCond(),
   12797                                    dt,
   12798                                    NeonRegisterList(DRegister(first),
   12799                                                     DRegister(last),
   12800                                                     spacing,
   12801                                                     transfer),
   12802                                    AlignedMemOperand(Register(rn),
   12803                                                      align,
   12804                                                      Register(rm),
   12805                                                      PostIndex));
   12806                               break;
   12807                             }
   12808                             case 0x00000600: {
   12809                               // 0xf9000600
   12810                               if (((instr & 0xd) == 0xd) ||
   12811                                   ((instr & 0xe20) == 0x620) ||
   12812                                   ((instr & 0xf30) == 0xa30)) {
   12813                                 UnallocatedT32(instr);
   12814                                 return;
   12815                               }
   12816                               DataType dt =
   12817                                   Dt_size_6_Decode((instr >> 6) & 0x3);
   12818                               if (dt.Is(kDataTypeValueInvalid)) {
   12819                                 UnallocatedT32(instr);
   12820                                 return;
   12821                               }
   12822                               Alignment align =
   12823                                   Align_align_5_Decode((instr >> 4) & 0x3);
   12824                               if (dt.Is(kDataTypeValueInvalid) ||
   12825                                   align.Is(kBadAlignment)) {
   12826                                 UnallocatedT32(instr);
   12827                                 return;
   12828                               }
   12829                               unsigned first = ExtractDRegister(instr, 22, 12);
   12830                               unsigned length;
   12831                               SpacingType spacing = kSingle;
   12832                               switch ((instr >> 8) & 0xf) {
   12833                                 default:
   12834                                   VIXL_UNREACHABLE_OR_FALLTHROUGH();
   12835                                 case 0x7:
   12836                                   length = 1;
   12837                                   break;
   12838                                 case 0xa:
   12839                                   length = 2;
   12840                                   break;
   12841                                 case 0x6:
   12842                                   length = 3;
   12843                                   break;
   12844                                 case 0x2:
   12845                                   length = 4;
   12846                                   break;
   12847                               }
   12848                               unsigned last = first + length - 1;
   12849                               TransferType transfer = kMultipleLanes;
   12850                               unsigned rn = (instr >> 16) & 0xf;
   12851                               unsigned rm = instr & 0xf;
   12852                               // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
   12853                               vst1(CurrentCond(),
   12854                                    dt,
   12855                                    NeonRegisterList(DRegister(first),
   12856                                                     DRegister(last),
   12857                                                     spacing,
   12858                                                     transfer),
   12859                                    AlignedMemOperand(Register(rn),
   12860                                                      align,
   12861                                                      Register(rm),
   12862                                                      PostIndex));
   12863                               break;
   12864                             }
   12865                             case 0x00000700: {
   12866                               // 0xf9000700
   12867                               if (((instr & 0xd) == 0xd) ||
   12868                                   ((instr & 0xe20) == 0x620) ||
   12869                                   ((instr & 0xf30) == 0xa30)) {
   12870                                 UnallocatedT32(instr);
   12871                                 return;
   12872                               }
   12873                               DataType dt =
   12874                                   Dt_size_6_Decode((instr >> 6) & 0x3);
   12875                               if (dt.Is(kDataTypeValueInvalid)) {
   12876                                 UnallocatedT32(instr);
   12877                                 return;
   12878                               }
   12879                               Alignment align =
   12880                                   Align_align_5_Decode((instr >> 4) & 0x3);
   12881                               if (dt.Is(kDataTypeValueInvalid) ||
   12882                                   align.Is(kBadAlignment)) {
   12883                                 UnallocatedT32(instr);
   12884                                 return;
   12885                               }
   12886                               unsigned first = ExtractDRegister(instr, 22, 12);
   12887                               unsigned length;
   12888                               SpacingType spacing = kSingle;
   12889                               switch ((instr >> 8) & 0xf) {
   12890                                 default:
   12891                                   VIXL_UNREACHABLE_OR_FALLTHROUGH();
   12892                                 case 0x7:
   12893                                   length = 1;
   12894                                   break;
   12895                                 case 0xa:
   12896                                   length = 2;
   12897                                   break;
   12898                                 case 0x6:
   12899                                   length = 3;
   12900                                   break;
   12901                                 case 0x2:
   12902                                   length = 4;
   12903                                   break;
   12904                               }
   12905                               unsigned last = first + length - 1;
   12906                               TransferType transfer = kMultipleLanes;
   12907                               unsigned rn = (instr >> 16) & 0xf;
   12908                               unsigned rm = instr & 0xf;
   12909                               // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
   12910                               vst1(CurrentCond(),
   12911                                    dt,
   12912                                    NeonRegisterList(DRegister(first),
   12913                                                     DRegister(last),
   12914                                                     spacing,
   12915                                                     transfer),
   12916                                    AlignedMemOperand(Register(rn),
   12917                                                      align,
   12918                                                      Register(rm),
   12919                                                      PostIndex));
   12920                               break;
   12921                             }
   12922                             case 0x00000800: {
   12923                               // 0xf9000800
   12924                               if (((instr & 0xd) == 0xd) ||
   12925                                   ((instr & 0xe30) == 0x830)) {
   12926                                 UnallocatedT32(instr);
   12927                                 return;
   12928                               }
   12929                               DataType dt =
   12930                                   Dt_size_7_Decode((instr >> 6) & 0x3);
   12931                               if (dt.Is(kDataTypeValueInvalid)) {
   12932                                 UnallocatedT32(instr);
   12933                                 return;
   12934                               }
   12935                               Alignment align =
   12936                                   Align_align_2_Decode((instr >> 4) & 0x3);
   12937                               if (dt.Is(kDataTypeValueInvalid) ||
   12938                                   align.Is(kBadAlignment)) {
   12939                                 UnallocatedT32(instr);
   12940                                 return;
   12941                               }
   12942                               unsigned first = ExtractDRegister(instr, 22, 12);
   12943                               unsigned length;
   12944                               SpacingType spacing;
   12945                               switch ((instr >> 8) & 0xf) {
   12946                                 default:
   12947                                   VIXL_UNREACHABLE_OR_FALLTHROUGH();
   12948                                 case 0x8:
   12949                                   length = 2;
   12950                                   spacing = kSingle;
   12951                                   break;
   12952                                 case 0x9:
   12953                                   length = 2;
   12954                                   spacing = kDouble;
   12955                                   break;
   12956                                 case 0x3:
   12957                                   length = 4;
   12958                                   spacing = kSingle;
   12959                                   break;
   12960                               }
   12961                               unsigned last =
   12962                                   first +
   12963                                   (length - 1) * (spacing == kSingle ? 1 : 2);
   12964                               TransferType transfer = kMultipleLanes;
   12965                               unsigned rn = (instr >> 16) & 0xf;
   12966                               unsigned rm = instr & 0xf;
   12967                               // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
   12968                               vst2(CurrentCond(),
   12969                                    dt,
   12970                                    NeonRegisterList(DRegister(first),
   12971                                                     DRegister(last),
   12972                                                     spacing,
   12973                                                     transfer),
   12974                                    AlignedMemOperand(Register(rn),
   12975                                                      align,
   12976                                                      Register(rm),
   12977                                                      PostIndex));
   12978                               break;
   12979                             }
   12980                             case 0x00000900: {
   12981                               // 0xf9000900
   12982                               if (((instr & 0xd) == 0xd) ||
   12983                                   ((instr & 0xe30) == 0x830)) {
   12984                                 UnallocatedT32(instr);
   12985                                 return;
   12986                               }
   12987                               DataType dt =
   12988                                   Dt_size_7_Decode((instr >> 6) & 0x3);
   12989                               if (dt.Is(kDataTypeValueInvalid)) {
   12990                                 UnallocatedT32(instr);
   12991                                 return;
   12992                               }
   12993                               Alignment align =
   12994                                   Align_align_2_Decode((instr >> 4) & 0x3);
   12995                               if (dt.Is(kDataTypeValueInvalid) ||
   12996                                   align.Is(kBadAlignment)) {
   12997                                 UnallocatedT32(instr);
   12998                                 return;
   12999                               }
   13000                               unsigned first = ExtractDRegister(instr, 22, 12);
   13001                               unsigned length;
   13002                               SpacingType spacing;
   13003                               switch ((instr >> 8) & 0xf) {
   13004                                 default:
   13005                                   VIXL_UNREACHABLE_OR_FALLTHROUGH();
   13006                                 case 0x8:
   13007                                   length = 2;
   13008                                   spacing = kSingle;
   13009                                   break;
   13010                                 case 0x9:
   13011                                   length = 2;
   13012                                   spacing = kDouble;
   13013                                   break;
   13014                                 case 0x3:
   13015                                   length = 4;
   13016                                   spacing = kSingle;
   13017                                   break;
   13018                               }
   13019                               unsigned last =
   13020                                   first +
   13021                                   (length - 1) * (spacing == kSingle ? 1 : 2);
   13022                               TransferType transfer = kMultipleLanes;
   13023                               unsigned rn = (instr >> 16) & 0xf;
   13024                               unsigned rm = instr & 0xf;
   13025                               // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
   13026                               vst2(CurrentCond(),
   13027                                    dt,
   13028                                    NeonRegisterList(DRegister(first),
   13029                                                     DRegister(last),
   13030                                                     spacing,
   13031                                                     transfer),
   13032                                    AlignedMemOperand(Register(rn),
   13033                                                      align,
   13034                                                      Register(rm),
   13035                                                      PostIndex));
   13036                               break;
   13037                             }
   13038                             case 0x00000a00: {
   13039                               // 0xf9000a00
   13040                               if (((instr & 0xd) == 0xd) ||
   13041                                   ((instr & 0xe20) == 0x620) ||
   13042                                   ((instr & 0xf30) == 0xa30)) {
   13043                                 UnallocatedT32(instr);
   13044                                 return;
   13045                               }
   13046                               DataType dt =
   13047                                   Dt_size_6_Decode((instr >> 6) & 0x3);
   13048                               if (dt.Is(kDataTypeValueInvalid)) {
   13049                                 UnallocatedT32(instr);
   13050                                 return;
   13051                               }
   13052                               Alignment align =
   13053                                   Align_align_5_Decode((instr >> 4) & 0x3);
   13054                               if (dt.Is(kDataTypeValueInvalid) ||
   13055                                   align.Is(kBadAlignment)) {
   13056                                 UnallocatedT32(instr);
   13057                                 return;
   13058                               }
   13059                               unsigned first = ExtractDRegister(instr, 22, 12);
   13060                               unsigned length;
   13061                               SpacingType spacing = kSingle;
   13062                               switch ((instr >> 8) & 0xf) {
   13063                                 default:
   13064                                   VIXL_UNREACHABLE_OR_FALLTHROUGH();
   13065                                 case 0x7:
   13066                                   length = 1;
   13067                                   break;
   13068                                 case 0xa:
   13069                                   length = 2;
   13070                                   break;
   13071                                 case 0x6:
   13072                                   length = 3;
   13073                                   break;
   13074                                 case 0x2:
   13075                                   length = 4;
   13076                                   break;
   13077                               }
   13078                               unsigned last = first + length - 1;
   13079                               TransferType transfer = kMultipleLanes;
   13080                               unsigned rn = (instr >> 16) & 0xf;
   13081                               unsigned rm = instr & 0xf;
   13082                               // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
   13083                               vst1(CurrentCond(),
   13084                                    dt,
   13085                                    NeonRegisterList(DRegister(first),
   13086                                                     DRegister(last),
   13087                                                     spacing,
   13088                                                     transfer),
   13089                                    AlignedMemOperand(Register(rn),
   13090                                                      align,
   13091                                                      Register(rm),
   13092                                                      PostIndex));
   13093                               break;
   13094                             }
   13095                             default:
   13096                               UnallocatedT32(instr);
   13097                               break;
   13098                           }
   13099                           break;
   13100                         }
   13101                       }
   13102                       break;
   13103                     }
   13104                     case 0x01200000: {
   13105                       // 0xf9200000
   13106                       switch (instr & 0x0000000d) {
   13107                         case 0x0000000d: {
   13108                           // 0xf920000d
   13109                           switch (instr & 0x00000002) {
   13110                             case 0x00000000: {
   13111                               // 0xf920000d
   13112                               switch (instr & 0x00000f00) {
   13113                                 case 0x00000000: {
   13114                                   // 0xf920000d
   13115                                   DataType dt =
   13116                                       Dt_size_7_Decode((instr >> 6) & 0x3);
   13117                                   if (dt.Is(kDataTypeValueInvalid)) {
   13118                                     UnallocatedT32(instr);
   13119                                     return;
   13120                                   }
   13121                                   Alignment align =
   13122                                       Align_align_4_Decode((instr >> 4) & 0x3);
   13123                                   if (dt.Is(kDataTypeValueInvalid) ||
   13124                                       align.Is(kBadAlignment)) {
   13125                                     UnallocatedT32(instr);
   13126                                     return;
   13127                                   }
   13128                                   unsigned first =
   13129                                       ExtractDRegister(instr, 22, 12);
   13130                                   unsigned length;
   13131                                   SpacingType spacing;
   13132                                   switch ((instr >> 8) & 0xf) {
   13133                                     default:
   13134                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
   13135                                     case 0x0:
   13136                                       length = 4;
   13137                                       spacing = kSingle;
   13138                                       break;
   13139                                     case 0x1:
   13140                                       length = 4;
   13141                                       spacing = kDouble;
   13142                                       break;
   13143                                   }
   13144                                   unsigned last =
   13145                                       first +
   13146                                       (length - 1) *
   13147                                           (spacing == kSingle ? 1 : 2);
   13148                                   TransferType transfer = kMultipleLanes;
   13149                                   unsigned rn = (instr >> 16) & 0xf;
   13150                                   // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
   13151                                   vld4(CurrentCond(),
   13152                                        dt,
   13153                                        NeonRegisterList(DRegister(first),
   13154                                                         DRegister(last),
   13155                                                         spacing,
   13156                                                         transfer),
   13157                                        AlignedMemOperand(Register(rn),
   13158                                                          align,
   13159                                                          PostIndex));
   13160                                   break;
   13161                                 }
   13162                                 case 0x00000100: {
   13163                                   // 0xf920010d
   13164                                   DataType dt =
   13165                                       Dt_size_7_Decode((instr >> 6) & 0x3);
   13166                                   if (dt.Is(kDataTypeValueInvalid)) {
   13167                                     UnallocatedT32(instr);
   13168                                     return;
   13169                                   }
   13170                                   Alignment align =
   13171                                       Align_align_4_Decode((instr >> 4) & 0x3);
   13172                                   if (dt.Is(kDataTypeValueInvalid) ||
   13173                                       align.Is(kBadAlignment)) {
   13174                                     UnallocatedT32(instr);
   13175                                     return;
   13176                                   }
   13177                                   unsigned first =
   13178                                       ExtractDRegister(instr, 22, 12);
   13179                                   unsigned length;
   13180                                   SpacingType spacing;
   13181                                   switch ((instr >> 8) & 0xf) {
   13182                                     default:
   13183                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
   13184                                     case 0x0:
   13185                                       length = 4;
   13186                                       spacing = kSingle;
   13187                                       break;
   13188                                     case 0x1:
   13189                                       length = 4;
   13190                                       spacing = kDouble;
   13191                                       break;
   13192                                   }
   13193                                   unsigned last =
   13194                                       first +
   13195                                       (length - 1) *
   13196                                           (spacing == kSingle ? 1 : 2);
   13197                                   TransferType transfer = kMultipleLanes;
   13198                                   unsigned rn = (instr >> 16) & 0xf;
   13199                                   // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
   13200                                   vld4(CurrentCond(),
   13201                                        dt,
   13202                                        NeonRegisterList(DRegister(first),
   13203                                                         DRegister(last),
   13204                                                         spacing,
   13205                                                         transfer),
   13206                                        AlignedMemOperand(Register(rn),
   13207                                                          align,
   13208                                                          PostIndex));
   13209                                   break;
   13210                                 }
   13211                                 case 0x00000200: {
   13212                                   // 0xf920020d
   13213                                   if (((instr & 0xe20) == 0x620) ||
   13214                                       ((instr & 0xf30) == 0xa30)) {
   13215                                     UnallocatedT32(instr);
   13216                                     return;
   13217                                   }
   13218                                   DataType dt =
   13219                                       Dt_size_6_Decode((instr >> 6) & 0x3);
   13220                                   if (dt.Is(kDataTypeValueInvalid)) {
   13221                                     UnallocatedT32(instr);
   13222                                     return;
   13223                                   }
   13224                                   Alignment align =
   13225                                       Align_align_1_Decode((instr >> 4) & 0x3);
   13226                                   if (dt.Is(kDataTypeValueInvalid) ||
   13227                                       align.Is(kBadAlignment)) {
   13228                                     UnallocatedT32(instr);
   13229                                     return;
   13230                                   }
   13231                                   unsigned first =
   13232                                       ExtractDRegister(instr, 22, 12);
   13233                                   unsigned length;
   13234                                   SpacingType spacing = kSingle;
   13235                                   switch ((instr >> 8) & 0xf) {
   13236                                     default:
   13237                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
   13238                                     case 0x7:
   13239                                       length = 1;
   13240                                       break;
   13241                                     case 0xa:
   13242                                       length = 2;
   13243                                       break;
   13244                                     case 0x6:
   13245                                       length = 3;
   13246                                       break;
   13247                                     case 0x2:
   13248                                       length = 4;
   13249                                       break;
   13250                                   }
   13251                                   unsigned last = first + length - 1;
   13252                                   TransferType transfer = kMultipleLanes;
   13253                                   unsigned rn = (instr >> 16) & 0xf;
   13254                                   // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
   13255                                   vld1(CurrentCond(),
   13256                                        dt,
   13257                                        NeonRegisterList(DRegister(first),
   13258                                                         DRegister(last),
   13259                                                         spacing,
   13260                                                         transfer),
   13261                                        AlignedMemOperand(Register(rn),
   13262                                                          align,
   13263                                                          PostIndex));
   13264                                   break;
   13265                                 }
   13266                                 case 0x00000300: {
   13267                                   // 0xf920030d
   13268                                   if (((instr & 0xe30) == 0x830)) {
   13269                                     UnallocatedT32(instr);
   13270                                     return;
   13271                                   }
   13272                                   DataType dt =
   13273                                       Dt_size_7_Decode((instr >> 6) & 0x3);
   13274                                   if (dt.Is(kDataTypeValueInvalid)) {
   13275                                     UnallocatedT32(instr);
   13276                                     return;
   13277                                   }
   13278                                   Alignment align =
   13279                                       Align_align_2_Decode((instr >> 4) & 0x3);
   13280                                   if (dt.Is(kDataTypeValueInvalid) ||
   13281                                       align.Is(kBadAlignment)) {
   13282                                     UnallocatedT32(instr);
   13283                                     return;
   13284                                   }
   13285                                   unsigned first =
   13286                                       ExtractDRegister(instr, 22, 12);
   13287                                   unsigned length;
   13288                                   SpacingType spacing;
   13289                                   switch ((instr >> 8) & 0xf) {
   13290                                     default:
   13291                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
   13292                                     case 0x8:
   13293                                       length = 2;
   13294                                       spacing = kSingle;
   13295                                       break;
   13296                                     case 0x9:
   13297                                       length = 2;
   13298                                       spacing = kDouble;
   13299                                       break;
   13300                                     case 0x3:
   13301                                       length = 4;
   13302                                       spacing = kSingle;
   13303                                       break;
   13304                                   }
   13305                                   unsigned last =
   13306                                       first +
   13307                                       (length - 1) *
   13308                                           (spacing == kSingle ? 1 : 2);
   13309                                   TransferType transfer = kMultipleLanes;
   13310                                   unsigned rn = (instr >> 16) & 0xf;
   13311                                   // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
   13312                                   vld2(CurrentCond(),
   13313                                        dt,
   13314                                        NeonRegisterList(DRegister(first),
   13315                                                         DRegister(last),
   13316                                                         spacing,
   13317                                                         transfer),
   13318                                        AlignedMemOperand(Register(rn),
   13319                                                          align,
   13320                                                          PostIndex));
   13321                                   break;
   13322                                 }
   13323                                 case 0x00000400: {
   13324                                   // 0xf920040d
   13325                                   DataType dt =
   13326                                       Dt_size_7_Decode((instr >> 6) & 0x3);
   13327                                   if (dt.Is(kDataTypeValueInvalid)) {
   13328                                     UnallocatedT32(instr);
   13329                                     return;
   13330                                   }
   13331                                   Alignment align =
   13332                                       Align_align_3_Decode((instr >> 4) & 0x3);
   13333                                   if (dt.Is(kDataTypeValueInvalid) ||
   13334                                       align.Is(kBadAlignment)) {
   13335                                     UnallocatedT32(instr);
   13336                                     return;
   13337                                   }
   13338                                   unsigned first =
   13339                                       ExtractDRegister(instr, 22, 12);
   13340                                   unsigned length;
   13341                                   SpacingType spacing;
   13342                                   switch ((instr >> 8) & 0xf) {
   13343                                     default:
   13344                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
   13345                                     case 0x4:
   13346                                       length = 3;
   13347                                       spacing = kSingle;
   13348                                       break;
   13349                                     case 0x5:
   13350                                       length = 3;
   13351                                       spacing = kDouble;
   13352                                       break;
   13353                                   }
   13354                                   unsigned last =
   13355                                       first +
   13356                                       (length - 1) *
   13357                                           (spacing == kSingle ? 1 : 2);
   13358                                   TransferType transfer = kMultipleLanes;
   13359                                   unsigned rn = (instr >> 16) & 0xf;
   13360                                   // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
   13361                                   vld3(CurrentCond(),
   13362                                        dt,
   13363                                        NeonRegisterList(DRegister(first),
   13364                                                         DRegister(last),
   13365                                                         spacing,
   13366                                                         transfer),
   13367                                        AlignedMemOperand(Register(rn),
   13368                                                          align,
   13369                                                          PostIndex));
   13370                                   break;
   13371                                 }
   13372                                 case 0x00000500: {
   13373                                   // 0xf920050d
   13374                                   DataType dt =
   13375                                       Dt_size_7_Decode((instr >> 6) & 0x3);
   13376                                   if (dt.Is(kDataTypeValueInvalid)) {
   13377                                     UnallocatedT32(instr);
   13378                                     return;
   13379                                   }
   13380                                   Alignment align =
   13381                                       Align_align_3_Decode((instr >> 4) & 0x3);
   13382                                   if (dt.Is(kDataTypeValueInvalid) ||
   13383                                       align.Is(kBadAlignment)) {
   13384                                     UnallocatedT32(instr);
   13385                                     return;
   13386                                   }
   13387                                   unsigned first =
   13388                                       ExtractDRegister(instr, 22, 12);
   13389                                   unsigned length;
   13390                                   SpacingType spacing;
   13391                                   switch ((instr >> 8) & 0xf) {
   13392                                     default:
   13393                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
   13394                                     case 0x4:
   13395                                       length = 3;
   13396                                       spacing = kSingle;
   13397                                       break;
   13398                                     case 0x5:
   13399                                       length = 3;
   13400                                       spacing = kDouble;
   13401                                       break;
   13402                                   }
   13403                                   unsigned last =
   13404                                       first +
   13405                                       (length - 1) *
   13406                                           (spacing == kSingle ? 1 : 2);
   13407                                   TransferType transfer = kMultipleLanes;
   13408                                   unsigned rn = (instr >> 16) & 0xf;
   13409                                   // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
   13410                                   vld3(CurrentCond(),
   13411                                        dt,
   13412                                        NeonRegisterList(DRegister(first),
   13413                                                         DRegister(last),
   13414                                                         spacing,
   13415                                                         transfer),
   13416                                        AlignedMemOperand(Register(rn),
   13417                                                          align,
   13418                                                          PostIndex));
   13419                                   break;
   13420                                 }
   13421                                 case 0x00000600: {
   13422                                   // 0xf920060d
   13423                                   if (((instr & 0xe20) == 0x620) ||
   13424                                       ((instr & 0xf30) == 0xa30)) {
   13425                                     UnallocatedT32(instr);
   13426                                     return;
   13427                                   }
   13428                                   DataType dt =
   13429                                       Dt_size_6_Decode((instr >> 6) & 0x3);
   13430                                   if (dt.Is(kDataTypeValueInvalid)) {
   13431                                     UnallocatedT32(instr);
   13432                                     return;
   13433                                   }
   13434                                   Alignment align =
   13435                                       Align_align_1_Decode((instr >> 4) & 0x3);
   13436                                   if (dt.Is(kDataTypeValueInvalid) ||
   13437                                       align.Is(kBadAlignment)) {
   13438                                     UnallocatedT32(instr);
   13439                                     return;
   13440                                   }
   13441                                   unsigned first =
   13442                                       ExtractDRegister(instr, 22, 12);
   13443                                   unsigned length;
   13444                                   SpacingType spacing = kSingle;
   13445                                   switch ((instr >> 8) & 0xf) {
   13446                                     default:
   13447                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
   13448                                     case 0x7:
   13449                                       length = 1;
   13450                                       break;
   13451                                     case 0xa:
   13452                                       length = 2;
   13453                                       break;
   13454                                     case 0x6:
   13455                                       length = 3;
   13456                                       break;
   13457                                     case 0x2:
   13458                                       length = 4;
   13459                                       break;
   13460                                   }
   13461                                   unsigned last = first + length - 1;
   13462                                   TransferType transfer = kMultipleLanes;
   13463                                   unsigned rn = (instr >> 16) & 0xf;
   13464                                   // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
   13465                                   vld1(CurrentCond(),
   13466                                        dt,
   13467                                        NeonRegisterList(DRegister(first),
   13468                                                         DRegister(last),
   13469                                                         spacing,
   13470                                                         transfer),
   13471                                        AlignedMemOperand(Register(rn),
   13472                                                          align,
   13473                                                          PostIndex));
   13474                                   break;
   13475                                 }
   13476                                 case 0x00000700: {
   13477                                   // 0xf920070d
   13478                                   if (((instr & 0xe20) == 0x620) ||
   13479                                       ((instr & 0xf30) == 0xa30)) {
   13480                                     UnallocatedT32(instr);
   13481                                     return;
   13482                                   }
   13483                                   DataType dt =
   13484                                       Dt_size_6_Decode((instr >> 6) & 0x3);
   13485                                   if (dt.Is(kDataTypeValueInvalid)) {
   13486                                     UnallocatedT32(instr);
   13487                                     return;
   13488                                   }
   13489                                   Alignment align =
   13490                                       Align_align_1_Decode((instr >> 4) & 0x3);
   13491                                   if (dt.Is(kDataTypeValueInvalid) ||
   13492                                       align.Is(kBadAlignment)) {
   13493                                     UnallocatedT32(instr);
   13494                                     return;
   13495                                   }
   13496                                   unsigned first =
   13497                                       ExtractDRegister(instr, 22, 12);
   13498                                   unsigned length;
   13499                                   SpacingType spacing = kSingle;
   13500                                   switch ((instr >> 8) & 0xf) {
   13501                                     default:
   13502                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
   13503                                     case 0x7:
   13504                                       length = 1;
   13505                                       break;
   13506                                     case 0xa:
   13507                                       length = 2;
   13508                                       break;
   13509                                     case 0x6:
   13510                                       length = 3;
   13511                                       break;
   13512                                     case 0x2:
   13513                                       length = 4;
   13514                                       break;
   13515                                   }
   13516                                   unsigned last = first + length - 1;
   13517                                   TransferType transfer = kMultipleLanes;
   13518                                   unsigned rn = (instr >> 16) & 0xf;
   13519                                   // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
   13520                                   vld1(CurrentCond(),
   13521                                        dt,
   13522                                        NeonRegisterList(DRegister(first),
   13523                                                         DRegister(last),
   13524                                                         spacing,
   13525                                                         transfer),
   13526                                        AlignedMemOperand(Register(rn),
   13527                                                          align,
   13528                                                          PostIndex));
   13529                                   break;
   13530                                 }
   13531                                 case 0x00000800: {
   13532                                   // 0xf920080d
   13533                                   if (((instr & 0xe30) == 0x830)) {
   13534                                     UnallocatedT32(instr);
   13535                                     return;
   13536                                   }
   13537                                   DataType dt =
   13538                                       Dt_size_7_Decode((instr >> 6) & 0x3);
   13539                                   if (dt.Is(kDataTypeValueInvalid)) {
   13540                                     UnallocatedT32(instr);
   13541                                     return;
   13542                                   }
   13543                                   Alignment align =
   13544                                       Align_align_2_Decode((instr >> 4) & 0x3);
   13545                                   if (dt.Is(kDataTypeValueInvalid) ||
   13546                                       align.Is(kBadAlignment)) {
   13547                                     UnallocatedT32(instr);
   13548                                     return;
   13549                                   }
   13550                                   unsigned first =
   13551                                       ExtractDRegister(instr, 22, 12);
   13552                                   unsigned length;
   13553                                   SpacingType spacing;
   13554                                   switch ((instr >> 8) & 0xf) {
   13555                                     default:
   13556                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
   13557                                     case 0x8:
   13558                                       length = 2;
   13559                                       spacing = kSingle;
   13560                                       break;
   13561                                     case 0x9:
   13562                                       length = 2;
   13563                                       spacing = kDouble;
   13564                                       break;
   13565                                     case 0x3:
   13566                                       length = 4;
   13567                                       spacing = kSingle;
   13568                                       break;
   13569                                   }
   13570                                   unsigned last =
   13571                                       first +
   13572                                       (length - 1) *
   13573                                           (spacing == kSingle ? 1 : 2);
   13574                                   TransferType transfer = kMultipleLanes;
   13575                                   unsigned rn = (instr >> 16) & 0xf;
   13576                                   // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
   13577                                   vld2(CurrentCond(),
   13578                                        dt,
   13579                                        NeonRegisterList(DRegister(first),
   13580                                                         DRegister(last),
   13581                                                         spacing,
   13582                                                         transfer),
   13583                                        AlignedMemOperand(Register(rn),
   13584                                                          align,
   13585                                                          PostIndex));
   13586                                   break;
   13587                                 }
   13588                                 case 0x00000900: {
   13589                                   // 0xf920090d
   13590                                   if (((instr & 0xe30) == 0x830)) {
   13591                                     UnallocatedT32(instr);
   13592                                     return;
   13593                                   }
   13594                                   DataType dt =
   13595                                       Dt_size_7_Decode((instr >> 6) & 0x3);
   13596                                   if (dt.Is(kDataTypeValueInvalid)) {
   13597                                     UnallocatedT32(instr);
   13598                                     return;
   13599                                   }
   13600                                   Alignment align =
   13601                                       Align_align_2_Decode((instr >> 4) & 0x3);
   13602                                   if (dt.Is(kDataTypeValueInvalid) ||
   13603                                       align.Is(kBadAlignment)) {
   13604                                     UnallocatedT32(instr);
   13605                                     return;
   13606                                   }
   13607                                   unsigned first =
   13608                                       ExtractDRegister(instr, 22, 12);
   13609                                   unsigned length;
   13610                                   SpacingType spacing;
   13611                                   switch ((instr >> 8) & 0xf) {
   13612                                     default:
   13613                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
   13614                                     case 0x8:
   13615                                       length = 2;
   13616                                       spacing = kSingle;
   13617                                       break;
   13618                                     case 0x9:
   13619                                       length = 2;
   13620                                       spacing = kDouble;
   13621                                       break;
   13622                                     case 0x3:
   13623                                       length = 4;
   13624                                       spacing = kSingle;
   13625                                       break;
   13626                                   }
   13627                                   unsigned last =
   13628                                       first +
   13629                                       (length - 1) *
   13630                                           (spacing == kSingle ? 1 : 2);
   13631                                   TransferType transfer = kMultipleLanes;
   13632                                   unsigned rn = (instr >> 16) & 0xf;
   13633                                   // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
   13634                                   vld2(CurrentCond(),
   13635                                        dt,
   13636                                        NeonRegisterList(DRegister(first),
   13637                                                         DRegister(last),
   13638                                                         spacing,
   13639                                                         transfer),
   13640                                        AlignedMemOperand(Register(rn),
   13641                                                          align,
   13642                                                          PostIndex));
   13643                                   break;
   13644                                 }
   13645                                 case 0x00000a00: {
   13646                                   // 0xf9200a0d
   13647                                   if (((instr & 0xe20) == 0x620) ||
   13648                                       ((instr & 0xf30) == 0xa30)) {
   13649                                     UnallocatedT32(instr);
   13650                                     return;
   13651                                   }
   13652                                   DataType dt =
   13653                                       Dt_size_6_Decode((instr >> 6) & 0x3);
   13654                                   if (dt.Is(kDataTypeValueInvalid)) {
   13655                                     UnallocatedT32(instr);
   13656                                     return;
   13657                                   }
   13658                                   Alignment align =
   13659                                       Align_align_1_Decode((instr >> 4) & 0x3);
   13660                                   if (dt.Is(kDataTypeValueInvalid) ||
   13661                                       align.Is(kBadAlignment)) {
   13662                                     UnallocatedT32(instr);
   13663                                     return;
   13664                                   }
   13665                                   unsigned first =
   13666                                       ExtractDRegister(instr, 22, 12);
   13667                                   unsigned length;
   13668                                   SpacingType spacing = kSingle;
   13669                                   switch ((instr >> 8) & 0xf) {
   13670                                     default:
   13671                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
   13672                                     case 0x7:
   13673                                       length = 1;
   13674                                       break;
   13675                                     case 0xa:
   13676                                       length = 2;
   13677                                       break;
   13678                                     case 0x6:
   13679                                       length = 3;
   13680                                       break;
   13681                                     case 0x2:
   13682                                       length = 4;
   13683                                       break;
   13684                                   }
   13685                                   unsigned last = first + length - 1;
   13686                                   TransferType transfer = kMultipleLanes;
   13687                                   unsigned rn = (instr >> 16) & 0xf;
   13688                                   // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
   13689                                   vld1(CurrentCond(),
   13690                                        dt,
   13691                                        NeonRegisterList(DRegister(first),
   13692                                                         DRegister(last),
   13693                                                         spacing,
   13694                                                         transfer),
   13695                                        AlignedMemOperand(Register(rn),
   13696                                                          align,
   13697                                                          PostIndex));
   13698                                   break;
   13699                                 }
   13700                                 default:
   13701                                   UnallocatedT32(instr);
   13702                                   break;
   13703                               }
   13704                               break;
   13705                             }
   13706                             case 0x00000002: {
   13707                               // 0xf920000f
   13708                               switch (instr & 0x00000f00) {
   13709                                 case 0x00000000: {
   13710                                   // 0xf920000d
   13711                                   DataType dt =
   13712                                       Dt_size_7_Decode((instr >> 6) & 0x3);
   13713                                   if (dt.Is(kDataTypeValueInvalid)) {
   13714                                     UnallocatedT32(instr);
   13715                                     return;
   13716                                   }
   13717                                   Alignment align =
   13718                                       Align_align_4_Decode((instr >> 4) & 0x3);
   13719                                   if (dt.Is(kDataTypeValueInvalid) ||
   13720                                       align.Is(kBadAlignment)) {
   13721                                     UnallocatedT32(instr);
   13722                                     return;
   13723                                   }
   13724                                   unsigned first =
   13725                                       ExtractDRegister(instr, 22, 12);
   13726                                   unsigned length;
   13727                                   SpacingType spacing;
   13728                                   switch ((instr >> 8) & 0xf) {
   13729                                     default:
   13730                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
   13731                                     case 0x0:
   13732                                       length = 4;
   13733                                       spacing = kSingle;
   13734                                       break;
   13735                                     case 0x1:
   13736                                       length = 4;
   13737                                       spacing = kDouble;
   13738                                       break;
   13739                                   }
   13740                                   unsigned last =
   13741                                       first +
   13742                                       (length - 1) *
   13743                                           (spacing == kSingle ? 1 : 2);
   13744                                   TransferType transfer = kMultipleLanes;
   13745                                   unsigned rn = (instr >> 16) & 0xf;
   13746                                   // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
   13747                                   vld4(CurrentCond(),
   13748                                        dt,
   13749                                        NeonRegisterList(DRegister(first),
   13750                                                         DRegister(last),
   13751                                                         spacing,
   13752                                                         transfer),
   13753                                        AlignedMemOperand(Register(rn),
   13754                                                          align,
   13755                                                          Offset));
   13756                                   break;
   13757                                 }
   13758                                 case 0x00000100: {
   13759                                   // 0xf920010d
   13760                                   DataType dt =
   13761                                       Dt_size_7_Decode((instr >> 6) & 0x3);
   13762                                   if (dt.Is(kDataTypeValueInvalid)) {
   13763                                     UnallocatedT32(instr);
   13764                                     return;
   13765                                   }
   13766                                   Alignment align =
   13767                                       Align_align_4_Decode((instr >> 4) & 0x3);
   13768                                   if (dt.Is(kDataTypeValueInvalid) ||
   13769                                       align.Is(kBadAlignment)) {
   13770                                     UnallocatedT32(instr);
   13771                                     return;
   13772                                   }
   13773                                   unsigned first =
   13774                                       ExtractDRegister(instr, 22, 12);
   13775                                   unsigned length;
   13776                                   SpacingType spacing;
   13777                                   switch ((instr >> 8) & 0xf) {
   13778                                     default:
   13779                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
   13780                                     case 0x0:
   13781                                       length = 4;
   13782                                       spacing = kSingle;
   13783                                       break;
   13784                                     case 0x1:
   13785                                       length = 4;
   13786                                       spacing = kDouble;
   13787                                       break;
   13788                                   }
   13789                                   unsigned last =
   13790                                       first +
   13791                                       (length - 1) *
   13792                                           (spacing == kSingle ? 1 : 2);
   13793                                   TransferType transfer = kMultipleLanes;
   13794                                   unsigned rn = (instr >> 16) & 0xf;
   13795                                   // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
   13796                                   vld4(CurrentCond(),
   13797                                        dt,
   13798                                        NeonRegisterList(DRegister(first),
   13799                                                         DRegister(last),
   13800                                                         spacing,
   13801                                                         transfer),
   13802                                        AlignedMemOperand(Register(rn),
   13803                                                          align,
   13804                                                          Offset));
   13805                                   break;
   13806                                 }
   13807                                 case 0x00000200: {
   13808                                   // 0xf920020d
   13809                                   if (((instr & 0xe20) == 0x620) ||
   13810                                       ((instr & 0xf30) == 0xa30)) {
   13811                                     UnallocatedT32(instr);
   13812                                     return;
   13813                                   }
   13814                                   DataType dt =
   13815                                       Dt_size_6_Decode((instr >> 6) & 0x3);
   13816                                   if (dt.Is(kDataTypeValueInvalid)) {
   13817                                     UnallocatedT32(instr);
   13818                                     return;
   13819                                   }
   13820                                   Alignment align =
   13821                                       Align_align_1_Decode((instr >> 4) & 0x3);
   13822                                   if (dt.Is(kDataTypeValueInvalid) ||
   13823                                       align.Is(kBadAlignment)) {
   13824                                     UnallocatedT32(instr);
   13825                                     return;
   13826                                   }
   13827                                   unsigned first =
   13828                                       ExtractDRegister(instr, 22, 12);
   13829                                   unsigned length;
   13830                                   SpacingType spacing = kSingle;
   13831                                   switch ((instr >> 8) & 0xf) {
   13832                                     default:
   13833                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
   13834                                     case 0x7:
   13835                                       length = 1;
   13836                                       break;
   13837                                     case 0xa:
   13838                                       length = 2;
   13839                                       break;
   13840                                     case 0x6:
   13841                                       length = 3;
   13842                                       break;
   13843                                     case 0x2:
   13844                                       length = 4;
   13845                                       break;
   13846                                   }
   13847                                   unsigned last = first + length - 1;
   13848                                   TransferType transfer = kMultipleLanes;
   13849                                   unsigned rn = (instr >> 16) & 0xf;
   13850                                   // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
   13851                                   vld1(CurrentCond(),
   13852                                        dt,
   13853                                        NeonRegisterList(DRegister(first),
   13854                                                         DRegister(last),
   13855                                                         spacing,
   13856                                                         transfer),
   13857                                        AlignedMemOperand(Register(rn),
   13858                                                          align,
   13859                                                          Offset));
   13860                                   break;
   13861                                 }
   13862                                 case 0x00000300: {
   13863                                   // 0xf920030d
   13864                                   if (((instr & 0xe30) == 0x830)) {
   13865                                     UnallocatedT32(instr);
   13866                                     return;
   13867                                   }
   13868                                   DataType dt =
   13869                                       Dt_size_7_Decode((instr >> 6) & 0x3);
   13870                                   if (dt.Is(kDataTypeValueInvalid)) {
   13871                                     UnallocatedT32(instr);
   13872                                     return;
   13873                                   }
   13874                                   Alignment align =
   13875                                       Align_align_2_Decode((instr >> 4) & 0x3);
   13876                                   if (dt.Is(kDataTypeValueInvalid) ||
   13877                                       align.Is(kBadAlignment)) {
   13878                                     UnallocatedT32(instr);
   13879                                     return;
   13880                                   }
   13881                                   unsigned first =
   13882                                       ExtractDRegister(instr, 22, 12);
   13883                                   unsigned length;
   13884                                   SpacingType spacing;
   13885                                   switch ((instr >> 8) & 0xf) {
   13886                                     default:
   13887                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
   13888                                     case 0x8:
   13889                                       length = 2;
   13890                                       spacing = kSingle;
   13891                                       break;
   13892                                     case 0x9:
   13893                                       length = 2;
   13894                                       spacing = kDouble;
   13895                                       break;
   13896                                     case 0x3:
   13897                                       length = 4;
   13898                                       spacing = kSingle;
   13899                                       break;
   13900                                   }
   13901                                   unsigned last =
   13902                                       first +
   13903                                       (length - 1) *
   13904                                           (spacing == kSingle ? 1 : 2);
   13905                                   TransferType transfer = kMultipleLanes;
   13906                                   unsigned rn = (instr >> 16) & 0xf;
   13907                                   // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
   13908                                   vld2(CurrentCond(),
   13909                                        dt,
   13910                                        NeonRegisterList(DRegister(first),
   13911                                                         DRegister(last),
   13912                                                         spacing,
   13913                                                         transfer),
   13914                                        AlignedMemOperand(Register(rn),
   13915                                                          align,
   13916                                                          Offset));
   13917                                   break;
   13918                                 }
   13919                                 case 0x00000400: {
   13920                                   // 0xf920040d
   13921                                   DataType dt =
   13922                                       Dt_size_7_Decode((instr >> 6) & 0x3);
   13923                                   if (dt.Is(kDataTypeValueInvalid)) {
   13924                                     UnallocatedT32(instr);
   13925                                     return;
   13926                                   }
   13927                                   Alignment align =
   13928                                       Align_align_3_Decode((instr >> 4) & 0x3);
   13929                                   if (dt.Is(kDataTypeValueInvalid) ||
   13930                                       align.Is(kBadAlignment)) {
   13931                                     UnallocatedT32(instr);
   13932                                     return;
   13933                                   }
   13934                                   unsigned first =
   13935                                       ExtractDRegister(instr, 22, 12);
   13936                                   unsigned length;
   13937                                   SpacingType spacing;
   13938                                   switch ((instr >> 8) & 0xf) {
   13939                                     default:
   13940                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
   13941                                     case 0x4:
   13942                                       length = 3;
   13943                                       spacing = kSingle;
   13944                                       break;
   13945                                     case 0x5:
   13946                                       length = 3;
   13947                                       spacing = kDouble;
   13948                                       break;
   13949                                   }
   13950                                   unsigned last =
   13951                                       first +
   13952                                       (length - 1) *
   13953                                           (spacing == kSingle ? 1 : 2);
   13954                                   TransferType transfer = kMultipleLanes;
   13955                                   unsigned rn = (instr >> 16) & 0xf;
   13956                                   // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
   13957                                   vld3(CurrentCond(),
   13958                                        dt,
   13959                                        NeonRegisterList(DRegister(first),
   13960                                                         DRegister(last),
   13961                                                         spacing,
   13962                                                         transfer),
   13963                                        AlignedMemOperand(Register(rn),
   13964                                                          align,
   13965                                                          Offset));
   13966                                   break;
   13967                                 }
   13968                                 case 0x00000500: {
   13969                                   // 0xf920050d
   13970                                   DataType dt =
   13971                                       Dt_size_7_Decode((instr >> 6) & 0x3);
   13972                                   if (dt.Is(kDataTypeValueInvalid)) {
   13973                                     UnallocatedT32(instr);
   13974                                     return;
   13975                                   }
   13976                                   Alignment align =
   13977                                       Align_align_3_Decode((instr >> 4) & 0x3);
   13978                                   if (dt.Is(kDataTypeValueInvalid) ||
   13979                                       align.Is(kBadAlignment)) {
   13980                                     UnallocatedT32(instr);
   13981                                     return;
   13982                                   }
   13983                                   unsigned first =
   13984                                       ExtractDRegister(instr, 22, 12);
   13985                                   unsigned length;
   13986                                   SpacingType spacing;
   13987                                   switch ((instr >> 8) & 0xf) {
   13988                                     default:
   13989                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
   13990                                     case 0x4:
   13991                                       length = 3;
   13992                                       spacing = kSingle;
   13993                                       break;
   13994                                     case 0x5:
   13995                                       length = 3;
   13996                                       spacing = kDouble;
   13997                                       break;
   13998                                   }
   13999                                   unsigned last =
   14000                                       first +
   14001                                       (length - 1) *
   14002                                           (spacing == kSingle ? 1 : 2);
   14003                                   TransferType transfer = kMultipleLanes;
   14004                                   unsigned rn = (instr >> 16) & 0xf;
   14005                                   // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
   14006                                   vld3(CurrentCond(),
   14007                                        dt,
   14008                                        NeonRegisterList(DRegister(first),
   14009                                                         DRegister(last),
   14010                                                         spacing,
   14011                                                         transfer),
   14012                                        AlignedMemOperand(Register(rn),
   14013                                                          align,
   14014                                                          Offset));
   14015                                   break;
   14016                                 }
   14017                                 case 0x00000600: {
   14018                                   // 0xf920060d
   14019                                   if (((instr & 0xe20) == 0x620) ||
   14020                                       ((instr & 0xf30) == 0xa30)) {
   14021                                     UnallocatedT32(instr);
   14022                                     return;
   14023                                   }
   14024                                   DataType dt =
   14025                                       Dt_size_6_Decode((instr >> 6) & 0x3);
   14026                                   if (dt.Is(kDataTypeValueInvalid)) {
   14027                                     UnallocatedT32(instr);
   14028                                     return;
   14029                                   }
   14030                                   Alignment align =
   14031                                       Align_align_1_Decode((instr >> 4) & 0x3);
   14032                                   if (dt.Is(kDataTypeValueInvalid) ||
   14033                                       align.Is(kBadAlignment)) {
   14034                                     UnallocatedT32(instr);
   14035                                     return;
   14036                                   }
   14037                                   unsigned first =
   14038                                       ExtractDRegister(instr, 22, 12);
   14039                                   unsigned length;
   14040                                   SpacingType spacing = kSingle;
   14041                                   switch ((instr >> 8) & 0xf) {
   14042                                     default:
   14043                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
   14044                                     case 0x7:
   14045                                       length = 1;
   14046                                       break;
   14047                                     case 0xa:
   14048                                       length = 2;
   14049                                       break;
   14050                                     case 0x6:
   14051                                       length = 3;
   14052                                       break;
   14053                                     case 0x2:
   14054                                       length = 4;
   14055                                       break;
   14056                                   }
   14057                                   unsigned last = first + length - 1;
   14058                                   TransferType transfer = kMultipleLanes;
   14059                                   unsigned rn = (instr >> 16) & 0xf;
   14060                                   // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
   14061                                   vld1(CurrentCond(),
   14062                                        dt,
   14063                                        NeonRegisterList(DRegister(first),
   14064                                                         DRegister(last),
   14065                                                         spacing,
   14066                                                         transfer),
   14067                                        AlignedMemOperand(Register(rn),
   14068                                                          align,
   14069                                                          Offset));
   14070                                   break;
   14071                                 }
   14072                                 case 0x00000700: {
   14073                                   // 0xf920070d
   14074                                   if (((instr & 0xe20) == 0x620) ||
   14075                                       ((instr & 0xf30) == 0xa30)) {
   14076                                     UnallocatedT32(instr);
   14077                                     return;
   14078                                   }
   14079                                   DataType dt =
   14080                                       Dt_size_6_Decode((instr >> 6) & 0x3);
   14081                                   if (dt.Is(kDataTypeValueInvalid)) {
   14082                                     UnallocatedT32(instr);
   14083                                     return;
   14084                                   }
   14085                                   Alignment align =
   14086                                       Align_align_1_Decode((instr >> 4) & 0x3);
   14087                                   if (dt.Is(kDataTypeValueInvalid) ||
   14088                                       align.Is(kBadAlignment)) {
   14089                                     UnallocatedT32(instr);
   14090                                     return;
   14091                                   }
   14092                                   unsigned first =
   14093                                       ExtractDRegister(instr, 22, 12);
   14094                                   unsigned length;
   14095                                   SpacingType spacing = kSingle;
   14096                                   switch ((instr >> 8) & 0xf) {
   14097                                     default:
   14098                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
   14099                                     case 0x7:
   14100                                       length = 1;
   14101                                       break;
   14102                                     case 0xa:
   14103                                       length = 2;
   14104                                       break;
   14105                                     case 0x6:
   14106                                       length = 3;
   14107                                       break;
   14108                                     case 0x2:
   14109                                       length = 4;
   14110                                       break;
   14111                                   }
   14112                                   unsigned last = first + length - 1;
   14113                                   TransferType transfer = kMultipleLanes;
   14114                                   unsigned rn = (instr >> 16) & 0xf;
   14115                                   // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
   14116                                   vld1(CurrentCond(),
   14117                                        dt,
   14118                                        NeonRegisterList(DRegister(first),
   14119                                                         DRegister(last),
   14120                                                         spacing,
   14121                                                         transfer),
   14122                                        AlignedMemOperand(Register(rn),
   14123                                                          align,
   14124                                                          Offset));
   14125                                   break;
   14126                                 }
   14127                                 case 0x00000800: {
   14128                                   // 0xf920080d
   14129                                   if (((instr & 0xe30) == 0x830)) {
   14130                                     UnallocatedT32(instr);
   14131                                     return;
   14132                                   }
   14133                                   DataType dt =
   14134                                       Dt_size_7_Decode((instr >> 6) & 0x3);
   14135                                   if (dt.Is(kDataTypeValueInvalid)) {
   14136                                     UnallocatedT32(instr);
   14137                                     return;
   14138                                   }
   14139                                   Alignment align =
   14140                                       Align_align_2_Decode((instr >> 4) & 0x3);
   14141                                   if (dt.Is(kDataTypeValueInvalid) ||
   14142                                       align.Is(kBadAlignment)) {
   14143                                     UnallocatedT32(instr);
   14144                                     return;
   14145                                   }
   14146                                   unsigned first =
   14147                                       ExtractDRegister(instr, 22, 12);
   14148                                   unsigned length;
   14149                                   SpacingType spacing;
   14150                                   switch ((instr >> 8) & 0xf) {
   14151                                     default:
   14152                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
   14153                                     case 0x8:
   14154                                       length = 2;
   14155                                       spacing = kSingle;
   14156                                       break;
   14157                                     case 0x9:
   14158                                       length = 2;
   14159                                       spacing = kDouble;
   14160                                       break;
   14161                                     case 0x3:
   14162                                       length = 4;
   14163                                       spacing = kSingle;
   14164                                       break;
   14165                                   }
   14166                                   unsigned last =
   14167                                       first +
   14168                                       (length - 1) *
   14169                                           (spacing == kSingle ? 1 : 2);
   14170                                   TransferType transfer = kMultipleLanes;
   14171                                   unsigned rn = (instr >> 16) & 0xf;
   14172                                   // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
   14173                                   vld2(CurrentCond(),
   14174                                        dt,
   14175                                        NeonRegisterList(DRegister(first),
   14176                                                         DRegister(last),
   14177                                                         spacing,
   14178                                                         transfer),
   14179                                        AlignedMemOperand(Register(rn),
   14180                                                          align,
   14181                                                          Offset));
   14182                                   break;
   14183                                 }
   14184                                 case 0x00000900: {
   14185                                   // 0xf920090d
   14186                                   if (((instr & 0xe30) == 0x830)) {
   14187                                     UnallocatedT32(instr);
   14188                                     return;
   14189                                   }
   14190                                   DataType dt =
   14191                                       Dt_size_7_Decode((instr >> 6) & 0x3);
   14192                                   if (dt.Is(kDataTypeValueInvalid)) {
   14193                                     UnallocatedT32(instr);
   14194                                     return;
   14195                                   }
   14196                                   Alignment align =
   14197                                       Align_align_2_Decode((instr >> 4) & 0x3);
   14198                                   if (dt.Is(kDataTypeValueInvalid) ||
   14199                                       align.Is(kBadAlignment)) {
   14200                                     UnallocatedT32(instr);
   14201                                     return;
   14202                                   }
   14203                                   unsigned first =
   14204                                       ExtractDRegister(instr, 22, 12);
   14205                                   unsigned length;
   14206                                   SpacingType spacing;
   14207                                   switch ((instr >> 8) & 0xf) {
   14208                                     default:
   14209                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
   14210                                     case 0x8:
   14211                                       length = 2;
   14212                                       spacing = kSingle;
   14213                                       break;
   14214                                     case 0x9:
   14215                                       length = 2;
   14216                                       spacing = kDouble;
   14217                                       break;
   14218                                     case 0x3:
   14219                                       length = 4;
   14220                                       spacing = kSingle;
   14221                                       break;
   14222                                   }
   14223                                   unsigned last =
   14224                                       first +
   14225                                       (length - 1) *
   14226                                           (spacing == kSingle ? 1 : 2);
   14227                                   TransferType transfer = kMultipleLanes;
   14228                                   unsigned rn = (instr >> 16) & 0xf;
   14229                                   // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
   14230                                   vld2(CurrentCond(),
   14231                                        dt,
   14232                                        NeonRegisterList(DRegister(first),
   14233                                                         DRegister(last),
   14234                                                         spacing,
   14235                                                         transfer),
   14236                                        AlignedMemOperand(Register(rn),
   14237                                                          align,
   14238                                                          Offset));
   14239                                   break;
   14240                                 }
   14241                                 case 0x00000a00: {
   14242                                   // 0xf9200a0d
   14243                                   if (((instr & 0xe20) == 0x620) ||
   14244                                       ((instr & 0xf30) == 0xa30)) {
   14245                                     UnallocatedT32(instr);
   14246                                     return;
   14247                                   }
   14248                                   DataType dt =
   14249                                       Dt_size_6_Decode((instr >> 6) & 0x3);
   14250                                   if (dt.Is(kDataTypeValueInvalid)) {
   14251                                     UnallocatedT32(instr);
   14252                                     return;
   14253                                   }
   14254                                   Alignment align =
   14255                                       Align_align_1_Decode((instr >> 4) & 0x3);
   14256                                   if (dt.Is(kDataTypeValueInvalid) ||
   14257                                       align.Is(kBadAlignment)) {
   14258                                     UnallocatedT32(instr);
   14259                                     return;
   14260                                   }
   14261                                   unsigned first =
   14262                                       ExtractDRegister(instr, 22, 12);
   14263                                   unsigned length;
   14264                                   SpacingType spacing = kSingle;
   14265                                   switch ((instr >> 8) & 0xf) {
   14266                                     default:
   14267                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
   14268                                     case 0x7:
   14269                                       length = 1;
   14270                                       break;
   14271                                     case 0xa:
   14272                                       length = 2;
   14273                                       break;
   14274                                     case 0x6:
   14275                                       length = 3;
   14276                                       break;
   14277                                     case 0x2:
   14278                                       length = 4;
   14279                                       break;
   14280                                   }
   14281                                   unsigned last = first + length - 1;
   14282                                   TransferType transfer = kMultipleLanes;
   14283                                   unsigned rn = (instr >> 16) & 0xf;
   14284                                   // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
   14285                                   vld1(CurrentCond(),
   14286                                        dt,
   14287                                        NeonRegisterList(DRegister(first),
   14288                                                         DRegister(last),
   14289                                                         spacing,
   14290                                                         transfer),
   14291                                        AlignedMemOperand(Register(rn),
   14292                                                          align,
   14293                                                          Offset));
   14294                                   break;
   14295                                 }
   14296                                 default:
   14297                                   UnallocatedT32(instr);
   14298                                   break;
   14299                               }
   14300                               break;
   14301                             }
   14302                           }
   14303                           break;
   14304                         }
   14305                         default: {
   14306                           switch (instr & 0x00000f00) {
   14307                             case 0x00000000: {
   14308                               // 0xf9200000
   14309                               if (((instr & 0xd) == 0xd)) {
   14310                                 UnallocatedT32(instr);
   14311                                 return;
   14312                               }
   14313                               DataType dt =
   14314                                   Dt_size_7_Decode((instr >> 6) & 0x3);
   14315                               if (dt.Is(kDataTypeValueInvalid)) {
   14316                                 UnallocatedT32(instr);
   14317                                 return;
   14318                               }
   14319                               Alignment align =
   14320                                   Align_align_4_Decode((instr >> 4) & 0x3);
   14321                               if (dt.Is(kDataTypeValueInvalid) ||
   14322                                   align.Is(kBadAlignment)) {
   14323                                 UnallocatedT32(instr);
   14324                                 return;
   14325                               }
   14326                               unsigned first = ExtractDRegister(instr, 22, 12);
   14327                               unsigned length;
   14328                               SpacingType spacing;
   14329                               switch ((instr >> 8) & 0xf) {
   14330                                 default:
   14331                                   VIXL_UNREACHABLE_OR_FALLTHROUGH();
   14332                                 case 0x0:
   14333                                   length = 4;
   14334                                   spacing = kSingle;
   14335                                   break;
   14336                                 case 0x1:
   14337                                   length = 4;
   14338                                   spacing = kDouble;
   14339                                   break;
   14340                               }
   14341                               unsigned last =
   14342                                   first +
   14343                                   (length - 1) * (spacing == kSingle ? 1 : 2);
   14344                               TransferType transfer = kMultipleLanes;
   14345                               unsigned rn = (instr >> 16) & 0xf;
   14346                               unsigned rm = instr & 0xf;
   14347                               // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
   14348                               vld4(CurrentCond(),
   14349                                    dt,
   14350                                    NeonRegisterList(DRegister(first),
   14351                                                     DRegister(last),
   14352                                                     spacing,
   14353                                                     transfer),
   14354                                    AlignedMemOperand(Register(rn),
   14355                                                      align,
   14356                                                      Register(rm),
   14357                                                      PostIndex));
   14358                               break;
   14359                             }
   14360                             case 0x00000100: {
   14361                               // 0xf9200100
   14362                               if (((instr & 0xd) == 0xd)) {
   14363                                 UnallocatedT32(instr);
   14364                                 return;
   14365                               }
   14366                               DataType dt =
   14367                                   Dt_size_7_Decode((instr >> 6) & 0x3);
   14368                               if (dt.Is(kDataTypeValueInvalid)) {
   14369                                 UnallocatedT32(instr);
   14370                                 return;
   14371                               }
   14372                               Alignment align =
   14373                                   Align_align_4_Decode((instr >> 4) & 0x3);
   14374                               if (dt.Is(kDataTypeValueInvalid) ||
   14375                                   align.Is(kBadAlignment)) {
   14376                                 UnallocatedT32(instr);
   14377                                 return;
   14378                               }
   14379                               unsigned first = ExtractDRegister(instr, 22, 12);
   14380                               unsigned length;
   14381                               SpacingType spacing;
   14382                               switch ((instr >> 8) & 0xf) {
   14383                                 default:
   14384                                   VIXL_UNREACHABLE_OR_FALLTHROUGH();
   14385                                 case 0x0:
   14386                                   length = 4;
   14387                                   spacing = kSingle;
   14388                                   break;
   14389                                 case 0x1:
   14390                                   length = 4;
   14391                                   spacing = kDouble;
   14392                                   break;
   14393                               }
   14394                               unsigned last =
   14395                                   first +
   14396                                   (length - 1) * (spacing == kSingle ? 1 : 2);
   14397                               TransferType transfer = kMultipleLanes;
   14398                               unsigned rn = (instr >> 16) & 0xf;
   14399                               unsigned rm = instr & 0xf;
   14400                               // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
   14401                               vld4(CurrentCond(),
   14402                                    dt,
   14403                                    NeonRegisterList(DRegister(first),
   14404                                                     DRegister(last),
   14405                                                     spacing,
   14406                                                     transfer),
   14407                                    AlignedMemOperand(Register(rn),
   14408                                                      align,
   14409                                                      Register(rm),
   14410                                                      PostIndex));
   14411                               break;
   14412                             }
   14413                             case 0x00000200: {
   14414                               // 0xf9200200
   14415                               if (((instr & 0xd) == 0xd) ||
   14416                                   ((instr & 0xe20) == 0x620) ||
   14417                                   ((instr & 0xf30) == 0xa30)) {
   14418                                 UnallocatedT32(instr);
   14419                                 return;
   14420                               }
   14421                               DataType dt =
   14422                                   Dt_size_6_Decode((instr >> 6) & 0x3);
   14423                               if (dt.Is(kDataTypeValueInvalid)) {
   14424                                 UnallocatedT32(instr);
   14425                                 return;
   14426                               }
   14427                               Alignment align =
   14428                                   Align_align_1_Decode((instr >> 4) & 0x3);
   14429                               if (dt.Is(kDataTypeValueInvalid) ||
   14430                                   align.Is(kBadAlignment)) {
   14431                                 UnallocatedT32(instr);
   14432                                 return;
   14433                               }
   14434                               unsigned first = ExtractDRegister(instr, 22, 12);
   14435                               unsigned length;
   14436                               SpacingType spacing = kSingle;
   14437                               switch ((instr >> 8) & 0xf) {
   14438                                 default:
   14439                                   VIXL_UNREACHABLE_OR_FALLTHROUGH();
   14440                                 case 0x7:
   14441                                   length = 1;
   14442                                   break;
   14443                                 case 0xa:
   14444                                   length = 2;
   14445                                   break;
   14446                                 case 0x6:
   14447                                   length = 3;
   14448                                   break;
   14449                                 case 0x2:
   14450                                   length = 4;
   14451                                   break;
   14452                               }
   14453                               unsigned last = first + length - 1;
   14454                               TransferType transfer = kMultipleLanes;
   14455                               unsigned rn = (instr >> 16) & 0xf;
   14456                               unsigned rm = instr & 0xf;
   14457                               // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
   14458                               vld1(CurrentCond(),
   14459                                    dt,
   14460                                    NeonRegisterList(DRegister(first),
   14461                                                     DRegister(last),
   14462                                                     spacing,
   14463                                                     transfer),
   14464                                    AlignedMemOperand(Register(rn),
   14465                                                      align,
   14466                                                      Register(rm),
   14467                                                      PostIndex));
   14468                               break;
   14469                             }
   14470                             case 0x00000300: {
   14471                               // 0xf9200300
   14472                               if (((instr & 0xd) == 0xd) ||
   14473                                   ((instr & 0xe30) == 0x830)) {
   14474                                 UnallocatedT32(instr);
   14475                                 return;
   14476                               }
   14477                               DataType dt =
   14478                                   Dt_size_7_Decode((instr >> 6) & 0x3);
   14479                               if (dt.Is(kDataTypeValueInvalid)) {
   14480                                 UnallocatedT32(instr);
   14481                                 return;
   14482                               }
   14483                               Alignment align =
   14484                                   Align_align_2_Decode((instr >> 4) & 0x3);
   14485                               if (dt.Is(kDataTypeValueInvalid) ||
   14486                                   align.Is(kBadAlignment)) {
   14487                                 UnallocatedT32(instr);
   14488                                 return;
   14489                               }
   14490                               unsigned first = ExtractDRegister(instr, 22, 12);
   14491                               unsigned length;
   14492                               SpacingType spacing;
   14493                               switch ((instr >> 8) & 0xf) {
   14494                                 default:
   14495                                   VIXL_UNREACHABLE_OR_FALLTHROUGH();
   14496                                 case 0x8:
   14497                                   length = 2;
   14498                                   spacing = kSingle;
   14499                                   break;
   14500                                 case 0x9:
   14501                                   length = 2;
   14502                                   spacing = kDouble;
   14503                                   break;
   14504                                 case 0x3:
   14505                                   length = 4;
   14506                                   spacing = kSingle;
   14507                                   break;
   14508                               }
   14509                               unsigned last =
   14510                                   first +
   14511                                   (length - 1) * (spacing == kSingle ? 1 : 2);
   14512                               TransferType transfer = kMultipleLanes;
   14513                               unsigned rn = (instr >> 16) & 0xf;
   14514                               unsigned rm = instr & 0xf;
   14515                               // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
   14516                               vld2(CurrentCond(),
   14517                                    dt,
   14518                                    NeonRegisterList(DRegister(first),
   14519                                                     DRegister(last),
   14520                                                     spacing,
   14521                                                     transfer),
   14522                                    AlignedMemOperand(Register(rn),
   14523                                                      align,
   14524                                                      Register(rm),
   14525                                                      PostIndex));
   14526                               break;
   14527                             }
   14528                             case 0x00000400: {
   14529                               // 0xf9200400
   14530                               if (((instr & 0xd) == 0xd)) {
   14531                                 UnallocatedT32(instr);
   14532                                 return;
   14533                               }
   14534                               DataType dt =
   14535                                   Dt_size_7_Decode((instr >> 6) & 0x3);
   14536                               if (dt.Is(kDataTypeValueInvalid)) {
   14537                                 UnallocatedT32(instr);
   14538                                 return;
   14539                               }
   14540                               Alignment align =
   14541                                   Align_align_3_Decode((instr >> 4) & 0x3);
   14542                               if (dt.Is(kDataTypeValueInvalid) ||
   14543                                   align.Is(kBadAlignment)) {
   14544                                 UnallocatedT32(instr);
   14545                                 return;
   14546                               }
   14547                               unsigned first = ExtractDRegister(instr, 22, 12);
   14548                               unsigned length;
   14549                               SpacingType spacing;
   14550                               switch ((instr >> 8) & 0xf) {
   14551                                 default:
   14552                                   VIXL_UNREACHABLE_OR_FALLTHROUGH();
   14553                                 case 0x4:
   14554                                   length = 3;
   14555                                   spacing = kSingle;
   14556                                   break;
   14557                                 case 0x5:
   14558                                   length = 3;
   14559                                   spacing = kDouble;
   14560                                   break;
   14561                               }
   14562                               unsigned last =
   14563                                   first +
   14564                                   (length - 1) * (spacing == kSingle ? 1 : 2);
   14565                               TransferType transfer = kMultipleLanes;
   14566                               unsigned rn = (instr >> 16) & 0xf;
   14567                               unsigned rm = instr & 0xf;
   14568                               // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
   14569                               vld3(CurrentCond(),
   14570                                    dt,
   14571                                    NeonRegisterList(DRegister(first),
   14572                                                     DRegister(last),
   14573                                                     spacing,
   14574                                                     transfer),
   14575                                    AlignedMemOperand(Register(rn),
   14576                                                      align,
   14577                                                      Register(rm),
   14578                                                      PostIndex));
   14579                               break;
   14580                             }
   14581                             case 0x00000500: {
   14582                               // 0xf9200500
   14583                               if (((instr & 0xd) == 0xd)) {
   14584                                 UnallocatedT32(instr);
   14585                                 return;
   14586                               }
   14587                               DataType dt =
   14588                                   Dt_size_7_Decode((instr >> 6) & 0x3);
   14589                               if (dt.Is(kDataTypeValueInvalid)) {
   14590                                 UnallocatedT32(instr);
   14591                                 return;
   14592                               }
   14593                               Alignment align =
   14594                                   Align_align_3_Decode((instr >> 4) & 0x3);
   14595                               if (dt.Is(kDataTypeValueInvalid) ||
   14596                                   align.Is(kBadAlignment)) {
   14597                                 UnallocatedT32(instr);
   14598                                 return;
   14599                               }
   14600                               unsigned first = ExtractDRegister(instr, 22, 12);
   14601                               unsigned length;
   14602                               SpacingType spacing;
   14603                               switch ((instr >> 8) & 0xf) {
   14604                                 default:
   14605                                   VIXL_UNREACHABLE_OR_FALLTHROUGH();
   14606                                 case 0x4:
   14607                                   length = 3;
   14608                                   spacing = kSingle;
   14609                                   break;
   14610                                 case 0x5:
   14611                                   length = 3;
   14612                                   spacing = kDouble;
   14613                                   break;
   14614                               }
   14615                               unsigned last =
   14616                                   first +
   14617                                   (length - 1) * (spacing == kSingle ? 1 : 2);
   14618                               TransferType transfer = kMultipleLanes;
   14619                               unsigned rn = (instr >> 16) & 0xf;
   14620                               unsigned rm = instr & 0xf;
   14621                               // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
   14622                               vld3(CurrentCond(),
   14623                                    dt,
   14624                                    NeonRegisterList(DRegister(first),
   14625                                                     DRegister(last),
   14626                                                     spacing,
   14627                                                     transfer),
   14628                                    AlignedMemOperand(Register(rn),
   14629                                                      align,
   14630                                                      Register(rm),
   14631                                                      PostIndex));
   14632                               break;
   14633                             }
   14634                             case 0x00000600: {
   14635                               // 0xf9200600
   14636                               if (((instr & 0xd) == 0xd) ||
   14637                                   ((instr & 0xe20) == 0x620) ||
   14638                                   ((instr & 0xf30) == 0xa30)) {
   14639                                 UnallocatedT32(instr);
   14640                                 return;
   14641                               }
   14642                               DataType dt =
   14643                                   Dt_size_6_Decode((instr >> 6) & 0x3);
   14644                               if (dt.Is(kDataTypeValueInvalid)) {
   14645                                 UnallocatedT32(instr);
   14646                                 return;
   14647                               }
   14648                               Alignment align =
   14649                                   Align_align_1_Decode((instr >> 4) & 0x3);
   14650                               if (dt.Is(kDataTypeValueInvalid) ||
   14651                                   align.Is(kBadAlignment)) {
   14652                                 UnallocatedT32(instr);
   14653                                 return;
   14654                               }
   14655                               unsigned first = ExtractDRegister(instr, 22, 12);
   14656                               unsigned length;
   14657                               SpacingType spacing = kSingle;
   14658                               switch ((instr >> 8) & 0xf) {
   14659                                 default:
   14660                                   VIXL_UNREACHABLE_OR_FALLTHROUGH();
   14661                                 case 0x7:
   14662                                   length = 1;
   14663                                   break;
   14664                                 case 0xa:
   14665                                   length = 2;
   14666                                   break;
   14667                                 case 0x6:
   14668                                   length = 3;
   14669                                   break;
   14670                                 case 0x2:
   14671                                   length = 4;
   14672                                   break;
   14673                               }
   14674                               unsigned last = first + length - 1;
   14675                               TransferType transfer = kMultipleLanes;
   14676                               unsigned rn = (instr >> 16) & 0xf;
   14677                               unsigned rm = instr & 0xf;
   14678                               // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
   14679                               vld1(CurrentCond(),
   14680                                    dt,
   14681                                    NeonRegisterList(DRegister(first),
   14682                                                     DRegister(last),
   14683                                                     spacing,
   14684                                                     transfer),
   14685                                    AlignedMemOperand(Register(rn),
   14686                                                      align,
   14687                                                      Register(rm),
   14688                                                      PostIndex));
   14689                               break;
   14690                             }
   14691                             case 0x00000700: {
   14692                               // 0xf9200700
   14693                               if (((instr & 0xd) == 0xd) ||
   14694                                   ((instr & 0xe20) == 0x620) ||
   14695                                   ((instr & 0xf30) == 0xa30)) {
   14696                                 UnallocatedT32(instr);
   14697                                 return;
   14698                               }
   14699                               DataType dt =
   14700                                   Dt_size_6_Decode((instr >> 6) & 0x3);
   14701                               if (dt.Is(kDataTypeValueInvalid)) {
   14702                                 UnallocatedT32(instr);
   14703                                 return;
   14704                               }
   14705                               Alignment align =
   14706                                   Align_align_1_Decode((instr >> 4) & 0x3);
   14707                               if (dt.Is(kDataTypeValueInvalid) ||
   14708                                   align.Is(kBadAlignment)) {
   14709                                 UnallocatedT32(instr);
   14710                                 return;
   14711                               }
   14712                               unsigned first = ExtractDRegister(instr, 22, 12);
   14713                               unsigned length;
   14714                               SpacingType spacing = kSingle;
   14715                               switch ((instr >> 8) & 0xf) {
   14716                                 default:
   14717                                   VIXL_UNREACHABLE_OR_FALLTHROUGH();
   14718                                 case 0x7:
   14719                                   length = 1;
   14720                                   break;
   14721                                 case 0xa:
   14722                                   length = 2;
   14723                                   break;
   14724                                 case 0x6:
   14725                                   length = 3;
   14726                                   break;
   14727                                 case 0x2:
   14728                                   length = 4;
   14729                                   break;
   14730                               }
   14731                               unsigned last = first + length - 1;
   14732                               TransferType transfer = kMultipleLanes;
   14733                               unsigned rn = (instr >> 16) & 0xf;
   14734                               unsigned rm = instr & 0xf;
   14735                               // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
   14736                               vld1(CurrentCond(),
   14737                                    dt,
   14738                                    NeonRegisterList(DRegister(first),
   14739                                                     DRegister(last),
   14740                                                     spacing,
   14741                                                     transfer),
   14742                                    AlignedMemOperand(Register(rn),
   14743                                                      align,
   14744                                                      Register(rm),
   14745                                                      PostIndex));
   14746                               break;
   14747                             }
   14748                             case 0x00000800: {
   14749                               // 0xf9200800
   14750                               if (((instr & 0xd) == 0xd) ||
   14751                                   ((instr & 0xe30) == 0x830)) {
   14752                                 UnallocatedT32(instr);
   14753                                 return;
   14754                               }
   14755                               DataType dt =
   14756                                   Dt_size_7_Decode((instr >> 6) & 0x3);
   14757                               if (dt.Is(kDataTypeValueInvalid)) {
   14758                                 UnallocatedT32(instr);
   14759                                 return;
   14760                               }
   14761                               Alignment align =
   14762                                   Align_align_2_Decode((instr >> 4) & 0x3);
   14763                               if (dt.Is(kDataTypeValueInvalid) ||
   14764                                   align.Is(kBadAlignment)) {
   14765                                 UnallocatedT32(instr);
   14766                                 return;
   14767                               }
   14768                               unsigned first = ExtractDRegister(instr, 22, 12);
   14769                               unsigned length;
   14770                               SpacingType spacing;
   14771                               switch ((instr >> 8) & 0xf) {
   14772                                 default:
   14773                                   VIXL_UNREACHABLE_OR_FALLTHROUGH();
   14774                                 case 0x8:
   14775                                   length = 2;
   14776                                   spacing = kSingle;
   14777                                   break;
   14778                                 case 0x9:
   14779                                   length = 2;
   14780                                   spacing = kDouble;
   14781                                   break;
   14782                                 case 0x3:
   14783                                   length = 4;
   14784                                   spacing = kSingle;
   14785                                   break;
   14786                               }
   14787                               unsigned last =
   14788                                   first +
   14789                                   (length - 1) * (spacing == kSingle ? 1 : 2);
   14790                               TransferType transfer = kMultipleLanes;
   14791                               unsigned rn = (instr >> 16) & 0xf;
   14792                               unsigned rm = instr & 0xf;
   14793                               // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
   14794                               vld2(CurrentCond(),
   14795                                    dt,
   14796                                    NeonRegisterList(DRegister(first),
   14797                                                     DRegister(last),
   14798                                                     spacing,
   14799                                                     transfer),
   14800                                    AlignedMemOperand(Register(rn),
   14801                                                      align,
   14802                                                      Register(rm),
   14803                                                      PostIndex));
   14804                               break;
   14805                             }
   14806                             case 0x00000900: {
   14807                               // 0xf9200900
   14808                               if (((instr & 0xd) == 0xd) ||
   14809                                   ((instr & 0xe30) == 0x830)) {
   14810                                 UnallocatedT32(instr);
   14811                                 return;
   14812                               }
   14813                               DataType dt =
   14814                                   Dt_size_7_Decode((instr >> 6) & 0x3);
   14815                               if (dt.Is(kDataTypeValueInvalid)) {
   14816                                 UnallocatedT32(instr);
   14817                                 return;
   14818                               }
   14819                               Alignment align =
   14820                                   Align_align_2_Decode((instr >> 4) & 0x3);
   14821                               if (dt.Is(kDataTypeValueInvalid) ||
   14822                                   align.Is(kBadAlignment)) {
   14823                                 UnallocatedT32(instr);
   14824                                 return;
   14825                               }
   14826                               unsigned first = ExtractDRegister(instr, 22, 12);
   14827                               unsigned length;
   14828                               SpacingType spacing;
   14829                               switch ((instr >> 8) & 0xf) {
   14830                                 default:
   14831                                   VIXL_UNREACHABLE_OR_FALLTHROUGH();
   14832                                 case 0x8:
   14833                                   length = 2;
   14834                                   spacing = kSingle;
   14835                                   break;
   14836                                 case 0x9:
   14837                                   length = 2;
   14838                                   spacing = kDouble;
   14839                                   break;
   14840                                 case 0x3:
   14841                                   length = 4;
   14842                                   spacing = kSingle;
   14843                                   break;
   14844                               }
   14845                               unsigned last =
   14846                                   first +
   14847                                   (length - 1) * (spacing == kSingle ? 1 : 2);
   14848                               TransferType transfer = kMultipleLanes;
   14849                               unsigned rn = (instr >> 16) & 0xf;
   14850                               unsigned rm = instr & 0xf;
   14851                               // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
   14852                               vld2(CurrentCond(),
   14853                                    dt,
   14854                                    NeonRegisterList(DRegister(first),
   14855                                                     DRegister(last),
   14856                                                     spacing,
   14857                                                     transfer),
   14858                                    AlignedMemOperand(Register(rn),
   14859                                                      align,
   14860                                                      Register(rm),
   14861                                                      PostIndex));
   14862                               break;
   14863                             }
   14864                             case 0x00000a00: {
   14865                               // 0xf9200a00
   14866                               if (((instr & 0xd) == 0xd) ||
   14867                                   ((instr & 0xe20) == 0x620) ||
   14868                                   ((instr & 0xf30) == 0xa30)) {
   14869                                 UnallocatedT32(instr);
   14870                                 return;
   14871                               }
   14872                               DataType dt =
   14873                                   Dt_size_6_Decode((instr >> 6) & 0x3);
   14874                               if (dt.Is(kDataTypeValueInvalid)) {
   14875                                 UnallocatedT32(instr);
   14876                                 return;
   14877                               }
   14878                               Alignment align =
   14879                                   Align_align_1_Decode((instr >> 4) & 0x3);
   14880                               if (dt.Is(kDataTypeValueInvalid) ||
   14881                                   align.Is(kBadAlignment)) {
   14882                                 UnallocatedT32(instr);
   14883                                 return;
   14884                               }
   14885                               unsigned first = ExtractDRegister(instr, 22, 12);
   14886                               unsigned length;
   14887                               SpacingType spacing = kSingle;
   14888                               switch ((instr >> 8) & 0xf) {
   14889                                 default:
   14890                                   VIXL_UNREACHABLE_OR_FALLTHROUGH();
   14891                                 case 0x7:
   14892                                   length = 1;
   14893                                   break;
   14894                                 case 0xa:
   14895                                   length = 2;
   14896                                   break;
   14897                                 case 0x6:
   14898                                   length = 3;
   14899                                   break;
   14900                                 case 0x2:
   14901                                   length = 4;
   14902                                   break;
   14903                               }
   14904                               unsigned last = first + length - 1;
   14905                               TransferType transfer = kMultipleLanes;
   14906                               unsigned rn = (instr >> 16) & 0xf;
   14907                               unsigned rm = instr & 0xf;
   14908                               // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
   14909                               vld1(CurrentCond(),
   14910                                    dt,
   14911                                    NeonRegisterList(DRegister(first),
   14912                                                     DRegister(last),
   14913                                                     spacing,
   14914                                                     transfer),
   14915                                    AlignedMemOperand(Register(rn),
   14916                                                      align,
   14917                                                      Register(rm),
   14918                                                      PostIndex));
   14919                               break;
   14920                             }
   14921                             default:
   14922                               UnallocatedT32(instr);
   14923                               break;
   14924                           }
   14925                           break;
   14926                         }
   14927                       }
   14928                       break;
   14929                     }
   14930                     case 0x01800000: {
   14931                       // 0xf9800000
   14932                       switch (instr & 0x00000300) {
   14933                         case 0x00000000: {
   14934                           // 0xf9800000
   14935                           switch (instr & 0x00000c00) {
   14936                             case 0x00000c00: {
   14937                               // 0xf9800c00
   14938                               UnallocatedT32(instr);
   14939                               break;
   14940                             }
   14941                             default: {
   14942                               switch (instr & 0x0000000d) {
   14943                                 case 0x0000000d: {
   14944                                   // 0xf980000d
   14945                                   switch (instr & 0x00000002) {
   14946                                     case 0x00000000: {
   14947                                       // 0xf980000d
   14948                                       if (((instr & 0xc00) == 0xc00)) {
   14949                                         UnallocatedT32(instr);
   14950                                         return;
   14951                                       }
   14952                                       DataType dt =
   14953                                           Dt_size_7_Decode((instr >> 10) & 0x3);
   14954                                       if (dt.Is(kDataTypeValueInvalid)) {
   14955                                         UnallocatedT32(instr);
   14956                                         return;
   14957                                       }
   14958                                       DecodeNeonAndAlign decode_neon =
   14959                                           Align_index_align_1_Decode((instr >>
   14960                                                                       4) &
   14961                                                                          0xf,
   14962                                                                      dt);
   14963                                       if (!decode_neon.IsValid()) {
   14964                                         UnallocatedT32(instr);
   14965                                         return;
   14966                                       }
   14967                                       Alignment align = decode_neon.GetAlign();
   14968                                       int lane = decode_neon.GetLane();
   14969                                       SpacingType spacing =
   14970                                           decode_neon.GetSpacing();
   14971                                       unsigned first =
   14972                                           ExtractDRegister(instr, 22, 12);
   14973                                       unsigned length = 1;
   14974                                       unsigned last = first + length - 1;
   14975                                       unsigned rn = (instr >> 16) & 0xf;
   14976                                       // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
   14977                                       vst1(CurrentCond(),
   14978                                            dt,
   14979                                            NeonRegisterList(DRegister(first),
   14980                                                             DRegister(last),
   14981                                                             spacing,
   14982                                                             lane),
   14983                                            AlignedMemOperand(Register(rn),
   14984                                                              align,
   14985                                                              PostIndex));
   14986                                       break;
   14987                                     }
   14988                                     case 0x00000002: {
   14989                                       // 0xf980000f
   14990                                       if (((instr & 0xc00) == 0xc00)) {
   14991                                         UnallocatedT32(instr);
   14992                                         return;
   14993                                       }
   14994                                       DataType dt =
   14995                                           Dt_size_7_Decode((instr >> 10) & 0x3);
   14996                                       if (dt.Is(kDataTypeValueInvalid)) {
   14997                                         UnallocatedT32(instr);
   14998                                         return;
   14999                                       }
   15000                                       DecodeNeonAndAlign decode_neon =
   15001                                           Align_index_align_1_Decode((instr >>
   15002                                                                       4) &
   15003                                                                          0xf,
   15004                                                                      dt);
   15005                                       if (!decode_neon.IsValid()) {
   15006                                         UnallocatedT32(instr);
   15007                                         return;
   15008                                       }
   15009                                       Alignment align = decode_neon.GetAlign();
   15010                                       int lane = decode_neon.GetLane();
   15011                                       SpacingType spacing =
   15012                                           decode_neon.GetSpacing();
   15013                                       unsigned first =
   15014                                           ExtractDRegister(instr, 22, 12);
   15015                                       unsigned length = 1;
   15016                                       unsigned last = first + length - 1;
   15017                                       unsigned rn = (instr >> 16) & 0xf;
   15018                                       // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
   15019                                       vst1(CurrentCond(),
   15020                                            dt,
   15021                                            NeonRegisterList(DRegister(first),
   15022                                                             DRegister(last),
   15023                                                             spacing,
   15024                                                             lane),
   15025                                            AlignedMemOperand(Register(rn),
   15026                                                              align,
   15027                                                              Offset));
   15028                                       break;
   15029                                     }
   15030                                   }
   15031                                   break;
   15032                                 }
   15033                                 default: {
   15034                                   if (((instr & 0xc00) == 0xc00) ||
   15035                                       ((instr & 0xd) == 0xd)) {
   15036                                     UnallocatedT32(instr);
   15037                                     return;
   15038                                   }
   15039                                   DataType dt =
   15040                                       Dt_size_7_Decode((instr >> 10) & 0x3);
   15041                                   if (dt.Is(kDataTypeValueInvalid)) {
   15042                                     UnallocatedT32(instr);
   15043                                     return;
   15044                                   }
   15045                                   DecodeNeonAndAlign decode_neon =
   15046                                       Align_index_align_1_Decode((instr >> 4) &
   15047                                                                      0xf,
   15048                                                                  dt);
   15049                                   if (!decode_neon.IsValid()) {
   15050                                     UnallocatedT32(instr);
   15051                                     return;
   15052                                   }
   15053                                   Alignment align = decode_neon.GetAlign();
   15054                                   int lane = decode_neon.GetLane();
   15055                                   SpacingType spacing =
   15056                                       decode_neon.GetSpacing();
   15057                                   unsigned first =
   15058                                       ExtractDRegister(instr, 22, 12);
   15059                                   unsigned length = 1;
   15060                                   unsigned last = first + length - 1;
   15061                                   unsigned rn = (instr >> 16) & 0xf;
   15062                                   unsigned rm = instr & 0xf;
   15063                                   // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
   15064                                   vst1(CurrentCond(),
   15065                                        dt,
   15066                                        NeonRegisterList(DRegister(first),
   15067                                                         DRegister(last),
   15068                                                         spacing,
   15069                                                         lane),
   15070                                        AlignedMemOperand(Register(rn),
   15071                                                          align,
   15072                                                          Register(rm),
   15073                                                          PostIndex));
   15074                                   break;
   15075                                 }
   15076                               }
   15077                               break;
   15078                             }
   15079                           }
   15080                           break;
   15081                         }
   15082                         case 0x00000100: {
   15083                           // 0xf9800100
   15084                           switch (instr & 0x00000c00) {
   15085                             case 0x00000c00: {
   15086                               // 0xf9800d00
   15087                               UnallocatedT32(instr);
   15088                               break;
   15089                             }
   15090                             default: {
   15091                               switch (instr & 0x0000000d) {
   15092                                 case 0x0000000d: {
   15093                                   // 0xf980010d
   15094                                   switch (instr & 0x00000002) {
   15095                                     case 0x00000000: {
   15096                                       // 0xf980010d
   15097                                       if (((instr & 0xc00) == 0xc00)) {
   15098                                         UnallocatedT32(instr);
   15099                                         return;
   15100                                       }
   15101                                       DataType dt =
   15102                                           Dt_size_7_Decode((instr >> 10) & 0x3);
   15103                                       if (dt.Is(kDataTypeValueInvalid)) {
   15104                                         UnallocatedT32(instr);
   15105                                         return;
   15106                                       }
   15107                                       DecodeNeonAndAlign decode_neon =
   15108                                           Align_index_align_2_Decode((instr >>
   15109                                                                       4) &
   15110                                                                          0xf,
   15111                                                                      dt);
   15112                                       if (!decode_neon.IsValid()) {
   15113                                         UnallocatedT32(instr);
   15114                                         return;
   15115                                       }
   15116                                       Alignment align = decode_neon.GetAlign();
   15117                                       int lane = decode_neon.GetLane();
   15118                                       SpacingType spacing =
   15119                                           decode_neon.GetSpacing();
   15120                                       unsigned first =
   15121                                           ExtractDRegister(instr, 22, 12);
   15122                                       unsigned length = 2;
   15123                                       unsigned last =
   15124                                           first +
   15125                                           (length - 1) *
   15126                                               (spacing == kSingle ? 1 : 2);
   15127                                       unsigned rn = (instr >> 16) & 0xf;
   15128                                       // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
   15129                                       vst2(CurrentCond(),
   15130                                            dt,
   15131                                            NeonRegisterList(DRegister(first),
   15132                                                             DRegister(last),
   15133                                                             spacing,
   15134                                                             lane),
   15135                                            AlignedMemOperand(Register(rn),
   15136                                                              align,
   15137                                                              PostIndex));
   15138                                       break;
   15139                                     }
   15140                                     case 0x00000002: {
   15141                                       // 0xf980010f
   15142                                       if (((instr & 0xc00) == 0xc00)) {
   15143                                         UnallocatedT32(instr);
   15144                                         return;
   15145                                       }
   15146                                       DataType dt =
   15147                                           Dt_size_7_Decode((instr >> 10) & 0x3);
   15148                                       if (dt.Is(kDataTypeValueInvalid)) {
   15149                                         UnallocatedT32(instr);
   15150                                         return;
   15151                                       }
   15152                                       DecodeNeonAndAlign decode_neon =
   15153                                           Align_index_align_2_Decode((instr >>
   15154                                                                       4) &
   15155                                                                          0xf,
   15156                                                                      dt);
   15157                                       if (!decode_neon.IsValid()) {
   15158                                         UnallocatedT32(instr);
   15159                                         return;
   15160                                       }
   15161                                       Alignment align = decode_neon.GetAlign();
   15162                                       int lane = decode_neon.GetLane();
   15163                                       SpacingType spacing =
   15164                                           decode_neon.GetSpacing();
   15165                                       unsigned first =
   15166                                           ExtractDRegister(instr, 22, 12);
   15167                                       unsigned length = 2;
   15168                                       unsigned last =
   15169                                           first +
   15170                                           (length - 1) *
   15171                                               (spacing == kSingle ? 1 : 2);
   15172                                       unsigned rn = (instr >> 16) & 0xf;
   15173                                       // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
   15174                                       vst2(CurrentCond(),
   15175                                            dt,
   15176                                            NeonRegisterList(DRegister(first),
   15177                                                             DRegister(last),
   15178                                                             spacing,
   15179                                                             lane),
   15180                                            AlignedMemOperand(Register(rn),
   15181                                                              align,
   15182                                                              Offset));
   15183                                       break;
   15184                                     }
   15185                                   }
   15186                                   break;
   15187                                 }
   15188                                 default: {
   15189                                   if (((instr & 0xc00) == 0xc00) ||
   15190                                       ((instr & 0xd) == 0xd)) {
   15191                                     UnallocatedT32(instr);
   15192                                     return;
   15193                                   }
   15194                                   DataType dt =
   15195                                       Dt_size_7_Decode((instr >> 10) & 0x3);
   15196                                   if (dt.Is(kDataTypeValueInvalid)) {
   15197                                     UnallocatedT32(instr);
   15198                                     return;
   15199                                   }
   15200                                   DecodeNeonAndAlign decode_neon =
   15201                                       Align_index_align_2_Decode((instr >> 4) &
   15202                                                                      0xf,
   15203                                                                  dt);
   15204                                   if (!decode_neon.IsValid()) {
   15205                                     UnallocatedT32(instr);
   15206                                     return;
   15207                                   }
   15208                                   Alignment align = decode_neon.GetAlign();
   15209                                   int lane = decode_neon.GetLane();
   15210                                   SpacingType spacing =
   15211                                       decode_neon.GetSpacing();
   15212                                   unsigned first =
   15213                                       ExtractDRegister(instr, 22, 12);
   15214                                   unsigned length = 2;
   15215                                   unsigned last =
   15216                                       first +
   15217                                       (length - 1) *
   15218                                           (spacing == kSingle ? 1 : 2);
   15219                                   unsigned rn = (instr >> 16) & 0xf;
   15220                                   unsigned rm = instr & 0xf;
   15221                                   // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
   15222                                   vst2(CurrentCond(),
   15223                                        dt,
   15224                                        NeonRegisterList(DRegister(first),
   15225                                                         DRegister(last),
   15226                                                         spacing,
   15227                                                         lane),
   15228                                        AlignedMemOperand(Register(rn),
   15229                                                          align,
   15230                                                          Register(rm),
   15231                                                          PostIndex));
   15232                                   break;
   15233                                 }
   15234                               }
   15235                               break;
   15236                             }
   15237                           }
   15238                           break;
   15239                         }
   15240                         case 0x00000200: {
   15241                           // 0xf9800200
   15242                           switch (instr & 0x00000c30) {
   15243                             case 0x00000010: {
   15244                               // 0xf9800210
   15245                               UnallocatedT32(instr);
   15246                               break;
   15247                             }
   15248                             case 0x00000030: {
   15249                               // 0xf9800230
   15250                               UnallocatedT32(instr);
   15251                               break;
   15252                             }
   15253                             case 0x00000410: {
   15254                               // 0xf9800610
   15255                               UnallocatedT32(instr);
   15256                               break;
   15257                             }
   15258                             case 0x00000430: {
   15259                               // 0xf9800630
   15260                               UnallocatedT32(instr);
   15261                               break;
   15262                             }
   15263                             case 0x00000810: {
   15264                               // 0xf9800a10
   15265                               UnallocatedT32(instr);
   15266                               break;
   15267                             }
   15268                             case 0x00000820: {
   15269                               // 0xf9800a20
   15270                               UnallocatedT32(instr);
   15271                               break;
   15272                             }
   15273                             case 0x00000830: {
   15274                               // 0xf9800a30
   15275                               UnallocatedT32(instr);
   15276                               break;
   15277                             }
   15278                             case 0x00000c00: {
   15279                               // 0xf9800e00
   15280                               UnallocatedT32(instr);
   15281                               break;
   15282                             }
   15283                             case 0x00000c10: {
   15284                               // 0xf9800e10
   15285                               UnallocatedT32(instr);
   15286                               break;
   15287                             }
   15288                             case 0x00000c20: {
   15289                               // 0xf9800e20
   15290                               UnallocatedT32(instr);
   15291                               break;
   15292                             }
   15293                             case 0x00000c30: {
   15294                               // 0xf9800e30
   15295                               UnallocatedT32(instr);
   15296                               break;
   15297                             }
   15298                             default: {
   15299                               switch (instr & 0x0000000d) {
   15300                                 case 0x0000000d: {
   15301                                   // 0xf980020d
   15302                                   switch (instr & 0x00000002) {
   15303                                     case 0x00000000: {
   15304                                       // 0xf980020d
   15305                                       if (((instr & 0xc00) == 0xc00) ||
   15306                                           ((instr & 0x810) == 0x10) ||
   15307                                           ((instr & 0xc30) == 0x810) ||
   15308                                           ((instr & 0xc30) == 0x820) ||
   15309                                           ((instr & 0xc30) == 0x830)) {
   15310                                         UnallocatedT32(instr);
   15311                                         return;
   15312                                       }
   15313                                       DataType dt =
   15314                                           Dt_size_7_Decode((instr >> 10) & 0x3);
   15315                                       if (dt.Is(kDataTypeValueInvalid)) {
   15316                                         UnallocatedT32(instr);
   15317                                         return;
   15318                                       }
   15319                                       DecodeNeon decode_neon =
   15320                                           Index_1_Decode((instr >> 4) & 0xf,
   15321                                                          dt);
   15322                                       if (!decode_neon.IsValid()) {
   15323                                         UnallocatedT32(instr);
   15324                                         return;
   15325                                       }
   15326                                       int lane = decode_neon.GetLane();
   15327                                       SpacingType spacing =
   15328                                           decode_neon.GetSpacing();
   15329                                       unsigned first =
   15330                                           ExtractDRegister(instr, 22, 12);
   15331                                       unsigned length = 3;
   15332                                       unsigned last =
   15333                                           first +
   15334                                           (length - 1) *
   15335                                               (spacing == kSingle ? 1 : 2);
   15336                                       unsigned rn = (instr >> 16) & 0xf;
   15337                                       // VST3{<c>}{<q>}.<dt> <list>, [<Rn>]! ; T1 NOLINT(whitespace/line_length)
   15338                                       vst3(CurrentCond(),
   15339                                            dt,
   15340                                            NeonRegisterList(DRegister(first),
   15341                                                             DRegister(last),
   15342                                                             spacing,
   15343                                                             lane),
   15344                                            MemOperand(Register(rn), PostIndex));
   15345                                       break;
   15346                                     }
   15347                                     case 0x00000002: {
   15348                                       // 0xf980020f
   15349                                       if (((instr & 0xc00) == 0xc00) ||
   15350                                           ((instr & 0x810) == 0x10) ||
   15351                                           ((instr & 0xc30) == 0x810) ||
   15352                                           ((instr & 0xc30) == 0x820) ||
   15353                                           ((instr & 0xc30) == 0x830)) {
   15354                                         UnallocatedT32(instr);
   15355                                         return;
   15356                                       }
   15357                                       DataType dt =
   15358                                           Dt_size_7_Decode((instr >> 10) & 0x3);
   15359                                       if (dt.Is(kDataTypeValueInvalid)) {
   15360                                         UnallocatedT32(instr);
   15361                                         return;
   15362                                       }
   15363                                       DecodeNeon decode_neon =
   15364                                           Index_1_Decode((instr >> 4) & 0xf,
   15365                                                          dt);
   15366                                       if (!decode_neon.IsValid()) {
   15367                                         UnallocatedT32(instr);
   15368                                         return;
   15369                                       }
   15370                                       int lane = decode_neon.GetLane();
   15371                                       SpacingType spacing =
   15372                                           decode_neon.GetSpacing();
   15373                                       unsigned first =
   15374                                           ExtractDRegister(instr, 22, 12);
   15375                                       unsigned length = 3;
   15376                                       unsigned last =
   15377                                           first +
   15378                                           (length - 1) *
   15379                                               (spacing == kSingle ? 1 : 2);
   15380                                       unsigned rn = (instr >> 16) & 0xf;
   15381                                       // VST3{<c>}{<q>}.<dt> <list>, [<Rn>] ; T1
   15382                                       vst3(CurrentCond(),
   15383                                            dt,
   15384                                            NeonRegisterList(DRegister(first),
   15385                                                             DRegister(last),
   15386                                                             spacing,
   15387                                                             lane),
   15388                                            MemOperand(Register(rn), Offset));
   15389                                       break;
   15390                                     }
   15391                                   }
   15392                                   break;
   15393                                 }
   15394                                 default: {
   15395                                   if (((instr & 0xc00) == 0xc00) ||
   15396                                       ((instr & 0xd) == 0xd) ||
   15397                                       ((instr & 0x810) == 0x10) ||
   15398                                       ((instr & 0xc30) == 0x810) ||
   15399                                       ((instr & 0xc30) == 0x820) ||
   15400                                       ((instr & 0xc30) == 0x830)) {
   15401                                     UnallocatedT32(instr);
   15402                                     return;
   15403                                   }
   15404                                   DataType dt =
   15405                                       Dt_size_7_Decode((instr >> 10) & 0x3);
   15406                                   if (dt.Is(kDataTypeValueInvalid)) {
   15407                                     UnallocatedT32(instr);
   15408                                     return;
   15409                                   }
   15410                                   DecodeNeon decode_neon =
   15411                                       Index_1_Decode((instr >> 4) & 0xf, dt);
   15412                                   if (!decode_neon.IsValid()) {
   15413                                     UnallocatedT32(instr);
   15414                                     return;
   15415                                   }
   15416                                   int lane = decode_neon.GetLane();
   15417                                   SpacingType spacing =
   15418                                       decode_neon.GetSpacing();
   15419                                   unsigned first =
   15420                                       ExtractDRegister(instr, 22, 12);
   15421                                   unsigned length = 3;
   15422                                   unsigned last =
   15423                                       first +
   15424                                       (length - 1) *
   15425                                           (spacing == kSingle ? 1 : 2);
   15426                                   unsigned rn = (instr >> 16) & 0xf;
   15427                                   Sign sign(plus);
   15428                                   unsigned rm = instr & 0xf;
   15429                                   // VST3{<c>}{<q>}.<dt> <list>, [<Rn>], #<Rm> ; T1 NOLINT(whitespace/line_length)
   15430                                   vst3(CurrentCond(),
   15431                                        dt,
   15432                                        NeonRegisterList(DRegister(first),
   15433                                                         DRegister(last),
   15434                                                         spacing,
   15435                                                         lane),
   15436                                        MemOperand(Register(rn),
   15437                                                   sign,
   15438                                                   Register(rm),
   15439                                                   PostIndex));
   15440                                   break;
   15441                                 }
   15442                               }
   15443                               break;
   15444                             }
   15445                           }
   15446                           break;
   15447                         }
   15448                         case 0x00000300: {
   15449                           // 0xf9800300
   15450                           switch (instr & 0x00000c00) {
   15451                             case 0x00000c00: {
   15452                               // 0xf9800f00
   15453                               UnallocatedT32(instr);
   15454                               break;
   15455                             }
   15456                             default: {
   15457                               switch (instr & 0x0000000d) {
   15458                                 case 0x0000000d: {
   15459                                   // 0xf980030d
   15460                                   switch (instr & 0x00000002) {
   15461                                     case 0x00000000: {
   15462                                       // 0xf980030d
   15463                                       if (((instr & 0xc00) == 0xc00)) {
   15464                                         UnallocatedT32(instr);
   15465                                         return;
   15466                                       }
   15467                                       DataType dt =
   15468                                           Dt_size_7_Decode((instr >> 10) & 0x3);
   15469                                       if (dt.Is(kDataTypeValueInvalid)) {
   15470                                         UnallocatedT32(instr);
   15471                                         return;
   15472                                       }
   15473                                       DecodeNeonAndAlign decode_neon =
   15474                                           Align_index_align_3_Decode((instr >>
   15475                                                                       4) &
   15476                                                                          0xf,
   15477                                                                      dt);
   15478                                       if (!decode_neon.IsValid()) {
   15479                                         UnallocatedT32(instr);
   15480                                         return;
   15481                                       }
   15482                                       Alignment align = decode_neon.GetAlign();
   15483                                       int lane = decode_neon.GetLane();
   15484                                       SpacingType spacing =
   15485                                           decode_neon.GetSpacing();
   15486                                       unsigned first =
   15487                                           ExtractDRegister(instr, 22, 12);
   15488                                       unsigned length = 4;
   15489                                       unsigned last =
   15490                                           first +
   15491                                           (length - 1) *
   15492                                               (spacing == kSingle ? 1 : 2);
   15493                                       unsigned rn = (instr >> 16) & 0xf;
   15494                                       // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
   15495                                       vst4(CurrentCond(),
   15496                                            dt,
   15497                                            NeonRegisterList(DRegister(first),
   15498                                                             DRegister(last),
   15499                                                             spacing,
   15500                                                             lane),
   15501                                            AlignedMemOperand(Register(rn),
   15502                                                              align,
   15503                                                              PostIndex));
   15504                                       break;
   15505                                     }
   15506                                     case 0x00000002: {
   15507                                       // 0xf980030f
   15508                                       if (((instr & 0xc00) == 0xc00)) {
   15509                                         UnallocatedT32(instr);
   15510                                         return;
   15511                                       }
   15512                                       DataType dt =
   15513                                           Dt_size_7_Decode((instr >> 10) & 0x3);
   15514                                       if (dt.Is(kDataTypeValueInvalid)) {
   15515                                         UnallocatedT32(instr);
   15516                                         return;
   15517                                       }
   15518                                       DecodeNeonAndAlign decode_neon =
   15519                                           Align_index_align_3_Decode((instr >>
   15520                                                                       4) &
   15521                                                                          0xf,
   15522                                                                      dt);
   15523                                       if (!decode_neon.IsValid()) {
   15524                                         UnallocatedT32(instr);
   15525                                         return;
   15526                                       }
   15527                                       Alignment align = decode_neon.GetAlign();
   15528                                       int lane = decode_neon.GetLane();
   15529                                       SpacingType spacing =
   15530                                           decode_neon.GetSpacing();
   15531                                       unsigned first =
   15532                                           ExtractDRegister(instr, 22, 12);
   15533                                       unsigned length = 4;
   15534                                       unsigned last =
   15535                                           first +
   15536                                           (length - 1) *
   15537                                               (spacing == kSingle ? 1 : 2);
   15538                                       unsigned rn = (instr >> 16) & 0xf;
   15539                                       // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
   15540                                       vst4(CurrentCond(),
   15541                                            dt,
   15542                                            NeonRegisterList(DRegister(first),
   15543                                                             DRegister(last),
   15544                                                             spacing,
   15545                                                             lane),
   15546                                            AlignedMemOperand(Register(rn),
   15547                                                              align,
   15548                                                              Offset));
   15549                                       break;
   15550                                     }
   15551                                   }
   15552                                   break;
   15553                                 }
   15554                                 default: {
   15555                                   if (((instr & 0xc00) == 0xc00) ||
   15556                                       ((instr & 0xd) == 0xd)) {
   15557                                     UnallocatedT32(instr);
   15558                                     return;
   15559                                   }
   15560                                   DataType dt =
   15561                                       Dt_size_7_Decode((instr >> 10) & 0x3);
   15562                                   if (dt.Is(kDataTypeValueInvalid)) {
   15563                                     UnallocatedT32(instr);
   15564                                     return;
   15565                                   }
   15566                                   DecodeNeonAndAlign decode_neon =
   15567                                       Align_index_align_3_Decode((instr >> 4) &
   15568                                                                      0xf,
   15569                                                                  dt);
   15570                                   if (!decode_neon.IsValid()) {
   15571                                     UnallocatedT32(instr);
   15572                                     return;
   15573                                   }
   15574                                   Alignment align = decode_neon.GetAlign();
   15575                                   int lane = decode_neon.GetLane();
   15576                                   SpacingType spacing =
   15577                                       decode_neon.GetSpacing();
   15578                                   unsigned first =
   15579                                       ExtractDRegister(instr, 22, 12);
   15580                                   unsigned length = 4;
   15581                                   unsigned last =
   15582                                       first +
   15583                                       (length - 1) *
   15584                                           (spacing == kSingle ? 1 : 2);
   15585                                   unsigned rn = (instr >> 16) & 0xf;
   15586                                   unsigned rm = instr & 0xf;
   15587                                   // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
   15588                                   vst4(CurrentCond(),
   15589                                        dt,
   15590                                        NeonRegisterList(DRegister(first),
   15591                                                         DRegister(last),
   15592                                                         spacing,
   15593                                                         lane),
   15594                                        AlignedMemOperand(Register(rn),
   15595                                                          align,
   15596                                                          Register(rm),
   15597                                                          PostIndex));
   15598                                   break;
   15599                                 }
   15600                               }
   15601                               break;
   15602                             }
   15603                           }
   15604                           break;
   15605                         }
   15606                       }
   15607                       break;
   15608                     }
   15609                     case 0x01a00000: {
   15610                       // 0xf9a00000
   15611                       switch (instr & 0x00000300) {
   15612                         case 0x00000000: {
   15613                           // 0xf9a00000
   15614                           switch (instr & 0x00000c00) {
   15615                             case 0x00000c00: {
   15616                               // 0xf9a00c00
   15617                               switch (instr & 0x0000000d) {
   15618                                 case 0x0000000d: {
   15619                                   // 0xf9a00c0d
   15620                                   switch (instr & 0x00000002) {
   15621                                     case 0x00000000: {
   15622                                       // 0xf9a00c0d
   15623                                       DataType dt =
   15624                                           Dt_size_7_Decode((instr >> 6) & 0x3);
   15625                                       if (dt.Is(kDataTypeValueInvalid)) {
   15626                                         UnallocatedT32(instr);
   15627                                         return;
   15628                                       }
   15629                                       Alignment align =
   15630                                           Align_a_1_Decode((instr >> 4) & 0x1,
   15631                                                            dt);
   15632                                       if (dt.Is(kDataTypeValueInvalid) ||
   15633                                           align.Is(kBadAlignment)) {
   15634                                         UnallocatedT32(instr);
   15635                                         return;
   15636                                       }
   15637                                       unsigned first =
   15638                                           ExtractDRegister(instr, 22, 12);
   15639                                       unsigned length;
   15640                                       SpacingType spacing = kSingle;
   15641                                       switch ((instr >> 5) & 0x1) {
   15642                                         default:
   15643                                           VIXL_UNREACHABLE_OR_FALLTHROUGH();
   15644                                         case 0x0:
   15645                                           length = 1;
   15646                                           break;
   15647                                         case 0x1:
   15648                                           length = 2;
   15649                                           break;
   15650                                       }
   15651                                       unsigned last = first + length - 1;
   15652                                       TransferType transfer = kAllLanes;
   15653                                       unsigned rn = (instr >> 16) & 0xf;
   15654                                       // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
   15655                                       vld1(CurrentCond(),
   15656                                            dt,
   15657                                            NeonRegisterList(DRegister(first),
   15658                                                             DRegister(last),
   15659                                                             spacing,
   15660                                                             transfer),
   15661                                            AlignedMemOperand(Register(rn),
   15662                                                              align,
   15663                                                              PostIndex));
   15664                                       break;
   15665                                     }
   15666                                     case 0x00000002: {
   15667                                       // 0xf9a00c0f
   15668                                       DataType dt =
   15669                                           Dt_size_7_Decode((instr >> 6) & 0x3);
   15670                                       if (dt.Is(kDataTypeValueInvalid)) {
   15671                                         UnallocatedT32(instr);
   15672                                         return;
   15673                                       }
   15674                                       Alignment align =
   15675                                           Align_a_1_Decode((instr >> 4) & 0x1,
   15676                                                            dt);
   15677                                       if (dt.Is(kDataTypeValueInvalid) ||
   15678                                           align.Is(kBadAlignment)) {
   15679                                         UnallocatedT32(instr);
   15680                                         return;
   15681                                       }
   15682                                       unsigned first =
   15683                                           ExtractDRegister(instr, 22, 12);
   15684                                       unsigned length;
   15685                                       SpacingType spacing = kSingle;
   15686                                       switch ((instr >> 5) & 0x1) {
   15687                                         default:
   15688                                           VIXL_UNREACHABLE_OR_FALLTHROUGH();
   15689                                         case 0x0:
   15690                                           length = 1;
   15691                                           break;
   15692                                         case 0x1:
   15693                                           length = 2;
   15694                                           break;
   15695                                       }
   15696                                       unsigned last = first + length - 1;
   15697                                       TransferType transfer = kAllLanes;
   15698                                       unsigned rn = (instr >> 16) & 0xf;
   15699                                       // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
   15700                                       vld1(CurrentCond(),
   15701                                            dt,
   15702                                            NeonRegisterList(DRegister(first),
   15703                                                             DRegister(last),
   15704                                                             spacing,
   15705                                                             transfer),
   15706                                            AlignedMemOperand(Register(rn),
   15707                                                              align,
   15708                                                              Offset));
   15709                                       break;
   15710                                     }
   15711                                   }
   15712                                   break;
   15713                                 }
   15714                                 default: {
   15715                                   if (((instr & 0xd) == 0xd)) {
   15716                                     UnallocatedT32(instr);
   15717                                     return;
   15718                                   }
   15719                                   DataType dt =
   15720                                       Dt_size_7_Decode((instr >> 6) & 0x3);
   15721                                   if (dt.Is(kDataTypeValueInvalid)) {
   15722                                     UnallocatedT32(instr);
   15723                                     return;
   15724                                   }
   15725                                   Alignment align =
   15726                                       Align_a_1_Decode((instr >> 4) & 0x1, dt);
   15727                                   if (dt.Is(kDataTypeValueInvalid) ||
   15728                                       align.Is(kBadAlignment)) {
   15729                                     UnallocatedT32(instr);
   15730                                     return;
   15731                                   }
   15732                                   unsigned first =
   15733                                       ExtractDRegister(instr, 22, 12);
   15734                                   unsigned length;
   15735                                   SpacingType spacing = kSingle;
   15736                                   switch ((instr >> 5) & 0x1) {
   15737                                     default:
   15738                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
   15739                                     case 0x0:
   15740                                       length = 1;
   15741                                       break;
   15742                                     case 0x1:
   15743                                       length = 2;
   15744                                       break;
   15745                                   }
   15746                                   unsigned last = first + length - 1;
   15747                                   TransferType transfer = kAllLanes;
   15748                                   unsigned rn = (instr >> 16) & 0xf;
   15749                                   unsigned rm = instr & 0xf;
   15750                                   // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
   15751                                   vld1(CurrentCond(),
   15752                                        dt,
   15753                                        NeonRegisterList(DRegister(first),
   15754                                                         DRegister(last),
   15755                                                         spacing,
   15756                                                         transfer),
   15757                                        AlignedMemOperand(Register(rn),
   15758                                                          align,
   15759                                                          Register(rm),
   15760                                                          PostIndex));
   15761                                   break;
   15762                                 }
   15763                               }
   15764                               break;
   15765                             }
   15766                             default: {
   15767                               switch (instr & 0x0000000d) {
   15768                                 case 0x0000000d: {
   15769                                   // 0xf9a0000d
   15770                                   switch (instr & 0x00000002) {
   15771                                     case 0x00000000: {
   15772                                       // 0xf9a0000d
   15773                                       if (((instr & 0xc00) == 0xc00)) {
   15774                                         UnallocatedT32(instr);
   15775                                         return;
   15776                                       }
   15777                                       DataType dt =
   15778                                           Dt_size_7_Decode((instr >> 10) & 0x3);
   15779                                       if (dt.Is(kDataTypeValueInvalid)) {
   15780                                         UnallocatedT32(instr);
   15781                                         return;
   15782                                       }
   15783                                       DecodeNeonAndAlign decode_neon =
   15784                                           Align_index_align_1_Decode((instr >>
   15785                                                                       4) &
   15786                                                                          0xf,
   15787                                                                      dt);
   15788                                       if (!decode_neon.IsValid()) {
   15789                                         UnallocatedT32(instr);
   15790                                         return;
   15791                                       }
   15792                                       Alignment align = decode_neon.GetAlign();
   15793                                       int lane = decode_neon.GetLane();
   15794                                       SpacingType spacing =
   15795                                           decode_neon.GetSpacing();
   15796                                       unsigned first =
   15797                                           ExtractDRegister(instr, 22, 12);
   15798                                       unsigned length = 1;
   15799                                       unsigned last = first + length - 1;
   15800                                       unsigned rn = (instr >> 16) & 0xf;
   15801                                       // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
   15802                                       vld1(CurrentCond(),
   15803                                            dt,
   15804                                            NeonRegisterList(DRegister(first),
   15805                                                             DRegister(last),
   15806                                                             spacing,
   15807                                                             lane),
   15808                                            AlignedMemOperand(Register(rn),
   15809                                                              align,
   15810                                                              PostIndex));
   15811                                       break;
   15812                                     }
   15813                                     case 0x00000002: {
   15814                                       // 0xf9a0000f
   15815                                       if (((instr & 0xc00) == 0xc00)) {
   15816                                         UnallocatedT32(instr);
   15817                                         return;
   15818                                       }
   15819                                       DataType dt =
   15820                                           Dt_size_7_Decode((instr >> 10) & 0x3);
   15821                                       if (dt.Is(kDataTypeValueInvalid)) {
   15822                                         UnallocatedT32(instr);
   15823                                         return;
   15824                                       }
   15825                                       DecodeNeonAndAlign decode_neon =
   15826                                           Align_index_align_1_Decode((instr >>
   15827                                                                       4) &
   15828                                                                          0xf,
   15829                                                                      dt);
   15830                                       if (!decode_neon.IsValid()) {
   15831                                         UnallocatedT32(instr);
   15832                                         return;
   15833                                       }
   15834                                       Alignment align = decode_neon.GetAlign();
   15835                                       int lane = decode_neon.GetLane();
   15836                                       SpacingType spacing =
   15837                                           decode_neon.GetSpacing();
   15838                                       unsigned first =
   15839                                           ExtractDRegister(instr, 22, 12);
   15840                                       unsigned length = 1;
   15841                                       unsigned last = first + length - 1;
   15842                                       unsigned rn = (instr >> 16) & 0xf;
   15843                                       // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
   15844                                       vld1(CurrentCond(),
   15845                                            dt,
   15846                                            NeonRegisterList(DRegister(first),
   15847                                                             DRegister(last),
   15848                                                             spacing,
   15849                                                             lane),
   15850                                            AlignedMemOperand(Register(rn),
   15851                                                              align,
   15852                                                              Offset));
   15853                                       break;
   15854                                     }
   15855                                   }
   15856                                   break;
   15857                                 }
   15858                                 default: {
   15859                                   if (((instr & 0xc00) == 0xc00) ||
   15860                                       ((instr & 0xd) == 0xd)) {
   15861                                     UnallocatedT32(instr);
   15862                                     return;
   15863                                   }
   15864                                   DataType dt =
   15865                                       Dt_size_7_Decode((instr >> 10) & 0x3);
   15866                                   if (dt.Is(kDataTypeValueInvalid)) {
   15867                                     UnallocatedT32(instr);
   15868                                     return;
   15869                                   }
   15870                                   DecodeNeonAndAlign decode_neon =
   15871                                       Align_index_align_1_Decode((instr >> 4) &
   15872                                                                      0xf,
   15873                                                                  dt);
   15874                                   if (!decode_neon.IsValid()) {
   15875                                     UnallocatedT32(instr);
   15876                                     return;
   15877                                   }
   15878                                   Alignment align = decode_neon.GetAlign();
   15879                                   int lane = decode_neon.GetLane();
   15880                                   SpacingType spacing =
   15881                                       decode_neon.GetSpacing();
   15882                                   unsigned first =
   15883                                       ExtractDRegister(instr, 22, 12);
   15884                                   unsigned length = 1;
   15885                                   unsigned last = first + length - 1;
   15886                                   unsigned rn = (instr >> 16) & 0xf;
   15887                                   unsigned rm = instr & 0xf;
   15888                                   // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
   15889                                   vld1(CurrentCond(),
   15890                                        dt,
   15891                                        NeonRegisterList(DRegister(first),
   15892                                                         DRegister(last),
   15893                                                         spacing,
   15894                                                         lane),
   15895                                        AlignedMemOperand(Register(rn),
   15896                                                          align,
   15897                                                          Register(rm),
   15898                                                          PostIndex));
   15899                                   break;
   15900                                 }
   15901                               }
   15902                               break;
   15903                             }
   15904                           }
   15905                           break;
   15906                         }
   15907                         case 0x00000100: {
   15908                           // 0xf9a00100
   15909                           switch (instr & 0x00000c00) {
   15910                             case 0x00000c00: {
   15911                               // 0xf9a00d00
   15912                               switch (instr & 0x0000000d) {
   15913                                 case 0x0000000d: {
   15914                                   // 0xf9a00d0d
   15915                                   switch (instr & 0x00000002) {
   15916                                     case 0x00000000: {
   15917                                       // 0xf9a00d0d
   15918                                       DataType dt =
   15919                                           Dt_size_7_Decode((instr >> 6) & 0x3);
   15920                                       if (dt.Is(kDataTypeValueInvalid)) {
   15921                                         UnallocatedT32(instr);
   15922                                         return;
   15923                                       }
   15924                                       Alignment align =
   15925                                           Align_a_2_Decode((instr >> 4) & 0x1,
   15926                                                            dt);
   15927                                       if (dt.Is(kDataTypeValueInvalid) ||
   15928                                           align.Is(kBadAlignment)) {
   15929                                         UnallocatedT32(instr);
   15930                                         return;
   15931                                       }
   15932                                       unsigned first =
   15933                                           ExtractDRegister(instr, 22, 12);
   15934                                       unsigned length;
   15935                                       SpacingType spacing;
   15936                                       switch ((instr >> 5) & 0x1) {
   15937                                         default:
   15938                                           VIXL_UNREACHABLE_OR_FALLTHROUGH();
   15939                                         case 0x0:
   15940                                           length = 2;
   15941                                           spacing = kSingle;
   15942                                           break;
   15943                                         case 0x1:
   15944                                           length = 2;
   15945                                           spacing = kDouble;
   15946                                           break;
   15947                                       }
   15948                                       unsigned last =
   15949                                           first +
   15950                                           (length - 1) *
   15951                                               (spacing == kSingle ? 1 : 2);
   15952                                       TransferType transfer = kAllLanes;
   15953                                       unsigned rn = (instr >> 16) & 0xf;
   15954                                       // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
   15955                                       vld2(CurrentCond(),
   15956                                            dt,
   15957                                            NeonRegisterList(DRegister(first),
   15958                                                             DRegister(last),
   15959                                                             spacing,
   15960                                                             transfer),
   15961                                            AlignedMemOperand(Register(rn),
   15962                                                              align,
   15963                                                              PostIndex));
   15964                                       break;
   15965                                     }
   15966                                     case 0x00000002: {
   15967                                       // 0xf9a00d0f
   15968                                       DataType dt =
   15969                                           Dt_size_7_Decode((instr >> 6) & 0x3);
   15970                                       if (dt.Is(kDataTypeValueInvalid)) {
   15971                                         UnallocatedT32(instr);
   15972                                         return;
   15973                                       }
   15974                                       Alignment align =
   15975                                           Align_a_2_Decode((instr >> 4) & 0x1,
   15976                                                            dt);
   15977                                       if (dt.Is(kDataTypeValueInvalid) ||
   15978                                           align.Is(kBadAlignment)) {
   15979                                         UnallocatedT32(instr);
   15980                                         return;
   15981                                       }
   15982                                       unsigned first =
   15983                                           ExtractDRegister(instr, 22, 12);
   15984                                       unsigned length;
   15985                                       SpacingType spacing;
   15986                                       switch ((instr >> 5) & 0x1) {
   15987                                         default:
   15988                                           VIXL_UNREACHABLE_OR_FALLTHROUGH();
   15989                                         case 0x0:
   15990                                           length = 2;
   15991                                           spacing = kSingle;
   15992                                           break;
   15993                                         case 0x1:
   15994                                           length = 2;
   15995                                           spacing = kDouble;
   15996                                           break;
   15997                                       }
   15998                                       unsigned last =
   15999                                           first +
   16000                                           (length - 1) *
   16001                                               (spacing == kSingle ? 1 : 2);
   16002                                       TransferType transfer = kAllLanes;
   16003                                       unsigned rn = (instr >> 16) & 0xf;
   16004                                       // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
   16005                                       vld2(CurrentCond(),
   16006                                            dt,
   16007                                            NeonRegisterList(DRegister(first),
   16008                                                             DRegister(last),
   16009                                                             spacing,
   16010                                                             transfer),
   16011                                            AlignedMemOperand(Register(rn),
   16012                                                              align,
   16013                                                              Offset));
   16014                                       break;
   16015                                     }
   16016                                   }
   16017                                   break;
   16018                                 }
   16019                                 default: {
   16020                                   if (((instr & 0xd) == 0xd)) {
   16021                                     UnallocatedT32(instr);
   16022                                     return;
   16023                                   }
   16024                                   DataType dt =
   16025                                       Dt_size_7_Decode((instr >> 6) & 0x3);
   16026                                   if (dt.Is(kDataTypeValueInvalid)) {
   16027                                     UnallocatedT32(instr);
   16028                                     return;
   16029                                   }
   16030                                   Alignment align =
   16031                                       Align_a_2_Decode((instr >> 4) & 0x1, dt);
   16032                                   if (dt.Is(kDataTypeValueInvalid) ||
   16033                                       align.Is(kBadAlignment)) {
   16034                                     UnallocatedT32(instr);
   16035                                     return;
   16036                                   }
   16037                                   unsigned first =
   16038                                       ExtractDRegister(instr, 22, 12);
   16039                                   unsigned length;
   16040                                   SpacingType spacing;
   16041                                   switch ((instr >> 5) & 0x1) {
   16042                                     default:
   16043                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
   16044                                     case 0x0:
   16045                                       length = 2;
   16046                                       spacing = kSingle;
   16047                                       break;
   16048                                     case 0x1:
   16049                                       length = 2;
   16050                                       spacing = kDouble;
   16051                                       break;
   16052                                   }
   16053                                   unsigned last =
   16054                                       first +
   16055                                       (length - 1) *
   16056                                           (spacing == kSingle ? 1 : 2);
   16057                                   TransferType transfer = kAllLanes;
   16058                                   unsigned rn = (instr >> 16) & 0xf;
   16059                                   unsigned rm = instr & 0xf;
   16060                                   // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
   16061                                   vld2(CurrentCond(),
   16062                                        dt,
   16063                                        NeonRegisterList(DRegister(first),
   16064                                                         DRegister(last),
   16065                                                         spacing,
   16066                                                         transfer),
   16067                                        AlignedMemOperand(Register(rn),
   16068                                                          align,
   16069                                                          Register(rm),
   16070                                                          PostIndex));
   16071                                   break;
   16072                                 }
   16073                               }
   16074                               break;
   16075                             }
   16076                             default: {
   16077                               switch (instr & 0x0000000d) {
   16078                                 case 0x0000000d: {
   16079                                   // 0xf9a0010d
   16080                                   switch (instr & 0x00000002) {
   16081                                     case 0x00000000: {
   16082                                       // 0xf9a0010d
   16083                                       if (((instr & 0xc00) == 0xc00)) {
   16084                                         UnallocatedT32(instr);
   16085                                         return;
   16086                                       }
   16087                                       DataType dt =
   16088                                           Dt_size_7_Decode((instr >> 10) & 0x3);
   16089                                       if (dt.Is(kDataTypeValueInvalid)) {
   16090                                         UnallocatedT32(instr);
   16091                                         return;
   16092                                       }
   16093                                       DecodeNeonAndAlign decode_neon =
   16094                                           Align_index_align_2_Decode((instr >>
   16095                                                                       4) &
   16096                                                                          0xf,
   16097                                                                      dt);
   16098                                       if (!decode_neon.IsValid()) {
   16099                                         UnallocatedT32(instr);
   16100                                         return;
   16101                                       }
   16102                                       Alignment align = decode_neon.GetAlign();
   16103                                       int lane = decode_neon.GetLane();
   16104                                       SpacingType spacing =
   16105                                           decode_neon.GetSpacing();
   16106                                       unsigned first =
   16107                                           ExtractDRegister(instr, 22, 12);
   16108                                       unsigned length = 2;
   16109                                       unsigned last =
   16110                                           first +
   16111                                           (length - 1) *
   16112                                               (spacing == kSingle ? 1 : 2);
   16113                                       unsigned rn = (instr >> 16) & 0xf;
   16114                                       // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
   16115                                       vld2(CurrentCond(),
   16116                                            dt,
   16117                                            NeonRegisterList(DRegister(first),
   16118                                                             DRegister(last),
   16119                                                             spacing,
   16120                                                             lane),
   16121                                            AlignedMemOperand(Register(rn),
   16122                                                              align,
   16123                                                              PostIndex));
   16124                                       break;
   16125                                     }
   16126                                     case 0x00000002: {
   16127                                       // 0xf9a0010f
   16128                                       if (((instr & 0xc00) == 0xc00)) {
   16129                                         UnallocatedT32(instr);
   16130                                         return;
   16131                                       }
   16132                                       DataType dt =
   16133                                           Dt_size_7_Decode((instr >> 10) & 0x3);
   16134                                       if (dt.Is(kDataTypeValueInvalid)) {
   16135                                         UnallocatedT32(instr);
   16136                                         return;
   16137                                       }
   16138                                       DecodeNeonAndAlign decode_neon =
   16139                                           Align_index_align_2_Decode((instr >>
   16140                                                                       4) &
   16141                                                                          0xf,
   16142                                                                      dt);
   16143                                       if (!decode_neon.IsValid()) {
   16144                                         UnallocatedT32(instr);
   16145                                         return;
   16146                                       }
   16147                                       Alignment align = decode_neon.GetAlign();
   16148                                       int lane = decode_neon.GetLane();
   16149                                       SpacingType spacing =
   16150                                           decode_neon.GetSpacing();
   16151                                       unsigned first =
   16152                                           ExtractDRegister(instr, 22, 12);
   16153                                       unsigned length = 2;
   16154                                       unsigned last =
   16155                                           first +
   16156                                           (length - 1) *
   16157                                               (spacing == kSingle ? 1 : 2);
   16158                                       unsigned rn = (instr >> 16) & 0xf;
   16159                                       // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
   16160                                       vld2(CurrentCond(),
   16161                                            dt,
   16162                                            NeonRegisterList(DRegister(first),
   16163                                                             DRegister(last),
   16164                                                             spacing,
   16165                                                             lane),
   16166                                            AlignedMemOperand(Register(rn),
   16167                                                              align,
   16168                                                              Offset));
   16169                                       break;
   16170                                     }
   16171                                   }
   16172                                   break;
   16173                                 }
   16174                                 default: {
   16175                                   if (((instr & 0xc00) == 0xc00) ||
   16176                                       ((instr & 0xd) == 0xd)) {
   16177                                     UnallocatedT32(instr);
   16178                                     return;
   16179                                   }
   16180                                   DataType dt =
   16181                                       Dt_size_7_Decode((instr >> 10) & 0x3);
   16182                                   if (dt.Is(kDataTypeValueInvalid)) {
   16183                                     UnallocatedT32(instr);
   16184                                     return;
   16185                                   }
   16186                                   DecodeNeonAndAlign decode_neon =
   16187                                       Align_index_align_2_Decode((instr >> 4) &
   16188                                                                      0xf,
   16189                                                                  dt);
   16190                                   if (!decode_neon.IsValid()) {
   16191                                     UnallocatedT32(instr);
   16192                                     return;
   16193                                   }
   16194                                   Alignment align = decode_neon.GetAlign();
   16195                                   int lane = decode_neon.GetLane();
   16196                                   SpacingType spacing =
   16197                                       decode_neon.GetSpacing();
   16198                                   unsigned first =
   16199                                       ExtractDRegister(instr, 22, 12);
   16200                                   unsigned length = 2;
   16201                                   unsigned last =
   16202                                       first +
   16203                                       (length - 1) *
   16204                                           (spacing == kSingle ? 1 : 2);
   16205                                   unsigned rn = (instr >> 16) & 0xf;
   16206                                   unsigned rm = instr & 0xf;
   16207                                   // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
   16208                                   vld2(CurrentCond(),
   16209                                        dt,
   16210                                        NeonRegisterList(DRegister(first),
   16211                                                         DRegister(last),
   16212                                                         spacing,
   16213                                                         lane),
   16214                                        AlignedMemOperand(Register(rn),
   16215                                                          align,
   16216                                                          Register(rm),
   16217                                                          PostIndex));
   16218                                   break;
   16219                                 }
   16220                               }
   16221                               break;
   16222                             }
   16223                           }
   16224                           break;
   16225                         }
   16226                         case 0x00000200: {
   16227                           // 0xf9a00200
   16228                           switch (instr & 0x00000c00) {
   16229                             case 0x00000c00: {
   16230                               // 0xf9a00e00
   16231                               switch (instr & 0x00000010) {
   16232                                 case 0x00000000: {
   16233                                   // 0xf9a00e00
   16234                                   switch (instr & 0x0000000d) {
   16235                                     case 0x0000000d: {
   16236                                       // 0xf9a00e0d
   16237                                       switch (instr & 0x00000002) {
   16238                                         case 0x00000000: {
   16239                                           // 0xf9a00e0d
   16240                                           DataType dt = Dt_size_7_Decode(
   16241                                               (instr >> 6) & 0x3);
   16242                                           if (dt.Is(kDataTypeValueInvalid)) {
   16243                                             UnallocatedT32(instr);
   16244                                             return;
   16245                                           }
   16246                                           unsigned first =
   16247                                               ExtractDRegister(instr, 22, 12);
   16248                                           unsigned length;
   16249                                           SpacingType spacing;
   16250                                           switch ((instr >> 5) & 0x1) {
   16251                                             default:
   16252                                               VIXL_UNREACHABLE_OR_FALLTHROUGH();
   16253                                             case 0x0:
   16254                                               length = 3;
   16255                                               spacing = kSingle;
   16256                                               break;
   16257                                             case 0x1:
   16258                                               length = 3;
   16259                                               spacing = kDouble;
   16260                                               break;
   16261                                           }
   16262                                           unsigned last =
   16263                                               first +
   16264                                               (length - 1) *
   16265                                                   (spacing == kSingle ? 1 : 2);
   16266                                           TransferType transfer = kAllLanes;
   16267                                           unsigned rn = (instr >> 16) & 0xf;
   16268                                           // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>]! ; T1 NOLINT(whitespace/line_length)
   16269                                           vld3(CurrentCond(),
   16270                                                dt,
   16271                                                NeonRegisterList(DRegister(
   16272                                                                     first),
   16273                                                                 DRegister(last),
   16274                                                                 spacing,
   16275                                                                 transfer),
   16276                                                MemOperand(Register(rn),
   16277                                                           PostIndex));
   16278                                           break;
   16279                                         }
   16280                                         case 0x00000002: {
   16281                                           // 0xf9a00e0f
   16282                                           DataType dt = Dt_size_7_Decode(
   16283                                               (instr >> 6) & 0x3);
   16284                                           if (dt.Is(kDataTypeValueInvalid)) {
   16285                                             UnallocatedT32(instr);
   16286                                             return;
   16287                                           }
   16288                                           unsigned first =
   16289                                               ExtractDRegister(instr, 22, 12);
   16290                                           unsigned length;
   16291                                           SpacingType spacing;
   16292                                           switch ((instr >> 5) & 0x1) {
   16293                                             default:
   16294                                               VIXL_UNREACHABLE_OR_FALLTHROUGH();
   16295                                             case 0x0:
   16296                                               length = 3;
   16297                                               spacing = kSingle;
   16298                                               break;
   16299                                             case 0x1:
   16300                                               length = 3;
   16301                                               spacing = kDouble;
   16302                                               break;
   16303                                           }
   16304                                           unsigned last =
   16305                                               first +
   16306                                               (length - 1) *
   16307                                                   (spacing == kSingle ? 1 : 2);
   16308                                           TransferType transfer = kAllLanes;
   16309                                           unsigned rn = (instr >> 16) & 0xf;
   16310                                           // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>] ; T1 NOLINT(whitespace/line_length)
   16311                                           vld3(CurrentCond(),
   16312                                                dt,
   16313                                                NeonRegisterList(DRegister(
   16314                                                                     first),
   16315                                                                 DRegister(last),
   16316                                                                 spacing,
   16317                                                                 transfer),
   16318                                                MemOperand(Register(rn),
   16319                                                           Offset));
   16320                                           break;
   16321                                         }
   16322                                       }
   16323                                       break;
   16324                                     }
   16325                                     default: {
   16326                                       if (((instr & 0xd) == 0xd)) {
   16327                                         UnallocatedT32(instr);
   16328                                         return;
   16329                                       }
   16330                                       DataType dt =
   16331                                           Dt_size_7_Decode((instr >> 6) & 0x3);
   16332                                       if (dt.Is(kDataTypeValueInvalid)) {
   16333                                         UnallocatedT32(instr);
   16334                                         return;
   16335                                       }
   16336                                       unsigned first =
   16337                                           ExtractDRegister(instr, 22, 12);
   16338                                       unsigned length;
   16339                                       SpacingType spacing;
   16340                                       switch ((instr >> 5) & 0x1) {
   16341                                         default:
   16342                                           VIXL_UNREACHABLE_OR_FALLTHROUGH();
   16343                                         case 0x0:
   16344                                           length = 3;
   16345                                           spacing = kSingle;
   16346                                           break;
   16347                                         case 0x1:
   16348                                           length = 3;
   16349                                           spacing = kDouble;
   16350                                           break;
   16351                                       }
   16352                                       unsigned last =
   16353                                           first +
   16354                                           (length - 1) *
   16355                                               (spacing == kSingle ? 1 : 2);
   16356                                       TransferType transfer = kAllLanes;
   16357                                       unsigned rn = (instr >> 16) & 0xf;
   16358                                       Sign sign(plus);
   16359                                       unsigned rm = instr & 0xf;
   16360                                       // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>], #<Rm> ; T1 NOLINT(whitespace/line_length)
   16361                                       vld3(CurrentCond(),
   16362                                            dt,
   16363                                            NeonRegisterList(DRegister(first),
   16364                                                             DRegister(last),
   16365                                                             spacing,
   16366                                                             transfer),
   16367                                            MemOperand(Register(rn),
   16368                                                       sign,
   16369                                                       Register(rm),
   16370                                                       PostIndex));
   16371                                       break;
   16372                                     }
   16373                                   }
   16374                                   break;
   16375                                 }
   16376                                 default:
   16377                                   UnallocatedT32(instr);
   16378                                   break;
   16379                               }
   16380                               break;
   16381                             }
   16382                             default: {
   16383                               switch (instr & 0x0000000d) {
   16384                                 case 0x0000000d: {
   16385                                   // 0xf9a0020d
   16386                                   switch (instr & 0x00000002) {
   16387                                     case 0x00000000: {
   16388                                       // 0xf9a0020d
   16389                                       if (((instr & 0xc00) == 0xc00)) {
   16390                                         UnallocatedT32(instr);
   16391                                         return;
   16392                                       }
   16393                                       DataType dt =
   16394                                           Dt_size_7_Decode((instr >> 10) & 0x3);
   16395                                       if (dt.Is(kDataTypeValueInvalid)) {
   16396                                         UnallocatedT32(instr);
   16397                                         return;
   16398                                       }
   16399                                       DecodeNeon decode_neon =
   16400                                           Index_1_Decode((instr >> 4) & 0xf,
   16401                                                          dt);
   16402                                       if (!decode_neon.IsValid()) {
   16403                                         UnallocatedT32(instr);
   16404                                         return;
   16405                                       }
   16406                                       int lane = decode_neon.GetLane();
   16407                                       SpacingType spacing =
   16408                                           decode_neon.GetSpacing();
   16409                                       unsigned first =
   16410                                           ExtractDRegister(instr, 22, 12);
   16411                                       unsigned length = 3;
   16412                                       unsigned last =
   16413                                           first +
   16414                                           (length - 1) *
   16415                                               (spacing == kSingle ? 1 : 2);
   16416                                       unsigned rn = (instr >> 16) & 0xf;
   16417                                       // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>]! ; T1 NOLINT(whitespace/line_length)
   16418                                       vld3(CurrentCond(),
   16419                                            dt,
   16420                                            NeonRegisterList(DRegister(first),
   16421                                                             DRegister(last),
   16422                                                             spacing,
   16423                                                             lane),
   16424                                            MemOperand(Register(rn), PostIndex));
   16425                                       break;
   16426                                     }
   16427                                     case 0x00000002: {
   16428                                       // 0xf9a0020f
   16429                                       if (((instr & 0xc00) == 0xc00)) {
   16430                                         UnallocatedT32(instr);
   16431                                         return;
   16432                                       }
   16433                                       DataType dt =
   16434                                           Dt_size_7_Decode((instr >> 10) & 0x3);
   16435                                       if (dt.Is(kDataTypeValueInvalid)) {
   16436                                         UnallocatedT32(instr);
   16437                                         return;
   16438                                       }
   16439                                       DecodeNeon decode_neon =
   16440                                           Index_1_Decode((instr >> 4) & 0xf,
   16441                                                          dt);
   16442                                       if (!decode_neon.IsValid()) {
   16443                                         UnallocatedT32(instr);
   16444                                         return;
   16445                                       }
   16446                                       int lane = decode_neon.GetLane();
   16447                                       SpacingType spacing =
   16448                                           decode_neon.GetSpacing();
   16449                                       unsigned first =
   16450                                           ExtractDRegister(instr, 22, 12);
   16451                                       unsigned length = 3;
   16452                                       unsigned last =
   16453                                           first +
   16454                                           (length - 1) *
   16455                                               (spacing == kSingle ? 1 : 2);
   16456                                       unsigned rn = (instr >> 16) & 0xf;
   16457                                       // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>] ; T1
   16458                                       vld3(CurrentCond(),
   16459                                            dt,
   16460                                            NeonRegisterList(DRegister(first),
   16461                                                             DRegister(last),
   16462                                                             spacing,
   16463                                                             lane),
   16464                                            MemOperand(Register(rn), Offset));
   16465                                       break;
   16466                                     }
   16467                                   }
   16468                                   break;
   16469                                 }
   16470                                 default: {
   16471                                   if (((instr & 0xc00) == 0xc00) ||
   16472                                       ((instr & 0xd) == 0xd)) {
   16473                                     UnallocatedT32(instr);
   16474                                     return;
   16475                                   }
   16476                                   DataType dt =
   16477                                       Dt_size_7_Decode((instr >> 10) & 0x3);
   16478                                   if (dt.Is(kDataTypeValueInvalid)) {
   16479                                     UnallocatedT32(instr);
   16480                                     return;
   16481                                   }
   16482                                   DecodeNeon decode_neon =
   16483                                       Index_1_Decode((instr >> 4) & 0xf, dt);
   16484                                   if (!decode_neon.IsValid()) {
   16485                                     UnallocatedT32(instr);
   16486                                     return;
   16487                                   }
   16488                                   int lane = decode_neon.GetLane();
   16489                                   SpacingType spacing =
   16490                                       decode_neon.GetSpacing();
   16491                                   unsigned first =
   16492                                       ExtractDRegister(instr, 22, 12);
   16493                                   unsigned length = 3;
   16494                                   unsigned last =
   16495                                       first +
   16496                                       (length - 1) *
   16497                                           (spacing == kSingle ? 1 : 2);
   16498                                   unsigned rn = (instr >> 16) & 0xf;
   16499                                   Sign sign(plus);
   16500                                   unsigned rm = instr & 0xf;
   16501                                   // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>], #<Rm> ; T1 NOLINT(whitespace/line_length)
   16502                                   vld3(CurrentCond(),
   16503                                        dt,
   16504                                        NeonRegisterList(DRegister(first),
   16505                                                         DRegister(last),
   16506                                                         spacing,
   16507                                                         lane),
   16508                                        MemOperand(Register(rn),
   16509                                                   sign,
   16510                                                   Register(rm),
   16511                                                   PostIndex));
   16512                                   break;
   16513                                 }
   16514                               }
   16515                               break;
   16516                             }
   16517                           }
   16518                           break;
   16519                         }
   16520                         case 0x00000300: {
   16521                           // 0xf9a00300
   16522                           switch (instr & 0x00000c00) {
   16523                             case 0x00000c00: {
   16524                               // 0xf9a00f00
   16525                               switch (instr & 0x0000000d) {
   16526                                 case 0x0000000d: {
   16527                                   // 0xf9a00f0d
   16528                                   switch (instr & 0x00000002) {
   16529                                     case 0x00000000: {
   16530                                       // 0xf9a00f0d
   16531                                       DataType dt =
   16532                                           Dt_size_8_Decode((instr >> 6) & 0x3);
   16533                                       if (dt.Is(kDataTypeValueInvalid)) {
   16534                                         UnallocatedT32(instr);
   16535                                         return;
   16536                                       }
   16537                                       Alignment align =
   16538                                           Align_a_3_Decode((instr >> 4) & 0x1,
   16539                                                            dt,
   16540                                                            (instr >> 6) & 0x3);
   16541                                       if (dt.Is(kDataTypeValueInvalid) ||
   16542                                           align.Is(kBadAlignment)) {
   16543                                         UnallocatedT32(instr);
   16544                                         return;
   16545                                       }
   16546                                       unsigned first =
   16547                                           ExtractDRegister(instr, 22, 12);
   16548                                       unsigned length;
   16549                                       SpacingType spacing;
   16550                                       switch ((instr >> 5) & 0x1) {
   16551                                         default:
   16552                                           VIXL_UNREACHABLE_OR_FALLTHROUGH();
   16553                                         case 0x0:
   16554                                           length = 4;
   16555                                           spacing = kSingle;
   16556                                           break;
   16557                                         case 0x1:
   16558                                           length = 4;
   16559                                           spacing = kDouble;
   16560                                           break;
   16561                                       }
   16562                                       unsigned last =
   16563                                           first +
   16564                                           (length - 1) *
   16565                                               (spacing == kSingle ? 1 : 2);
   16566                                       TransferType transfer = kAllLanes;
   16567                                       unsigned rn = (instr >> 16) & 0xf;
   16568                                       // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
   16569                                       vld4(CurrentCond(),
   16570                                            dt,
   16571                                            NeonRegisterList(DRegister(first),
   16572                                                             DRegister(last),
   16573                                                             spacing,
   16574                                                             transfer),
   16575                                            AlignedMemOperand(Register(rn),
   16576                                                              align,
   16577                                                              PostIndex));
   16578                                       break;
   16579                                     }
   16580                                     case 0x00000002: {
   16581                                       // 0xf9a00f0f
   16582                                       DataType dt =
   16583                                           Dt_size_8_Decode((instr >> 6) & 0x3);
   16584                                       if (dt.Is(kDataTypeValueInvalid)) {
   16585                                         UnallocatedT32(instr);
   16586                                         return;
   16587                                       }
   16588                                       Alignment align =
   16589                                           Align_a_3_Decode((instr >> 4) & 0x1,
   16590                                                            dt,
   16591                                                            (instr >> 6) & 0x3);
   16592                                       if (dt.Is(kDataTypeValueInvalid) ||
   16593                                           align.Is(kBadAlignment)) {
   16594                                         UnallocatedT32(instr);
   16595                                         return;
   16596                                       }
   16597                                       unsigned first =
   16598                                           ExtractDRegister(instr, 22, 12);
   16599                                       unsigned length;
   16600                                       SpacingType spacing;
   16601                                       switch ((instr >> 5) & 0x1) {
   16602                                         default:
   16603                                           VIXL_UNREACHABLE_OR_FALLTHROUGH();
   16604                                         case 0x0:
   16605                                           length = 4;
   16606                                           spacing = kSingle;
   16607                                           break;
   16608                                         case 0x1:
   16609                                           length = 4;
   16610                                           spacing = kDouble;
   16611                                           break;
   16612                                       }
   16613                                       unsigned last =
   16614                                           first +
   16615                                           (length - 1) *
   16616                                               (spacing == kSingle ? 1 : 2);
   16617                                       TransferType transfer = kAllLanes;
   16618                                       unsigned rn = (instr >> 16) & 0xf;
   16619                                       // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
   16620                                       vld4(CurrentCond(),
   16621                                            dt,
   16622                                            NeonRegisterList(DRegister(first),
   16623                                                             DRegister(last),
   16624                                                             spacing,
   16625                                                             transfer),
   16626                                            AlignedMemOperand(Register(rn),
   16627                                                              align,
   16628                                                              Offset));
   16629                                       break;
   16630                                     }
   16631                                   }
   16632                                   break;
   16633                                 }
   16634                                 default: {
   16635                                   if (((instr & 0xd) == 0xd)) {
   16636                                     UnallocatedT32(instr);
   16637                                     return;
   16638                                   }
   16639                                   DataType dt =
   16640                                       Dt_size_8_Decode((instr >> 6) & 0x3);
   16641                                   if (dt.Is(kDataTypeValueInvalid)) {
   16642                                     UnallocatedT32(instr);
   16643                                     return;
   16644                                   }
   16645                                   Alignment align =
   16646                                       Align_a_3_Decode((instr >> 4) & 0x1,
   16647                                                        dt,
   16648                                                        (instr >> 6) & 0x3);
   16649                                   if (dt.Is(kDataTypeValueInvalid) ||
   16650                                       align.Is(kBadAlignment)) {
   16651                                     UnallocatedT32(instr);
   16652                                     return;
   16653                                   }
   16654                                   unsigned first =
   16655                                       ExtractDRegister(instr, 22, 12);
   16656                                   unsigned length;
   16657                                   SpacingType spacing;
   16658                                   switch ((instr >> 5) & 0x1) {
   16659                                     default:
   16660                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
   16661                                     case 0x0:
   16662                                       length = 4;
   16663                                       spacing = kSingle;
   16664                                       break;
   16665                                     case 0x1:
   16666                                       length = 4;
   16667                                       spacing = kDouble;
   16668                                       break;
   16669                                   }
   16670                                   unsigned last =
   16671                                       first +
   16672                                       (length - 1) *
   16673                                           (spacing == kSingle ? 1 : 2);
   16674                                   TransferType transfer = kAllLanes;
   16675                                   unsigned rn = (instr >> 16) & 0xf;
   16676                                   unsigned rm = instr & 0xf;
   16677                                   // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
   16678                                   vld4(CurrentCond(),
   16679                                        dt,
   16680                                        NeonRegisterList(DRegister(first),
   16681                                                         DRegister(last),
   16682                                                         spacing,
   16683                                                         transfer),
   16684                                        AlignedMemOperand(Register(rn),
   16685                                                          align,
   16686                                                          Register(rm),
   16687                                                          PostIndex));
   16688                                   break;
   16689                                 }
   16690                               }
   16691                               break;
   16692                             }
   16693                             default: {
   16694                               switch (instr & 0x0000000d) {
   16695                                 case 0x0000000d: {
   16696                                   // 0xf9a0030d
   16697                                   switch (instr & 0x00000002) {
   16698                                     case 0x00000000: {
   16699                                       // 0xf9a0030d
   16700                                       if (((instr & 0xc00) == 0xc00)) {
   16701                                         UnallocatedT32(instr);
   16702                                         return;
   16703                                       }
   16704                                       DataType dt =
   16705                                           Dt_size_7_Decode((instr >> 10) & 0x3);
   16706                                       if (dt.Is(kDataTypeValueInvalid)) {
   16707                                         UnallocatedT32(instr);
   16708                                         return;
   16709                                       }
   16710                                       DecodeNeonAndAlign decode_neon =
   16711                                           Align_index_align_3_Decode((instr >>
   16712                                                                       4) &
   16713                                                                          0xf,
   16714                                                                      dt);
   16715                                       if (!decode_neon.IsValid()) {
   16716                                         UnallocatedT32(instr);
   16717                                         return;
   16718                                       }
   16719                                       Alignment align = decode_neon.GetAlign();
   16720                                       int lane = decode_neon.GetLane();
   16721                                       SpacingType spacing =
   16722                                           decode_neon.GetSpacing();
   16723                                       unsigned first =
   16724                                           ExtractDRegister(instr, 22, 12);
   16725                                       unsigned length = 4;
   16726                                       unsigned last =
   16727                                           first +
   16728                                           (length - 1) *
   16729                                               (spacing == kSingle ? 1 : 2);
   16730                                       unsigned rn = (instr >> 16) & 0xf;
   16731                                       // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
   16732                                       vld4(CurrentCond(),
   16733                                            dt,
   16734                                            NeonRegisterList(DRegister(first),
   16735                                                             DRegister(last),
   16736                                                             spacing,
   16737                                                             lane),
   16738                                            AlignedMemOperand(Register(rn),
   16739                                                              align,
   16740                                                              PostIndex));
   16741                                       break;
   16742                                     }
   16743                                     case 0x00000002: {
   16744                                       // 0xf9a0030f
   16745                                       if (((instr & 0xc00) == 0xc00)) {
   16746                                         UnallocatedT32(instr);
   16747                                         return;
   16748                                       }
   16749                                       DataType dt =
   16750                                           Dt_size_7_Decode((instr >> 10) & 0x3);
   16751                                       if (dt.Is(kDataTypeValueInvalid)) {
   16752                                         UnallocatedT32(instr);
   16753                                         return;
   16754                                       }
   16755                                       DecodeNeonAndAlign decode_neon =
   16756                                           Align_index_align_3_Decode((instr >>
   16757                                                                       4) &
   16758                                                                          0xf,
   16759                                                                      dt);
   16760                                       if (!decode_neon.IsValid()) {
   16761                                         UnallocatedT32(instr);
   16762                                         return;
   16763                                       }
   16764                                       Alignment align = decode_neon.GetAlign();
   16765                                       int lane = decode_neon.GetLane();
   16766                                       SpacingType spacing =
   16767                                           decode_neon.GetSpacing();
   16768                                       unsigned first =
   16769                                           ExtractDRegister(instr, 22, 12);
   16770                                       unsigned length = 4;
   16771                                       unsigned last =
   16772                                           first +
   16773                                           (length - 1) *
   16774                                               (spacing == kSingle ? 1 : 2);
   16775                                       unsigned rn = (instr >> 16) & 0xf;
   16776                                       // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
   16777                                       vld4(CurrentCond(),
   16778                                            dt,
   16779                                            NeonRegisterList(DRegister(first),
   16780                                                             DRegister(last),
   16781                                                             spacing,
   16782                                                             lane),
   16783                                            AlignedMemOperand(Register(rn),
   16784                                                              align,
   16785                                                              Offset));
   16786                                       break;
   16787                                     }
   16788                                   }
   16789                                   break;
   16790                                 }
   16791                                 default: {
   16792                                   if (((instr & 0xc00) == 0xc00) ||
   16793                                       ((instr & 0xd) == 0xd)) {
   16794                                     UnallocatedT32(instr);
   16795                                     return;
   16796                                   }
   16797                                   DataType dt =
   16798                                       Dt_size_7_Decode((instr >> 10) & 0x3);
   16799                                   if (dt.Is(kDataTypeValueInvalid)) {
   16800                                     UnallocatedT32(instr);
   16801                                     return;
   16802                                   }
   16803                                   DecodeNeonAndAlign decode_neon =
   16804                                       Align_index_align_3_Decode((instr >> 4) &
   16805                                                                      0xf,
   16806                                                                  dt);
   16807                                   if (!decode_neon.IsValid()) {
   16808                                     UnallocatedT32(instr);
   16809                                     return;
   16810                                   }
   16811                                   Alignment align = decode_neon.GetAlign();
   16812                                   int lane = decode_neon.GetLane();
   16813                                   SpacingType spacing =
   16814                                       decode_neon.GetSpacing();
   16815                                   unsigned first =
   16816                                       ExtractDRegister(instr, 22, 12);
   16817                                   unsigned length = 4;
   16818                                   unsigned last =
   16819                                       first +
   16820                                       (length - 1) *
   16821                                           (spacing == kSingle ? 1 : 2);
   16822                                   unsigned rn = (instr >> 16) & 0xf;
   16823                                   unsigned rm = instr & 0xf;
   16824                                   // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
   16825                                   vld4(CurrentCond(),
   16826                                        dt,
   16827                                        NeonRegisterList(DRegister(first),
   16828                                                         DRegister(last),
   16829                                                         spacing,
   16830                                                         lane),
   16831                                        AlignedMemOperand(Register(rn),
   16832                                                          align,
   16833                                                          Register(rm),
   16834                                                          PostIndex));
   16835                                   break;
   16836                                 }
   16837                               }
   16838                               break;
   16839                             }
   16840                           }
   16841                           break;
   16842                         }
   16843                       }
   16844                       break;
   16845                     }
   16846                   }
   16847                   break;
   16848                 }
   16849                 case 0x10100000: {
   16850                   // 0xf8100000
   16851                   switch (instr & 0x01400000) {
   16852                     case 0x00000000: {
   16853                       // 0xf8100000
   16854                       switch (instr & 0x000f0000) {
   16855                         case 0x000f0000: {
   16856                           // 0xf81f0000
   16857                           switch (instr & 0x0000f000) {
   16858                             case 0x0000f000: {
   16859                               // 0xf81ff000
   16860                               uint32_t U = (instr >> 23) & 0x1;
   16861                               int32_t imm = instr & 0xfff;
   16862                               if (U == 0) imm = -imm;
   16863                               bool minus_zero = (imm == 0) && (U == 0);
   16864                               Location location(imm, kT32PcDelta);
   16865                               // PLD{<c>}{<q>} <label> ; T1
   16866                               if (minus_zero) {
   16867                                 pld(CurrentCond(), MemOperand(pc, minus, 0));
   16868                               } else {
   16869                                 pld(CurrentCond(), &location);
   16870                               }
   16871                               if (((instr & 0xff7ff000) != 0xf81ff000)) {
   16872                                 UnpredictableT32(instr);
   16873                               }
   16874                               break;
   16875                             }
   16876                             default: {
   16877                               switch (instr & 0x00200000) {
   16878                                 case 0x00000000: {
   16879                                   // 0xf81f0000
   16880                                   if (((instr & 0xf000) == 0xf000)) {
   16881                                     UnallocatedT32(instr);
   16882                                     return;
   16883                                   }
   16884                                   unsigned rt = (instr >> 12) & 0xf;
   16885                                   uint32_t U = (instr >> 23) & 0x1;
   16886                                   int32_t imm = instr & 0xfff;
   16887                                   if (U == 0) imm = -imm;
   16888                                   bool minus_zero = (imm == 0) && (U == 0);
   16889                                   Location location(imm, kT32PcDelta);
   16890                                   // LDRB{<c>}{<q>} <Rt>, <label> ; T1
   16891                                   if (minus_zero) {
   16892                                     ldrb(CurrentCond(),
   16893                                          Best,
   16894                                          Register(rt),
   16895                                          MemOperand(pc, minus, 0));
   16896                                   } else {
   16897                                     ldrb(CurrentCond(),
   16898                                          Register(rt),
   16899                                          &location);
   16900                                   }
   16901                                   break;
   16902                                 }
   16903                                 case 0x00200000: {
   16904                                   // 0xf83f0000
   16905                                   if (((instr & 0xf000) == 0xf000)) {
   16906                                     UnallocatedT32(instr);
   16907                                     return;
   16908                                   }
   16909                                   unsigned rt = (instr >> 12) & 0xf;
   16910                                   uint32_t U = (instr >> 23) & 0x1;
   16911                                   int32_t imm = instr & 0xfff;
   16912                                   if (U == 0) imm = -imm;
   16913                                   bool minus_zero = (imm == 0) && (U == 0);
   16914                                   Location location(imm, kT32PcDelta);
   16915                                   // LDRH{<c>}{<q>} <Rt>, <label> ; T1
   16916                                   if (minus_zero) {
   16917                                     ldrh(CurrentCond(),
   16918                                          Best,
   16919                                          Register(rt),
   16920                                          MemOperand(pc, minus, 0));
   16921                                   } else {
   16922                                     ldrh(CurrentCond(),
   16923                                          Register(rt),
   16924                                          &location);
   16925                                   }
   16926                                   break;
   16927                                 }
   16928                               }
   16929                               break;
   16930                             }
   16931                           }
   16932                           break;
   16933                         }
   16934                         default: {
   16935                           switch (instr & 0x00a00000) {
   16936                             case 0x00000000: {
   16937                               // 0xf8100000
   16938                               switch (instr & 0x00000d00) {
   16939                                 case 0x00000000: {
   16940                                   // 0xf8100000
   16941                                   switch (instr & 0x000002c0) {
   16942                                     case 0x00000000: {
   16943                                       // 0xf8100000
   16944                                       switch (instr & 0x0000f000) {
   16945                                         case 0x0000f000: {
   16946                                           // 0xf810f000
   16947                                           if (((instr & 0xf0000) == 0xf0000)) {
   16948                                             UnallocatedT32(instr);
   16949                                             return;
   16950                                           }
   16951                                           unsigned rn = (instr >> 16) & 0xf;
   16952                                           Sign sign(plus);
   16953                                           unsigned rm = instr & 0xf;
   16954                                           Shift shift = LSL;
   16955                                           uint32_t amount = (instr >> 4) & 0x3;
   16956                                           AddrMode addrmode = Offset;
   16957                                           // PLD{<c>}{<q>} [<Rn>, {+}<Rm>{, LSL #<amount>}] ; T1 NOLINT(whitespace/line_length)
   16958                                           pld(CurrentCond(),
   16959                                               MemOperand(Register(rn),
   16960                                                          sign,
   16961                                                          Register(rm),
   16962                                                          shift,
   16963                                                          amount,
   16964                                                          addrmode));
   16965                                           break;
   16966                                         }
   16967                                         default: {
   16968                                           if (((instr & 0xf0000) == 0xf0000) ||
   16969                                               ((instr & 0xf000) == 0xf000)) {
   16970                                             UnallocatedT32(instr);
   16971                                             return;
   16972                                           }
   16973                                           unsigned rt = (instr >> 12) & 0xf;
   16974                                           unsigned rn = (instr >> 16) & 0xf;
   16975                                           Sign sign(plus);
   16976                                           unsigned rm = instr & 0xf;
   16977                                           Shift shift = LSL;
   16978                                           uint32_t amount = (instr >> 4) & 0x3;
   16979                                           AddrMode addrmode = Offset;
   16980                                           if ((rt < kNumberOfT32LowRegisters) &&
   16981                                               (rn < kNumberOfT32LowRegisters) &&
   16982                                               (rm < kNumberOfT32LowRegisters) &&
   16983                                               shift.IsLSL() && (amount == 0) &&
   16984                                               sign.IsPlus()) {
   16985                                             // LDRB{<c>}.W <Rt>, [<Rn>, #{+}<Rm>] ; T2 NOLINT(whitespace/line_length)
   16986                                             ldrb(CurrentCond(),
   16987                                                  Wide,
   16988                                                  Register(rt),
   16989                                                  MemOperand(Register(rn),
   16990                                                             sign,
   16991                                                             Register(rm),
   16992                                                             addrmode));
   16993                                           } else {
   16994                                             // LDRB{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>{, LSL #<imm>}] ; T2 NOLINT(whitespace/line_length)
   16995                                             ldrb(CurrentCond(),
   16996                                                  Best,
   16997                                                  Register(rt),
   16998                                                  MemOperand(Register(rn),
   16999                                                             sign,
   17000                                                             Register(rm),
   17001                                                             shift,
   17002                                                             amount,
   17003                                                             addrmode));
   17004                                           }
   17005                                           break;
   17006                                         }
   17007                                       }
   17008                                       break;
   17009                                     }
   17010                                     default:
   17011                                       UnallocatedT32(instr);
   17012                                       break;
   17013                                   }
   17014                                   break;
   17015                                 }
   17016                                 case 0x00000900: {
   17017                                   // 0xf8100900
   17018                                   if (((instr & 0xf0000) == 0xf0000)) {
   17019                                     UnallocatedT32(instr);
   17020                                     return;
   17021                                   }
   17022                                   unsigned rt = (instr >> 12) & 0xf;
   17023                                   unsigned rn = (instr >> 16) & 0xf;
   17024                                   Sign sign((((instr >> 9) & 0x1) == 0) ? minus
   17025                                                                         : plus);
   17026                                   int32_t offset = instr & 0xff;
   17027                                   // LDRB{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_2> ; T3 NOLINT(whitespace/line_length)
   17028                                   ldrb(CurrentCond(),
   17029                                        Best,
   17030                                        Register(rt),
   17031                                        MemOperand(Register(rn),
   17032                                                   sign,
   17033                                                   offset,
   17034                                                   PostIndex));
   17035                                   break;
   17036                                 }
   17037                                 case 0x00000c00: {
   17038                                   // 0xf8100c00
   17039                                   switch (instr & 0x00000200) {
   17040                                     case 0x00000000: {
   17041                                       // 0xf8100c00
   17042                                       switch (instr & 0x0000f000) {
   17043                                         case 0x0000f000: {
   17044                                           // 0xf810fc00
   17045                                           if (((instr & 0xf0000) == 0xf0000)) {
   17046                                             UnallocatedT32(instr);
   17047                                             return;
   17048                                           }
   17049                                           unsigned rn = (instr >> 16) & 0xf;
   17050                                           int32_t offset = instr & 0xff;
   17051                                           // PLD{<c>}{<q>} [<Rn>{, #-<imm_1>}] ; T2 NOLINT(whitespace/line_length)
   17052                                           pld(CurrentCond(),
   17053                                               MemOperand(Register(rn),
   17054                                                          minus,
   17055                                                          offset,
   17056                                                          Offset));
   17057                                           break;
   17058                                         }
   17059                                         default: {
   17060                                           if (((instr & 0xf0000) == 0xf0000) ||
   17061                                               ((instr & 0xf000) == 0xf000)) {
   17062                                             UnallocatedT32(instr);
   17063                                             return;
   17064                                           }
   17065                                           unsigned rt = (instr >> 12) & 0xf;
   17066                                           unsigned rn = (instr >> 16) & 0xf;
   17067                                           int32_t offset = instr & 0xff;
   17068                                           // LDRB{<c>}{<q>} <Rt>, [<Rn>{, #-<imm_2>}] ; T3 NOLINT(whitespace/line_length)
   17069                                           ldrb(CurrentCond(),
   17070                                                Best,
   17071                                                Register(rt),
   17072                                                MemOperand(Register(rn),
   17073                                                           minus,
   17074                                                           offset,
   17075                                                           Offset));
   17076                                           break;
   17077                                         }
   17078                                       }
   17079                                       break;
   17080                                     }
   17081                                     case 0x00000200: {
   17082                                       // 0xf8100e00
   17083                                       if (((instr & 0xf0000) == 0xf0000)) {
   17084                                         UnallocatedT32(instr);
   17085                                         return;
   17086                                       }
   17087                                       UnimplementedT32_32("LDRBT", instr);
   17088                                       break;
   17089                                     }
   17090                                   }
   17091                                   break;
   17092                                 }
   17093                                 case 0x00000d00: {
   17094                                   // 0xf8100d00
   17095                                   if (((instr & 0xf0000) == 0xf0000)) {
   17096                                     UnallocatedT32(instr);
   17097                                     return;
   17098                                   }
   17099                                   unsigned rt = (instr >> 12) & 0xf;
   17100                                   unsigned rn = (instr >> 16) & 0xf;
   17101                                   Sign sign((((instr >> 9) & 0x1) == 0) ? minus
   17102                                                                         : plus);
   17103                                   int32_t offset = instr & 0xff;
   17104                                   // LDRB{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_2>}]! ; T3 NOLINT(whitespace/line_length)
   17105                                   ldrb(CurrentCond(),
   17106                                        Best,
   17107                                        Register(rt),
   17108                                        MemOperand(Register(rn),
   17109                                                   sign,
   17110                                                   offset,
   17111                                                   PreIndex));
   17112                                   break;
   17113                                 }
   17114                                 default:
   17115                                   UnallocatedT32(instr);
   17116                                   break;
   17117                               }
   17118                               break;
   17119                             }
   17120                             case 0x00200000: {
   17121                               // 0xf8300000
   17122                               switch (instr & 0x00000d00) {
   17123                                 case 0x00000000: {
   17124                                   // 0xf8300000
   17125                                   switch (instr & 0x000002c0) {
   17126                                     case 0x00000000: {
   17127                                       // 0xf8300000
   17128                                       switch (instr & 0x0000f000) {
   17129                                         case 0x0000f000: {
   17130                                           // 0xf830f000
   17131                                           if (((instr & 0xf0000) == 0xf0000)) {
   17132                                             UnallocatedT32(instr);
   17133                                             return;
   17134                                           }
   17135                                           unsigned rn = (instr >> 16) & 0xf;
   17136                                           Sign sign(plus);
   17137                                           unsigned rm = instr & 0xf;
   17138                                           Shift shift = LSL;
   17139                                           uint32_t amount = (instr >> 4) & 0x3;
   17140                                           AddrMode addrmode = Offset;
   17141                                           // PLDW{<c>}{<q>} [<Rn>, {+}<Rm>{, LSL #<amount>}] ; T1 NOLINT(whitespace/line_length)
   17142                                           pldw(CurrentCond(),
   17143                                                MemOperand(Register(rn),
   17144                                                           sign,
   17145                                                           Register(rm),
   17146                                                           shift,
   17147                                                           amount,
   17148                                                           addrmode));
   17149                                           break;
   17150                                         }
   17151                                         default: {
   17152                                           if (((instr & 0xf0000) == 0xf0000) ||
   17153                                               ((instr & 0xf000) == 0xf000)) {
   17154                                             UnallocatedT32(instr);
   17155                                             return;
   17156                                           }
   17157                                           unsigned rt = (instr >> 12) & 0xf;
   17158                                           unsigned rn = (instr >> 16) & 0xf;
   17159                                           Sign sign(plus);
   17160                                           unsigned rm = instr & 0xf;
   17161                                           Shift shift = LSL;
   17162                                           uint32_t amount = (instr >> 4) & 0x3;
   17163                                           AddrMode addrmode = Offset;
   17164                                           if ((rt < kNumberOfT32LowRegisters) &&
   17165                                               (rn < kNumberOfT32LowRegisters) &&
   17166                                               (rm < kNumberOfT32LowRegisters) &&
   17167                                               shift.IsLSL() && (amount == 0) &&
   17168                                               sign.IsPlus()) {
   17169                                             // LDRH{<c>}.W <Rt>, [<Rn>, #{+}<Rm>] ; T2 NOLINT(whitespace/line_length)
   17170                                             ldrh(CurrentCond(),
   17171                                                  Wide,
   17172                                                  Register(rt),
   17173                                                  MemOperand(Register(rn),
   17174                                                             sign,
   17175                                                             Register(rm),
   17176                                                             addrmode));
   17177                                           } else {
   17178                                             // LDRH{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>{, LSL #<imm>}] ; T2 NOLINT(whitespace/line_length)
   17179                                             ldrh(CurrentCond(),
   17180                                                  Best,
   17181                                                  Register(rt),
   17182                                                  MemOperand(Register(rn),
   17183                                                             sign,
   17184                                                             Register(rm),
   17185                                                             shift,
   17186                                                             amount,
   17187                                                             addrmode));
   17188                                           }
   17189                                           break;
   17190                                         }
   17191                                       }
   17192                                       break;
   17193                                     }
   17194                                     default:
   17195                                       UnallocatedT32(instr);
   17196                                       break;
   17197                                   }
   17198                                   break;
   17199                                 }
   17200                                 case 0x00000900: {
   17201                                   // 0xf8300900
   17202                                   if (((instr & 0xf0000) == 0xf0000)) {
   17203                                     UnallocatedT32(instr);
   17204                                     return;
   17205                                   }
   17206                                   unsigned rt = (instr >> 12) & 0xf;
   17207                                   unsigned rn = (instr >> 16) & 0xf;
   17208                                   Sign sign((((instr >> 9) & 0x1) == 0) ? minus
   17209                                                                         : plus);
   17210                                   int32_t offset = instr & 0xff;
   17211                                   // LDRH{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_2> ; T3 NOLINT(whitespace/line_length)
   17212                                   ldrh(CurrentCond(),
   17213                                        Best,
   17214                                        Register(rt),
   17215                                        MemOperand(Register(rn),
   17216                                                   sign,
   17217                                                   offset,
   17218                                                   PostIndex));
   17219                                   break;
   17220                                 }
   17221                                 case 0x00000c00: {
   17222                                   // 0xf8300c00
   17223                                   switch (instr & 0x00000200) {
   17224                                     case 0x00000000: {
   17225                                       // 0xf8300c00
   17226                                       switch (instr & 0x0000f000) {
   17227                                         case 0x0000f000: {
   17228                                           // 0xf830fc00
   17229                                           if (((instr & 0xf0000) == 0xf0000)) {
   17230                                             UnallocatedT32(instr);
   17231                                             return;
   17232                                           }
   17233                                           unsigned rn = (instr >> 16) & 0xf;
   17234                                           int32_t offset = instr & 0xff;
   17235                                           // PLDW{<c>}{<q>} [<Rn>{, #-<imm_1>}] ; T2 NOLINT(whitespace/line_length)
   17236                                           pldw(CurrentCond(),
   17237                                                MemOperand(Register(rn),
   17238                                                           minus,
   17239                                                           offset,
   17240                                                           Offset));
   17241                                           break;
   17242                                         }
   17243                                         default: {
   17244                                           if (((instr & 0xf0000) == 0xf0000) ||
   17245                                               ((instr & 0xf000) == 0xf000)) {
   17246                                             UnallocatedT32(instr);
   17247                                             return;
   17248                                           }
   17249                                           unsigned rt = (instr >> 12) & 0xf;
   17250                                           unsigned rn = (instr >> 16) & 0xf;
   17251                                           int32_t offset = instr & 0xff;
   17252                                           // LDRH{<c>}{<q>} <Rt>, [<Rn>{, #-<imm_2>}] ; T3 NOLINT(whitespace/line_length)
   17253                                           ldrh(CurrentCond(),
   17254                                                Best,
   17255                                                Register(rt),
   17256                                                MemOperand(Register(rn),
   17257                                                           minus,
   17258                                                           offset,
   17259                                                           Offset));
   17260                                           break;
   17261                                         }
   17262                                       }
   17263                                       break;
   17264                                     }
   17265                                     case 0x00000200: {
   17266                                       // 0xf8300e00
   17267                                       if (((instr & 0xf0000) == 0xf0000)) {
   17268                                         UnallocatedT32(instr);
   17269                                         return;
   17270                                       }
   17271                                       UnimplementedT32_32("LDRHT", instr);
   17272                                       break;
   17273                                     }
   17274                                   }
   17275                                   break;
   17276                                 }
   17277                                 case 0x00000d00: {
   17278                                   // 0xf8300d00
   17279                                   if (((instr & 0xf0000) == 0xf0000)) {
   17280                                     UnallocatedT32(instr);
   17281                                     return;
   17282                                   }
   17283                                   unsigned rt = (instr >> 12) & 0xf;
   17284                                   unsigned rn = (instr >> 16) & 0xf;
   17285                                   Sign sign((((instr >> 9) & 0x1) == 0) ? minus
   17286                                                                         : plus);
   17287                                   int32_t offset = instr & 0xff;
   17288                                   // LDRH{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_2>}]! ; T3 NOLINT(whitespace/line_length)
   17289                                   ldrh(CurrentCond(),
   17290                                        Best,
   17291                                        Register(rt),
   17292                                        MemOperand(Register(rn),
   17293                                                   sign,
   17294                                                   offset,
   17295                                                   PreIndex));
   17296                                   break;
   17297                                 }
   17298                                 default:
   17299                                   UnallocatedT32(instr);
   17300                                   break;
   17301                               }
   17302                               break;
   17303                             }
   17304                             case 0x00800000: {
   17305                               // 0xf8900000
   17306                               switch (instr & 0x0000f000) {
   17307                                 case 0x0000f000: {
   17308                                   // 0xf890f000
   17309                                   if (((instr & 0xf0000) == 0xf0000)) {
   17310                                     UnallocatedT32(instr);
   17311                                     return;
   17312                                   }
   17313                                   unsigned rn = (instr >> 16) & 0xf;
   17314                                   int32_t offset = instr & 0xfff;
   17315                                   // PLD{<c>}{<q>} [<Rn>{, #{+}<imm>}] ; T1
   17316                                   pld(CurrentCond(),
   17317                                       MemOperand(Register(rn),
   17318                                                  plus,
   17319                                                  offset,
   17320                                                  Offset));
   17321                                   break;
   17322                                 }
   17323                                 default: {
   17324                                   if (((instr & 0xf0000) == 0xf0000) ||
   17325                                       ((instr & 0xf000) == 0xf000)) {
   17326                                     UnallocatedT32(instr);
   17327                                     return;
   17328                                   }
   17329                                   unsigned rt = (instr >> 12) & 0xf;
   17330                                   unsigned rn = (instr >> 16) & 0xf;
   17331                                   int32_t offset = instr & 0xfff;
   17332                                   if ((rt < kNumberOfT32LowRegisters) &&
   17333                                       (rn < kNumberOfT32LowRegisters) &&
   17334                                       ((offset >= 0) && (offset <= 31))) {
   17335                                     // LDRB{<c>}.W <Rt>, [<Rn>{, #{+}<imm_1>}] ; T2 NOLINT(whitespace/line_length)
   17336                                     ldrb(CurrentCond(),
   17337                                          Wide,
   17338                                          Register(rt),
   17339                                          MemOperand(Register(rn),
   17340                                                     plus,
   17341                                                     offset,
   17342                                                     Offset));
   17343                                   } else {
   17344                                     // LDRB{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm_1>}] ; T2 NOLINT(whitespace/line_length)
   17345                                     ldrb(CurrentCond(),
   17346                                          Best,
   17347                                          Register(rt),
   17348                                          MemOperand(Register(rn),
   17349                                                     plus,
   17350                                                     offset,
   17351                                                     Offset));
   17352                                   }
   17353                                   break;
   17354                                 }
   17355                               }
   17356                               break;
   17357                             }
   17358                             case 0x00a00000: {
   17359                               // 0xf8b00000
   17360                               switch (instr & 0x0000f000) {
   17361                                 case 0x0000f000: {
   17362                                   // 0xf8b0f000
   17363                                   if (((instr & 0xf0000) == 0xf0000)) {
   17364                                     UnallocatedT32(instr);
   17365                                     return;
   17366                                   }
   17367                                   unsigned rn = (instr >> 16) & 0xf;
   17368                                   int32_t offset = instr & 0xfff;
   17369                                   // PLDW{<c>}{<q>} [<Rn>{, #{+}<imm>}] ; T1
   17370                                   pldw(CurrentCond(),
   17371                                        MemOperand(Register(rn),
   17372                                                   plus,
   17373                                                   offset,
   17374                                                   Offset));
   17375                                   break;
   17376                                 }
   17377                                 default: {
   17378                                   if (((instr & 0xf0000) == 0xf0000) ||
   17379                                       ((instr & 0xf000) == 0xf000)) {
   17380                                     UnallocatedT32(instr);
   17381                                     return;
   17382                                   }
   17383                                   unsigned rt = (instr >> 12) & 0xf;
   17384                                   unsigned rn = (instr >> 16) & 0xf;
   17385                                   int32_t offset = instr & 0xfff;
   17386                                   if ((rt < kNumberOfT32LowRegisters) &&
   17387                                       (rn < kNumberOfT32LowRegisters) &&
   17388                                       ((offset >= 0) && (offset <= 62) &&
   17389                                        ((offset & 1) == 0))) {
   17390                                     // LDRH{<c>}.W <Rt>, [<Rn>{, #{+}<imm_1>}] ; T2 NOLINT(whitespace/line_length)
   17391                                     ldrh(CurrentCond(),
   17392                                          Wide,
   17393                                          Register(rt),
   17394                                          MemOperand(Register(rn),
   17395                                                     plus,
   17396                                                     offset,
   17397                                                     Offset));
   17398                                   } else {
   17399                                     // LDRH{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm_1>}] ; T2 NOLINT(whitespace/line_length)
   17400                                     ldrh(CurrentCond(),
   17401                                          Best,
   17402                                          Register(rt),
   17403                                          MemOperand(Register(rn),
   17404                                                     plus,
   17405                                                     offset,
   17406                                                     Offset));
   17407                                   }
   17408                                   break;
   17409                                 }
   17410                               }
   17411                               break;
   17412                             }
   17413                           }
   17414                           break;
   17415                         }
   17416                       }
   17417                       break;
   17418                     }
   17419                     case 0x00400000: {
   17420                       // 0xf8500000
   17421                       switch (instr & 0x00200000) {
   17422                         case 0x00000000: {
   17423                           // 0xf8500000
   17424                           switch (instr & 0x000f0000) {
   17425                             case 0x000f0000: {
   17426                               // 0xf85f0000
   17427                               unsigned rt = (instr >> 12) & 0xf;
   17428                               uint32_t U = (instr >> 23) & 0x1;
   17429                               int32_t imm = instr & 0xfff;
   17430                               if (U == 0) imm = -imm;
   17431                               bool minus_zero = (imm == 0) && (U == 0);
   17432                               Location location(imm, kT32PcDelta);
   17433                               if ((imm >= -4095) && (imm <= 4095) &&
   17434                                   ((rt < kNumberOfT32LowRegisters) &&
   17435                                    (imm >= 0) && (imm <= 1020) &&
   17436                                    ((imm & 3) == 0))) {
   17437                                 // LDR{<c>}.W <Rt>, <label> ; T2
   17438                                 if (minus_zero) {
   17439                                   ldr(CurrentCond(),
   17440                                       Wide,
   17441                                       Register(rt),
   17442                                       MemOperand(pc, minus, 0));
   17443                                 } else {
   17444                                   ldr(CurrentCond(),
   17445                                       Wide,
   17446                                       Register(rt),
   17447                                       &location);
   17448                                 }
   17449                               } else if ((imm >= -4095) && (imm <= 4095)) {
   17450                                 // LDR{<c>}{<q>} <Rt>, <label> ; T2
   17451                                 if (minus_zero) {
   17452                                   ldr(CurrentCond(),
   17453                                       Best,
   17454                                       Register(rt),
   17455                                       MemOperand(pc, minus, 0));
   17456                                 } else {
   17457                                   ldr(CurrentCond(),
   17458                                       Best,
   17459                                       Register(rt),
   17460                                       &location);
   17461                                 }
   17462                               } else {
   17463                                 UnallocatedT32(instr);
   17464                               }
   17465                               break;
   17466                             }
   17467                             default: {
   17468                               switch (instr & 0x00800000) {
   17469                                 case 0x00000000: {
   17470                                   // 0xf8500000
   17471                                   switch (instr & 0x00000d00) {
   17472                                     case 0x00000000: {
   17473                                       // 0xf8500000
   17474                                       if ((instr & 0x000002c0) == 0x00000000) {
   17475                                         if (((instr & 0xf0000) == 0xf0000)) {
   17476                                           UnallocatedT32(instr);
   17477                                           return;
   17478                                         }
   17479                                         unsigned rt = (instr >> 12) & 0xf;
   17480                                         unsigned rn = (instr >> 16) & 0xf;
   17481                                         Sign sign(plus);
   17482                                         unsigned rm = instr & 0xf;
   17483                                         Shift shift = LSL;
   17484                                         uint32_t amount = (instr >> 4) & 0x3;
   17485                                         AddrMode addrmode = Offset;
   17486                                         if ((rt < kNumberOfT32LowRegisters) &&
   17487                                             (rn < kNumberOfT32LowRegisters) &&
   17488                                             (rm < kNumberOfT32LowRegisters) &&
   17489                                             shift.IsLSL() && (amount == 0) &&
   17490                                             sign.IsPlus()) {
   17491                                           // LDR{<c>}.W <Rt>, [<Rn>, #{+}<Rm>] ; T2 NOLINT(whitespace/line_length)
   17492                                           ldr(CurrentCond(),
   17493                                               Wide,
   17494                                               Register(rt),
   17495                                               MemOperand(Register(rn),
   17496                                                          sign,
   17497                                                          Register(rm),
   17498                                                          addrmode));
   17499                                         } else {
   17500                                           // LDR{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>{, LSL #<imm>}] ; T2 NOLINT(whitespace/line_length)
   17501                                           ldr(CurrentCond(),
   17502                                               Best,
   17503                                               Register(rt),
   17504                                               MemOperand(Register(rn),
   17505                                                          sign,
   17506                                                          Register(rm),
   17507                                                          shift,
   17508                                                          amount,
   17509                                                          addrmode));
   17510                                         }
   17511                                       } else {
   17512                                         UnallocatedT32(instr);
   17513                                       }
   17514                                       break;
   17515                                     }
   17516                                     case 0x00000900: {
   17517                                       // 0xf8500900
   17518                                       if (((instr & 0xf0000) == 0xf0000)) {
   17519                                         UnallocatedT32(instr);
   17520                                         return;
   17521                                       }
   17522                                       if (((Uint32((instr >> 16)) &
   17523                                             Uint32(0xf)) == Uint32(0xd)) &&
   17524                                           ((Uint32((instr >> 9)) &
   17525                                             Uint32(0x1)) == Uint32(0x1)) &&
   17526                                           ((Uint32(instr) & Uint32(0xff)) ==
   17527                                            Uint32(0x4))) {
   17528                                         unsigned rt = (instr >> 12) & 0xf;
   17529                                         if ((rt <= 7) || (rt == kPCRegNum)) {
   17530                                           // POP{<c>}.W <single_register_list> ; T4 NOLINT(whitespace/line_length)
   17531                                           pop(CurrentCond(),
   17532                                               Wide,
   17533                                               Register(rt));
   17534                                         } else {
   17535                                           // POP{<c>}{<q>} <single_register_list> ; T4 NOLINT(whitespace/line_length)
   17536                                           pop(CurrentCond(),
   17537                                               Best,
   17538                                               Register(rt));
   17539                                         }
   17540                                         return;
   17541                                       }
   17542                                       unsigned rt = (instr >> 12) & 0xf;
   17543                                       unsigned rn = (instr >> 16) & 0xf;
   17544                                       Sign sign((((instr >> 9) & 0x1) == 0)
   17545                                                     ? minus
   17546                                                     : plus);
   17547                                       int32_t offset = instr & 0xff;
   17548                                       // LDR{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_2> ; T4 NOLINT(whitespace/line_length)
   17549                                       ldr(CurrentCond(),
   17550                                           Best,
   17551                                           Register(rt),
   17552                                           MemOperand(Register(rn),
   17553                                                      sign,
   17554                                                      offset,
   17555                                                      PostIndex));
   17556                                       break;
   17557                                     }
   17558                                     case 0x00000c00: {
   17559                                       // 0xf8500c00
   17560                                       switch (instr & 0x00000200) {
   17561                                         case 0x00000000: {
   17562                                           // 0xf8500c00
   17563                                           if (((instr & 0xf0000) == 0xf0000)) {
   17564                                             UnallocatedT32(instr);
   17565                                             return;
   17566                                           }
   17567                                           unsigned rt = (instr >> 12) & 0xf;
   17568                                           unsigned rn = (instr >> 16) & 0xf;
   17569                                           int32_t offset = instr & 0xff;
   17570                                           // LDR{<c>}{<q>} <Rt>, [<Rn>{, #-<imm_2>}] ; T4 NOLINT(whitespace/line_length)
   17571                                           ldr(CurrentCond(),
   17572                                               Best,
   17573                                               Register(rt),
   17574                                               MemOperand(Register(rn),
   17575                                                          minus,
   17576                                                          offset,
   17577                                                          Offset));
   17578                                           break;
   17579                                         }
   17580                                         case 0x00000200: {
   17581                                           // 0xf8500e00
   17582                                           if (((instr & 0xf0000) == 0xf0000)) {
   17583                                             UnallocatedT32(instr);
   17584                                             return;
   17585                                           }
   17586                                           UnimplementedT32_32("LDRT", instr);
   17587                                           break;
   17588                                         }
   17589                                       }
   17590                                       break;
   17591                                     }
   17592                                     case 0x00000d00: {
   17593                                       // 0xf8500d00
   17594                                       if (((instr & 0xf0000) == 0xf0000)) {
   17595                                         UnallocatedT32(instr);
   17596                                         return;
   17597                                       }
   17598                                       unsigned rt = (instr >> 12) & 0xf;
   17599                                       unsigned rn = (instr >> 16) & 0xf;
   17600                                       Sign sign((((instr >> 9) & 0x1) == 0)
   17601                                                     ? minus
   17602                                                     : plus);
   17603                                       int32_t offset = instr & 0xff;
   17604                                       // LDR{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_2>}]! ; T4 NOLINT(whitespace/line_length)
   17605                                       ldr(CurrentCond(),
   17606                                           Best,
   17607                                           Register(rt),
   17608                                           MemOperand(Register(rn),
   17609                                                      sign,
   17610                                                      offset,
   17611                                                      PreIndex));
   17612                                       break;
   17613                                     }
   17614                                     default:
   17615                                       UnallocatedT32(instr);
   17616                                       break;
   17617                                   }
   17618                                   break;
   17619                                 }
   17620                                 case 0x00800000: {
   17621                                   // 0xf8d00000
   17622                                   if (((instr & 0xf0000) == 0xf0000)) {
   17623                                     UnallocatedT32(instr);
   17624                                     return;
   17625                                   }
   17626                                   unsigned rt = (instr >> 12) & 0xf;
   17627                                   unsigned rn = (instr >> 16) & 0xf;
   17628                                   int32_t offset = instr & 0xfff;
   17629                                   if (((rt < kNumberOfT32LowRegisters) &&
   17630                                        (rn < kNumberOfT32LowRegisters) &&
   17631                                        ((offset >= 0) && (offset <= 124) &&
   17632                                         ((offset & 3) == 0))) ||
   17633                                       ((rt < kNumberOfT32LowRegisters) &&
   17634                                        (rn == sp.GetCode()) &&
   17635                                        ((offset >= 0) && (offset <= 1020) &&
   17636                                         ((offset & 3) == 0)))) {
   17637                                     // LDR{<c>}.W <Rt>, [<Rn>{, #{+}<imm_1>}] ; T3 NOLINT(whitespace/line_length)
   17638                                     ldr(CurrentCond(),
   17639                                         Wide,
   17640                                         Register(rt),
   17641                                         MemOperand(Register(rn),
   17642                                                    plus,
   17643                                                    offset,
   17644                                                    Offset));
   17645                                   } else {
   17646                                     // LDR{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm_1>}] ; T3 NOLINT(whitespace/line_length)
   17647                                     ldr(CurrentCond(),
   17648                                         Best,
   17649                                         Register(rt),
   17650                                         MemOperand(Register(rn),
   17651                                                    plus,
   17652                                                    offset,
   17653                                                    Offset));
   17654                                   }
   17655                                   break;
   17656                                 }
   17657                               }
   17658                               break;
   17659                             }
   17660                           }
   17661                           break;
   17662                         }
   17663                         default:
   17664                           UnallocatedT32(instr);
   17665                           break;
   17666                       }
   17667                       break;
   17668                     }
   17669                     case 0x01000000: {
   17670                       // 0xf9100000
   17671                       switch (instr & 0x00200000) {
   17672                         case 0x00000000: {
   17673                           // 0xf9100000
   17674                           switch (instr & 0x000f0000) {
   17675                             case 0x000f0000: {
   17676                               // 0xf91f0000
   17677                               switch (instr & 0x0000f000) {
   17678                                 case 0x0000f000: {
   17679                                   // 0xf91ff000
   17680                                   uint32_t U = (instr >> 23) & 0x1;
   17681                                   int32_t imm = instr & 0xfff;
   17682                                   if (U == 0) imm = -imm;
   17683                                   bool minus_zero = (imm == 0) && (U == 0);
   17684                                   Location location(imm, kT32PcDelta);
   17685                                   // PLI{<c>}{<q>} <label> ; T3
   17686                                   if (minus_zero) {
   17687                                     pli(CurrentCond(),
   17688                                         MemOperand(pc, minus, 0));
   17689                                   } else {
   17690                                     pli(CurrentCond(), &location);
   17691                                   }
   17692                                   break;
   17693                                 }
   17694                                 default: {
   17695                                   if (((instr & 0xf000) == 0xf000)) {
   17696                                     UnallocatedT32(instr);
   17697                                     return;
   17698                                   }
   17699                                   unsigned rt = (instr >> 12) & 0xf;
   17700                                   uint32_t U = (instr >> 23) & 0x1;
   17701                                   int32_t imm = instr & 0xfff;
   17702                                   if (U == 0) imm = -imm;
   17703                                   bool minus_zero = (imm == 0) && (U == 0);
   17704                                   Location location(imm, kT32PcDelta);
   17705                                   // LDRSB{<c>}{<q>} <Rt>, <label> ; T1
   17706                                   if (minus_zero) {
   17707                                     ldrsb(CurrentCond(),
   17708                                           Best,
   17709                                           Register(rt),
   17710                                           MemOperand(pc, minus, 0));
   17711                                   } else {
   17712                                     ldrsb(CurrentCond(),
   17713                                           Register(rt),
   17714                                           &location);
   17715                                   }
   17716                                   break;
   17717                                 }
   17718                               }
   17719                               break;
   17720                             }
   17721                             default: {
   17722                               switch (instr & 0x00800000) {
   17723                                 case 0x00000000: {
   17724                                   // 0xf9100000
   17725                                   switch (instr & 0x00000d00) {
   17726                                     case 0x00000000: {
   17727                                       // 0xf9100000
   17728                                       switch (instr & 0x000002c0) {
   17729                                         case 0x00000000: {
   17730                                           // 0xf9100000
   17731                                           switch (instr & 0x0000f000) {
   17732                                             case 0x0000f000: {
   17733                                               // 0xf910f000
   17734                                               if (((instr & 0xf0000) ==
   17735                                                    0xf0000)) {
   17736                                                 UnallocatedT32(instr);
   17737                                                 return;
   17738                                               }
   17739                                               unsigned rn = (instr >> 16) & 0xf;
   17740                                               Sign sign(plus);
   17741                                               unsigned rm = instr & 0xf;
   17742                                               Shift shift = LSL;
   17743                                               uint32_t amount =
   17744                                                   (instr >> 4) & 0x3;
   17745                                               AddrMode addrmode = Offset;
   17746                                               // PLI{<c>}{<q>} [<Rn>, {+}<Rm>{, LSL #<amount>}] ; T1 NOLINT(whitespace/line_length)
   17747                                               pli(CurrentCond(),
   17748                                                   MemOperand(Register(rn),
   17749                                                              sign,
   17750                                                              Register(rm),
   17751                                                              shift,
   17752                                                              amount,
   17753                                                              addrmode));
   17754                                               break;
   17755                                             }
   17756                                             default: {
   17757                                               if (((instr & 0xf0000) ==
   17758                                                    0xf0000) ||
   17759                                                   ((instr & 0xf000) ==
   17760                                                    0xf000)) {
   17761                                                 UnallocatedT32(instr);
   17762                                                 return;
   17763                                               }
   17764                                               unsigned rt = (instr >> 12) & 0xf;
   17765                                               unsigned rn = (instr >> 16) & 0xf;
   17766                                               Sign sign(plus);
   17767                                               unsigned rm = instr & 0xf;
   17768                                               Shift shift = LSL;
   17769                                               uint32_t amount =
   17770                                                   (instr >> 4) & 0x3;
   17771                                               AddrMode addrmode = Offset;
   17772                                               if ((rt <
   17773                                                    kNumberOfT32LowRegisters) &&
   17774                                                   (rn <
   17775                                                    kNumberOfT32LowRegisters) &&
   17776                                                   (rm <
   17777                                                    kNumberOfT32LowRegisters) &&
   17778                                                   shift.IsLSL() &&
   17779                                                   (amount == 0) &&
   17780                                                   sign.IsPlus()) {
   17781                                                 // LDRSB{<c>}.W <Rt>, [<Rn>, #{+}<Rm>] ; T2 NOLINT(whitespace/line_length)
   17782                                                 ldrsb(CurrentCond(),
   17783                                                       Wide,
   17784                                                       Register(rt),
   17785                                                       MemOperand(Register(rn),
   17786                                                                  sign,
   17787                                                                  Register(rm),
   17788                                                                  addrmode));
   17789                                               } else {
   17790                                                 // LDRSB{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>{, LSL #<imm>}] ; T2 NOLINT(whitespace/line_length)
   17791                                                 ldrsb(CurrentCond(),
   17792                                                       Best,
   17793                                                       Register(rt),
   17794                                                       MemOperand(Register(rn),
   17795                                                                  sign,
   17796                                                                  Register(rm),
   17797                                                                  shift,
   17798                                                                  amount,
   17799                                                                  addrmode));
   17800                                               }
   17801                                               break;
   17802                                             }
   17803                                           }
   17804                                           break;
   17805                                         }
   17806                                         default:
   17807                                           UnallocatedT32(instr);
   17808                                           break;
   17809                                       }
   17810                                       break;
   17811                                     }
   17812                                     case 0x00000900: {
   17813                                       // 0xf9100900
   17814                                       if (((instr & 0xf0000) == 0xf0000)) {
   17815                                         UnallocatedT32(instr);
   17816                                         return;
   17817                                       }
   17818                                       unsigned rt = (instr >> 12) & 0xf;
   17819                                       unsigned rn = (instr >> 16) & 0xf;
   17820                                       Sign sign((((instr >> 9) & 0x1) == 0)
   17821                                                     ? minus
   17822                                                     : plus);
   17823                                       int32_t offset = instr & 0xff;
   17824                                       // LDRSB{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_1> ; T2 NOLINT(whitespace/line_length)
   17825                                       ldrsb(CurrentCond(),
   17826                                             Best,
   17827                                             Register(rt),
   17828                                             MemOperand(Register(rn),
   17829                                                        sign,
   17830                                                        offset,
   17831                                                        PostIndex));
   17832                                       break;
   17833                                     }
   17834                                     case 0x00000c00: {
   17835                                       // 0xf9100c00
   17836                                       switch (instr & 0x00000200) {
   17837                                         case 0x00000000: {
   17838                                           // 0xf9100c00
   17839                                           switch (instr & 0x0000f000) {
   17840                                             case 0x0000f000: {
   17841                                               // 0xf910fc00
   17842                                               if (((instr & 0xf0000) ==
   17843                                                    0xf0000)) {
   17844                                                 UnallocatedT32(instr);
   17845                                                 return;
   17846                                               }
   17847                                               unsigned rn = (instr >> 16) & 0xf;
   17848                                               int32_t offset = instr & 0xff;
   17849                                               // PLI{<c>}{<q>} [<Rn>{, #-<imm_1>}] ; T2 NOLINT(whitespace/line_length)
   17850                                               pli(CurrentCond(),
   17851                                                   MemOperand(Register(rn),
   17852                                                              minus,
   17853                                                              offset,
   17854                                                              Offset));
   17855                                               break;
   17856                                             }
   17857                                             default: {
   17858                                               if (((instr & 0xf0000) ==
   17859                                                    0xf0000) ||
   17860                                                   ((instr & 0xf000) ==
   17861                                                    0xf000)) {
   17862                                                 UnallocatedT32(instr);
   17863                                                 return;
   17864                                               }
   17865                                               unsigned rt = (instr >> 12) & 0xf;
   17866                                               unsigned rn = (instr >> 16) & 0xf;
   17867                                               int32_t offset = instr & 0xff;
   17868                                               // LDRSB{<c>}{<q>} <Rt>, [<Rn>{, #-<imm_1>}] ; T2 NOLINT(whitespace/line_length)
   17869                                               ldrsb(CurrentCond(),
   17870                                                     Best,
   17871                                                     Register(rt),
   17872                                                     MemOperand(Register(rn),
   17873                                                                minus,
   17874                                                                offset,
   17875                                                                Offset));
   17876                                               break;
   17877                                             }
   17878                                           }
   17879                                           break;
   17880                                         }
   17881                                         case 0x00000200: {
   17882                                           // 0xf9100e00
   17883                                           if (((instr & 0xf0000) == 0xf0000)) {
   17884                                             UnallocatedT32(instr);
   17885                                             return;
   17886                                           }
   17887                                           UnimplementedT32_32("LDRSBT", instr);
   17888                                           break;
   17889                                         }
   17890                                       }
   17891                                       break;
   17892                                     }
   17893                                     case 0x00000d00: {
   17894                                       // 0xf9100d00
   17895                                       if (((instr & 0xf0000) == 0xf0000)) {
   17896                                         UnallocatedT32(instr);
   17897                                         return;
   17898                                       }
   17899                                       unsigned rt = (instr >> 12) & 0xf;
   17900                                       unsigned rn = (instr >> 16) & 0xf;
   17901                                       Sign sign((((instr >> 9) & 0x1) == 0)
   17902                                                     ? minus
   17903                                                     : plus);
   17904                                       int32_t offset = instr & 0xff;
   17905                                       // LDRSB{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_1>}]! ; T2 NOLINT(whitespace/line_length)
   17906                                       ldrsb(CurrentCond(),
   17907                                             Best,
   17908                                             Register(rt),
   17909                                             MemOperand(Register(rn),
   17910                                                        sign,
   17911                                                        offset,
   17912                                                        PreIndex));
   17913                                       break;
   17914                                     }
   17915                                     default:
   17916                                       UnallocatedT32(instr);
   17917                                       break;
   17918                                   }
   17919                                   break;
   17920                                 }
   17921                                 case 0x00800000: {
   17922                                   // 0xf9900000
   17923                                   switch (instr & 0x0000f000) {
   17924                                     case 0x0000f000: {
   17925                                       // 0xf990f000
   17926                                       if (((instr & 0xf0000) == 0xf0000)) {
   17927                                         UnallocatedT32(instr);
   17928                                         return;
   17929                                       }
   17930                                       unsigned rn = (instr >> 16) & 0xf;
   17931                                       int32_t offset = instr & 0xfff;
   17932                                       // PLI{<c>}{<q>} [<Rn>{, #{+}<imm>}] ; T1
   17933                                       pli(CurrentCond(),
   17934                                           MemOperand(Register(rn),
   17935                                                      plus,
   17936                                                      offset,
   17937                                                      Offset));
   17938                                       break;
   17939                                     }
   17940                                     default: {
   17941                                       if (((instr & 0xf0000) == 0xf0000) ||
   17942                                           ((instr & 0xf000) == 0xf000)) {
   17943                                         UnallocatedT32(instr);
   17944                                         return;
   17945                                       }
   17946                                       unsigned rt = (instr >> 12) & 0xf;
   17947                                       unsigned rn = (instr >> 16) & 0xf;
   17948                                       int32_t offset = instr & 0xfff;
   17949                                       // LDRSB{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm>}] ; T1 NOLINT(whitespace/line_length)
   17950                                       ldrsb(CurrentCond(),
   17951                                             Best,
   17952                                             Register(rt),
   17953                                             MemOperand(Register(rn),
   17954                                                        plus,
   17955                                                        offset,
   17956                                                        Offset));
   17957                                       break;
   17958                                     }
   17959                                   }
   17960                                   break;
   17961                                 }
   17962                               }
   17963                               break;
   17964                             }
   17965                           }
   17966                           break;
   17967                         }
   17968                         case 0x00200000: {
   17969                           // 0xf9300000
   17970                           switch (instr & 0x000f0000) {
   17971                             case 0x000f0000: {
   17972                               // 0xf93f0000
   17973                               if (((instr & 0xf000) == 0xf000)) {
   17974                                 UnallocatedT32(instr);
   17975                                 return;
   17976                               }
   17977                               unsigned rt = (instr >> 12) & 0xf;
   17978                               uint32_t U = (instr >> 23) & 0x1;
   17979                               int32_t imm = instr & 0xfff;
   17980                               if (U == 0) imm = -imm;
   17981                               bool minus_zero = (imm == 0) && (U == 0);
   17982                               Location location(imm, kT32PcDelta);
   17983                               // LDRSH{<c>}{<q>} <Rt>, <label> ; T1
   17984                               if (minus_zero) {
   17985                                 ldrsh(CurrentCond(),
   17986                                       Best,
   17987                                       Register(rt),
   17988                                       MemOperand(pc, minus, 0));
   17989                               } else {
   17990                                 ldrsh(CurrentCond(), Register(rt), &location);
   17991                               }
   17992                               break;
   17993                             }
   17994                             default: {
   17995                               switch (instr & 0x00800000) {
   17996                                 case 0x00000000: {
   17997                                   // 0xf9300000
   17998                                   switch (instr & 0x00000d00) {
   17999                                     case 0x00000000: {
   18000                                       // 0xf9300000
   18001                                       if ((instr & 0x000002c0) == 0x00000000) {
   18002                                         if (((instr & 0xf0000) == 0xf0000) ||
   18003                                             ((instr & 0xf000) == 0xf000)) {
   18004                                           UnallocatedT32(instr);
   18005                                           return;
   18006                                         }
   18007                                         unsigned rt = (instr >> 12) & 0xf;
   18008                                         unsigned rn = (instr >> 16) & 0xf;
   18009                                         Sign sign(plus);
   18010                                         unsigned rm = instr & 0xf;
   18011                                         Shift shift = LSL;
   18012                                         uint32_t amount = (instr >> 4) & 0x3;
   18013                                         AddrMode addrmode = Offset;
   18014                                         if ((rt < kNumberOfT32LowRegisters) &&
   18015                                             (rn < kNumberOfT32LowRegisters) &&
   18016                                             (rm < kNumberOfT32LowRegisters) &&
   18017                                             shift.IsLSL() && (amount == 0) &&
   18018                                             sign.IsPlus()) {
   18019                                           // LDRSH{<c>}.W <Rt>, [<Rn>, #{+}<Rm>] ; T2 NOLINT(whitespace/line_length)
   18020                                           ldrsh(CurrentCond(),
   18021                                                 Wide,
   18022                                                 Register(rt),
   18023                                                 MemOperand(Register(rn),
   18024                                                            sign,
   18025                                                            Register(rm),
   18026                                                            addrmode));
   18027                                         } else {
   18028                                           // LDRSH{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>{, LSL #<imm>}] ; T2 NOLINT(whitespace/line_length)
   18029                                           ldrsh(CurrentCond(),
   18030                                                 Best,
   18031                                                 Register(rt),
   18032                                                 MemOperand(Register(rn),
   18033                                                            sign,
   18034                                                            Register(rm),
   18035                                                            shift,
   18036                                                            amount,
   18037                                                            addrmode));
   18038                                         }
   18039                                       } else {
   18040                                         UnallocatedT32(instr);
   18041                                       }
   18042                                       break;
   18043                                     }
   18044                                     case 0x00000900: {
   18045                                       // 0xf9300900
   18046                                       if (((instr & 0xf0000) == 0xf0000)) {
   18047                                         UnallocatedT32(instr);
   18048                                         return;
   18049                                       }
   18050                                       unsigned rt = (instr >> 12) & 0xf;
   18051                                       unsigned rn = (instr >> 16) & 0xf;
   18052                                       Sign sign((((instr >> 9) & 0x1) == 0)
   18053                                                     ? minus
   18054                                                     : plus);
   18055                                       int32_t offset = instr & 0xff;
   18056                                       // LDRSH{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_1> ; T2 NOLINT(whitespace/line_length)
   18057                                       ldrsh(CurrentCond(),
   18058                                             Best,
   18059                                             Register(rt),
   18060                                             MemOperand(Register(rn),
   18061                                                        sign,
   18062                                                        offset,
   18063                                                        PostIndex));
   18064                                       break;
   18065                                     }
   18066                                     case 0x00000c00: {
   18067                                       // 0xf9300c00
   18068                                       switch (instr & 0x00000200) {
   18069                                         case 0x00000000: {
   18070                                           // 0xf9300c00
   18071                                           if (((instr & 0xf0000) == 0xf0000) ||
   18072                                               ((instr & 0xf000) == 0xf000)) {
   18073                                             UnallocatedT32(instr);
   18074                                             return;
   18075                                           }
   18076                                           unsigned rt = (instr >> 12) & 0xf;
   18077                                           unsigned rn = (instr >> 16) & 0xf;
   18078                                           int32_t offset = instr & 0xff;
   18079                                           // LDRSH{<c>}{<q>} <Rt>, [<Rn>{, #-<imm_1>}] ; T2 NOLINT(whitespace/line_length)
   18080                                           ldrsh(CurrentCond(),
   18081                                                 Best,
   18082                                                 Register(rt),
   18083                                                 MemOperand(Register(rn),
   18084                                                            minus,
   18085                                                            offset,
   18086                                                            Offset));
   18087                                           break;
   18088                                         }
   18089                                         case 0x00000200: {
   18090                                           // 0xf9300e00
   18091                                           if (((instr & 0xf0000) == 0xf0000)) {
   18092                                             UnallocatedT32(instr);
   18093                                             return;
   18094                                           }
   18095                                           UnimplementedT32_32("LDRSHT", instr);
   18096                                           break;
   18097                                         }
   18098                                       }
   18099                                       break;
   18100                                     }
   18101                                     case 0x00000d00: {
   18102                                       // 0xf9300d00
   18103                                       if (((instr & 0xf0000) == 0xf0000)) {
   18104                                         UnallocatedT32(instr);
   18105                                         return;
   18106                                       }
   18107                                       unsigned rt = (instr >> 12) & 0xf;
   18108                                       unsigned rn = (instr >> 16) & 0xf;
   18109                                       Sign sign((((instr >> 9) & 0x1) == 0)
   18110                                                     ? minus
   18111                                                     : plus);
   18112                                       int32_t offset = instr & 0xff;
   18113                                       // LDRSH{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_1>}]! ; T2 NOLINT(whitespace/line_length)
   18114                                       ldrsh(CurrentCond(),
   18115                                             Best,
   18116                                             Register(rt),
   18117                                             MemOperand(Register(rn),
   18118                                                        sign,
   18119                                                        offset,
   18120                                                        PreIndex));
   18121                                       break;
   18122                                     }
   18123                                     default:
   18124                                       UnallocatedT32(instr);
   18125                                       break;
   18126                                   }
   18127                                   break;
   18128                                 }
   18129                                 case 0x00800000: {
   18130                                   // 0xf9b00000
   18131                                   if (((instr & 0xf0000) == 0xf0000) ||
   18132                                       ((instr & 0xf000) == 0xf000)) {
   18133                                     UnallocatedT32(instr);
   18134                                     return;
   18135                                   }
   18136                                   unsigned rt = (instr >> 12) & 0xf;
   18137                                   unsigned rn = (instr >> 16) & 0xf;
   18138                                   int32_t offset = instr & 0xfff;
   18139                                   // LDRSH{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm>}] ; T1 NOLINT(whitespace/line_length)
   18140                                   ldrsh(CurrentCond(),
   18141                                         Best,
   18142                                         Register(rt),
   18143                                         MemOperand(Register(rn),
   18144                                                    plus,
   18145                                                    offset,
   18146                                                    Offset));
   18147                                   break;
   18148                                 }
   18149                               }
   18150                               break;
   18151                             }
   18152                           }
   18153                           break;
   18154                         }
   18155                       }
   18156                       break;
   18157                     }
   18158                     default:
   18159                       UnallocatedT32(instr);
   18160                       break;
   18161                   }
   18162                   break;
   18163                 }
   18164               }
   18165               break;
   18166             }
   18167             case 0x02000000: {
   18168               // 0xea000000
   18169               switch (instr & 0x11900000) {
   18170                 case 0x00000000: {
   18171                   // 0xea000000
   18172                   switch (instr & 0x00600000) {
   18173                     case 0x00000000: {
   18174                       // 0xea000000
   18175                       switch (instr & 0x000070f0) {
   18176                         case 0x00000030: {
   18177                           // 0xea000030
   18178                           unsigned rd = (instr >> 8) & 0xf;
   18179                           unsigned rn = (instr >> 16) & 0xf;
   18180                           unsigned rm = instr & 0xf;
   18181                           // AND{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2
   18182                           and_(CurrentCond(),
   18183                                Best,
   18184                                Register(rd),
   18185                                Register(rn),
   18186                                Operand(Register(rm), RRX));
   18187                           if (((instr & 0xfff0f0f0) != 0xea000030)) {
   18188                             UnpredictableT32(instr);
   18189                           }
   18190                           break;
   18191                         }
   18192                         default: {
   18193                           if (((instr & 0x70f0) == 0x30)) {
   18194                             UnallocatedT32(instr);
   18195                             return;
   18196                           }
   18197                           unsigned rd = (instr >> 8) & 0xf;
   18198                           unsigned rn = (instr >> 16) & 0xf;
   18199                           unsigned rm = instr & 0xf;
   18200                           ImmediateShiftOperand
   18201                               shift_operand((instr >> 4) & 0x3,
   18202                                             ((instr >> 6) & 0x3) |
   18203                                                 ((instr >> 10) & 0x1c));
   18204                           if (InITBlock() &&
   18205                               (instr & 0x00100000) == 0x00000000 &&
   18206                               shift_operand.GetShift().IsLSL() &&
   18207                               (shift_operand.GetAmount() == 0) &&
   18208                               ((rd == rn) && (rd < kNumberOfT32LowRegisters) &&
   18209                                (rm < kNumberOfT32LowRegisters))) {
   18210                             // AND<c>.W {<Rd>}, <Rn>, <Rm> ; T2
   18211                             and_(CurrentCond(),
   18212                                  Wide,
   18213                                  Register(rd),
   18214                                  Register(rn),
   18215                                  Register(rm));
   18216                             if (((instr & 0xfff08000) != 0xea000000)) {
   18217                               UnpredictableT32(instr);
   18218                             }
   18219                           } else if ((instr & 0x00100000) == 0x00000000) {
   18220                             // AND{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
   18221                             and_(CurrentCond(),
   18222                                  Best,
   18223                                  Register(rd),
   18224                                  Register(rn),
   18225                                  Operand(Register(rm),
   18226                                          shift_operand.GetType(),
   18227                                          shift_operand.GetAmount()));
   18228                             if (((instr & 0xfff08000) != 0xea000000)) {
   18229                               UnpredictableT32(instr);
   18230                             }
   18231                           } else {
   18232                             UnallocatedT32(instr);
   18233                           }
   18234                           break;
   18235                         }
   18236                       }
   18237                       break;
   18238                     }
   18239                     case 0x00200000: {
   18240                       // 0xea200000
   18241                       switch (instr & 0x000070f0) {
   18242                         case 0x00000030: {
   18243                           // 0xea200030
   18244                           unsigned rd = (instr >> 8) & 0xf;
   18245                           unsigned rn = (instr >> 16) & 0xf;
   18246                           unsigned rm = instr & 0xf;
   18247                           // BIC{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2
   18248                           bic(CurrentCond(),
   18249                               Best,
   18250                               Register(rd),
   18251                               Register(rn),
   18252                               Operand(Register(rm), RRX));
   18253                           if (((instr & 0xfff0f0f0) != 0xea200030)) {
   18254                             UnpredictableT32(instr);
   18255                           }
   18256                           break;
   18257                         }
   18258                         default: {
   18259                           if (((instr & 0x70f0) == 0x30)) {
   18260                             UnallocatedT32(instr);
   18261                             return;
   18262                           }
   18263                           unsigned rd = (instr >> 8) & 0xf;
   18264                           unsigned rn = (instr >> 16) & 0xf;
   18265                           unsigned rm = instr & 0xf;
   18266                           ImmediateShiftOperand
   18267                               shift_operand((instr >> 4) & 0x3,
   18268                                             ((instr >> 6) & 0x3) |
   18269                                                 ((instr >> 10) & 0x1c));
   18270                           if (InITBlock() &&
   18271                               (instr & 0x00100000) == 0x00000000 &&
   18272                               shift_operand.GetShift().IsLSL() &&
   18273                               (shift_operand.GetAmount() == 0) &&
   18274                               ((rd == rn) && (rd < kNumberOfT32LowRegisters) &&
   18275                                (rm < kNumberOfT32LowRegisters))) {
   18276                             // BIC<c>.W {<Rd>}, <Rn>, <Rm> ; T2
   18277                             bic(CurrentCond(),
   18278                                 Wide,
   18279                                 Register(rd),
   18280                                 Register(rn),
   18281                                 Register(rm));
   18282                             if (((instr & 0xfff08000) != 0xea200000)) {
   18283                               UnpredictableT32(instr);
   18284                             }
   18285                           } else if ((instr & 0x00100000) == 0x00000000) {
   18286                             // BIC{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
   18287                             bic(CurrentCond(),
   18288                                 Best,
   18289                                 Register(rd),
   18290                                 Register(rn),
   18291                                 Operand(Register(rm),
   18292                                         shift_operand.GetType(),
   18293                                         shift_operand.GetAmount()));
   18294                             if (((instr & 0xfff08000) != 0xea200000)) {
   18295                               UnpredictableT32(instr);
   18296                             }
   18297                           } else {
   18298                             UnallocatedT32(instr);
   18299                           }
   18300                           break;
   18301                         }
   18302                       }
   18303                       break;
   18304                     }
   18305                     case 0x00400000: {
   18306                       // 0xea400000
   18307                       switch (instr & 0x000f0000) {
   18308                         case 0x000f0000: {
   18309                           // 0xea4f0000
   18310                           switch (instr & 0x000070f0) {
   18311                             case 0x00000030: {
   18312                               // 0xea4f0030
   18313                               unsigned rd = (instr >> 8) & 0xf;
   18314                               unsigned rm = instr & 0xf;
   18315                               // RRX{<c>}{<q>} {<Rd>}, <Rm> ; T3
   18316                               rrx(CurrentCond(), Register(rd), Register(rm));
   18317                               if (((instr & 0xfffff0f0) != 0xea4f0030)) {
   18318                                 UnpredictableT32(instr);
   18319                               }
   18320                               break;
   18321                             }
   18322                             default: {
   18323                               if (((instr & 0x70f0) == 0x30)) {
   18324                                 UnallocatedT32(instr);
   18325                                 return;
   18326                               }
   18327                               if (((Uint32((instr >> 4)) & Uint32(0x3)) ==
   18328                                    Uint32(0x2))) {
   18329                                 unsigned rd = (instr >> 8) & 0xf;
   18330                                 unsigned rm = instr & 0xf;
   18331                                 uint32_t amount = ((instr >> 6) & 0x3) |
   18332                                                   ((instr >> 10) & 0x1c);
   18333                                 if (amount == 0) amount = 32;
   18334                                 if (InITBlock() &&
   18335                                     ((rd < kNumberOfT32LowRegisters) &&
   18336                                      (rm < kNumberOfT32LowRegisters) &&
   18337                                      ((amount >= 1) && (amount <= 32)))) {
   18338                                   // ASR<c>.W {<Rd>}, <Rm>, #<imm> ; T3
   18339                                   asr(CurrentCond(),
   18340                                       Wide,
   18341                                       Register(rd),
   18342                                       Register(rm),
   18343                                       amount);
   18344                                   if (((instr & 0xffff8030) != 0xea4f0020)) {
   18345                                     UnpredictableT32(instr);
   18346                                   }
   18347                                 } else {
   18348                                   // ASR{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; T3
   18349                                   asr(CurrentCond(),
   18350                                       Best,
   18351                                       Register(rd),
   18352                                       Register(rm),
   18353                                       amount);
   18354                                   if (((instr & 0xffff8030) != 0xea4f0020)) {
   18355                                     UnpredictableT32(instr);
   18356                                   }
   18357                                 }
   18358                                 return;
   18359                               }
   18360                               if (((Uint32((instr >> 4)) & Uint32(0x3)) ==
   18361                                    Uint32(0x0)) &&
   18362                                   ((instr & 0x000070c0) != 0x00000000)) {
   18363                                 unsigned rd = (instr >> 8) & 0xf;
   18364                                 unsigned rm = instr & 0xf;
   18365                                 uint32_t amount = ((instr >> 6) & 0x3) |
   18366                                                   ((instr >> 10) & 0x1c);
   18367                                 if (InITBlock() &&
   18368                                     ((rd < kNumberOfT32LowRegisters) &&
   18369                                      (rm < kNumberOfT32LowRegisters) &&
   18370                                      ((amount >= 1) && (amount <= 31)))) {
   18371                                   // LSL<c>.W {<Rd>}, <Rm>, #<imm> ; T3
   18372                                   lsl(CurrentCond(),
   18373                                       Wide,
   18374                                       Register(rd),
   18375                                       Register(rm),
   18376                                       amount);
   18377                                   if (((instr & 0xffff8030) != 0xea4f0000)) {
   18378                                     UnpredictableT32(instr);
   18379                                   }
   18380                                 } else {
   18381                                   // LSL{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; T3
   18382                                   lsl(CurrentCond(),
   18383                                       Best,
   18384                                       Register(rd),
   18385                                       Register(rm),
   18386                                       amount);
   18387                                   if (((instr & 0xffff8030) != 0xea4f0000)) {
   18388                                     UnpredictableT32(instr);
   18389                                   }
   18390                                 }
   18391                                 return;
   18392                               }
   18393                               if (((Uint32((instr >> 4)) & Uint32(0x3)) ==
   18394                                    Uint32(0x1))) {
   18395                                 unsigned rd = (instr >> 8) & 0xf;
   18396                                 unsigned rm = instr & 0xf;
   18397                                 uint32_t amount = ((instr >> 6) & 0x3) |
   18398                                                   ((instr >> 10) & 0x1c);
   18399                                 if (amount == 0) amount = 32;
   18400                                 if (InITBlock() &&
   18401                                     ((rd < kNumberOfT32LowRegisters) &&
   18402                                      (rm < kNumberOfT32LowRegisters) &&
   18403                                      ((amount >= 1) && (amount <= 32)))) {
   18404                                   // LSR<c>.W {<Rd>}, <Rm>, #<imm> ; T3
   18405                                   lsr(CurrentCond(),
   18406                                       Wide,
   18407                                       Register(rd),
   18408                                       Register(rm),
   18409                                       amount);
   18410                                   if (((instr & 0xffff8030) != 0xea4f0010)) {
   18411                                     UnpredictableT32(instr);
   18412                                   }
   18413                                 } else {
   18414                                   // LSR{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; T3
   18415                                   lsr(CurrentCond(),
   18416                                       Best,
   18417                                       Register(rd),
   18418                                       Register(rm),
   18419                                       amount);
   18420                                   if (((instr & 0xffff8030) != 0xea4f0010)) {
   18421                                     UnpredictableT32(instr);
   18422                                   }
   18423                                 }
   18424                                 return;
   18425                               }
   18426                               if (((Uint32((instr >> 4)) & Uint32(0x3)) ==
   18427                                    Uint32(0x3)) &&
   18428                                   ((instr & 0x000070c0) != 0x00000000)) {
   18429                                 unsigned rd = (instr >> 8) & 0xf;
   18430                                 unsigned rm = instr & 0xf;
   18431                                 uint32_t amount = ((instr >> 6) & 0x3) |
   18432                                                   ((instr >> 10) & 0x1c);
   18433                                 // ROR{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; T3
   18434                                 ror(CurrentCond(),
   18435                                     Best,
   18436                                     Register(rd),
   18437                                     Register(rm),
   18438                                     amount);
   18439                                 if (((instr & 0xffff8030) != 0xea4f0030)) {
   18440                                   UnpredictableT32(instr);
   18441                                 }
   18442                                 return;
   18443                               }
   18444                               unsigned rd = (instr >> 8) & 0xf;
   18445                               unsigned rm = instr & 0xf;
   18446                               ImmediateShiftOperand
   18447                                   shift_operand((instr >> 4) & 0x3,
   18448                                                 ((instr >> 6) & 0x3) |
   18449                                                     ((instr >> 10) & 0x1c));
   18450                               if ((instr & 0x00100000) == 0x00000000 &&
   18451                                   (shift_operand.GetShift().IsLSL() &&
   18452                                    (shift_operand.GetAmount() == 0))) {
   18453                                 // MOV<c>.W <Rd>, <Rm> {, <shift> #<amount> } ; T3 NOLINT(whitespace/line_length)
   18454                                 mov(CurrentCond(),
   18455                                     Wide,
   18456                                     Register(rd),
   18457                                     Operand(Register(rm),
   18458                                             shift_operand.GetType(),
   18459                                             shift_operand.GetAmount()));
   18460                                 if (((instr & 0xffff8000) != 0xea4f0000)) {
   18461                                   UnpredictableT32(instr);
   18462                                 }
   18463                               } else if (InITBlock() &&
   18464                                          (instr & 0x00100000) == 0x00000000 &&
   18465                                          ((rd < kNumberOfT32LowRegisters) &&
   18466                                           (rm < kNumberOfT32LowRegisters))) {
   18467                                 // MOV<c>.W <Rd>, <Rm> {, <shift> #<amount> } ; T3 NOLINT(whitespace/line_length)
   18468                                 mov(CurrentCond(),
   18469                                     Wide,
   18470                                     Register(rd),
   18471                                     Operand(Register(rm),
   18472                                             shift_operand.GetType(),
   18473                                             shift_operand.GetAmount()));
   18474                                 if (((instr & 0xffff8000) != 0xea4f0000)) {
   18475                                   UnpredictableT32(instr);
   18476                                 }
   18477                               } else if ((instr & 0x00100000) == 0x00000000) {
   18478                                 // MOV{<c>}{<q>} <Rd>, <Rm> {, <shift> #<amount> } ; T3 NOLINT(whitespace/line_length)
   18479                                 mov(CurrentCond(),
   18480                                     Best,
   18481                                     Register(rd),
   18482                                     Operand(Register(rm),
   18483                                             shift_operand.GetType(),
   18484                                             shift_operand.GetAmount()));
   18485                                 if (((instr & 0xffff8000) != 0xea4f0000)) {
   18486                                   UnpredictableT32(instr);
   18487                                 }
   18488                               } else {
   18489                                 UnallocatedT32(instr);
   18490                               }
   18491                               break;
   18492                             }
   18493                           }
   18494                           break;
   18495                         }
   18496                         default: {
   18497                           switch (instr & 0x000070f0) {
   18498                             case 0x00000030: {
   18499                               // 0xea400030
   18500                               if (((instr & 0xf0000) == 0xf0000)) {
   18501                                 UnallocatedT32(instr);
   18502                                 return;
   18503                               }
   18504                               unsigned rd = (instr >> 8) & 0xf;
   18505                               unsigned rn = (instr >> 16) & 0xf;
   18506                               unsigned rm = instr & 0xf;
   18507                               // ORR{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2
   18508                               orr(CurrentCond(),
   18509                                   Best,
   18510                                   Register(rd),
   18511                                   Register(rn),
   18512                                   Operand(Register(rm), RRX));
   18513                               if (((instr & 0xfff0f0f0) != 0xea400030)) {
   18514                                 UnpredictableT32(instr);
   18515                               }
   18516                               break;
   18517                             }
   18518                             default: {
   18519                               if (((instr & 0xf0000) == 0xf0000) ||
   18520                                   ((instr & 0x70f0) == 0x30)) {
   18521                                 UnallocatedT32(instr);
   18522                                 return;
   18523                               }
   18524                               unsigned rd = (instr >> 8) & 0xf;
   18525                               unsigned rn = (instr >> 16) & 0xf;
   18526                               unsigned rm = instr & 0xf;
   18527                               ImmediateShiftOperand
   18528                                   shift_operand((instr >> 4) & 0x3,
   18529                                                 ((instr >> 6) & 0x3) |
   18530                                                     ((instr >> 10) & 0x1c));
   18531                               if (InITBlock() &&
   18532                                   (instr & 0x00100000) == 0x00000000 &&
   18533                                   shift_operand.GetShift().IsLSL() &&
   18534                                   (shift_operand.GetAmount() == 0) &&
   18535                                   ((rd == rn) &&
   18536                                    (rd < kNumberOfT32LowRegisters) &&
   18537                                    (rm < kNumberOfT32LowRegisters))) {
   18538                                 // ORR<c>.W {<Rd>}, <Rn>, <Rm> ; T2
   18539                                 orr(CurrentCond(),
   18540                                     Wide,
   18541                                     Register(rd),
   18542                                     Register(rn),
   18543                                     Register(rm));
   18544                                 if (((instr & 0xfff08000) != 0xea400000)) {
   18545                                   UnpredictableT32(instr);
   18546                                 }
   18547                               } else if ((instr & 0x00100000) == 0x00000000) {
   18548                                 // ORR{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
   18549                                 orr(CurrentCond(),
   18550                                     Best,
   18551                                     Register(rd),
   18552                                     Register(rn),
   18553                                     Operand(Register(rm),
   18554                                             shift_operand.GetType(),
   18555                                             shift_operand.GetAmount()));
   18556                                 if (((instr & 0xfff08000) != 0xea400000)) {
   18557                                   UnpredictableT32(instr);
   18558                                 }
   18559                               } else {
   18560                                 UnallocatedT32(instr);
   18561                               }
   18562                               break;
   18563                             }
   18564                           }
   18565                           break;
   18566                         }
   18567                       }
   18568                       break;
   18569                     }
   18570                     case 0x00600000: {
   18571                       // 0xea600000
   18572                       switch (instr & 0x000f0000) {
   18573                         case 0x000f0000: {
   18574                           // 0xea6f0000
   18575                           switch (instr & 0x000070f0) {
   18576                             case 0x00000030: {
   18577                               // 0xea6f0030
   18578                               unsigned rd = (instr >> 8) & 0xf;
   18579                               unsigned rm = instr & 0xf;
   18580                               // MVN{<c>}{<q>} <Rd>, <Rm>, RRX ; T2
   18581                               mvn(CurrentCond(),
   18582                                   Best,
   18583                                   Register(rd),
   18584                                   Operand(Register(rm), RRX));
   18585                               if (((instr & 0xfffff0f0) != 0xea6f0030)) {
   18586                                 UnpredictableT32(instr);
   18587                               }
   18588                               break;
   18589                             }
   18590                             default: {
   18591                               if (((instr & 0x70f0) == 0x30)) {
   18592                                 UnallocatedT32(instr);
   18593                                 return;
   18594                               }
   18595                               unsigned rd = (instr >> 8) & 0xf;
   18596                               unsigned rm = instr & 0xf;
   18597                               ImmediateShiftOperand
   18598                                   shift_operand((instr >> 4) & 0x3,
   18599                                                 ((instr >> 6) & 0x3) |
   18600                                                     ((instr >> 10) & 0x1c));
   18601                               if (InITBlock() &&
   18602                                   (instr & 0x00100000) == 0x00000000 &&
   18603                                   shift_operand.GetShift().IsLSL() &&
   18604                                   (shift_operand.GetAmount() == 0) &&
   18605                                   ((rd < kNumberOfT32LowRegisters) &&
   18606                                    (rm < kNumberOfT32LowRegisters))) {
   18607                                 // MVN<c>.W <Rd>, <Rm> ; T2
   18608                                 mvn(CurrentCond(),
   18609                                     Wide,
   18610                                     Register(rd),
   18611                                     Register(rm));
   18612                                 if (((instr & 0xffff8000) != 0xea6f0000)) {
   18613                                   UnpredictableT32(instr);
   18614                                 }
   18615                               } else if ((instr & 0x00100000) == 0x00000000) {
   18616                                 // MVN{<c>}{<q>} <Rd>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
   18617                                 mvn(CurrentCond(),
   18618                                     Best,
   18619                                     Register(rd),
   18620                                     Operand(Register(rm),
   18621                                             shift_operand.GetType(),
   18622                                             shift_operand.GetAmount()));
   18623                                 if (((instr & 0xffff8000) != 0xea6f0000)) {
   18624                                   UnpredictableT32(instr);
   18625                                 }
   18626                               } else {
   18627                                 UnallocatedT32(instr);
   18628                               }
   18629                               break;
   18630                             }
   18631                           }
   18632                           break;
   18633                         }
   18634                         default: {
   18635                           switch (instr & 0x000070f0) {
   18636                             case 0x00000030: {
   18637                               // 0xea600030
   18638                               if (((instr & 0xf0000) == 0xf0000)) {
   18639                                 UnallocatedT32(instr);
   18640                                 return;
   18641                               }
   18642                               unsigned rd = (instr >> 8) & 0xf;
   18643                               unsigned rn = (instr >> 16) & 0xf;
   18644                               unsigned rm = instr & 0xf;
   18645                               // ORN{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T1
   18646                               orn(CurrentCond(),
   18647                                   Register(rd),
   18648                                   Register(rn),
   18649                                   Operand(Register(rm), RRX));
   18650                               if (((instr & 0xfff0f0f0) != 0xea600030)) {
   18651                                 UnpredictableT32(instr);
   18652                               }
   18653                               break;
   18654                             }
   18655                             default: {
   18656                               if (((instr & 0xf0000) == 0xf0000) ||
   18657                                   ((instr & 0x70f0) == 0x30)) {
   18658                                 UnallocatedT32(instr);
   18659                                 return;
   18660                               }
   18661                               unsigned rd = (instr >> 8) & 0xf;
   18662                               unsigned rn = (instr >> 16) & 0xf;
   18663                               unsigned rm = instr & 0xf;
   18664                               ImmediateShiftOperand
   18665                                   shift_operand((instr >> 4) & 0x3,
   18666                                                 ((instr >> 6) & 0x3) |
   18667                                                     ((instr >> 10) & 0x1c));
   18668                               // ORN{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T1 NOLINT(whitespace/line_length)
   18669                               orn(CurrentCond(),
   18670                                   Register(rd),
   18671                                   Register(rn),
   18672                                   Operand(Register(rm),
   18673                                           shift_operand.GetType(),
   18674                                           shift_operand.GetAmount()));
   18675                               if (((instr & 0xfff08000) != 0xea600000)) {
   18676                                 UnpredictableT32(instr);
   18677                               }
   18678                               break;
   18679                             }
   18680                           }
   18681                           break;
   18682                         }
   18683                       }
   18684                       break;
   18685                     }
   18686                   }
   18687                   break;
   18688                 }
   18689                 case 0x00100000: {
   18690                   // 0xea100000
   18691                   switch (instr & 0x00600000) {
   18692                     case 0x00000000: {
   18693                       // 0xea100000
   18694                       switch (instr & 0x00000f00) {
   18695                         case 0x00000f00: {
   18696                           // 0xea100f00
   18697                           switch (instr & 0x000070f0) {
   18698                             case 0x00000030: {
   18699                               // 0xea100f30
   18700                               unsigned rn = (instr >> 16) & 0xf;
   18701                               unsigned rm = instr & 0xf;
   18702                               // TST{<c>}{<q>} <Rn>, <Rm>, RRX ; T2
   18703                               tst(CurrentCond(),
   18704                                   Best,
   18705                                   Register(rn),
   18706                                   Operand(Register(rm), RRX));
   18707                               if (((instr & 0xfff0fff0) != 0xea100f30)) {
   18708                                 UnpredictableT32(instr);
   18709                               }
   18710                               break;
   18711                             }
   18712                             default: {
   18713                               if (((instr & 0x70f0) == 0x30)) {
   18714                                 UnallocatedT32(instr);
   18715                                 return;
   18716                               }
   18717                               unsigned rn = (instr >> 16) & 0xf;
   18718                               unsigned rm = instr & 0xf;
   18719                               ImmediateShiftOperand
   18720                                   shift_operand((instr >> 4) & 0x3,
   18721                                                 ((instr >> 6) & 0x3) |
   18722                                                     ((instr >> 10) & 0x1c));
   18723                               if (shift_operand.GetShift().IsLSL() &&
   18724                                   (shift_operand.GetAmount() == 0) &&
   18725                                   ((rn < kNumberOfT32LowRegisters) &&
   18726                                    (rm < kNumberOfT32LowRegisters))) {
   18727                                 // TST{<c>}.W <Rn>, <Rm> ; T2
   18728                                 tst(CurrentCond(),
   18729                                     Wide,
   18730                                     Register(rn),
   18731                                     Register(rm));
   18732                                 if (((instr & 0xfff08f00) != 0xea100f00)) {
   18733                                   UnpredictableT32(instr);
   18734                                 }
   18735                               } else {
   18736                                 // TST{<c>}{<q>} <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
   18737                                 tst(CurrentCond(),
   18738                                     Best,
   18739                                     Register(rn),
   18740                                     Operand(Register(rm),
   18741                                             shift_operand.GetType(),
   18742                                             shift_operand.GetAmount()));
   18743                                 if (((instr & 0xfff08f00) != 0xea100f00)) {
   18744                                   UnpredictableT32(instr);
   18745                                 }
   18746                               }
   18747                               break;
   18748                             }
   18749                           }
   18750                           break;
   18751                         }
   18752                         default: {
   18753                           switch (instr & 0x000070f0) {
   18754                             case 0x00000030: {
   18755                               // 0xea100030
   18756                               if (((instr & 0xf00) == 0xf00)) {
   18757                                 UnallocatedT32(instr);
   18758                                 return;
   18759                               }
   18760                               unsigned rd = (instr >> 8) & 0xf;
   18761                               unsigned rn = (instr >> 16) & 0xf;
   18762                               unsigned rm = instr & 0xf;
   18763                               // ANDS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2
   18764                               ands(CurrentCond(),
   18765                                    Best,
   18766                                    Register(rd),
   18767                                    Register(rn),
   18768                                    Operand(Register(rm), RRX));
   18769                               if (((instr & 0xfff0f0f0) != 0xea100030)) {
   18770                                 UnpredictableT32(instr);
   18771                               }
   18772                               break;
   18773                             }
   18774                             default: {
   18775                               if (((instr & 0x70f0) == 0x30) ||
   18776                                   ((instr & 0xf00) == 0xf00)) {
   18777                                 UnallocatedT32(instr);
   18778                                 return;
   18779                               }
   18780                               unsigned rd = (instr >> 8) & 0xf;
   18781                               unsigned rn = (instr >> 16) & 0xf;
   18782                               unsigned rm = instr & 0xf;
   18783                               ImmediateShiftOperand
   18784                                   shift_operand((instr >> 4) & 0x3,
   18785                                                 ((instr >> 6) & 0x3) |
   18786                                                     ((instr >> 10) & 0x1c));
   18787                               if (OutsideITBlock() &&
   18788                                   (instr & 0x00100000) == 0x00100000 &&
   18789                                   shift_operand.GetShift().IsLSL() &&
   18790                                   (shift_operand.GetAmount() == 0) &&
   18791                                   ((rd == rn) &&
   18792                                    (rd < kNumberOfT32LowRegisters) &&
   18793                                    (rm < kNumberOfT32LowRegisters))) {
   18794                                 // ANDS.W {<Rd>}, <Rn>, <Rm> ; T2
   18795                                 ands(Condition::None(),
   18796                                      Wide,
   18797                                      Register(rd),
   18798                                      Register(rn),
   18799                                      Register(rm));
   18800                                 if (((instr & 0xfff08000) != 0xea100000)) {
   18801                                   UnpredictableT32(instr);
   18802                                 }
   18803                               } else if ((instr & 0x00100000) == 0x00100000) {
   18804                                 // ANDS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
   18805                                 ands(CurrentCond(),
   18806                                      Best,
   18807                                      Register(rd),
   18808                                      Register(rn),
   18809                                      Operand(Register(rm),
   18810                                              shift_operand.GetType(),
   18811                                              shift_operand.GetAmount()));
   18812                                 if (((instr & 0xfff08000) != 0xea100000)) {
   18813                                   UnpredictableT32(instr);
   18814                                 }
   18815                               } else {
   18816                                 UnallocatedT32(instr);
   18817                               }
   18818                               break;
   18819                             }
   18820                           }
   18821                           break;
   18822                         }
   18823                       }
   18824                       break;
   18825                     }
   18826                     case 0x00200000: {
   18827                       // 0xea300000
   18828                       switch (instr & 0x000070f0) {
   18829                         case 0x00000030: {
   18830                           // 0xea300030
   18831                           unsigned rd = (instr >> 8) & 0xf;
   18832                           unsigned rn = (instr >> 16) & 0xf;
   18833                           unsigned rm = instr & 0xf;
   18834                           // BICS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2
   18835                           bics(CurrentCond(),
   18836                                Best,
   18837                                Register(rd),
   18838                                Register(rn),
   18839                                Operand(Register(rm), RRX));
   18840                           if (((instr & 0xfff0f0f0) != 0xea300030)) {
   18841                             UnpredictableT32(instr);
   18842                           }
   18843                           break;
   18844                         }
   18845                         default: {
   18846                           if (((instr & 0x70f0) == 0x30)) {
   18847                             UnallocatedT32(instr);
   18848                             return;
   18849                           }
   18850                           unsigned rd = (instr >> 8) & 0xf;
   18851                           unsigned rn = (instr >> 16) & 0xf;
   18852                           unsigned rm = instr & 0xf;
   18853                           ImmediateShiftOperand
   18854                               shift_operand((instr >> 4) & 0x3,
   18855                                             ((instr >> 6) & 0x3) |
   18856                                                 ((instr >> 10) & 0x1c));
   18857                           if (OutsideITBlock() &&
   18858                               (instr & 0x00100000) == 0x00100000 &&
   18859                               shift_operand.GetShift().IsLSL() &&
   18860                               (shift_operand.GetAmount() == 0) &&
   18861                               ((rd == rn) && (rd < kNumberOfT32LowRegisters) &&
   18862                                (rm < kNumberOfT32LowRegisters))) {
   18863                             // BICS.W {<Rd>}, <Rn>, <Rm> ; T2
   18864                             bics(Condition::None(),
   18865                                  Wide,
   18866                                  Register(rd),
   18867                                  Register(rn),
   18868                                  Register(rm));
   18869                             if (((instr & 0xfff08000) != 0xea300000)) {
   18870                               UnpredictableT32(instr);
   18871                             }
   18872                           } else if ((instr & 0x00100000) == 0x00100000) {
   18873                             // BICS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
   18874                             bics(CurrentCond(),
   18875                                  Best,
   18876                                  Register(rd),
   18877                                  Register(rn),
   18878                                  Operand(Register(rm),
   18879                                          shift_operand.GetType(),
   18880                                          shift_operand.GetAmount()));
   18881                             if (((instr & 0xfff08000) != 0xea300000)) {
   18882                               UnpredictableT32(instr);
   18883                             }
   18884                           } else {
   18885                             UnallocatedT32(instr);
   18886                           }
   18887                           break;
   18888                         }
   18889                       }
   18890                       break;
   18891                     }
   18892                     case 0x00400000: {
   18893                       // 0xea500000
   18894                       switch (instr & 0x000f0000) {
   18895                         case 0x000f0000: {
   18896                           // 0xea5f0000
   18897                           switch (instr & 0x000070f0) {
   18898                             case 0x00000030: {
   18899                               // 0xea5f0030
   18900                               unsigned rd = (instr >> 8) & 0xf;
   18901                               unsigned rm = instr & 0xf;
   18902                               // RRXS{<c>}{<q>} {<Rd>}, <Rm> ; T3
   18903                               rrxs(CurrentCond(), Register(rd), Register(rm));
   18904                               if (((instr & 0xfffff0f0) != 0xea5f0030)) {
   18905                                 UnpredictableT32(instr);
   18906                               }
   18907                               break;
   18908                             }
   18909                             default: {
   18910                               if (((instr & 0x70f0) == 0x30)) {
   18911                                 UnallocatedT32(instr);
   18912                                 return;
   18913                               }
   18914                               if (((Uint32((instr >> 4)) & Uint32(0x3)) ==
   18915                                    Uint32(0x2))) {
   18916                                 unsigned rd = (instr >> 8) & 0xf;
   18917                                 unsigned rm = instr & 0xf;
   18918                                 uint32_t amount = ((instr >> 6) & 0x3) |
   18919                                                   ((instr >> 10) & 0x1c);
   18920                                 if (amount == 0) amount = 32;
   18921                                 if (OutsideITBlock() &&
   18922                                     ((rd < kNumberOfT32LowRegisters) &&
   18923                                      (rm < kNumberOfT32LowRegisters) &&
   18924                                      ((amount >= 1) && (amount <= 32)))) {
   18925                                   // ASRS.W {<Rd>}, <Rm>, #<imm> ; T3
   18926                                   asrs(Condition::None(),
   18927                                        Wide,
   18928                                        Register(rd),
   18929                                        Register(rm),
   18930                                        amount);
   18931                                   if (((instr & 0xffff8030) != 0xea5f0020)) {
   18932                                     UnpredictableT32(instr);
   18933                                   }
   18934                                 } else {
   18935                                   // ASRS{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; T3
   18936                                   asrs(CurrentCond(),
   18937                                        Best,
   18938                                        Register(rd),
   18939                                        Register(rm),
   18940                                        amount);
   18941                                   if (((instr & 0xffff8030) != 0xea5f0020)) {
   18942                                     UnpredictableT32(instr);
   18943                                   }
   18944                                 }
   18945                                 return;
   18946                               }
   18947                               if (((Uint32((instr >> 4)) & Uint32(0x3)) ==
   18948                                    Uint32(0x0)) &&
   18949                                   ((instr & 0x000070c0) != 0x00000000)) {
   18950                                 unsigned rd = (instr >> 8) & 0xf;
   18951                                 unsigned rm = instr & 0xf;
   18952                                 uint32_t amount = ((instr >> 6) & 0x3) |
   18953                                                   ((instr >> 10) & 0x1c);
   18954                                 if (OutsideITBlock() &&
   18955                                     ((rd < kNumberOfT32LowRegisters) &&
   18956                                      (rm < kNumberOfT32LowRegisters) &&
   18957                                      ((amount >= 1) && (amount <= 31)))) {
   18958                                   // LSLS.W {<Rd>}, <Rm>, #<imm> ; T3
   18959                                   lsls(Condition::None(),
   18960                                        Wide,
   18961                                        Register(rd),
   18962                                        Register(rm),
   18963                                        amount);
   18964                                   if (((instr & 0xffff8030) != 0xea5f0000)) {
   18965                                     UnpredictableT32(instr);
   18966                                   }
   18967                                 } else {
   18968                                   // LSLS{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; T3
   18969                                   lsls(CurrentCond(),
   18970                                        Best,
   18971                                        Register(rd),
   18972                                        Register(rm),
   18973                                        amount);
   18974                                   if (((instr & 0xffff8030) != 0xea5f0000)) {
   18975                                     UnpredictableT32(instr);
   18976                                   }
   18977                                 }
   18978                                 return;
   18979                               }
   18980                               if (((Uint32((instr >> 4)) & Uint32(0x3)) ==
   18981                                    Uint32(0x1))) {
   18982                                 unsigned rd = (instr >> 8) & 0xf;
   18983                                 unsigned rm = instr & 0xf;
   18984                                 uint32_t amount = ((instr >> 6) & 0x3) |
   18985                                                   ((instr >> 10) & 0x1c);
   18986                                 if (amount == 0) amount = 32;
   18987                                 if (OutsideITBlock() &&
   18988                                     ((rd < kNumberOfT32LowRegisters) &&
   18989                                      (rm < kNumberOfT32LowRegisters) &&
   18990                                      ((amount >= 1) && (amount <= 32)))) {
   18991                                   // LSRS.W {<Rd>}, <Rm>, #<imm> ; T3
   18992                                   lsrs(Condition::None(),
   18993                                        Wide,
   18994                                        Register(rd),
   18995                                        Register(rm),
   18996                                        amount);
   18997                                   if (((instr & 0xffff8030) != 0xea5f0010)) {
   18998                                     UnpredictableT32(instr);
   18999                                   }
   19000                                 } else {
   19001                                   // LSRS{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; T3
   19002                                   lsrs(CurrentCond(),
   19003                                        Best,
   19004                                        Register(rd),
   19005                                        Register(rm),
   19006                                        amount);
   19007                                   if (((instr & 0xffff8030) != 0xea5f0010)) {
   19008                                     UnpredictableT32(instr);
   19009                                   }
   19010                                 }
   19011                                 return;
   19012                               }
   19013                               if (((Uint32((instr >> 4)) & Uint32(0x3)) ==
   19014                                    Uint32(0x3)) &&
   19015                                   ((instr & 0x000070c0) != 0x00000000)) {
   19016                                 unsigned rd = (instr >> 8) & 0xf;
   19017                                 unsigned rm = instr & 0xf;
   19018                                 uint32_t amount = ((instr >> 6) & 0x3) |
   19019                                                   ((instr >> 10) & 0x1c);
   19020                                 // RORS{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; T3
   19021                                 rors(CurrentCond(),
   19022                                      Best,
   19023                                      Register(rd),
   19024                                      Register(rm),
   19025                                      amount);
   19026                                 if (((instr & 0xffff8030) != 0xea5f0030)) {
   19027                                   UnpredictableT32(instr);
   19028                                 }
   19029                                 return;
   19030                               }
   19031                               unsigned rd = (instr >> 8) & 0xf;
   19032                               unsigned rm = instr & 0xf;
   19033                               ImmediateShiftOperand
   19034                                   shift_operand((instr >> 4) & 0x3,
   19035                                                 ((instr >> 6) & 0x3) |
   19036                                                     ((instr >> 10) & 0x1c));
   19037                               if (OutsideITBlock() &&
   19038                                   (instr & 0x00100000) == 0x00100000 &&
   19039                                   ((rd < kNumberOfT32LowRegisters) &&
   19040                                    (rm < kNumberOfT32LowRegisters))) {
   19041                                 // MOVS.W <Rd>, <Rm> {, <shift> #<amount> } ; T3
   19042                                 movs(Condition::None(),
   19043                                      Wide,
   19044                                      Register(rd),
   19045                                      Operand(Register(rm),
   19046                                              shift_operand.GetType(),
   19047                                              shift_operand.GetAmount()));
   19048                                 if (((instr & 0xffff8000) != 0xea5f0000)) {
   19049                                   UnpredictableT32(instr);
   19050                                 }
   19051                               } else if ((instr & 0x00100000) == 0x00100000) {
   19052                                 // MOVS{<c>}{<q>} <Rd>, <Rm> {, <shift> #<amount> } ; T3 NOLINT(whitespace/line_length)
   19053                                 movs(CurrentCond(),
   19054                                      Best,
   19055                                      Register(rd),
   19056                                      Operand(Register(rm),
   19057                                              shift_operand.GetType(),
   19058                                              shift_operand.GetAmount()));
   19059                                 if (((instr & 0xffff8000) != 0xea5f0000)) {
   19060                                   UnpredictableT32(instr);
   19061                                 }
   19062                               } else {
   19063                                 UnallocatedT32(instr);
   19064                               }
   19065                               break;
   19066                             }
   19067                           }
   19068                           break;
   19069                         }
   19070                         default: {
   19071                           switch (instr & 0x000070f0) {
   19072                             case 0x00000030: {
   19073                               // 0xea500030
   19074                               if (((instr & 0xf0000) == 0xf0000)) {
   19075                                 UnallocatedT32(instr);
   19076                                 return;
   19077                               }
   19078                               unsigned rd = (instr >> 8) & 0xf;
   19079                               unsigned rn = (instr >> 16) & 0xf;
   19080                               unsigned rm = instr & 0xf;
   19081                               // ORRS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2
   19082                               orrs(CurrentCond(),
   19083                                    Best,
   19084                                    Register(rd),
   19085                                    Register(rn),
   19086                                    Operand(Register(rm), RRX));
   19087                               if (((instr & 0xfff0f0f0) != 0xea500030)) {
   19088                                 UnpredictableT32(instr);
   19089                               }
   19090                               break;
   19091                             }
   19092                             default: {
   19093                               if (((instr & 0xf0000) == 0xf0000) ||
   19094                                   ((instr & 0x70f0) == 0x30)) {
   19095                                 UnallocatedT32(instr);
   19096                                 return;
   19097                               }
   19098                               unsigned rd = (instr >> 8) & 0xf;
   19099                               unsigned rn = (instr >> 16) & 0xf;
   19100                               unsigned rm = instr & 0xf;
   19101                               ImmediateShiftOperand
   19102                                   shift_operand((instr >> 4) & 0x3,
   19103                                                 ((instr >> 6) & 0x3) |
   19104                                                     ((instr >> 10) & 0x1c));
   19105                               if (OutsideITBlock() &&
   19106                                   (instr & 0x00100000) == 0x00100000 &&
   19107                                   shift_operand.GetShift().IsLSL() &&
   19108                                   (shift_operand.GetAmount() == 0) &&
   19109                                   ((rd == rn) &&
   19110                                    (rd < kNumberOfT32LowRegisters) &&
   19111                                    (rm < kNumberOfT32LowRegisters))) {
   19112                                 // ORRS.W {<Rd>}, <Rn>, <Rm> ; T2
   19113                                 orrs(Condition::None(),
   19114                                      Wide,
   19115                                      Register(rd),
   19116                                      Register(rn),
   19117                                      Register(rm));
   19118                                 if (((instr & 0xfff08000) != 0xea500000)) {
   19119                                   UnpredictableT32(instr);
   19120                                 }
   19121                               } else if ((instr & 0x00100000) == 0x00100000) {
   19122                                 // ORRS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
   19123                                 orrs(CurrentCond(),
   19124                                      Best,
   19125                                      Register(rd),
   19126                                      Register(rn),
   19127                                      Operand(Register(rm),
   19128                                              shift_operand.GetType(),
   19129                                              shift_operand.GetAmount()));
   19130                                 if (((instr & 0xfff08000) != 0xea500000)) {
   19131                                   UnpredictableT32(instr);
   19132                                 }
   19133                               } else {
   19134                                 UnallocatedT32(instr);
   19135                               }
   19136                               break;
   19137                             }
   19138                           }
   19139                           break;
   19140                         }
   19141                       }
   19142                       break;
   19143                     }
   19144                     case 0x00600000: {
   19145                       // 0xea700000
   19146                       switch (instr & 0x000f0000) {
   19147                         case 0x000f0000: {
   19148                           // 0xea7f0000
   19149                           switch (instr & 0x000070f0) {
   19150                             case 0x00000030: {
   19151                               // 0xea7f0030
   19152                               unsigned rd = (instr >> 8) & 0xf;
   19153                               unsigned rm = instr & 0xf;
   19154                               // MVNS{<c>}{<q>} <Rd>, <Rm>, RRX ; T2
   19155                               mvns(CurrentCond(),
   19156                                    Best,
   19157                                    Register(rd),
   19158                                    Operand(Register(rm), RRX));
   19159                               if (((instr & 0xfffff0f0) != 0xea7f0030)) {
   19160                                 UnpredictableT32(instr);
   19161                               }
   19162                               break;
   19163                             }
   19164                             default: {
   19165                               if (((instr & 0x70f0) == 0x30)) {
   19166                                 UnallocatedT32(instr);
   19167                                 return;
   19168                               }
   19169                               unsigned rd = (instr >> 8) & 0xf;
   19170                               unsigned rm = instr & 0xf;
   19171                               ImmediateShiftOperand
   19172                                   shift_operand((instr >> 4) & 0x3,
   19173                                                 ((instr >> 6) & 0x3) |
   19174                                                     ((instr >> 10) & 0x1c));
   19175                               if (OutsideITBlock() &&
   19176                                   (instr & 0x00100000) == 0x00100000 &&
   19177                                   shift_operand.GetShift().IsLSL() &&
   19178                                   (shift_operand.GetAmount() == 0) &&
   19179                                   ((rd < kNumberOfT32LowRegisters) &&
   19180                                    (rm < kNumberOfT32LowRegisters))) {
   19181                                 // MVNS.W <Rd>, <Rm> ; T2
   19182                                 mvns(Condition::None(),
   19183                                      Wide,
   19184                                      Register(rd),
   19185                                      Register(rm));
   19186                                 if (((instr & 0xffff8000) != 0xea7f0000)) {
   19187                                   UnpredictableT32(instr);
   19188                                 }
   19189                               } else if ((instr & 0x00100000) == 0x00100000) {
   19190                                 // MVNS{<c>}{<q>} <Rd>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
   19191                                 mvns(CurrentCond(),
   19192                                      Best,
   19193                                      Register(rd),
   19194                                      Operand(Register(rm),
   19195                                              shift_operand.GetType(),
   19196                                              shift_operand.GetAmount()));
   19197                                 if (((instr & 0xffff8000) != 0xea7f0000)) {
   19198                                   UnpredictableT32(instr);
   19199                                 }
   19200                               } else {
   19201                                 UnallocatedT32(instr);
   19202                               }
   19203                               break;
   19204                             }
   19205                           }
   19206                           break;
   19207                         }
   19208                         default: {
   19209                           switch (instr & 0x000070f0) {
   19210                             case 0x00000030: {
   19211                               // 0xea700030
   19212                               if (((instr & 0xf0000) == 0xf0000)) {
   19213                                 UnallocatedT32(instr);
   19214                                 return;
   19215                               }
   19216                               unsigned rd = (instr >> 8) & 0xf;
   19217                               unsigned rn = (instr >> 16) & 0xf;
   19218                               unsigned rm = instr & 0xf;
   19219                               // ORNS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T1
   19220                               orns(CurrentCond(),
   19221                                    Register(rd),
   19222                                    Register(rn),
   19223                                    Operand(Register(rm), RRX));
   19224                               if (((instr & 0xfff0f0f0) != 0xea700030)) {
   19225                                 UnpredictableT32(instr);
   19226                               }
   19227                               break;
   19228                             }
   19229                             default: {
   19230                               if (((instr & 0xf0000) == 0xf0000) ||
   19231                                   ((instr & 0x70f0) == 0x30)) {
   19232                                 UnallocatedT32(instr);
   19233                                 return;
   19234                               }
   19235                               unsigned rd = (instr >> 8) & 0xf;
   19236                               unsigned rn = (instr >> 16) & 0xf;
   19237                               unsigned rm = instr & 0xf;
   19238                               ImmediateShiftOperand
   19239                                   shift_operand((instr >> 4) & 0x3,
   19240                                                 ((instr >> 6) & 0x3) |
   19241                                                     ((instr >> 10) & 0x1c));
   19242                               // ORNS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T1 NOLINT(whitespace/line_length)
   19243                               orns(CurrentCond(),
   19244                                    Register(rd),
   19245                                    Register(rn),
   19246                                    Operand(Register(rm),
   19247                                            shift_operand.GetType(),
   19248                                            shift_operand.GetAmount()));
   19249                               if (((instr & 0xfff08000) != 0xea700000)) {
   19250                                 UnpredictableT32(instr);
   19251                               }
   19252                               break;
   19253                             }
   19254                           }
   19255                           break;
   19256                         }
   19257                       }
   19258                       break;
   19259                     }
   19260                   }
   19261                   break;
   19262                 }
   19263                 case 0x00800000: {
   19264                   // 0xea800000
   19265                   switch (instr & 0x00600000) {
   19266                     case 0x00000000: {
   19267                       // 0xea800000
   19268                       switch (instr & 0x000070f0) {
   19269                         case 0x00000030: {
   19270                           // 0xea800030
   19271                           unsigned rd = (instr >> 8) & 0xf;
   19272                           unsigned rn = (instr >> 16) & 0xf;
   19273                           unsigned rm = instr & 0xf;
   19274                           // EOR{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2
   19275                           eor(CurrentCond(),
   19276                               Best,
   19277                               Register(rd),
   19278                               Register(rn),
   19279                               Operand(Register(rm), RRX));
   19280                           if (((instr & 0xfff0f0f0) != 0xea800030)) {
   19281                             UnpredictableT32(instr);
   19282                           }
   19283                           break;
   19284                         }
   19285                         default: {
   19286                           if (((instr & 0x70f0) == 0x30)) {
   19287                             UnallocatedT32(instr);
   19288                             return;
   19289                           }
   19290                           unsigned rd = (instr >> 8) & 0xf;
   19291                           unsigned rn = (instr >> 16) & 0xf;
   19292                           unsigned rm = instr & 0xf;
   19293                           ImmediateShiftOperand
   19294                               shift_operand((instr >> 4) & 0x3,
   19295                                             ((instr >> 6) & 0x3) |
   19296                                                 ((instr >> 10) & 0x1c));
   19297                           if (InITBlock() &&
   19298                               (instr & 0x00100000) == 0x00000000 &&
   19299                               shift_operand.GetShift().IsLSL() &&
   19300                               (shift_operand.GetAmount() == 0) &&
   19301                               ((rd == rn) && (rd < kNumberOfT32LowRegisters) &&
   19302                                (rm < kNumberOfT32LowRegisters))) {
   19303                             // EOR<c>.W {<Rd>}, <Rn>, <Rm> ; T2
   19304                             eor(CurrentCond(),
   19305                                 Wide,
   19306                                 Register(rd),
   19307                                 Register(rn),
   19308                                 Register(rm));
   19309                             if (((instr & 0xfff08000) != 0xea800000)) {
   19310                               UnpredictableT32(instr);
   19311                             }
   19312                           } else if ((instr & 0x00100000) == 0x00000000) {
   19313                             // EOR{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
   19314                             eor(CurrentCond(),
   19315                                 Best,
   19316                                 Register(rd),
   19317                                 Register(rn),
   19318                                 Operand(Register(rm),
   19319                                         shift_operand.GetType(),
   19320                                         shift_operand.GetAmount()));
   19321                             if (((instr & 0xfff08000) != 0xea800000)) {
   19322                               UnpredictableT32(instr);
   19323                             }
   19324                           } else {
   19325                             UnallocatedT32(instr);
   19326                           }
   19327                           break;
   19328                         }
   19329                       }
   19330                       break;
   19331                     }
   19332                     case 0x00400000: {
   19333                       // 0xeac00000
   19334                       switch (instr & 0x00000030) {
   19335                         case 0x00000000: {
   19336                           // 0xeac00000
   19337                           unsigned rd = (instr >> 8) & 0xf;
   19338                           unsigned rn = (instr >> 16) & 0xf;
   19339                           unsigned rm = instr & 0xf;
   19340                           uint32_t amount =
   19341                               ((instr >> 6) & 0x3) | ((instr >> 10) & 0x1c);
   19342                           // PKHBT{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, LSL #<imm> } ; T1 NOLINT(whitespace/line_length)
   19343                           pkhbt(CurrentCond(),
   19344                                 Register(rd),
   19345                                 Register(rn),
   19346                                 Operand(Register(rm), LSL, amount));
   19347                           if (((instr & 0xfff08030) != 0xeac00000)) {
   19348                             UnpredictableT32(instr);
   19349                           }
   19350                           break;
   19351                         }
   19352                         case 0x00000020: {
   19353                           // 0xeac00020
   19354                           unsigned rd = (instr >> 8) & 0xf;
   19355                           unsigned rn = (instr >> 16) & 0xf;
   19356                           unsigned rm = instr & 0xf;
   19357                           uint32_t amount =
   19358                               ((instr >> 6) & 0x3) | ((instr >> 10) & 0x1c);
   19359                           if (amount == 0) amount = 32;
   19360                           // PKHTB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ASR #<imm> } ; T1 NOLINT(whitespace/line_length)
   19361                           pkhtb(CurrentCond(),
   19362                                 Register(rd),
   19363                                 Register(rn),
   19364                                 Operand(Register(rm), ASR, amount));
   19365                           if (((instr & 0xfff08030) != 0xeac00020)) {
   19366                             UnpredictableT32(instr);
   19367                           }
   19368                           break;
   19369                         }
   19370                         default:
   19371                           UnallocatedT32(instr);
   19372                           break;
   19373                       }
   19374                       break;
   19375                     }
   19376                     default:
   19377                       UnallocatedT32(instr);
   19378                       break;
   19379                   }
   19380                   break;
   19381                 }
   19382                 case 0x00900000: {
   19383                   // 0xea900000
   19384                   switch (instr & 0x00600000) {
   19385                     case 0x00000000: {
   19386                       // 0xea900000
   19387                       switch (instr & 0x00000f00) {
   19388                         case 0x00000f00: {
   19389                           // 0xea900f00
   19390                           switch (instr & 0x000070f0) {
   19391                             case 0x00000030: {
   19392                               // 0xea900f30
   19393                               unsigned rn = (instr >> 16) & 0xf;
   19394                               unsigned rm = instr & 0xf;
   19395                               // TEQ{<c>}{<q>} <Rn>, <Rm>, RRX ; T1
   19396                               teq(CurrentCond(),
   19397                                   Register(rn),
   19398                                   Operand(Register(rm), RRX));
   19399                               if (((instr & 0xfff0fff0) != 0xea900f30)) {
   19400                                 UnpredictableT32(instr);
   19401                               }
   19402                               break;
   19403                             }
   19404                             default: {
   19405                               if (((instr & 0x70f0) == 0x30)) {
   19406                                 UnallocatedT32(instr);
   19407                                 return;
   19408                               }
   19409                               unsigned rn = (instr >> 16) & 0xf;
   19410                               unsigned rm = instr & 0xf;
   19411                               ImmediateShiftOperand
   19412                                   shift_operand((instr >> 4) & 0x3,
   19413                                                 ((instr >> 6) & 0x3) |
   19414                                                     ((instr >> 10) & 0x1c));
   19415                               // TEQ{<c>}{<q>} <Rn>, <Rm> {, <shift> #<amount> } ; T1 NOLINT(whitespace/line_length)
   19416                               teq(CurrentCond(),
   19417                                   Register(rn),
   19418                                   Operand(Register(rm),
   19419                                           shift_operand.GetType(),
   19420                                           shift_operand.GetAmount()));
   19421                               if (((instr & 0xfff08f00) != 0xea900f00)) {
   19422                                 UnpredictableT32(instr);
   19423                               }
   19424                               break;
   19425                             }
   19426                           }
   19427                           break;
   19428                         }
   19429                         default: {
   19430                           switch (instr & 0x000070f0) {
   19431                             case 0x00000030: {
   19432                               // 0xea900030
   19433                               if (((instr & 0xf00) == 0xf00)) {
   19434                                 UnallocatedT32(instr);
   19435                                 return;
   19436                               }
   19437                               unsigned rd = (instr >> 8) & 0xf;
   19438                               unsigned rn = (instr >> 16) & 0xf;
   19439                               unsigned rm = instr & 0xf;
   19440                               // EORS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2
   19441                               eors(CurrentCond(),
   19442                                    Best,
   19443                                    Register(rd),
   19444                                    Register(rn),
   19445                                    Operand(Register(rm), RRX));
   19446                               if (((instr & 0xfff0f0f0) != 0xea900030)) {
   19447                                 UnpredictableT32(instr);
   19448                               }
   19449                               break;
   19450                             }
   19451                             default: {
   19452                               if (((instr & 0x70f0) == 0x30) ||
   19453                                   ((instr & 0xf00) == 0xf00)) {
   19454                                 UnallocatedT32(instr);
   19455                                 return;
   19456                               }
   19457                               unsigned rd = (instr >> 8) & 0xf;
   19458                               unsigned rn = (instr >> 16) & 0xf;
   19459                               unsigned rm = instr & 0xf;
   19460                               ImmediateShiftOperand
   19461                                   shift_operand((instr >> 4) & 0x3,
   19462                                                 ((instr >> 6) & 0x3) |
   19463                                                     ((instr >> 10) & 0x1c));
   19464                               if (OutsideITBlock() &&
   19465                                   (instr & 0x00100000) == 0x00100000 &&
   19466                                   shift_operand.GetShift().IsLSL() &&
   19467                                   (shift_operand.GetAmount() == 0) &&
   19468                                   ((rd == rn) &&
   19469                                    (rd < kNumberOfT32LowRegisters) &&
   19470                                    (rm < kNumberOfT32LowRegisters))) {
   19471                                 // EORS.W {<Rd>}, <Rn>, <Rm> ; T2
   19472                                 eors(Condition::None(),
   19473                                      Wide,
   19474                                      Register(rd),
   19475                                      Register(rn),
   19476                                      Register(rm));
   19477                                 if (((instr & 0xfff08000) != 0xea900000)) {
   19478                                   UnpredictableT32(instr);
   19479                                 }
   19480                               } else if ((instr & 0x00100000) == 0x00100000) {
   19481                                 // EORS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
   19482                                 eors(CurrentCond(),
   19483                                      Best,
   19484                                      Register(rd),
   19485                                      Register(rn),
   19486                                      Operand(Register(rm),
   19487                                              shift_operand.GetType(),
   19488                                              shift_operand.GetAmount()));
   19489                                 if (((instr & 0xfff08000) != 0xea900000)) {
   19490                                   UnpredictableT32(instr);
   19491                                 }
   19492                               } else {
   19493                                 UnallocatedT32(instr);
   19494                               }
   19495                               break;
   19496                             }
   19497                           }
   19498                           break;
   19499                         }
   19500                       }
   19501                       break;
   19502                     }
   19503                     default:
   19504                       UnallocatedT32(instr);
   19505                       break;
   19506                   }
   19507                   break;
   19508                 }
   19509                 case 0x01000000: {
   19510                   // 0xeb000000
   19511                   switch (instr & 0x00600000) {
   19512                     case 0x00000000: {
   19513                       // 0xeb000000
   19514                       switch (instr & 0x000f0000) {
   19515                         case 0x000d0000: {
   19516                           // 0xeb0d0000
   19517                           switch (instr & 0x000070f0) {
   19518                             case 0x00000030: {
   19519                               // 0xeb0d0030
   19520                               unsigned rd = (instr >> 8) & 0xf;
   19521                               unsigned rm = instr & 0xf;
   19522                               // ADD{<c>}{<q>} {<Rd>}, SP, <Rm>, RRX ; T3
   19523                               add(CurrentCond(),
   19524                                   Best,
   19525                                   Register(rd),
   19526                                   sp,
   19527                                   Operand(Register(rm), RRX));
   19528                               if (((instr & 0xfffff0f0) != 0xeb0d0030)) {
   19529                                 UnpredictableT32(instr);
   19530                               }
   19531                               break;
   19532                             }
   19533                             default: {
   19534                               if (((instr & 0x70f0) == 0x30)) {
   19535                                 UnallocatedT32(instr);
   19536                                 return;
   19537                               }
   19538                               unsigned rd = (instr >> 8) & 0xf;
   19539                               unsigned rm = instr & 0xf;
   19540                               ImmediateShiftOperand
   19541                                   shift_operand((instr >> 4) & 0x3,
   19542                                                 ((instr >> 6) & 0x3) |
   19543                                                     ((instr >> 10) & 0x1c));
   19544                               if ((instr & 0x00100000) == 0x00000000 &&
   19545                                   shift_operand.GetShift().IsLSL() &&
   19546                                   (shift_operand.GetAmount() == 0) &&
   19547                                   (((rd == rm)) || ((rd == sp.GetCode())))) {
   19548                                 // ADD{<c>}.W {<Rd>}, SP, <Rm> ; T3
   19549                                 add(CurrentCond(),
   19550                                     Wide,
   19551                                     Register(rd),
   19552                                     sp,
   19553                                     Register(rm));
   19554                                 if (((instr & 0xffff8000) != 0xeb0d0000)) {
   19555                                   UnpredictableT32(instr);
   19556                                 }
   19557                               } else if ((instr & 0x00100000) == 0x00000000) {
   19558                                 // ADD{<c>}{<q>} {<Rd>}, SP, <Rm> {, <shift> #<amount> } ; T3 NOLINT(whitespace/line_length)
   19559                                 add(CurrentCond(),
   19560                                     Best,
   19561                                     Register(rd),
   19562                                     sp,
   19563                                     Operand(Register(rm),
   19564                                             shift_operand.GetType(),
   19565                                             shift_operand.GetAmount()));
   19566                                 if (((instr & 0xffff8000) != 0xeb0d0000)) {
   19567                                   UnpredictableT32(instr);
   19568                                 }
   19569                               } else {
   19570                                 UnallocatedT32(instr);
   19571                               }
   19572                               break;
   19573                             }
   19574                           }
   19575                           break;
   19576                         }
   19577                         default: {
   19578                           switch (instr & 0x000070f0) {
   19579                             case 0x00000030: {
   19580                               // 0xeb000030
   19581                               if (((instr & 0xf0000) == 0xd0000)) {
   19582                                 UnallocatedT32(instr);
   19583                                 return;
   19584                               }
   19585                               unsigned rd = (instr >> 8) & 0xf;
   19586                               unsigned rn = (instr >> 16) & 0xf;
   19587                               unsigned rm = instr & 0xf;
   19588                               // ADD{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T3
   19589                               add(CurrentCond(),
   19590                                   Best,
   19591                                   Register(rd),
   19592                                   Register(rn),
   19593                                   Operand(Register(rm), RRX));
   19594                               if (((instr & 0xfff0f0f0) != 0xeb000030)) {
   19595                                 UnpredictableT32(instr);
   19596                               }
   19597                               break;
   19598                             }
   19599                             default: {
   19600                               if (((instr & 0xf0000) == 0xd0000) ||
   19601                                   ((instr & 0x70f0) == 0x30)) {
   19602                                 UnallocatedT32(instr);
   19603                                 return;
   19604                               }
   19605                               unsigned rd = (instr >> 8) & 0xf;
   19606                               unsigned rn = (instr >> 16) & 0xf;
   19607                               unsigned rm = instr & 0xf;
   19608                               ImmediateShiftOperand
   19609                                   shift_operand((instr >> 4) & 0x3,
   19610                                                 ((instr >> 6) & 0x3) |
   19611                                                     ((instr >> 10) & 0x1c));
   19612                               if (InITBlock() &&
   19613                                   (instr & 0x00100000) == 0x00000000 &&
   19614                                   shift_operand.GetShift().IsLSL() &&
   19615                                   (shift_operand.GetAmount() == 0) &&
   19616                                   ((rd < kNumberOfT32LowRegisters) &&
   19617                                    (rn < kNumberOfT32LowRegisters) &&
   19618                                    (rm < kNumberOfT32LowRegisters))) {
   19619                                 // ADD<c>.W {<Rd>}, <Rn>, <Rm> ; T3
   19620                                 add(CurrentCond(),
   19621                                     Wide,
   19622                                     Register(rd),
   19623                                     Register(rn),
   19624                                     Register(rm));
   19625                                 if (((instr & 0xfff08000) != 0xeb000000)) {
   19626                                   UnpredictableT32(instr);
   19627                                 }
   19628                               } else if ((instr & 0x00100000) == 0x00000000 &&
   19629                                          shift_operand.GetShift().IsLSL() &&
   19630                                          (shift_operand.GetAmount() == 0) &&
   19631                                          ((rd == rn))) {
   19632                                 // ADD<c>.W {<Rd>}, <Rn>, <Rm> ; T3
   19633                                 add(CurrentCond(),
   19634                                     Wide,
   19635                                     Register(rd),
   19636                                     Register(rn),
   19637                                     Register(rm));
   19638                                 if (((instr & 0xfff08000) != 0xeb000000)) {
   19639                                   UnpredictableT32(instr);
   19640                                 }
   19641                               } else if ((instr & 0x00100000) == 0x00000000) {
   19642                                 // ADD{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T3 NOLINT(whitespace/line_length)
   19643                                 add(CurrentCond(),
   19644                                     Best,
   19645                                     Register(rd),
   19646                                     Register(rn),
   19647                                     Operand(Register(rm),
   19648                                             shift_operand.GetType(),
   19649                                             shift_operand.GetAmount()));
   19650                                 if (((instr & 0xfff08000) != 0xeb000000)) {
   19651                                   UnpredictableT32(instr);
   19652                                 }
   19653                               } else {
   19654                                 UnallocatedT32(instr);
   19655                               }
   19656                               break;
   19657                             }
   19658                           }
   19659                           break;
   19660                         }
   19661                       }
   19662                       break;
   19663                     }
   19664                     case 0x00400000: {
   19665                       // 0xeb400000
   19666                       switch (instr & 0x000070f0) {
   19667                         case 0x00000030: {
   19668                           // 0xeb400030
   19669                           unsigned rd = (instr >> 8) & 0xf;
   19670                           unsigned rn = (instr >> 16) & 0xf;
   19671                           unsigned rm = instr & 0xf;
   19672                           // ADC{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2
   19673                           adc(CurrentCond(),
   19674                               Best,
   19675                               Register(rd),
   19676                               Register(rn),
   19677                               Operand(Register(rm), RRX));
   19678                           if (((instr & 0xfff0f0f0) != 0xeb400030)) {
   19679                             UnpredictableT32(instr);
   19680                           }
   19681                           break;
   19682                         }
   19683                         default: {
   19684                           if (((instr & 0x70f0) == 0x30)) {
   19685                             UnallocatedT32(instr);
   19686                             return;
   19687                           }
   19688                           unsigned rd = (instr >> 8) & 0xf;
   19689                           unsigned rn = (instr >> 16) & 0xf;
   19690                           unsigned rm = instr & 0xf;
   19691                           ImmediateShiftOperand
   19692                               shift_operand((instr >> 4) & 0x3,
   19693                                             ((instr >> 6) & 0x3) |
   19694                                                 ((instr >> 10) & 0x1c));
   19695                           if (InITBlock() &&
   19696                               (instr & 0x00100000) == 0x00000000 &&
   19697                               shift_operand.GetShift().IsLSL() &&
   19698                               (shift_operand.GetAmount() == 0) &&
   19699                               ((rd == rn) && (rd < kNumberOfT32LowRegisters) &&
   19700                                (rm < kNumberOfT32LowRegisters))) {
   19701                             // ADC<c>.W {<Rd>}, <Rn>, <Rm> ; T2
   19702                             adc(CurrentCond(),
   19703                                 Wide,
   19704                                 Register(rd),
   19705                                 Register(rn),
   19706                                 Register(rm));
   19707                             if (((instr & 0xfff08000) != 0xeb400000)) {
   19708                               UnpredictableT32(instr);
   19709                             }
   19710                           } else if ((instr & 0x00100000) == 0x00000000) {
   19711                             // ADC{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
   19712                             adc(CurrentCond(),
   19713                                 Best,
   19714                                 Register(rd),
   19715                                 Register(rn),
   19716                                 Operand(Register(rm),
   19717                                         shift_operand.GetType(),
   19718                                         shift_operand.GetAmount()));
   19719                             if (((instr & 0xfff08000) != 0xeb400000)) {
   19720                               UnpredictableT32(instr);
   19721                             }
   19722                           } else {
   19723                             UnallocatedT32(instr);
   19724                           }
   19725                           break;
   19726                         }
   19727                       }
   19728                       break;
   19729                     }
   19730                     case 0x00600000: {
   19731                       // 0xeb600000
   19732                       switch (instr & 0x000070f0) {
   19733                         case 0x00000030: {
   19734                           // 0xeb600030
   19735                           unsigned rd = (instr >> 8) & 0xf;
   19736                           unsigned rn = (instr >> 16) & 0xf;
   19737                           unsigned rm = instr & 0xf;
   19738                           // SBC{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2
   19739                           sbc(CurrentCond(),
   19740                               Best,
   19741                               Register(rd),
   19742                               Register(rn),
   19743                               Operand(Register(rm), RRX));
   19744                           if (((instr & 0xfff0f0f0) != 0xeb600030)) {
   19745                             UnpredictableT32(instr);
   19746                           }
   19747                           break;
   19748                         }
   19749                         default: {
   19750                           if (((instr & 0x70f0) == 0x30)) {
   19751                             UnallocatedT32(instr);
   19752                             return;
   19753                           }
   19754                           unsigned rd = (instr >> 8) & 0xf;
   19755                           unsigned rn = (instr >> 16) & 0xf;
   19756                           unsigned rm = instr & 0xf;
   19757                           ImmediateShiftOperand
   19758                               shift_operand((instr >> 4) & 0x3,
   19759                                             ((instr >> 6) & 0x3) |
   19760                                                 ((instr >> 10) & 0x1c));
   19761                           if (InITBlock() &&
   19762                               (instr & 0x00100000) == 0x00000000 &&
   19763                               shift_operand.GetShift().IsLSL() &&
   19764                               (shift_operand.GetAmount() == 0) &&
   19765                               ((rd == rn) && (rd < kNumberOfT32LowRegisters) &&
   19766                                (rm < kNumberOfT32LowRegisters))) {
   19767                             // SBC<c>.W {<Rd>}, <Rn>, <Rm> ; T2
   19768                             sbc(CurrentCond(),
   19769                                 Wide,
   19770                                 Register(rd),
   19771                                 Register(rn),
   19772                                 Register(rm));
   19773                             if (((instr & 0xfff08000) != 0xeb600000)) {
   19774                               UnpredictableT32(instr);
   19775                             }
   19776                           } else if ((instr & 0x00100000) == 0x00000000) {
   19777                             // SBC{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
   19778                             sbc(CurrentCond(),
   19779                                 Best,
   19780                                 Register(rd),
   19781                                 Register(rn),
   19782                                 Operand(Register(rm),
   19783                                         shift_operand.GetType(),
   19784                                         shift_operand.GetAmount()));
   19785                             if (((instr & 0xfff08000) != 0xeb600000)) {
   19786                               UnpredictableT32(instr);
   19787                             }
   19788                           } else {
   19789                             UnallocatedT32(instr);
   19790                           }
   19791                           break;
   19792                         }
   19793                       }
   19794                       break;
   19795                     }
   19796                     default:
   19797                       UnallocatedT32(instr);
   19798                       break;
   19799                   }
   19800                   break;
   19801                 }
   19802                 case 0x01100000: {
   19803                   // 0xeb100000
   19804                   switch (instr & 0x00600000) {
   19805                     case 0x00000000: {
   19806                       // 0xeb100000
   19807                       switch (instr & 0x00000f00) {
   19808                         case 0x00000f00: {
   19809                           // 0xeb100f00
   19810                           switch (instr & 0x000070f0) {
   19811                             case 0x00000030: {
   19812                               // 0xeb100f30
   19813                               unsigned rn = (instr >> 16) & 0xf;
   19814                               unsigned rm = instr & 0xf;
   19815                               // CMN{<c>}{<q>} <Rn>, <Rm>, RRX ; T2
   19816                               cmn(CurrentCond(),
   19817                                   Best,
   19818                                   Register(rn),
   19819                                   Operand(Register(rm), RRX));
   19820                               if (((instr & 0xfff0fff0) != 0xeb100f30)) {
   19821                                 UnpredictableT32(instr);
   19822                               }
   19823                               break;
   19824                             }
   19825                             default: {
   19826                               if (((instr & 0x70f0) == 0x30)) {
   19827                                 UnallocatedT32(instr);
   19828                                 return;
   19829                               }
   19830                               unsigned rn = (instr >> 16) & 0xf;
   19831                               unsigned rm = instr & 0xf;
   19832                               ImmediateShiftOperand
   19833                                   shift_operand((instr >> 4) & 0x3,
   19834                                                 ((instr >> 6) & 0x3) |
   19835                                                     ((instr >> 10) & 0x1c));
   19836                               if (shift_operand.GetShift().IsLSL() &&
   19837                                   (shift_operand.GetAmount() == 0) &&
   19838                                   ((rn < kNumberOfT32LowRegisters) &&
   19839                                    (rm < kNumberOfT32LowRegisters))) {
   19840                                 // CMN{<c>}.W <Rn>, <Rm> ; T2
   19841                                 cmn(CurrentCond(),
   19842                                     Wide,
   19843                                     Register(rn),
   19844                                     Register(rm));
   19845                                 if (((instr & 0xfff08f00) != 0xeb100f00)) {
   19846                                   UnpredictableT32(instr);
   19847                                 }
   19848                               } else {
   19849                                 // CMN{<c>}{<q>} <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
   19850                                 cmn(CurrentCond(),
   19851                                     Best,
   19852                                     Register(rn),
   19853                                     Operand(Register(rm),
   19854                                             shift_operand.GetType(),
   19855                                             shift_operand.GetAmount()));
   19856                                 if (((instr & 0xfff08f00) != 0xeb100f00)) {
   19857                                   UnpredictableT32(instr);
   19858                                 }
   19859                               }
   19860                               break;
   19861                             }
   19862                           }
   19863                           break;
   19864                         }
   19865                         default: {
   19866                           switch (instr & 0x000f0000) {
   19867                             case 0x000d0000: {
   19868                               // 0xeb1d0000
   19869                               switch (instr & 0x000070f0) {
   19870                                 case 0x00000030: {
   19871                                   // 0xeb1d0030
   19872                                   if (((instr & 0xf00) == 0xf00)) {
   19873                                     UnallocatedT32(instr);
   19874                                     return;
   19875                                   }
   19876                                   unsigned rd = (instr >> 8) & 0xf;
   19877                                   unsigned rm = instr & 0xf;
   19878                                   // ADDS{<c>}{<q>} {<Rd>}, SP, <Rm>, RRX ; T3
   19879                                   adds(CurrentCond(),
   19880                                        Best,
   19881                                        Register(rd),
   19882                                        sp,
   19883                                        Operand(Register(rm), RRX));
   19884                                   if (((instr & 0xfffff0f0) != 0xeb1d0030)) {
   19885                                     UnpredictableT32(instr);
   19886                                   }
   19887                                   break;
   19888                                 }
   19889                                 default: {
   19890                                   if (((instr & 0x70f0) == 0x30) ||
   19891                                       ((instr & 0xf00) == 0xf00)) {
   19892                                     UnallocatedT32(instr);
   19893                                     return;
   19894                                   }
   19895                                   unsigned rd = (instr >> 8) & 0xf;
   19896                                   unsigned rm = instr & 0xf;
   19897                                   ImmediateShiftOperand
   19898                                       shift_operand((instr >> 4) & 0x3,
   19899                                                     ((instr >> 6) & 0x3) |
   19900                                                         ((instr >> 10) & 0x1c));
   19901                                   // ADDS{<c>}{<q>} {<Rd>}, SP, <Rm> {, <shift> #<amount> } ; T3 NOLINT(whitespace/line_length)
   19902                                   adds(CurrentCond(),
   19903                                        Best,
   19904                                        Register(rd),
   19905                                        sp,
   19906                                        Operand(Register(rm),
   19907                                                shift_operand.GetType(),
   19908                                                shift_operand.GetAmount()));
   19909                                   if (((instr & 0xffff8000) != 0xeb1d0000)) {
   19910                                     UnpredictableT32(instr);
   19911                                   }
   19912                                   break;
   19913                                 }
   19914                               }
   19915                               break;
   19916                             }
   19917                             default: {
   19918                               switch (instr & 0x000070f0) {
   19919                                 case 0x00000030: {
   19920                                   // 0xeb100030
   19921                                   if (((instr & 0xf0000) == 0xd0000) ||
   19922                                       ((instr & 0xf00) == 0xf00)) {
   19923                                     UnallocatedT32(instr);
   19924                                     return;
   19925                                   }
   19926                                   unsigned rd = (instr >> 8) & 0xf;
   19927                                   unsigned rn = (instr >> 16) & 0xf;
   19928                                   unsigned rm = instr & 0xf;
   19929                                   // ADDS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T3
   19930                                   adds(CurrentCond(),
   19931                                        Best,
   19932                                        Register(rd),
   19933                                        Register(rn),
   19934                                        Operand(Register(rm), RRX));
   19935                                   if (((instr & 0xfff0f0f0) != 0xeb100030)) {
   19936                                     UnpredictableT32(instr);
   19937                                   }
   19938                                   break;
   19939                                 }
   19940                                 default: {
   19941                                   if (((instr & 0xf0000) == 0xd0000) ||
   19942                                       ((instr & 0x70f0) == 0x30) ||
   19943                                       ((instr & 0xf00) == 0xf00)) {
   19944                                     UnallocatedT32(instr);
   19945                                     return;
   19946                                   }
   19947                                   unsigned rd = (instr >> 8) & 0xf;
   19948                                   unsigned rn = (instr >> 16) & 0xf;
   19949                                   unsigned rm = instr & 0xf;
   19950                                   ImmediateShiftOperand
   19951                                       shift_operand((instr >> 4) & 0x3,
   19952                                                     ((instr >> 6) & 0x3) |
   19953                                                         ((instr >> 10) & 0x1c));
   19954                                   if (OutsideITBlock() &&
   19955                                       (instr & 0x00100000) == 0x00100000 &&
   19956                                       shift_operand.GetShift().IsLSL() &&
   19957                                       (shift_operand.GetAmount() == 0) &&
   19958                                       ((rd < kNumberOfT32LowRegisters) &&
   19959                                        (rn < kNumberOfT32LowRegisters) &&
   19960                                        (rm < kNumberOfT32LowRegisters))) {
   19961                                     // ADDS.W {<Rd>}, <Rn>, <Rm> ; T3
   19962                                     adds(Condition::None(),
   19963                                          Wide,
   19964                                          Register(rd),
   19965                                          Register(rn),
   19966                                          Register(rm));
   19967                                     if (((instr & 0xfff08000) != 0xeb100000)) {
   19968                                       UnpredictableT32(instr);
   19969                                     }
   19970                                   } else if ((instr & 0x00100000) ==
   19971                                              0x00100000) {
   19972                                     // ADDS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T3 NOLINT(whitespace/line_length)
   19973                                     adds(CurrentCond(),
   19974                                          Best,
   19975                                          Register(rd),
   19976                                          Register(rn),
   19977                                          Operand(Register(rm),
   19978                                                  shift_operand.GetType(),
   19979                                                  shift_operand.GetAmount()));
   19980                                     if (((instr & 0xfff08000) != 0xeb100000)) {
   19981                                       UnpredictableT32(instr);
   19982                                     }
   19983                                   } else {
   19984                                     UnallocatedT32(instr);
   19985                                   }
   19986                                   break;
   19987                                 }
   19988                               }
   19989                               break;
   19990                             }
   19991                           }
   19992                           break;
   19993                         }
   19994                       }
   19995                       break;
   19996                     }
   19997                     case 0x00400000: {
   19998                       // 0xeb500000
   19999                       switch (instr & 0x000070f0) {
   20000                         case 0x00000030: {
   20001                           // 0xeb500030
   20002                           unsigned rd = (instr >> 8) & 0xf;
   20003                           unsigned rn = (instr >> 16) & 0xf;
   20004                           unsigned rm = instr & 0xf;
   20005                           // ADCS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2
   20006                           adcs(CurrentCond(),
   20007                                Best,
   20008                                Register(rd),
   20009                                Register(rn),
   20010                                Operand(Register(rm), RRX));
   20011                           if (((instr & 0xfff0f0f0) != 0xeb500030)) {
   20012                             UnpredictableT32(instr);
   20013                           }
   20014                           break;
   20015                         }
   20016                         default: {
   20017                           if (((instr & 0x70f0) == 0x30)) {
   20018                             UnallocatedT32(instr);
   20019                             return;
   20020                           }
   20021                           unsigned rd = (instr >> 8) & 0xf;
   20022                           unsigned rn = (instr >> 16) & 0xf;
   20023                           unsigned rm = instr & 0xf;
   20024                           ImmediateShiftOperand
   20025                               shift_operand((instr >> 4) & 0x3,
   20026                                             ((instr >> 6) & 0x3) |
   20027                                                 ((instr >> 10) & 0x1c));
   20028                           if (OutsideITBlock() &&
   20029                               (instr & 0x00100000) == 0x00100000 &&
   20030                               shift_operand.GetShift().IsLSL() &&
   20031                               (shift_operand.GetAmount() == 0) &&
   20032                               ((rd == rn) && (rd < kNumberOfT32LowRegisters) &&
   20033                                (rm < kNumberOfT32LowRegisters))) {
   20034                             // ADCS.W {<Rd>}, <Rn>, <Rm> ; T2
   20035                             adcs(Condition::None(),
   20036                                  Wide,
   20037                                  Register(rd),
   20038                                  Register(rn),
   20039                                  Register(rm));
   20040                             if (((instr & 0xfff08000) != 0xeb500000)) {
   20041                               UnpredictableT32(instr);
   20042                             }
   20043                           } else if ((instr & 0x00100000) == 0x00100000) {
   20044                             // ADCS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
   20045                             adcs(CurrentCond(),
   20046                                  Best,
   20047                                  Register(rd),
   20048                                  Register(rn),
   20049                                  Operand(Register(rm),
   20050                                          shift_operand.GetType(),
   20051                                          shift_operand.GetAmount()));
   20052                             if (((instr & 0xfff08000) != 0xeb500000)) {
   20053                               UnpredictableT32(instr);
   20054                             }
   20055                           } else {
   20056                             UnallocatedT32(instr);
   20057                           }
   20058                           break;
   20059                         }
   20060                       }
   20061                       break;
   20062                     }
   20063                     case 0x00600000: {
   20064                       // 0xeb700000
   20065                       switch (instr & 0x000070f0) {
   20066                         case 0x00000030: {
   20067                           // 0xeb700030
   20068                           unsigned rd = (instr >> 8) & 0xf;
   20069                           unsigned rn = (instr >> 16) & 0xf;
   20070                           unsigned rm = instr & 0xf;
   20071                           // SBCS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2
   20072                           sbcs(CurrentCond(),
   20073                                Best,
   20074                                Register(rd),
   20075                                Register(rn),
   20076                                Operand(Register(rm), RRX));
   20077                           if (((instr & 0xfff0f0f0) != 0xeb700030)) {
   20078                             UnpredictableT32(instr);
   20079                           }
   20080                           break;
   20081                         }
   20082                         default: {
   20083                           if (((instr & 0x70f0) == 0x30)) {
   20084                             UnallocatedT32(instr);
   20085                             return;
   20086                           }
   20087                           unsigned rd = (instr >> 8) & 0xf;
   20088                           unsigned rn = (instr >> 16) & 0xf;
   20089                           unsigned rm = instr & 0xf;
   20090                           ImmediateShiftOperand
   20091                               shift_operand((instr >> 4) & 0x3,
   20092                                             ((instr >> 6) & 0x3) |
   20093                                                 ((instr >> 10) & 0x1c));
   20094                           if (OutsideITBlock() &&
   20095                               (instr & 0x00100000) == 0x00100000 &&
   20096                               shift_operand.GetShift().IsLSL() &&
   20097                               (shift_operand.GetAmount() == 0) &&
   20098                               ((rd == rn) && (rd < kNumberOfT32LowRegisters) &&
   20099                                (rm < kNumberOfT32LowRegisters))) {
   20100                             // SBCS.W {<Rd>}, <Rn>, <Rm> ; T2
   20101                             sbcs(Condition::None(),
   20102                                  Wide,
   20103                                  Register(rd),
   20104                                  Register(rn),
   20105                                  Register(rm));
   20106                             if (((instr & 0xfff08000) != 0xeb700000)) {
   20107                               UnpredictableT32(instr);
   20108                             }
   20109                           } else if ((instr & 0x00100000) == 0x00100000) {
   20110                             // SBCS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
   20111                             sbcs(CurrentCond(),
   20112                                  Best,
   20113                                  Register(rd),
   20114                                  Register(rn),
   20115                                  Operand(Register(rm),
   20116                                          shift_operand.GetType(),
   20117                                          shift_operand.GetAmount()));
   20118                             if (((instr & 0xfff08000) != 0xeb700000)) {
   20119                               UnpredictableT32(instr);
   20120                             }
   20121                           } else {
   20122                             UnallocatedT32(instr);
   20123                           }
   20124                           break;
   20125                         }
   20126                       }
   20127                       break;
   20128                     }
   20129                     default:
   20130                       UnallocatedT32(instr);
   20131                       break;
   20132                   }
   20133                   break;
   20134                 }
   20135                 case 0x01800000: {
   20136                   // 0xeb800000
   20137                   switch (instr & 0x00600000) {
   20138                     case 0x00200000: {
   20139                       // 0xeba00000
   20140                       switch (instr & 0x000f0000) {
   20141                         case 0x000d0000: {
   20142                           // 0xebad0000
   20143                           switch (instr & 0x000070f0) {
   20144                             case 0x00000030: {
   20145                               // 0xebad0030
   20146                               unsigned rd = (instr >> 8) & 0xf;
   20147                               unsigned rm = instr & 0xf;
   20148                               // SUB{<c>}{<q>} {<Rd>}, SP, <Rm>, RRX ; T1
   20149                               sub(CurrentCond(),
   20150                                   Best,
   20151                                   Register(rd),
   20152                                   sp,
   20153                                   Operand(Register(rm), RRX));
   20154                               if (((instr & 0xfffff0f0) != 0xebad0030)) {
   20155                                 UnpredictableT32(instr);
   20156                               }
   20157                               break;
   20158                             }
   20159                             default: {
   20160                               if (((instr & 0x70f0) == 0x30)) {
   20161                                 UnallocatedT32(instr);
   20162                                 return;
   20163                               }
   20164                               unsigned rd = (instr >> 8) & 0xf;
   20165                               unsigned rm = instr & 0xf;
   20166                               ImmediateShiftOperand
   20167                                   shift_operand((instr >> 4) & 0x3,
   20168                                                 ((instr >> 6) & 0x3) |
   20169                                                     ((instr >> 10) & 0x1c));
   20170                               if ((instr & 0x00100000) == 0x00000000 &&
   20171                                   shift_operand.GetShift().IsLSL() &&
   20172                                   (shift_operand.GetAmount() == 0)) {
   20173                                 // SUB{<c>} {<Rd>}, SP, <Rm> ; T1
   20174                                 sub(CurrentCond(),
   20175                                     Best,
   20176                                     Register(rd),
   20177                                     sp,
   20178                                     Register(rm));
   20179                                 if (((instr & 0xffff8000) != 0xebad0000)) {
   20180                                   UnpredictableT32(instr);
   20181                                 }
   20182                               } else if ((instr & 0x00100000) == 0x00000000) {
   20183                                 // SUB{<c>}{<q>} {<Rd>}, SP, <Rm> {, <shift> #<amount> } ; T1 NOLINT(whitespace/line_length)
   20184                                 sub(CurrentCond(),
   20185                                     Best,
   20186                                     Register(rd),
   20187                                     sp,
   20188                                     Operand(Register(rm),
   20189                                             shift_operand.GetType(),
   20190                                             shift_operand.GetAmount()));
   20191                                 if (((instr & 0xffff8000) != 0xebad0000)) {
   20192                                   UnpredictableT32(instr);
   20193                                 }
   20194                               } else {
   20195                                 UnallocatedT32(instr);
   20196                               }
   20197                               break;
   20198                             }
   20199                           }
   20200                           break;
   20201                         }
   20202                         default: {
   20203                           switch (instr & 0x000070f0) {
   20204                             case 0x00000030: {
   20205                               // 0xeba00030
   20206                               if (((instr & 0xf0000) == 0xd0000)) {
   20207                                 UnallocatedT32(instr);
   20208                                 return;
   20209                               }
   20210                               unsigned rd = (instr >> 8) & 0xf;
   20211                               unsigned rn = (instr >> 16) & 0xf;
   20212                               unsigned rm = instr & 0xf;
   20213                               // SUB{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2
   20214                               sub(CurrentCond(),
   20215                                   Best,
   20216                                   Register(rd),
   20217                                   Register(rn),
   20218                                   Operand(Register(rm), RRX));
   20219                               if (((instr & 0xfff0f0f0) != 0xeba00030)) {
   20220                                 UnpredictableT32(instr);
   20221                               }
   20222                               break;
   20223                             }
   20224                             default: {
   20225                               if (((instr & 0xf0000) == 0xd0000) ||
   20226                                   ((instr & 0x70f0) == 0x30)) {
   20227                                 UnallocatedT32(instr);
   20228                                 return;
   20229                               }
   20230                               unsigned rd = (instr >> 8) & 0xf;
   20231                               unsigned rn = (instr >> 16) & 0xf;
   20232                               unsigned rm = instr & 0xf;
   20233                               ImmediateShiftOperand
   20234                                   shift_operand((instr >> 4) & 0x3,
   20235                                                 ((instr >> 6) & 0x3) |
   20236                                                     ((instr >> 10) & 0x1c));
   20237                               if (InITBlock() &&
   20238                                   (instr & 0x00100000) == 0x00000000 &&
   20239                                   shift_operand.GetShift().IsLSL() &&
   20240                                   (shift_operand.GetAmount() == 0) &&
   20241                                   ((rd < kNumberOfT32LowRegisters) &&
   20242                                    (rn < kNumberOfT32LowRegisters) &&
   20243                                    (rm < kNumberOfT32LowRegisters))) {
   20244                                 // SUB<c>.W {<Rd>}, <Rn>, <Rm> ; T2
   20245                                 sub(CurrentCond(),
   20246                                     Wide,
   20247                                     Register(rd),
   20248                                     Register(rn),
   20249                                     Register(rm));
   20250                                 if (((instr & 0xfff08000) != 0xeba00000)) {
   20251                                   UnpredictableT32(instr);
   20252                                 }
   20253                               } else if ((instr & 0x00100000) == 0x00000000) {
   20254                                 // SUB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
   20255                                 sub(CurrentCond(),
   20256                                     Best,
   20257                                     Register(rd),
   20258                                     Register(rn),
   20259                                     Operand(Register(rm),
   20260                                             shift_operand.GetType(),
   20261                                             shift_operand.GetAmount()));
   20262                                 if (((instr & 0xfff08000) != 0xeba00000)) {
   20263                                   UnpredictableT32(instr);
   20264                                 }
   20265                               } else {
   20266                                 UnallocatedT32(instr);
   20267                               }
   20268                               break;
   20269                             }
   20270                           }
   20271                           break;
   20272                         }
   20273                       }
   20274                       break;
   20275                     }
   20276                     case 0x00400000: {
   20277                       // 0xebc00000
   20278                       switch (instr & 0x000070f0) {
   20279                         case 0x00000030: {
   20280                           // 0xebc00030
   20281                           unsigned rd = (instr >> 8) & 0xf;
   20282                           unsigned rn = (instr >> 16) & 0xf;
   20283                           unsigned rm = instr & 0xf;
   20284                           // RSB{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T1
   20285                           rsb(CurrentCond(),
   20286                               Best,
   20287                               Register(rd),
   20288                               Register(rn),
   20289                               Operand(Register(rm), RRX));
   20290                           if (((instr & 0xfff0f0f0) != 0xebc00030)) {
   20291                             UnpredictableT32(instr);
   20292                           }
   20293                           break;
   20294                         }
   20295                         default: {
   20296                           if (((instr & 0x70f0) == 0x30)) {
   20297                             UnallocatedT32(instr);
   20298                             return;
   20299                           }
   20300                           unsigned rd = (instr >> 8) & 0xf;
   20301                           unsigned rn = (instr >> 16) & 0xf;
   20302                           unsigned rm = instr & 0xf;
   20303                           ImmediateShiftOperand
   20304                               shift_operand((instr >> 4) & 0x3,
   20305                                             ((instr >> 6) & 0x3) |
   20306                                                 ((instr >> 10) & 0x1c));
   20307                           // RSB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T1 NOLINT(whitespace/line_length)
   20308                           rsb(CurrentCond(),
   20309                               Best,
   20310                               Register(rd),
   20311                               Register(rn),
   20312                               Operand(Register(rm),
   20313                                       shift_operand.GetType(),
   20314                                       shift_operand.GetAmount()));
   20315                           if (((instr & 0xfff08000) != 0xebc00000)) {
   20316                             UnpredictableT32(instr);
   20317                           }
   20318                           break;
   20319                         }
   20320                       }
   20321                       break;
   20322                     }
   20323                     default:
   20324                       UnallocatedT32(instr);
   20325                       break;
   20326                   }
   20327                   break;
   20328                 }
   20329                 case 0x01900000: {
   20330                   // 0xeb900000
   20331                   switch (instr & 0x00600000) {
   20332                     case 0x00200000: {
   20333                       // 0xebb00000
   20334                       switch (instr & 0x00000f00) {
   20335                         case 0x00000f00: {
   20336                           // 0xebb00f00
   20337                           switch (instr & 0x000070f0) {
   20338                             case 0x00000030: {
   20339                               // 0xebb00f30
   20340                               unsigned rn = (instr >> 16) & 0xf;
   20341                               unsigned rm = instr & 0xf;
   20342                               // CMP{<c>}{<q>} <Rn>, <Rm>, RRX ; T3
   20343                               cmp(CurrentCond(),
   20344                                   Best,
   20345                                   Register(rn),
   20346                                   Operand(Register(rm), RRX));
   20347                               if (((instr & 0xfff0fff0) != 0xebb00f30)) {
   20348                                 UnpredictableT32(instr);
   20349                               }
   20350                               break;
   20351                             }
   20352                             default: {
   20353                               if (((instr & 0x70f0) == 0x30)) {
   20354                                 UnallocatedT32(instr);
   20355                                 return;
   20356                               }
   20357                               unsigned rn = (instr >> 16) & 0xf;
   20358                               unsigned rm = instr & 0xf;
   20359                               ImmediateShiftOperand
   20360                                   shift_operand((instr >> 4) & 0x3,
   20361                                                 ((instr >> 6) & 0x3) |
   20362                                                     ((instr >> 10) & 0x1c));
   20363                               if (shift_operand.GetShift().IsLSL() &&
   20364                                   (shift_operand.GetAmount() == 0)) {
   20365                                 // CMP{<c>}.W <Rn>, <Rm> ; T3
   20366                                 cmp(CurrentCond(),
   20367                                     Wide,
   20368                                     Register(rn),
   20369                                     Register(rm));
   20370                                 if (((instr & 0xfff08f00) != 0xebb00f00)) {
   20371                                   UnpredictableT32(instr);
   20372                                 }
   20373                               } else {
   20374                                 // CMP{<c>}{<q>} <Rn>, <Rm>, <shift> #<amount> ; T3 NOLINT(whitespace/line_length)
   20375                                 cmp(CurrentCond(),
   20376                                     Best,
   20377                                     Register(rn),
   20378                                     Operand(Register(rm),
   20379                                             shift_operand.GetType(),
   20380                                             shift_operand.GetAmount()));
   20381                                 if (((instr & 0xfff08f00) != 0xebb00f00)) {
   20382                                   UnpredictableT32(instr);
   20383                                 }
   20384                               }
   20385                               break;
   20386                             }
   20387                           }
   20388                           break;
   20389                         }
   20390                         default: {
   20391                           switch (instr & 0x000f0000) {
   20392                             case 0x000d0000: {
   20393                               // 0xebbd0000
   20394                               switch (instr & 0x000070f0) {
   20395                                 case 0x00000030: {
   20396                                   // 0xebbd0030
   20397                                   if (((instr & 0xf00) == 0xf00)) {
   20398                                     UnallocatedT32(instr);
   20399                                     return;
   20400                                   }
   20401                                   unsigned rd = (instr >> 8) & 0xf;
   20402                                   unsigned rm = instr & 0xf;
   20403                                   // SUBS{<c>}{<q>} {<Rd>}, SP, <Rm>, RRX ; T1
   20404                                   subs(CurrentCond(),
   20405                                        Best,
   20406                                        Register(rd),
   20407                                        sp,
   20408                                        Operand(Register(rm), RRX));
   20409                                   if (((instr & 0xfffff0f0) != 0xebbd0030)) {
   20410                                     UnpredictableT32(instr);
   20411                                   }
   20412                                   break;
   20413                                 }
   20414                                 default: {
   20415                                   if (((instr & 0x70f0) == 0x30) ||
   20416                                       ((instr & 0xf00) == 0xf00)) {
   20417                                     UnallocatedT32(instr);
   20418                                     return;
   20419                                   }
   20420                                   unsigned rd = (instr >> 8) & 0xf;
   20421                                   unsigned rm = instr & 0xf;
   20422                                   ImmediateShiftOperand
   20423                                       shift_operand((instr >> 4) & 0x3,
   20424                                                     ((instr >> 6) & 0x3) |
   20425                                                         ((instr >> 10) & 0x1c));
   20426                                   // SUBS{<c>}{<q>} {<Rd>}, SP, <Rm> {, <shift> #<amount> } ; T1 NOLINT(whitespace/line_length)
   20427                                   subs(CurrentCond(),
   20428                                        Best,
   20429                                        Register(rd),
   20430                                        sp,
   20431                                        Operand(Register(rm),
   20432                                                shift_operand.GetType(),
   20433                                                shift_operand.GetAmount()));
   20434                                   if (((instr & 0xffff8000) != 0xebbd0000)) {
   20435                                     UnpredictableT32(instr);
   20436                                   }
   20437                                   break;
   20438                                 }
   20439                               }
   20440                               break;
   20441                             }
   20442                             default: {
   20443                               switch (instr & 0x000070f0) {
   20444                                 case 0x00000030: {
   20445                                   // 0xebb00030
   20446                                   if (((instr & 0xf0000) == 0xd0000) ||
   20447                                       ((instr & 0xf00) == 0xf00)) {
   20448                                     UnallocatedT32(instr);
   20449                                     return;
   20450                                   }
   20451                                   unsigned rd = (instr >> 8) & 0xf;
   20452                                   unsigned rn = (instr >> 16) & 0xf;
   20453                                   unsigned rm = instr & 0xf;
   20454                                   // SUBS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2
   20455                                   subs(CurrentCond(),
   20456                                        Best,
   20457                                        Register(rd),
   20458                                        Register(rn),
   20459                                        Operand(Register(rm), RRX));
   20460                                   if (((instr & 0xfff0f0f0) != 0xebb00030)) {
   20461                                     UnpredictableT32(instr);
   20462                                   }
   20463                                   break;
   20464                                 }
   20465                                 default: {
   20466                                   if (((instr & 0xf0000) == 0xd0000) ||
   20467                                       ((instr & 0x70f0) == 0x30) ||
   20468                                       ((instr & 0xf00) == 0xf00)) {
   20469                                     UnallocatedT32(instr);
   20470                                     return;
   20471                                   }
   20472                                   unsigned rd = (instr >> 8) & 0xf;
   20473                                   unsigned rn = (instr >> 16) & 0xf;
   20474                                   unsigned rm = instr & 0xf;
   20475                                   ImmediateShiftOperand
   20476                                       shift_operand((instr >> 4) & 0x3,
   20477                                                     ((instr >> 6) & 0x3) |
   20478                                                         ((instr >> 10) & 0x1c));
   20479                                   if (OutsideITBlock() &&
   20480                                       (instr & 0x00100000) == 0x00100000 &&
   20481                                       shift_operand.GetShift().IsLSL() &&
   20482                                       (shift_operand.GetAmount() == 0) &&
   20483                                       ((rd < kNumberOfT32LowRegisters) &&
   20484                                        (rn < kNumberOfT32LowRegisters) &&
   20485                                        (rm < kNumberOfT32LowRegisters))) {
   20486                                     // SUBS.W {<Rd>}, <Rn>, <Rm> ; T2
   20487                                     subs(Condition::None(),
   20488                                          Wide,
   20489                                          Register(rd),
   20490                                          Register(rn),
   20491                                          Register(rm));
   20492                                     if (((instr & 0xfff08000) != 0xebb00000)) {
   20493                                       UnpredictableT32(instr);
   20494                                     }
   20495                                   } else if ((instr & 0x00100000) ==
   20496                                              0x00100000) {
   20497                                     // SUBS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
   20498                                     subs(CurrentCond(),
   20499                                          Best,
   20500                                          Register(rd),
   20501                                          Register(rn),
   20502                                          Operand(Register(rm),
   20503                                                  shift_operand.GetType(),
   20504                                                  shift_operand.GetAmount()));
   20505                                     if (((instr & 0xfff08000) != 0xebb00000)) {
   20506                                       UnpredictableT32(instr);
   20507                                     }
   20508                                   } else {
   20509                                     UnallocatedT32(instr);
   20510                                   }
   20511                                   break;
   20512                                 }
   20513                               }
   20514                               break;
   20515                             }
   20516                           }
   20517                           break;
   20518                         }
   20519                       }
   20520                       break;
   20521                     }
   20522                     case 0x00400000: {
   20523                       // 0xebd00000
   20524                       switch (instr & 0x000070f0) {
   20525                         case 0x00000030: {
   20526                           // 0xebd00030
   20527                           unsigned rd = (instr >> 8) & 0xf;
   20528                           unsigned rn = (instr >> 16) & 0xf;
   20529                           unsigned rm = instr & 0xf;
   20530                           // RSBS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T1
   20531                           rsbs(CurrentCond(),
   20532                                Best,
   20533                                Register(rd),
   20534                                Register(rn),
   20535                                Operand(Register(rm), RRX));
   20536                           if (((instr & 0xfff0f0f0) != 0xebd00030)) {
   20537                             UnpredictableT32(instr);
   20538                           }
   20539                           break;
   20540                         }
   20541                         default: {
   20542                           if (((instr & 0x70f0) == 0x30)) {
   20543                             UnallocatedT32(instr);
   20544                             return;
   20545                           }
   20546                           unsigned rd = (instr >> 8) & 0xf;
   20547                           unsigned rn = (instr >> 16) & 0xf;
   20548                           unsigned rm = instr & 0xf;
   20549                           ImmediateShiftOperand
   20550                               shift_operand((instr >> 4) & 0x3,
   20551                                             ((instr >> 6) & 0x3) |
   20552                                                 ((instr >> 10) & 0x1c));
   20553                           // RSBS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T1 NOLINT(whitespace/line_length)
   20554                           rsbs(CurrentCond(),
   20555                                Best,
   20556                                Register(rd),
   20557                                Register(rn),
   20558                                Operand(Register(rm),
   20559                                        shift_operand.GetType(),
   20560                                        shift_operand.GetAmount()));
   20561                           if (((instr & 0xfff08000) != 0xebd00000)) {
   20562                             UnpredictableT32(instr);
   20563                           }
   20564                           break;
   20565                         }
   20566                       }
   20567                       break;
   20568                     }
   20569                     default:
   20570                       UnallocatedT32(instr);
   20571                       break;
   20572                   }
   20573                   break;
   20574                 }
   20575                 case 0x10000000: {
   20576                   // 0xfa000000
   20577                   switch (instr & 0x0000f080) {
   20578                     case 0x0000f000: {
   20579                       // 0xfa00f000
   20580                       if ((instr & 0x00000070) == 0x00000000) {
   20581                         if (((Uint32((instr >> 21)) & Uint32(0x3)) ==
   20582                              Uint32(0x2))) {
   20583                           unsigned rd = (instr >> 8) & 0xf;
   20584                           unsigned rm = (instr >> 16) & 0xf;
   20585                           unsigned rs = instr & 0xf;
   20586                           if (InITBlock() &&
   20587                               ((rd == rm) && (rd < kNumberOfT32LowRegisters) &&
   20588                                (rs < kNumberOfT32LowRegisters))) {
   20589                             // ASR<c>.W {<Rd>}, <Rm>, <Rs> ; T2
   20590                             asr(CurrentCond(),
   20591                                 Wide,
   20592                                 Register(rd),
   20593                                 Register(rm),
   20594                                 Register(rs));
   20595                           } else {
   20596                             // ASR{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; T2
   20597                             asr(CurrentCond(),
   20598                                 Best,
   20599                                 Register(rd),
   20600                                 Register(rm),
   20601                                 Register(rs));
   20602                           }
   20603                           return;
   20604                         }
   20605                         if (((Uint32((instr >> 21)) & Uint32(0x3)) ==
   20606                              Uint32(0x0))) {
   20607                           unsigned rd = (instr >> 8) & 0xf;
   20608                           unsigned rm = (instr >> 16) & 0xf;
   20609                           unsigned rs = instr & 0xf;
   20610                           if (InITBlock() &&
   20611                               ((rd == rm) && (rd < kNumberOfT32LowRegisters) &&
   20612                                (rs < kNumberOfT32LowRegisters))) {
   20613                             // LSL<c>.W {<Rd>}, <Rm>, <Rs> ; T2
   20614                             lsl(CurrentCond(),
   20615                                 Wide,
   20616                                 Register(rd),
   20617                                 Register(rm),
   20618                                 Register(rs));
   20619                           } else {
   20620                             // LSL{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; T2
   20621                             lsl(CurrentCond(),
   20622                                 Best,
   20623                                 Register(rd),
   20624                                 Register(rm),
   20625                                 Register(rs));
   20626                           }
   20627                           return;
   20628                         }
   20629                         if (((Uint32((instr >> 21)) & Uint32(0x3)) ==
   20630                              Uint32(0x1))) {
   20631                           unsigned rd = (instr >> 8) & 0xf;
   20632                           unsigned rm = (instr >> 16) & 0xf;
   20633                           unsigned rs = instr & 0xf;
   20634                           if (InITBlock() &&
   20635                               ((rd == rm) && (rd < kNumberOfT32LowRegisters) &&
   20636                                (rs < kNumberOfT32LowRegisters))) {
   20637                             // LSR<c>.W {<Rd>}, <Rm>, <Rs> ; T2
   20638                             lsr(CurrentCond(),
   20639                                 Wide,
   20640                                 Register(rd),
   20641                                 Register(rm),
   20642                                 Register(rs));
   20643                           } else {
   20644                             // LSR{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; T2
   20645                             lsr(CurrentCond(),
   20646                                 Best,
   20647                                 Register(rd),
   20648                                 Register(rm),
   20649                                 Register(rs));
   20650                           }
   20651                           return;
   20652                         }
   20653                         if (((Uint32((instr >> 21)) & Uint32(0x3)) ==
   20654                              Uint32(0x3))) {
   20655                           unsigned rd = (instr >> 8) & 0xf;
   20656                           unsigned rm = (instr >> 16) & 0xf;
   20657                           unsigned rs = instr & 0xf;
   20658                           if (InITBlock() &&
   20659                               ((rd == rm) && (rd < kNumberOfT32LowRegisters) &&
   20660                                (rs < kNumberOfT32LowRegisters))) {
   20661                             // ROR<c>.W {<Rd>}, <Rm>, <Rs> ; T2
   20662                             ror(CurrentCond(),
   20663                                 Wide,
   20664                                 Register(rd),
   20665                                 Register(rm),
   20666                                 Register(rs));
   20667                           } else {
   20668                             // ROR{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; T2
   20669                             ror(CurrentCond(),
   20670                                 Best,
   20671                                 Register(rd),
   20672                                 Register(rm),
   20673                                 Register(rs));
   20674                           }
   20675                           return;
   20676                         }
   20677                         unsigned rd = (instr >> 8) & 0xf;
   20678                         unsigned rm = (instr >> 16) & 0xf;
   20679                         Shift shift((instr >> 21) & 0x3);
   20680                         unsigned rs = instr & 0xf;
   20681                         if (InITBlock() && (instr & 0x00100000) == 0x00000000 &&
   20682                             ((rd < kNumberOfT32LowRegisters) &&
   20683                              (rm < kNumberOfT32LowRegisters) &&
   20684                              (rs < kNumberOfT32LowRegisters))) {
   20685                           // MOV<c>.W <Rd>, <Rm>, <shift> <Rs> ; T2
   20686                           mov(CurrentCond(),
   20687                               Wide,
   20688                               Register(rd),
   20689                               Operand(Register(rm),
   20690                                       shift.GetType(),
   20691                                       Register(rs)));
   20692                         } else if ((instr & 0x00100000) == 0x00000000) {
   20693                           // MOV{<c>}{<q>} <Rd>, <Rm>, <shift> <Rs> ; T2
   20694                           mov(CurrentCond(),
   20695                               Best,
   20696                               Register(rd),
   20697                               Operand(Register(rm),
   20698                                       shift.GetType(),
   20699                                       Register(rs)));
   20700                         } else {
   20701                           UnallocatedT32(instr);
   20702                         }
   20703                       } else {
   20704                         UnallocatedT32(instr);
   20705                       }
   20706                       break;
   20707                     }
   20708                     case 0x0000f080: {
   20709                       // 0xfa00f080
   20710                       switch (instr & 0x00600000) {
   20711                         case 0x00000000: {
   20712                           // 0xfa00f080
   20713                           switch (instr & 0x000f0000) {
   20714                             case 0x000f0000: {
   20715                               // 0xfa0ff080
   20716                               unsigned rd = (instr >> 8) & 0xf;
   20717                               unsigned rm = instr & 0xf;
   20718                               uint32_t amount = ((instr >> 4) & 0x3) * 8;
   20719                               if ((amount == 0) &&
   20720                                   ((rd < kNumberOfT32LowRegisters) &&
   20721                                    (rm < kNumberOfT32LowRegisters))) {
   20722                                 // SXTH{<c>}.W {<Rd>}, <Rm> ; T2
   20723                                 sxth(CurrentCond(),
   20724                                      Wide,
   20725                                      Register(rd),
   20726                                      Register(rm));
   20727                                 if (((instr & 0xfffff0c0) != 0xfa0ff080)) {
   20728                                   UnpredictableT32(instr);
   20729                                 }
   20730                               } else {
   20731                                 // SXTH{<c>}{<q>} {<Rd>}, <Rm> {, ROR #<amount> } ; T2 NOLINT(whitespace/line_length)
   20732                                 sxth(CurrentCond(),
   20733                                      Best,
   20734                                      Register(rd),
   20735                                      Operand(Register(rm), ROR, amount));
   20736                                 if (((instr & 0xfffff0c0) != 0xfa0ff080)) {
   20737                                   UnpredictableT32(instr);
   20738                                 }
   20739                               }
   20740                               break;
   20741                             }
   20742                             default: {
   20743                               if (((instr & 0xf0000) == 0xf0000)) {
   20744                                 UnallocatedT32(instr);
   20745                                 return;
   20746                               }
   20747                               unsigned rd = (instr >> 8) & 0xf;
   20748                               unsigned rn = (instr >> 16) & 0xf;
   20749                               unsigned rm = instr & 0xf;
   20750                               uint32_t amount = ((instr >> 4) & 0x3) * 8;
   20751                               // SXTAH{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ROR #<amount> } ; T1 NOLINT(whitespace/line_length)
   20752                               sxtah(CurrentCond(),
   20753                                     Register(rd),
   20754                                     Register(rn),
   20755                                     Operand(Register(rm), ROR, amount));
   20756                               if (((instr & 0xfff0f0c0) != 0xfa00f080)) {
   20757                                 UnpredictableT32(instr);
   20758                               }
   20759                               break;
   20760                             }
   20761                           }
   20762                           break;
   20763                         }
   20764                         case 0x00200000: {
   20765                           // 0xfa20f080
   20766                           switch (instr & 0x000f0000) {
   20767                             case 0x000f0000: {
   20768                               // 0xfa2ff080
   20769                               unsigned rd = (instr >> 8) & 0xf;
   20770                               unsigned rm = instr & 0xf;
   20771                               uint32_t amount = ((instr >> 4) & 0x3) * 8;
   20772                               // SXTB16{<c>}{<q>} {<Rd>}, <Rm> {, ROR #<amount> } ; T1 NOLINT(whitespace/line_length)
   20773                               sxtb16(CurrentCond(),
   20774                                      Register(rd),
   20775                                      Operand(Register(rm), ROR, amount));
   20776                               if (((instr & 0xfffff0c0) != 0xfa2ff080)) {
   20777                                 UnpredictableT32(instr);
   20778                               }
   20779                               break;
   20780                             }
   20781                             default: {
   20782                               if (((instr & 0xf0000) == 0xf0000)) {
   20783                                 UnallocatedT32(instr);
   20784                                 return;
   20785                               }
   20786                               unsigned rd = (instr >> 8) & 0xf;
   20787                               unsigned rn = (instr >> 16) & 0xf;
   20788                               unsigned rm = instr & 0xf;
   20789                               uint32_t amount = ((instr >> 4) & 0x3) * 8;
   20790                               // SXTAB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ROR #<amount> } ; T1 NOLINT(whitespace/line_length)
   20791                               sxtab16(CurrentCond(),
   20792                                       Register(rd),
   20793                                       Register(rn),
   20794                                       Operand(Register(rm), ROR, amount));
   20795                               if (((instr & 0xfff0f0c0) != 0xfa20f080)) {
   20796                                 UnpredictableT32(instr);
   20797                               }
   20798                               break;
   20799                             }
   20800                           }
   20801                           break;
   20802                         }
   20803                         case 0x00400000: {
   20804                           // 0xfa40f080
   20805                           switch (instr & 0x000f0000) {
   20806                             case 0x000f0000: {
   20807                               // 0xfa4ff080
   20808                               unsigned rd = (instr >> 8) & 0xf;
   20809                               unsigned rm = instr & 0xf;
   20810                               uint32_t amount = ((instr >> 4) & 0x3) * 8;
   20811                               if ((amount == 0) &&
   20812                                   ((rd < kNumberOfT32LowRegisters) &&
   20813                                    (rm < kNumberOfT32LowRegisters))) {
   20814                                 // SXTB{<c>}.W {<Rd>}, <Rm> ; T2
   20815                                 sxtb(CurrentCond(),
   20816                                      Wide,
   20817                                      Register(rd),
   20818                                      Register(rm));
   20819                                 if (((instr & 0xfffff0c0) != 0xfa4ff080)) {
   20820                                   UnpredictableT32(instr);
   20821                                 }
   20822                               } else {
   20823                                 // SXTB{<c>}{<q>} {<Rd>}, <Rm> {, ROR #<amount> } ; T2 NOLINT(whitespace/line_length)
   20824                                 sxtb(CurrentCond(),
   20825                                      Best,
   20826                                      Register(rd),
   20827                                      Operand(Register(rm), ROR, amount));
   20828                                 if (((instr & 0xfffff0c0) != 0xfa4ff080)) {
   20829                                   UnpredictableT32(instr);
   20830                                 }
   20831                               }
   20832                               break;
   20833                             }
   20834                             default: {
   20835                               if (((instr & 0xf0000) == 0xf0000)) {
   20836                                 UnallocatedT32(instr);
   20837                                 return;
   20838                               }
   20839                               unsigned rd = (instr >> 8) & 0xf;
   20840                               unsigned rn = (instr >> 16) & 0xf;
   20841                               unsigned rm = instr & 0xf;
   20842                               uint32_t amount = ((instr >> 4) & 0x3) * 8;
   20843                               // SXTAB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ROR #<amount> } ; T1 NOLINT(whitespace/line_length)
   20844                               sxtab(CurrentCond(),
   20845                                     Register(rd),
   20846                                     Register(rn),
   20847                                     Operand(Register(rm), ROR, amount));
   20848                               if (((instr & 0xfff0f0c0) != 0xfa40f080)) {
   20849                                 UnpredictableT32(instr);
   20850                               }
   20851                               break;
   20852                             }
   20853                           }
   20854                           break;
   20855                         }
   20856                         default:
   20857                           UnallocatedT32(instr);
   20858                           break;
   20859                       }
   20860                       break;
   20861                     }
   20862                     default:
   20863                       UnallocatedT32(instr);
   20864                       break;
   20865                   }
   20866                   break;
   20867                 }
   20868                 case 0x10100000: {
   20869                   // 0xfa100000
   20870                   switch (instr & 0x0000f080) {
   20871                     case 0x0000f000: {
   20872                       // 0xfa10f000
   20873                       if ((instr & 0x00000070) == 0x00000000) {
   20874                         if (((Uint32((instr >> 21)) & Uint32(0x3)) ==
   20875                              Uint32(0x2))) {
   20876                           unsigned rd = (instr >> 8) & 0xf;
   20877                           unsigned rm = (instr >> 16) & 0xf;
   20878                           unsigned rs = instr & 0xf;
   20879                           if (OutsideITBlock() &&
   20880                               ((rd == rm) && (rd < kNumberOfT32LowRegisters) &&
   20881                                (rs < kNumberOfT32LowRegisters))) {
   20882                             // ASRS.W {<Rd>}, <Rm>, <Rs> ; T2
   20883                             asrs(Condition::None(),
   20884                                  Wide,
   20885                                  Register(rd),
   20886                                  Register(rm),
   20887                                  Register(rs));
   20888                           } else {
   20889                             // ASRS{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; T2
   20890                             asrs(CurrentCond(),
   20891                                  Best,
   20892                                  Register(rd),
   20893                                  Register(rm),
   20894                                  Register(rs));
   20895                           }
   20896                           return;
   20897                         }
   20898                         if (((Uint32((instr >> 21)) & Uint32(0x3)) ==
   20899                              Uint32(0x0))) {
   20900                           unsigned rd = (instr >> 8) & 0xf;
   20901                           unsigned rm = (instr >> 16) & 0xf;
   20902                           unsigned rs = instr & 0xf;
   20903                           if (OutsideITBlock() &&
   20904                               ((rd == rm) && (rd < kNumberOfT32LowRegisters) &&
   20905                                (rs < kNumberOfT32LowRegisters))) {
   20906                             // LSLS.W {<Rd>}, <Rm>, <Rs> ; T2
   20907                             lsls(Condition::None(),
   20908                                  Wide,
   20909                                  Register(rd),
   20910                                  Register(rm),
   20911                                  Register(rs));
   20912                           } else {
   20913                             // LSLS{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; T2
   20914                             lsls(CurrentCond(),
   20915                                  Best,
   20916                                  Register(rd),
   20917                                  Register(rm),
   20918                                  Register(rs));
   20919                           }
   20920                           return;
   20921                         }
   20922                         if (((Uint32((instr >> 21)) & Uint32(0x3)) ==
   20923                              Uint32(0x1))) {
   20924                           unsigned rd = (instr >> 8) & 0xf;
   20925                           unsigned rm = (instr >> 16) & 0xf;
   20926                           unsigned rs = instr & 0xf;
   20927                           if (OutsideITBlock() &&
   20928                               ((rd == rm) && (rd < kNumberOfT32LowRegisters) &&
   20929                                (rs < kNumberOfT32LowRegisters))) {
   20930                             // LSRS.W {<Rd>}, <Rm>, <Rs> ; T2
   20931                             lsrs(Condition::None(),
   20932                                  Wide,
   20933                                  Register(rd),
   20934                                  Register(rm),
   20935                                  Register(rs));
   20936                           } else {
   20937                             // LSRS{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; T2
   20938                             lsrs(CurrentCond(),
   20939                                  Best,
   20940                                  Register(rd),
   20941                                  Register(rm),
   20942                                  Register(rs));
   20943                           }
   20944                           return;
   20945                         }
   20946                         if (((Uint32((instr >> 21)) & Uint32(0x3)) ==
   20947                              Uint32(0x3))) {
   20948                           unsigned rd = (instr >> 8) & 0xf;
   20949                           unsigned rm = (instr >> 16) & 0xf;
   20950                           unsigned rs = instr & 0xf;
   20951                           if (OutsideITBlock() &&
   20952                               ((rd == rm) && (rd < kNumberOfT32LowRegisters) &&
   20953                                (rs < kNumberOfT32LowRegisters))) {
   20954                             // RORS.W {<Rd>}, <Rm>, <Rs> ; T2
   20955                             rors(Condition::None(),
   20956                                  Wide,
   20957                                  Register(rd),
   20958                                  Register(rm),
   20959                                  Register(rs));
   20960                           } else {
   20961                             // RORS{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; T2
   20962                             rors(CurrentCond(),
   20963                                  Best,
   20964                                  Register(rd),
   20965                                  Register(rm),
   20966                                  Register(rs));
   20967                           }
   20968                           return;
   20969                         }
   20970                         unsigned rd = (instr >> 8) & 0xf;
   20971                         unsigned rm = (instr >> 16) & 0xf;
   20972                         Shift shift((instr >> 21) & 0x3);
   20973                         unsigned rs = instr & 0xf;
   20974                         if (OutsideITBlock() &&
   20975                             (instr & 0x00100000) == 0x00100000 &&
   20976                             ((rd < kNumberOfT32LowRegisters) &&
   20977                              (rm < kNumberOfT32LowRegisters) &&
   20978                              (rs < kNumberOfT32LowRegisters))) {
   20979                           // MOVS.W <Rd>, <Rm>, <shift> <Rs> ; T2
   20980                           movs(Condition::None(),
   20981                                Wide,
   20982                                Register(rd),
   20983                                Operand(Register(rm),
   20984                                        shift.GetType(),
   20985                                        Register(rs)));
   20986                         } else if ((instr & 0x00100000) == 0x00100000) {
   20987                           // MOVS{<c>}{<q>} <Rd>, <Rm>, <shift> <Rs> ; T2
   20988                           movs(CurrentCond(),
   20989                                Best,
   20990                                Register(rd),
   20991                                Operand(Register(rm),
   20992                                        shift.GetType(),
   20993                                        Register(rs)));
   20994                         } else {
   20995                           UnallocatedT32(instr);
   20996                         }
   20997                       } else {
   20998                         UnallocatedT32(instr);
   20999                       }
   21000                       break;
   21001                     }
   21002                     case 0x0000f080: {
   21003                       // 0xfa10f080
   21004                       switch (instr & 0x00600000) {
   21005                         case 0x00000000: {
   21006                           // 0xfa10f080
   21007                           switch (instr & 0x000f0000) {
   21008                             case 0x000f0000: {
   21009                               // 0xfa1ff080
   21010                               unsigned rd = (instr >> 8) & 0xf;
   21011                               unsigned rm = instr & 0xf;
   21012                               uint32_t amount = ((instr >> 4) & 0x3) * 8;
   21013                               if ((amount == 0) &&
   21014                                   ((rd < kNumberOfT32LowRegisters) &&
   21015                                    (rm < kNumberOfT32LowRegisters))) {
   21016                                 // UXTH{<c>}.W {<Rd>}, <Rm> ; T2
   21017                                 uxth(CurrentCond(),
   21018                                      Wide,
   21019                                      Register(rd),
   21020                                      Register(rm));
   21021                                 if (((instr & 0xfffff0c0) != 0xfa1ff080)) {
   21022                                   UnpredictableT32(instr);
   21023                                 }
   21024                               } else {
   21025                                 // UXTH{<c>}{<q>} {<Rd>}, <Rm> {, ROR #<amount> } ; T2 NOLINT(whitespace/line_length)
   21026                                 uxth(CurrentCond(),
   21027                                      Best,
   21028                                      Register(rd),
   21029                                      Operand(Register(rm), ROR, amount));
   21030                                 if (((instr & 0xfffff0c0) != 0xfa1ff080)) {
   21031                                   UnpredictableT32(instr);
   21032                                 }
   21033                               }
   21034                               break;
   21035                             }
   21036                             default: {
   21037                               if (((instr & 0xf0000) == 0xf0000)) {
   21038                                 UnallocatedT32(instr);
   21039                                 return;
   21040                               }
   21041                               unsigned rd = (instr >> 8) & 0xf;
   21042                               unsigned rn = (instr >> 16) & 0xf;
   21043                               unsigned rm = instr & 0xf;
   21044                               uint32_t amount = ((instr >> 4) & 0x3) * 8;
   21045                               // UXTAH{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ROR #<amount> } ; T1 NOLINT(whitespace/line_length)
   21046                               uxtah(CurrentCond(),
   21047                                     Register(rd),
   21048                                     Register(rn),
   21049                                     Operand(Register(rm), ROR, amount));
   21050                               if (((instr & 0xfff0f0c0) != 0xfa10f080)) {
   21051                                 UnpredictableT32(instr);
   21052                               }
   21053                               break;
   21054                             }
   21055                           }
   21056                           break;
   21057                         }
   21058                         case 0x00200000: {
   21059                           // 0xfa30f080
   21060                           switch (instr & 0x000f0000) {
   21061                             case 0x000f0000: {
   21062                               // 0xfa3ff080
   21063                               unsigned rd = (instr >> 8) & 0xf;
   21064                               unsigned rm = instr & 0xf;
   21065                               uint32_t amount = ((instr >> 4) & 0x3) * 8;
   21066                               // UXTB16{<c>}{<q>} {<Rd>}, <Rm> {, ROR #<amount> } ; T1 NOLINT(whitespace/line_length)
   21067                               uxtb16(CurrentCond(),
   21068                                      Register(rd),
   21069                                      Operand(Register(rm), ROR, amount));
   21070                               if (((instr & 0xfffff0c0) != 0xfa3ff080)) {
   21071                                 UnpredictableT32(instr);
   21072                               }
   21073                               break;
   21074                             }
   21075                             default: {
   21076                               if (((instr & 0xf0000) == 0xf0000)) {
   21077                                 UnallocatedT32(instr);
   21078                                 return;
   21079                               }
   21080                               unsigned rd = (instr >> 8) & 0xf;
   21081                               unsigned rn = (instr >> 16) & 0xf;
   21082                               unsigned rm = instr & 0xf;
   21083                               uint32_t amount = ((instr >> 4) & 0x3) * 8;
   21084                               // UXTAB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ROR #<amount> } ; T1 NOLINT(whitespace/line_length)
   21085                               uxtab16(CurrentCond(),
   21086                                       Register(rd),
   21087                                       Register(rn),
   21088                                       Operand(Register(rm), ROR, amount));
   21089                               if (((instr & 0xfff0f0c0) != 0xfa30f080)) {
   21090                                 UnpredictableT32(instr);
   21091                               }
   21092                               break;
   21093                             }
   21094                           }
   21095                           break;
   21096                         }
   21097                         case 0x00400000: {
   21098                           // 0xfa50f080
   21099                           switch (instr & 0x000f0000) {
   21100                             case 0x000f0000: {
   21101                               // 0xfa5ff080
   21102                               unsigned rd = (instr >> 8) & 0xf;
   21103                               unsigned rm = instr & 0xf;
   21104                               uint32_t amount = ((instr >> 4) & 0x3) * 8;
   21105                               if ((amount == 0) &&
   21106                                   ((rd < kNumberOfT32LowRegisters) &&
   21107                                    (rm < kNumberOfT32LowRegisters))) {
   21108                                 // UXTB{<c>}.W {<Rd>}, <Rm> ; T2
   21109                                 uxtb(CurrentCond(),
   21110                                      Wide,
   21111                                      Register(rd),
   21112                                      Register(rm));
   21113                                 if (((instr & 0xfffff0c0) != 0xfa5ff080)) {
   21114                                   UnpredictableT32(instr);
   21115                                 }
   21116                               } else {
   21117                                 // UXTB{<c>}{<q>} {<Rd>}, <Rm> {, ROR #<amount> } ; T2 NOLINT(whitespace/line_length)
   21118                                 uxtb(CurrentCond(),
   21119                                      Best,
   21120                                      Register(rd),
   21121                                      Operand(Register(rm), ROR, amount));
   21122                                 if (((instr & 0xfffff0c0) != 0xfa5ff080)) {
   21123                                   UnpredictableT32(instr);
   21124                                 }
   21125                               }
   21126                               break;
   21127                             }
   21128                             default: {
   21129                               if (((instr & 0xf0000) == 0xf0000)) {
   21130                                 UnallocatedT32(instr);
   21131                                 return;
   21132                               }
   21133                               unsigned rd = (instr >> 8) & 0xf;
   21134                               unsigned rn = (instr >> 16) & 0xf;
   21135                               unsigned rm = instr & 0xf;
   21136                               uint32_t amount = ((instr >> 4) & 0x3) * 8;
   21137                               // UXTAB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ROR #<amount> } ; T1 NOLINT(whitespace/line_length)
   21138                               uxtab(CurrentCond(),
   21139                                     Register(rd),
   21140                                     Register(rn),
   21141                                     Operand(Register(rm), ROR, amount));
   21142                               if (((instr & 0xfff0f0c0) != 0xfa50f080)) {
   21143                                 UnpredictableT32(instr);
   21144                               }
   21145                               break;
   21146                             }
   21147                           }
   21148                           break;
   21149                         }
   21150                         default:
   21151                           UnallocatedT32(instr);
   21152                           break;
   21153                       }
   21154                       break;
   21155                     }
   21156                     default:
   21157                       UnallocatedT32(instr);
   21158                       break;
   21159                   }
   21160                   break;
   21161                 }
   21162                 case 0x10800000: {
   21163                   // 0xfa800000
   21164                   switch (instr & 0x0060f0f0) {
   21165                     case 0x0000f000: {
   21166                       // 0xfa80f000
   21167                       unsigned rd = (instr >> 8) & 0xf;
   21168                       unsigned rn = (instr >> 16) & 0xf;
   21169                       unsigned rm = instr & 0xf;
   21170                       // SADD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
   21171                       sadd8(CurrentCond(),
   21172                             Register(rd),
   21173                             Register(rn),
   21174                             Register(rm));
   21175                       break;
   21176                     }
   21177                     case 0x0000f010: {
   21178                       // 0xfa80f010
   21179                       unsigned rd = (instr >> 8) & 0xf;
   21180                       unsigned rn = (instr >> 16) & 0xf;
   21181                       unsigned rm = instr & 0xf;
   21182                       // QADD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
   21183                       qadd8(CurrentCond(),
   21184                             Register(rd),
   21185                             Register(rn),
   21186                             Register(rm));
   21187                       break;
   21188                     }
   21189                     case 0x0000f020: {
   21190                       // 0xfa80f020
   21191                       unsigned rd = (instr >> 8) & 0xf;
   21192                       unsigned rn = (instr >> 16) & 0xf;
   21193                       unsigned rm = instr & 0xf;
   21194                       // SHADD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
   21195                       shadd8(CurrentCond(),
   21196                              Register(rd),
   21197                              Register(rn),
   21198                              Register(rm));
   21199                       break;
   21200                     }
   21201                     case 0x0000f040: {
   21202                       // 0xfa80f040
   21203                       unsigned rd = (instr >> 8) & 0xf;
   21204                       unsigned rn = (instr >> 16) & 0xf;
   21205                       unsigned rm = instr & 0xf;
   21206                       // UADD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
   21207                       uadd8(CurrentCond(),
   21208                             Register(rd),
   21209                             Register(rn),
   21210                             Register(rm));
   21211                       break;
   21212                     }
   21213                     case 0x0000f050: {
   21214                       // 0xfa80f050
   21215                       unsigned rd = (instr >> 8) & 0xf;
   21216                       unsigned rn = (instr >> 16) & 0xf;
   21217                       unsigned rm = instr & 0xf;
   21218                       // UQADD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
   21219                       uqadd8(CurrentCond(),
   21220                              Register(rd),
   21221                              Register(rn),
   21222                              Register(rm));
   21223                       break;
   21224                     }
   21225                     case 0x0000f060: {
   21226                       // 0xfa80f060
   21227                       unsigned rd = (instr >> 8) & 0xf;
   21228                       unsigned rn = (instr >> 16) & 0xf;
   21229                       unsigned rm = instr & 0xf;
   21230                       // UHADD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
   21231                       uhadd8(CurrentCond(),
   21232                              Register(rd),
   21233                              Register(rn),
   21234                              Register(rm));
   21235                       break;
   21236                     }
   21237                     case 0x0000f080: {
   21238                       // 0xfa80f080
   21239                       unsigned rd = (instr >> 8) & 0xf;
   21240                       unsigned rm = instr & 0xf;
   21241                       unsigned rn = (instr >> 16) & 0xf;
   21242                       // QADD{<c>}{<q>} {<Rd>}, <Rm>, <Rn> ; T1
   21243                       qadd(CurrentCond(),
   21244                            Register(rd),
   21245                            Register(rm),
   21246                            Register(rn));
   21247                       break;
   21248                     }
   21249                     case 0x0000f090: {
   21250                       // 0xfa80f090
   21251                       unsigned rd = (instr >> 8) & 0xf;
   21252                       unsigned rm = instr & 0xf;
   21253                       unsigned rn = (instr >> 16) & 0xf;
   21254                       // QDADD{<c>}{<q>} {<Rd>}, <Rm>, <Rn> ; T1
   21255                       qdadd(CurrentCond(),
   21256                             Register(rd),
   21257                             Register(rm),
   21258                             Register(rn));
   21259                       break;
   21260                     }
   21261                     case 0x0000f0a0: {
   21262                       // 0xfa80f0a0
   21263                       unsigned rd = (instr >> 8) & 0xf;
   21264                       unsigned rm = instr & 0xf;
   21265                       unsigned rn = (instr >> 16) & 0xf;
   21266                       // QSUB{<c>}{<q>} {<Rd>}, <Rm>, <Rn> ; T1
   21267                       qsub(CurrentCond(),
   21268                            Register(rd),
   21269                            Register(rm),
   21270                            Register(rn));
   21271                       break;
   21272                     }
   21273                     case 0x0000f0b0: {
   21274                       // 0xfa80f0b0
   21275                       unsigned rd = (instr >> 8) & 0xf;
   21276                       unsigned rm = instr & 0xf;
   21277                       unsigned rn = (instr >> 16) & 0xf;
   21278                       // QDSUB{<c>}{<q>} {<Rd>}, <Rm>, <Rn> ; T1
   21279                       qdsub(CurrentCond(),
   21280                             Register(rd),
   21281                             Register(rm),
   21282                             Register(rn));
   21283                       break;
   21284                     }
   21285                     case 0x0020f000: {
   21286                       // 0xfaa0f000
   21287                       unsigned rd = (instr >> 8) & 0xf;
   21288                       unsigned rn = (instr >> 16) & 0xf;
   21289                       unsigned rm = instr & 0xf;
   21290                       // SASX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
   21291                       sasx(CurrentCond(),
   21292                            Register(rd),
   21293                            Register(rn),
   21294                            Register(rm));
   21295                       break;
   21296                     }
   21297                     case 0x0020f010: {
   21298                       // 0xfaa0f010
   21299                       unsigned rd = (instr >> 8) & 0xf;
   21300                       unsigned rn = (instr >> 16) & 0xf;
   21301                       unsigned rm = instr & 0xf;
   21302                       // QASX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
   21303                       qasx(CurrentCond(),
   21304                            Register(rd),
   21305                            Register(rn),
   21306                            Register(rm));
   21307                       break;
   21308                     }
   21309                     case 0x0020f020: {
   21310                       // 0xfaa0f020
   21311                       unsigned rd = (instr >> 8) & 0xf;
   21312                       unsigned rn = (instr >> 16) & 0xf;
   21313                       unsigned rm = instr & 0xf;
   21314                       // SHASX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
   21315                       shasx(CurrentCond(),
   21316                             Register(rd),
   21317                             Register(rn),
   21318                             Register(rm));
   21319                       break;
   21320                     }
   21321                     case 0x0020f040: {
   21322                       // 0xfaa0f040
   21323                       unsigned rd = (instr >> 8) & 0xf;
   21324                       unsigned rn = (instr >> 16) & 0xf;
   21325                       unsigned rm = instr & 0xf;
   21326                       // UASX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
   21327                       uasx(CurrentCond(),
   21328                            Register(rd),
   21329                            Register(rn),
   21330                            Register(rm));
   21331                       break;
   21332                     }
   21333                     case 0x0020f050: {
   21334                       // 0xfaa0f050
   21335                       unsigned rd = (instr >> 8) & 0xf;
   21336                       unsigned rn = (instr >> 16) & 0xf;
   21337                       unsigned rm = instr & 0xf;
   21338                       // UQASX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
   21339                       uqasx(CurrentCond(),
   21340                             Register(rd),
   21341                             Register(rn),
   21342                             Register(rm));
   21343                       break;
   21344                     }
   21345                     case 0x0020f060: {
   21346                       // 0xfaa0f060
   21347                       unsigned rd = (instr >> 8) & 0xf;
   21348                       unsigned rn = (instr >> 16) & 0xf;
   21349                       unsigned rm = instr & 0xf;
   21350                       // UHASX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
   21351                       uhasx(CurrentCond(),
   21352                             Register(rd),
   21353                             Register(rn),
   21354                             Register(rm));
   21355                       break;
   21356                     }
   21357                     case 0x0020f080: {
   21358                       // 0xfaa0f080
   21359                       unsigned rd = (instr >> 8) & 0xf;
   21360                       unsigned rn = (instr >> 16) & 0xf;
   21361                       unsigned rm = instr & 0xf;
   21362                       // SEL{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
   21363                       sel(CurrentCond(),
   21364                           Register(rd),
   21365                           Register(rn),
   21366                           Register(rm));
   21367                       break;
   21368                     }
   21369                     case 0x0040f000: {
   21370                       // 0xfac0f000
   21371                       unsigned rd = (instr >> 8) & 0xf;
   21372                       unsigned rn = (instr >> 16) & 0xf;
   21373                       unsigned rm = instr & 0xf;
   21374                       // SSUB8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
   21375                       ssub8(CurrentCond(),
   21376                             Register(rd),
   21377                             Register(rn),
   21378                             Register(rm));
   21379                       break;
   21380                     }
   21381                     case 0x0040f010: {
   21382                       // 0xfac0f010
   21383                       unsigned rd = (instr >> 8) & 0xf;
   21384                       unsigned rn = (instr >> 16) & 0xf;
   21385                       unsigned rm = instr & 0xf;
   21386                       // QSUB8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
   21387                       qsub8(CurrentCond(),
   21388                             Register(rd),
   21389                             Register(rn),
   21390                             Register(rm));
   21391                       break;
   21392                     }
   21393                     case 0x0040f020: {
   21394                       // 0xfac0f020
   21395                       unsigned rd = (instr >> 8) & 0xf;
   21396                       unsigned rn = (instr >> 16) & 0xf;
   21397                       unsigned rm = instr & 0xf;
   21398                       // SHSUB8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
   21399                       shsub8(CurrentCond(),
   21400                              Register(rd),
   21401                              Register(rn),
   21402                              Register(rm));
   21403                       break;
   21404                     }
   21405                     case 0x0040f040: {
   21406                       // 0xfac0f040
   21407                       unsigned rd = (instr >> 8) & 0xf;
   21408                       unsigned rn = (instr >> 16) & 0xf;
   21409                       unsigned rm = instr & 0xf;
   21410                       // USUB8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
   21411                       usub8(CurrentCond(),
   21412                             Register(rd),
   21413                             Register(rn),
   21414                             Register(rm));
   21415                       break;
   21416                     }
   21417                     case 0x0040f050: {
   21418                       // 0xfac0f050
   21419                       unsigned rd = (instr >> 8) & 0xf;
   21420                       unsigned rn = (instr >> 16) & 0xf;
   21421                       unsigned rm = instr & 0xf;
   21422                       // UQSUB8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
   21423                       uqsub8(CurrentCond(),
   21424                              Register(rd),
   21425                              Register(rn),
   21426                              Register(rm));
   21427                       break;
   21428                     }
   21429                     case 0x0040f060: {
   21430                       // 0xfac0f060
   21431                       unsigned rd = (instr >> 8) & 0xf;
   21432                       unsigned rn = (instr >> 16) & 0xf;
   21433                       unsigned rm = instr & 0xf;
   21434                       // UHSUB8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
   21435                       uhsub8(CurrentCond(),
   21436                              Register(rd),
   21437                              Register(rn),
   21438                              Register(rm));
   21439                       break;
   21440                     }
   21441                     case 0x0040f080: {
   21442                       // 0xfac0f080
   21443                       unsigned rd = (instr >> 8) & 0xf;
   21444                       unsigned rn = (instr >> 16) & 0xf;
   21445                       unsigned rm = instr & 0xf;
   21446                       // CRC32B{<q>} <Rd>, <Rn>, <Rm> ; T1
   21447                       crc32b(Condition::None(),
   21448                              Register(rd),
   21449                              Register(rn),
   21450                              Register(rm));
   21451                       break;
   21452                     }
   21453                     case 0x0040f090: {
   21454                       // 0xfac0f090
   21455                       unsigned rd = (instr >> 8) & 0xf;
   21456                       unsigned rn = (instr >> 16) & 0xf;
   21457                       unsigned rm = instr & 0xf;
   21458                       // CRC32H{<q>} <Rd>, <Rn>, <Rm> ; T1
   21459                       crc32h(Condition::None(),
   21460                              Register(rd),
   21461                              Register(rn),
   21462                              Register(rm));
   21463                       break;
   21464                     }
   21465                     case 0x0040f0a0: {
   21466                       // 0xfac0f0a0
   21467                       unsigned rd = (instr >> 8) & 0xf;
   21468                       unsigned rn = (instr >> 16) & 0xf;
   21469                       unsigned rm = instr & 0xf;
   21470                       // CRC32W{<q>} <Rd>, <Rn>, <Rm> ; T1
   21471                       crc32w(Condition::None(),
   21472                              Register(rd),
   21473                              Register(rn),
   21474                              Register(rm));
   21475                       break;
   21476                     }
   21477                     case 0x0060f000: {
   21478                       // 0xfae0f000
   21479                       unsigned rd = (instr >> 8) & 0xf;
   21480                       unsigned rn = (instr >> 16) & 0xf;
   21481                       unsigned rm = instr & 0xf;
   21482                       // SSAX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
   21483                       ssax(CurrentCond(),
   21484                            Register(rd),
   21485                            Register(rn),
   21486                            Register(rm));
   21487                       break;
   21488                     }
   21489                     case 0x0060f010: {
   21490                       // 0xfae0f010
   21491                       unsigned rd = (instr >> 8) & 0xf;
   21492                       unsigned rn = (instr >> 16) & 0xf;
   21493                       unsigned rm = instr & 0xf;
   21494                       // QSAX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
   21495                       qsax(CurrentCond(),
   21496                            Register(rd),
   21497                            Register(rn),
   21498                            Register(rm));
   21499                       break;
   21500                     }
   21501                     case 0x0060f020: {
   21502                       // 0xfae0f020
   21503                       unsigned rd = (instr >> 8) & 0xf;
   21504                       unsigned rn = (instr >> 16) & 0xf;
   21505                       unsigned rm = instr & 0xf;
   21506                       // SHSAX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
   21507                       shsax(CurrentCond(),
   21508                             Register(rd),
   21509                             Register(rn),
   21510                             Register(rm));
   21511                       break;
   21512                     }
   21513                     case 0x0060f040: {
   21514                       // 0xfae0f040
   21515                       unsigned rd = (instr >> 8) & 0xf;
   21516                       unsigned rn = (instr >> 16) & 0xf;
   21517                       unsigned rm = instr & 0xf;
   21518                       // USAX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
   21519                       usax(CurrentCond(),
   21520                            Register(rd),
   21521                            Register(rn),
   21522                            Register(rm));
   21523                       break;
   21524                     }
   21525                     case 0x0060f050: {
   21526                       // 0xfae0f050
   21527                       unsigned rd = (instr >> 8) & 0xf;
   21528                       unsigned rn = (instr >> 16) & 0xf;
   21529                       unsigned rm = instr & 0xf;
   21530                       // UQSAX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
   21531                       uqsax(CurrentCond(),
   21532                             Register(rd),
   21533                             Register(rn),
   21534                             Register(rm));
   21535                       break;
   21536                     }
   21537                     case 0x0060f060: {
   21538                       // 0xfae0f060
   21539                       unsigned rd = (instr >> 8) & 0xf;
   21540                       unsigned rn = (instr >> 16) & 0xf;
   21541                       unsigned rm = instr & 0xf;
   21542                       // UHSAX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
   21543                       uhsax(CurrentCond(),
   21544                             Register(rd),
   21545                             Register(rn),
   21546                             Register(rm));
   21547                       break;
   21548                     }
   21549                     default:
   21550                       UnallocatedT32(instr);
   21551                       break;
   21552                   }
   21553                   break;
   21554                 }
   21555                 case 0x10900000: {
   21556                   // 0xfa900000
   21557                   switch (instr & 0x0060f0f0) {
   21558                     case 0x0000f000: {
   21559                       // 0xfa90f000
   21560                       unsigned rd = (instr >> 8) & 0xf;
   21561                       unsigned rn = (instr >> 16) & 0xf;
   21562                       unsigned rm = instr & 0xf;
   21563                       // SADD16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
   21564                       sadd16(CurrentCond(),
   21565                              Register(rd),
   21566                              Register(rn),
   21567                              Register(rm));
   21568                       break;
   21569                     }
   21570                     case 0x0000f010: {
   21571                       // 0xfa90f010
   21572                       unsigned rd = (instr >> 8) & 0xf;
   21573                       unsigned rn = (instr >> 16) & 0xf;
   21574                       unsigned rm = instr & 0xf;
   21575                       // QADD16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
   21576                       qadd16(CurrentCond(),
   21577                              Register(rd),
   21578                              Register(rn),
   21579                              Register(rm));
   21580                       break;
   21581                     }
   21582                     case 0x0000f020: {
   21583                       // 0xfa90f020
   21584                       unsigned rd = (instr >> 8) & 0xf;
   21585                       unsigned rn = (instr >> 16) & 0xf;
   21586                       unsigned rm = instr & 0xf;
   21587                       // SHADD16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
   21588                       shadd16(CurrentCond(),
   21589                               Register(rd),
   21590                               Register(rn),
   21591                               Register(rm));
   21592                       break;
   21593                     }
   21594                     case 0x0000f040: {
   21595                       // 0xfa90f040
   21596                       unsigned rd = (instr >> 8) & 0xf;
   21597                       unsigned rn = (instr >> 16) & 0xf;
   21598                       unsigned rm = instr & 0xf;
   21599                       // UADD16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
   21600                       uadd16(CurrentCond(),
   21601                              Register(rd),
   21602                              Register(rn),
   21603                              Register(rm));
   21604                       break;
   21605                     }
   21606                     case 0x0000f050: {
   21607                       // 0xfa90f050
   21608                       unsigned rd = (instr >> 8) & 0xf;
   21609                       unsigned rn = (instr >> 16) & 0xf;
   21610                       unsigned rm = instr & 0xf;
   21611                       // UQADD16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
   21612                       uqadd16(CurrentCond(),
   21613                               Register(rd),
   21614                               Register(rn),
   21615                               Register(rm));
   21616                       break;
   21617                     }
   21618                     case 0x0000f060: {
   21619                       // 0xfa90f060
   21620                       unsigned rd = (instr >> 8) & 0xf;
   21621                       unsigned rn = (instr >> 16) & 0xf;
   21622                       unsigned rm = instr & 0xf;
   21623                       // UHADD16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
   21624                       uhadd16(CurrentCond(),
   21625                               Register(rd),
   21626                               Register(rn),
   21627                               Register(rm));
   21628                       break;
   21629                     }
   21630                     case 0x0000f080: {
   21631                       // 0xfa90f080
   21632                       if (((instr >> 16) & 0xf) == (instr & 0xf)) {
   21633                         unsigned rd = (instr >> 8) & 0xf;
   21634                         unsigned rm = instr & 0xf;
   21635                         if ((rd < kNumberOfT32LowRegisters) &&
   21636                             (rm < kNumberOfT32LowRegisters)) {
   21637                           // REV{<c>}.W <Rd>, <Rm> ; T2
   21638                           rev(CurrentCond(), Wide, Register(rd), Register(rm));
   21639                         } else {
   21640                           // REV{<c>}{<q>} <Rd>, <Rm> ; T2
   21641                           rev(CurrentCond(), Best, Register(rd), Register(rm));
   21642                         }
   21643                       } else {
   21644                         UnallocatedT32(instr);
   21645                       }
   21646                       break;
   21647                     }
   21648                     case 0x0000f090: {
   21649                       // 0xfa90f090
   21650                       if (((instr >> 16) & 0xf) == (instr & 0xf)) {
   21651                         unsigned rd = (instr >> 8) & 0xf;
   21652                         unsigned rm = instr & 0xf;
   21653                         if ((rd < kNumberOfT32LowRegisters) &&
   21654                             (rm < kNumberOfT32LowRegisters)) {
   21655                           // REV16{<c>}.W <Rd>, <Rm> ; T2
   21656                           rev16(CurrentCond(),
   21657                                 Wide,
   21658                                 Register(rd),
   21659                                 Register(rm));
   21660                         } else {
   21661                           // REV16{<c>}{<q>} <Rd>, <Rm> ; T2
   21662                           rev16(CurrentCond(),
   21663                                 Best,
   21664                                 Register(rd),
   21665                                 Register(rm));
   21666                         }
   21667                       } else {
   21668                         UnallocatedT32(instr);
   21669                       }
   21670                       break;
   21671                     }
   21672                     case 0x0000f0a0: {
   21673                       // 0xfa90f0a0
   21674                       if (((instr >> 16) & 0xf) == (instr & 0xf)) {
   21675                         unsigned rd = (instr >> 8) & 0xf;
   21676                         unsigned rm = instr & 0xf;
   21677                         // RBIT{<c>}{<q>} <Rd>, <Rm> ; T1
   21678                         rbit(CurrentCond(), Register(rd), Register(rm));
   21679                       } else {
   21680                         UnallocatedT32(instr);
   21681                       }
   21682                       break;
   21683                     }
   21684                     case 0x0000f0b0: {
   21685                       // 0xfa90f0b0
   21686                       if (((instr >> 16) & 0xf) == (instr & 0xf)) {
   21687                         unsigned rd = (instr >> 8) & 0xf;
   21688                         unsigned rm = instr & 0xf;
   21689                         if ((rd < kNumberOfT32LowRegisters) &&
   21690                             (rm < kNumberOfT32LowRegisters)) {
   21691                           // REVSH{<c>}.W <Rd>, <Rm> ; T2
   21692                           revsh(CurrentCond(),
   21693                                 Wide,
   21694                                 Register(rd),
   21695                                 Register(rm));
   21696                         } else {
   21697                           // REVSH{<c>}{<q>} <Rd>, <Rm> ; T2
   21698                           revsh(CurrentCond(),
   21699                                 Best,
   21700                                 Register(rd),
   21701                                 Register(rm));
   21702                         }
   21703                       } else {
   21704                         UnallocatedT32(instr);
   21705                       }
   21706                       break;
   21707                     }
   21708                     case 0x0020f080: {
   21709                       // 0xfab0f080
   21710                       if (((instr >> 16) & 0xf) == (instr & 0xf)) {
   21711                         unsigned rd = (instr >> 8) & 0xf;
   21712                         unsigned rm = instr & 0xf;
   21713                         // CLZ{<c>}{<q>} <Rd>, <Rm> ; T1
   21714                         clz(CurrentCond(), Register(rd), Register(rm));
   21715                       } else {
   21716                         UnallocatedT32(instr);
   21717                       }
   21718                       break;
   21719                     }
   21720                     case 0x0040f000: {
   21721                       // 0xfad0f000
   21722                       unsigned rd = (instr >> 8) & 0xf;
   21723                       unsigned rn = (instr >> 16) & 0xf;
   21724                       unsigned rm = instr & 0xf;
   21725                       // SSUB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
   21726                       ssub16(CurrentCond(),
   21727                              Register(rd),
   21728                              Register(rn),
   21729                              Register(rm));
   21730                       break;
   21731                     }
   21732                     case 0x0040f010: {
   21733                       // 0xfad0f010
   21734                       unsigned rd = (instr >> 8) & 0xf;
   21735                       unsigned rn = (instr >> 16) & 0xf;
   21736                       unsigned rm = instr & 0xf;
   21737                       // QSUB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
   21738                       qsub16(CurrentCond(),
   21739                              Register(rd),
   21740                              Register(rn),
   21741                              Register(rm));
   21742                       break;
   21743                     }
   21744                     case 0x0040f020: {
   21745                       // 0xfad0f020
   21746                       unsigned rd = (instr >> 8) & 0xf;
   21747                       unsigned rn = (instr >> 16) & 0xf;
   21748                       unsigned rm = instr & 0xf;
   21749                       // SHSUB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
   21750                       shsub16(CurrentCond(),
   21751                               Register(rd),
   21752                               Register(rn),
   21753                               Register(rm));
   21754                       break;
   21755                     }
   21756                     case 0x0040f040: {
   21757                       // 0xfad0f040
   21758                       unsigned rd = (instr >> 8) & 0xf;
   21759                       unsigned rn = (instr >> 16) & 0xf;
   21760                       unsigned rm = instr & 0xf;
   21761                       // USUB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
   21762                       usub16(CurrentCond(),
   21763                              Register(rd),
   21764                              Register(rn),
   21765                              Register(rm));
   21766                       break;
   21767                     }
   21768                     case 0x0040f050: {
   21769                       // 0xfad0f050
   21770                       unsigned rd = (instr >> 8) & 0xf;
   21771                       unsigned rn = (instr >> 16) & 0xf;
   21772                       unsigned rm = instr & 0xf;
   21773                       // UQSUB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
   21774                       uqsub16(CurrentCond(),
   21775                               Register(rd),
   21776                               Register(rn),
   21777                               Register(rm));
   21778                       break;
   21779                     }
   21780                     case 0x0040f060: {
   21781                       // 0xfad0f060
   21782                       unsigned rd = (instr >> 8) & 0xf;
   21783                       unsigned rn = (instr >> 16) & 0xf;
   21784                       unsigned rm = instr & 0xf;
   21785                       // UHSUB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
   21786                       uhsub16(CurrentCond(),
   21787                               Register(rd),
   21788                               Register(rn),
   21789                               Register(rm));
   21790                       break;
   21791                     }
   21792                     case 0x0040f080: {
   21793                       // 0xfad0f080
   21794                       unsigned rd = (instr >> 8) & 0xf;
   21795                       unsigned rn = (instr >> 16) & 0xf;
   21796                       unsigned rm = instr & 0xf;
   21797                       // CRC32CB{<q>} <Rd>, <Rn>, <Rm> ; T1
   21798                       crc32cb(Condition::None(),
   21799                               Register(rd),
   21800                               Register(rn),
   21801                               Register(rm));
   21802                       break;
   21803                     }
   21804                     case 0x0040f090: {
   21805                       // 0xfad0f090
   21806                       unsigned rd = (instr >> 8) & 0xf;
   21807                       unsigned rn = (instr >> 16) & 0xf;
   21808                       unsigned rm = instr & 0xf;
   21809                       // CRC32CH{<q>} <Rd>, <Rn>, <Rm> ; T1
   21810                       crc32ch(Condition::None(),
   21811                               Register(rd),
   21812                               Register(rn),
   21813                               Register(rm));
   21814                       break;
   21815                     }
   21816                     case 0x0040f0a0: {
   21817                       // 0xfad0f0a0
   21818                       unsigned rd = (instr >> 8) & 0xf;
   21819                       unsigned rn = (instr >> 16) & 0xf;
   21820                       unsigned rm = instr & 0xf;
   21821                       // CRC32CW{<q>} <Rd>, <Rn>, <Rm> ; T1
   21822                       crc32cw(Condition::None(),
   21823                               Register(rd),
   21824                               Register(rn),
   21825                               Register(rm));
   21826                       break;
   21827                     }
   21828                     default:
   21829                       UnallocatedT32(instr);
   21830                       break;
   21831                   }
   21832                   break;
   21833                 }
   21834                 case 0x11000000: {
   21835                   // 0xfb000000
   21836                   switch (instr & 0x006000f0) {
   21837                     case 0x00000000: {
   21838                       // 0xfb000000
   21839                       switch (instr & 0x0000f000) {
   21840                         case 0x0000f000: {
   21841                           // 0xfb00f000
   21842                           unsigned rd = (instr >> 8) & 0xf;
   21843                           unsigned rn = (instr >> 16) & 0xf;
   21844                           unsigned rm = instr & 0xf;
   21845                           if (InITBlock() &&
   21846                               ((rd == rm) && (rd < kNumberOfT32LowRegisters) &&
   21847                                (rn < kNumberOfT32LowRegisters))) {
   21848                             // MUL<c>.W <Rd>, <Rn>, {<Rm>} ; T2
   21849                             mul(CurrentCond(),
   21850                                 Wide,
   21851                                 Register(rd),
   21852                                 Register(rn),
   21853                                 Register(rm));
   21854                           } else {
   21855                             // MUL{<c>}{<q>} <Rd>, <Rn>, {<Rm>} ; T2
   21856                             mul(CurrentCond(),
   21857                                 Best,
   21858                                 Register(rd),
   21859                                 Register(rn),
   21860                                 Register(rm));
   21861                           }
   21862                           break;
   21863                         }
   21864                         default: {
   21865                           if (((instr & 0xf000) == 0xf000)) {
   21866                             UnallocatedT32(instr);
   21867                             return;
   21868                           }
   21869                           unsigned rd = (instr >> 8) & 0xf;
   21870                           unsigned rn = (instr >> 16) & 0xf;
   21871                           unsigned rm = instr & 0xf;
   21872                           unsigned ra = (instr >> 12) & 0xf;
   21873                           // MLA{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
   21874                           mla(CurrentCond(),
   21875                               Register(rd),
   21876                               Register(rn),
   21877                               Register(rm),
   21878                               Register(ra));
   21879                           break;
   21880                         }
   21881                       }
   21882                       break;
   21883                     }
   21884                     case 0x00000010: {
   21885                       // 0xfb000010
   21886                       unsigned rd = (instr >> 8) & 0xf;
   21887                       unsigned rn = (instr >> 16) & 0xf;
   21888                       unsigned rm = instr & 0xf;
   21889                       unsigned ra = (instr >> 12) & 0xf;
   21890                       // MLS{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
   21891                       mls(CurrentCond(),
   21892                           Register(rd),
   21893                           Register(rn),
   21894                           Register(rm),
   21895                           Register(ra));
   21896                       break;
   21897                     }
   21898                     case 0x00200000: {
   21899                       // 0xfb200000
   21900                       switch (instr & 0x0000f000) {
   21901                         case 0x0000f000: {
   21902                           // 0xfb20f000
   21903                           unsigned rd = (instr >> 8) & 0xf;
   21904                           unsigned rn = (instr >> 16) & 0xf;
   21905                           unsigned rm = instr & 0xf;
   21906                           // SMUAD{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
   21907                           smuad(CurrentCond(),
   21908                                 Register(rd),
   21909                                 Register(rn),
   21910                                 Register(rm));
   21911                           break;
   21912                         }
   21913                         default: {
   21914                           if (((instr & 0xf000) == 0xf000)) {
   21915                             UnallocatedT32(instr);
   21916                             return;
   21917                           }
   21918                           unsigned rd = (instr >> 8) & 0xf;
   21919                           unsigned rn = (instr >> 16) & 0xf;
   21920                           unsigned rm = instr & 0xf;
   21921                           unsigned ra = (instr >> 12) & 0xf;
   21922                           // SMLAD{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
   21923                           smlad(CurrentCond(),
   21924                                 Register(rd),
   21925                                 Register(rn),
   21926                                 Register(rm),
   21927                                 Register(ra));
   21928                           break;
   21929                         }
   21930                       }
   21931                       break;
   21932                     }
   21933                     case 0x00200010: {
   21934                       // 0xfb200010
   21935                       switch (instr & 0x0000f000) {
   21936                         case 0x0000f000: {
   21937                           // 0xfb20f010
   21938                           unsigned rd = (instr >> 8) & 0xf;
   21939                           unsigned rn = (instr >> 16) & 0xf;
   21940                           unsigned rm = instr & 0xf;
   21941                           // SMUADX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
   21942                           smuadx(CurrentCond(),
   21943                                  Register(rd),
   21944                                  Register(rn),
   21945                                  Register(rm));
   21946                           break;
   21947                         }
   21948                         default: {
   21949                           if (((instr & 0xf000) == 0xf000)) {
   21950                             UnallocatedT32(instr);
   21951                             return;
   21952                           }
   21953                           unsigned rd = (instr >> 8) & 0xf;
   21954                           unsigned rn = (instr >> 16) & 0xf;
   21955                           unsigned rm = instr & 0xf;
   21956                           unsigned ra = (instr >> 12) & 0xf;
   21957                           // SMLADX{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
   21958                           smladx(CurrentCond(),
   21959                                  Register(rd),
   21960                                  Register(rn),
   21961                                  Register(rm),
   21962                                  Register(ra));
   21963                           break;
   21964                         }
   21965                       }
   21966                       break;
   21967                     }
   21968                     case 0x00400000: {
   21969                       // 0xfb400000
   21970                       switch (instr & 0x0000f000) {
   21971                         case 0x0000f000: {
   21972                           // 0xfb40f000
   21973                           unsigned rd = (instr >> 8) & 0xf;
   21974                           unsigned rn = (instr >> 16) & 0xf;
   21975                           unsigned rm = instr & 0xf;
   21976                           // SMUSD{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
   21977                           smusd(CurrentCond(),
   21978                                 Register(rd),
   21979                                 Register(rn),
   21980                                 Register(rm));
   21981                           break;
   21982                         }
   21983                         default: {
   21984                           if (((instr & 0xf000) == 0xf000)) {
   21985                             UnallocatedT32(instr);
   21986                             return;
   21987                           }
   21988                           unsigned rd = (instr >> 8) & 0xf;
   21989                           unsigned rn = (instr >> 16) & 0xf;
   21990                           unsigned rm = instr & 0xf;
   21991                           unsigned ra = (instr >> 12) & 0xf;
   21992                           // SMLSD{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
   21993                           smlsd(CurrentCond(),
   21994                                 Register(rd),
   21995                                 Register(rn),
   21996                                 Register(rm),
   21997                                 Register(ra));
   21998                           break;
   21999                         }
   22000                       }
   22001                       break;
   22002                     }
   22003                     case 0x00400010: {
   22004                       // 0xfb400010
   22005                       switch (instr & 0x0000f000) {
   22006                         case 0x0000f000: {
   22007                           // 0xfb40f010
   22008                           unsigned rd = (instr >> 8) & 0xf;
   22009                           unsigned rn = (instr >> 16) & 0xf;
   22010                           unsigned rm = instr & 0xf;
   22011                           // SMUSDX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
   22012                           smusdx(CurrentCond(),
   22013                                  Register(rd),
   22014                                  Register(rn),
   22015                                  Register(rm));
   22016                           break;
   22017                         }
   22018                         default: {
   22019                           if (((instr & 0xf000) == 0xf000)) {
   22020                             UnallocatedT32(instr);
   22021                             return;
   22022                           }
   22023                           unsigned rd = (instr >> 8) & 0xf;
   22024                           unsigned rn = (instr >> 16) & 0xf;
   22025                           unsigned rm = instr & 0xf;
   22026                           unsigned ra = (instr >> 12) & 0xf;
   22027                           // SMLSDX{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
   22028                           smlsdx(CurrentCond(),
   22029                                  Register(rd),
   22030                                  Register(rn),
   22031                                  Register(rm),
   22032                                  Register(ra));
   22033                           break;
   22034                         }
   22035                       }
   22036                       break;
   22037                     }
   22038                     case 0x00600000: {
   22039                       // 0xfb600000
   22040                       unsigned rd = (instr >> 8) & 0xf;
   22041                       unsigned rn = (instr >> 16) & 0xf;
   22042                       unsigned rm = instr & 0xf;
   22043                       unsigned ra = (instr >> 12) & 0xf;
   22044                       // SMMLS{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
   22045                       smmls(CurrentCond(),
   22046                             Register(rd),
   22047                             Register(rn),
   22048                             Register(rm),
   22049                             Register(ra));
   22050                       break;
   22051                     }
   22052                     case 0x00600010: {
   22053                       // 0xfb600010
   22054                       unsigned rd = (instr >> 8) & 0xf;
   22055                       unsigned rn = (instr >> 16) & 0xf;
   22056                       unsigned rm = instr & 0xf;
   22057                       unsigned ra = (instr >> 12) & 0xf;
   22058                       // SMMLSR{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
   22059                       smmlsr(CurrentCond(),
   22060                              Register(rd),
   22061                              Register(rn),
   22062                              Register(rm),
   22063                              Register(ra));
   22064                       break;
   22065                     }
   22066                     default:
   22067                       UnallocatedT32(instr);
   22068                       break;
   22069                   }
   22070                   break;
   22071                 }
   22072                 case 0x11100000: {
   22073                   // 0xfb100000
   22074                   switch (instr & 0x006000f0) {
   22075                     case 0x00000000: {
   22076                       // 0xfb100000
   22077                       switch (instr & 0x0000f000) {
   22078                         case 0x0000f000: {
   22079                           // 0xfb10f000
   22080                           unsigned rd = (instr >> 8) & 0xf;
   22081                           unsigned rn = (instr >> 16) & 0xf;
   22082                           unsigned rm = instr & 0xf;
   22083                           // SMULBB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
   22084                           smulbb(CurrentCond(),
   22085                                  Register(rd),
   22086                                  Register(rn),
   22087                                  Register(rm));
   22088                           break;
   22089                         }
   22090                         default: {
   22091                           if (((instr & 0xf000) == 0xf000)) {
   22092                             UnallocatedT32(instr);
   22093                             return;
   22094                           }
   22095                           unsigned rd = (instr >> 8) & 0xf;
   22096                           unsigned rn = (instr >> 16) & 0xf;
   22097                           unsigned rm = instr & 0xf;
   22098                           unsigned ra = (instr >> 12) & 0xf;
   22099                           // SMLABB{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
   22100                           smlabb(CurrentCond(),
   22101                                  Register(rd),
   22102                                  Register(rn),
   22103                                  Register(rm),
   22104                                  Register(ra));
   22105                           break;
   22106                         }
   22107                       }
   22108                       break;
   22109                     }
   22110                     case 0x00000010: {
   22111                       // 0xfb100010
   22112                       switch (instr & 0x0000f000) {
   22113                         case 0x0000f000: {
   22114                           // 0xfb10f010
   22115                           unsigned rd = (instr >> 8) & 0xf;
   22116                           unsigned rn = (instr >> 16) & 0xf;
   22117                           unsigned rm = instr & 0xf;
   22118                           // SMULBT{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
   22119                           smulbt(CurrentCond(),
   22120                                  Register(rd),
   22121                                  Register(rn),
   22122                                  Register(rm));
   22123                           break;
   22124                         }
   22125                         default: {
   22126                           if (((instr & 0xf000) == 0xf000)) {
   22127                             UnallocatedT32(instr);
   22128                             return;
   22129                           }
   22130                           unsigned rd = (instr >> 8) & 0xf;
   22131                           unsigned rn = (instr >> 16) & 0xf;
   22132                           unsigned rm = instr & 0xf;
   22133                           unsigned ra = (instr >> 12) & 0xf;
   22134                           // SMLABT{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
   22135                           smlabt(CurrentCond(),
   22136                                  Register(rd),
   22137                                  Register(rn),
   22138                                  Register(rm),
   22139                                  Register(ra));
   22140                           break;
   22141                         }
   22142                       }
   22143                       break;
   22144                     }
   22145                     case 0x00000020: {
   22146                       // 0xfb100020
   22147                       switch (instr & 0x0000f000) {
   22148                         case 0x0000f000: {
   22149                           // 0xfb10f020
   22150                           unsigned rd = (instr >> 8) & 0xf;
   22151                           unsigned rn = (instr >> 16) & 0xf;
   22152                           unsigned rm = instr & 0xf;
   22153                           // SMULTB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
   22154                           smultb(CurrentCond(),
   22155                                  Register(rd),
   22156                                  Register(rn),
   22157                                  Register(rm));
   22158                           break;
   22159                         }
   22160                         default: {
   22161                           if (((instr & 0xf000) == 0xf000)) {
   22162                             UnallocatedT32(instr);
   22163                             return;
   22164                           }
   22165                           unsigned rd = (instr >> 8) & 0xf;
   22166                           unsigned rn = (instr >> 16) & 0xf;
   22167                           unsigned rm = instr & 0xf;
   22168                           unsigned ra = (instr >> 12) & 0xf;
   22169                           // SMLATB{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
   22170                           smlatb(CurrentCond(),
   22171                                  Register(rd),
   22172                                  Register(rn),
   22173                                  Register(rm),
   22174                                  Register(ra));
   22175                           break;
   22176                         }
   22177                       }
   22178                       break;
   22179                     }
   22180                     case 0x00000030: {
   22181                       // 0xfb100030
   22182                       switch (instr & 0x0000f000) {
   22183                         case 0x0000f000: {
   22184                           // 0xfb10f030
   22185                           unsigned rd = (instr >> 8) & 0xf;
   22186                           unsigned rn = (instr >> 16) & 0xf;
   22187                           unsigned rm = instr & 0xf;
   22188                           // SMULTT{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
   22189                           smultt(CurrentCond(),
   22190                                  Register(rd),
   22191                                  Register(rn),
   22192                                  Register(rm));
   22193                           break;
   22194                         }
   22195                         default: {
   22196                           if (((instr & 0xf000) == 0xf000)) {
   22197                             UnallocatedT32(instr);
   22198                             return;
   22199                           }
   22200                           unsigned rd = (instr >> 8) & 0xf;
   22201                           unsigned rn = (instr >> 16) & 0xf;
   22202                           unsigned rm = instr & 0xf;
   22203                           unsigned ra = (instr >> 12) & 0xf;
   22204                           // SMLATT{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
   22205                           smlatt(CurrentCond(),
   22206                                  Register(rd),
   22207                                  Register(rn),
   22208                                  Register(rm),
   22209                                  Register(ra));
   22210                           break;
   22211                         }
   22212                       }
   22213                       break;
   22214                     }
   22215                     case 0x00200000: {
   22216                       // 0xfb300000
   22217                       switch (instr & 0x0000f000) {
   22218                         case 0x0000f000: {
   22219                           // 0xfb30f000
   22220                           unsigned rd = (instr >> 8) & 0xf;
   22221                           unsigned rn = (instr >> 16) & 0xf;
   22222                           unsigned rm = instr & 0xf;
   22223                           // SMULWB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
   22224                           smulwb(CurrentCond(),
   22225                                  Register(rd),
   22226                                  Register(rn),
   22227                                  Register(rm));
   22228                           break;
   22229                         }
   22230                         default: {
   22231                           if (((instr & 0xf000) == 0xf000)) {
   22232                             UnallocatedT32(instr);
   22233                             return;
   22234                           }
   22235                           unsigned rd = (instr >> 8) & 0xf;
   22236                           unsigned rn = (instr >> 16) & 0xf;
   22237                           unsigned rm = instr & 0xf;
   22238                           unsigned ra = (instr >> 12) & 0xf;
   22239                           // SMLAWB{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
   22240                           smlawb(CurrentCond(),
   22241                                  Register(rd),
   22242                                  Register(rn),
   22243                                  Register(rm),
   22244                                  Register(ra));
   22245                           break;
   22246                         }
   22247                       }
   22248                       break;
   22249                     }
   22250                     case 0x00200010: {
   22251                       // 0xfb300010
   22252                       switch (instr & 0x0000f000) {
   22253                         case 0x0000f000: {
   22254                           // 0xfb30f010
   22255                           unsigned rd = (instr >> 8) & 0xf;
   22256                           unsigned rn = (instr >> 16) & 0xf;
   22257                           unsigned rm = instr & 0xf;
   22258                           // SMULWT{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
   22259                           smulwt(CurrentCond(),
   22260                                  Register(rd),
   22261                                  Register(rn),
   22262                                  Register(rm));
   22263                           break;
   22264                         }
   22265                         default: {
   22266                           if (((instr & 0xf000) == 0xf000)) {
   22267                             UnallocatedT32(instr);
   22268                             return;
   22269                           }
   22270                           unsigned rd = (instr >> 8) & 0xf;
   22271                           unsigned rn = (instr >> 16) & 0xf;
   22272                           unsigned rm = instr & 0xf;
   22273                           unsigned ra = (instr >> 12) & 0xf;
   22274                           // SMLAWT{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
   22275                           smlawt(CurrentCond(),
   22276                                  Register(rd),
   22277                                  Register(rn),
   22278                                  Register(rm),
   22279                                  Register(ra));
   22280                           break;
   22281                         }
   22282                       }
   22283                       break;
   22284                     }
   22285                     case 0x00400000: {
   22286                       // 0xfb500000
   22287                       switch (instr & 0x0000f000) {
   22288                         case 0x0000f000: {
   22289                           // 0xfb50f000
   22290                           unsigned rd = (instr >> 8) & 0xf;
   22291                           unsigned rn = (instr >> 16) & 0xf;
   22292                           unsigned rm = instr & 0xf;
   22293                           // SMMUL{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
   22294                           smmul(CurrentCond(),
   22295                                 Register(rd),
   22296                                 Register(rn),
   22297                                 Register(rm));
   22298                           break;
   22299                         }
   22300                         default: {
   22301                           if (((instr & 0xf000) == 0xf000)) {
   22302                             UnallocatedT32(instr);
   22303                             return;
   22304                           }
   22305                           unsigned rd = (instr >> 8) & 0xf;
   22306                           unsigned rn = (instr >> 16) & 0xf;
   22307                           unsigned rm = instr & 0xf;
   22308                           unsigned ra = (instr >> 12) & 0xf;
   22309                           // SMMLA{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
   22310                           smmla(CurrentCond(),
   22311                                 Register(rd),
   22312                                 Register(rn),
   22313                                 Register(rm),
   22314                                 Register(ra));
   22315                           break;
   22316                         }
   22317                       }
   22318                       break;
   22319                     }
   22320                     case 0x00400010: {
   22321                       // 0xfb500010
   22322                       switch (instr & 0x0000f000) {
   22323                         case 0x0000f000: {
   22324                           // 0xfb50f010
   22325                           unsigned rd = (instr >> 8) & 0xf;
   22326                           unsigned rn = (instr >> 16) & 0xf;
   22327                           unsigned rm = instr & 0xf;
   22328                           // SMMULR{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
   22329                           smmulr(CurrentCond(),
   22330                                  Register(rd),
   22331                                  Register(rn),
   22332                                  Register(rm));
   22333                           break;
   22334                         }
   22335                         default: {
   22336                           if (((instr & 0xf000) == 0xf000)) {
   22337                             UnallocatedT32(instr);
   22338                             return;
   22339                           }
   22340                           unsigned rd = (instr >> 8) & 0xf;
   22341                           unsigned rn = (instr >> 16) & 0xf;
   22342                           unsigned rm = instr & 0xf;
   22343                           unsigned ra = (instr >> 12) & 0xf;
   22344                           // SMMLAR{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
   22345                           smmlar(CurrentCond(),
   22346                                  Register(rd),
   22347                                  Register(rn),
   22348                                  Register(rm),
   22349                                  Register(ra));
   22350                           break;
   22351                         }
   22352                       }
   22353                       break;
   22354                     }
   22355                     case 0x00600000: {
   22356                       // 0xfb700000
   22357                       switch (instr & 0x0000f000) {
   22358                         case 0x0000f000: {
   22359                           // 0xfb70f000
   22360                           unsigned rd = (instr >> 8) & 0xf;
   22361                           unsigned rn = (instr >> 16) & 0xf;
   22362                           unsigned rm = instr & 0xf;
   22363                           // USAD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
   22364                           usad8(CurrentCond(),
   22365                                 Register(rd),
   22366                                 Register(rn),
   22367                                 Register(rm));
   22368                           break;
   22369                         }
   22370                         default: {
   22371                           if (((instr & 0xf000) == 0xf000)) {
   22372                             UnallocatedT32(instr);
   22373                             return;
   22374                           }
   22375                           unsigned rd = (instr >> 8) & 0xf;
   22376                           unsigned rn = (instr >> 16) & 0xf;
   22377                           unsigned rm = instr & 0xf;
   22378                           unsigned ra = (instr >> 12) & 0xf;
   22379                           // USADA8{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
   22380                           usada8(CurrentCond(),
   22381                                  Register(rd),
   22382                                  Register(rn),
   22383                                  Register(rm),
   22384                                  Register(ra));
   22385                           break;
   22386                         }
   22387                       }
   22388                       break;
   22389                     }
   22390                     default:
   22391                       UnallocatedT32(instr);
   22392                       break;
   22393                   }
   22394                   break;
   22395                 }
   22396                 case 0x11800000: {
   22397                   // 0xfb800000
   22398                   switch (instr & 0x006000f0) {
   22399                     case 0x00000000: {
   22400                       // 0xfb800000
   22401                       unsigned rdlo = (instr >> 12) & 0xf;
   22402                       unsigned rdhi = (instr >> 8) & 0xf;
   22403                       unsigned rn = (instr >> 16) & 0xf;
   22404                       unsigned rm = instr & 0xf;
   22405                       // SMULL{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; T1
   22406                       smull(CurrentCond(),
   22407                             Register(rdlo),
   22408                             Register(rdhi),
   22409                             Register(rn),
   22410                             Register(rm));
   22411                       break;
   22412                     }
   22413                     case 0x00200000: {
   22414                       // 0xfba00000
   22415                       unsigned rdlo = (instr >> 12) & 0xf;
   22416                       unsigned rdhi = (instr >> 8) & 0xf;
   22417                       unsigned rn = (instr >> 16) & 0xf;
   22418                       unsigned rm = instr & 0xf;
   22419                       // UMULL{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; T1
   22420                       umull(CurrentCond(),
   22421                             Register(rdlo),
   22422                             Register(rdhi),
   22423                             Register(rn),
   22424                             Register(rm));
   22425                       break;
   22426                     }
   22427                     case 0x00400000: {
   22428                       // 0xfbc00000
   22429                       unsigned rdlo = (instr >> 12) & 0xf;
   22430                       unsigned rdhi = (instr >> 8) & 0xf;
   22431                       unsigned rn = (instr >> 16) & 0xf;
   22432                       unsigned rm = instr & 0xf;
   22433                       // SMLAL{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; T1
   22434                       smlal(CurrentCond(),
   22435                             Register(rdlo),
   22436                             Register(rdhi),
   22437                             Register(rn),
   22438                             Register(rm));
   22439                       break;
   22440                     }
   22441                     case 0x00400080: {
   22442                       // 0xfbc00080
   22443                       unsigned rdlo = (instr >> 12) & 0xf;
   22444                       unsigned rdhi = (instr >> 8) & 0xf;
   22445                       unsigned rn = (instr >> 16) & 0xf;
   22446                       unsigned rm = instr & 0xf;
   22447                       // SMLALBB{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; T1
   22448                       smlalbb(CurrentCond(),
   22449                               Register(rdlo),
   22450                               Register(rdhi),
   22451                               Register(rn),
   22452                               Register(rm));
   22453                       break;
   22454                     }
   22455                     case 0x00400090: {
   22456                       // 0xfbc00090
   22457                       unsigned rdlo = (instr >> 12) & 0xf;
   22458                       unsigned rdhi = (instr >> 8) & 0xf;
   22459                       unsigned rn = (instr >> 16) & 0xf;
   22460                       unsigned rm = instr & 0xf;
   22461                       // SMLALBT{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; T1
   22462                       smlalbt(CurrentCond(),
   22463                               Register(rdlo),
   22464                               Register(rdhi),
   22465                               Register(rn),
   22466                               Register(rm));
   22467                       break;
   22468                     }
   22469                     case 0x004000a0: {
   22470                       // 0xfbc000a0
   22471                       unsigned rdlo = (instr >> 12) & 0xf;
   22472                       unsigned rdhi = (instr >> 8) & 0xf;
   22473                       unsigned rn = (instr >> 16) & 0xf;
   22474                       unsigned rm = instr & 0xf;
   22475                       // SMLALTB{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; T1
   22476                       smlaltb(CurrentCond(),
   22477                               Register(rdlo),
   22478                               Register(rdhi),
   22479                               Register(rn),
   22480                               Register(rm));
   22481                       break;
   22482                     }
   22483                     case 0x004000b0: {
   22484                       // 0xfbc000b0
   22485                       unsigned rdlo = (instr >> 12) & 0xf;
   22486                       unsigned rdhi = (instr >> 8) & 0xf;
   22487                       unsigned rn = (instr >> 16) & 0xf;
   22488                       unsigned rm = instr & 0xf;
   22489                       // SMLALTT{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; T1
   22490                       smlaltt(CurrentCond(),
   22491                               Register(rdlo),
   22492                               Register(rdhi),
   22493                               Register(rn),
   22494                               Register(rm));
   22495                       break;
   22496                     }
   22497                     case 0x004000c0: {
   22498                       // 0xfbc000c0
   22499                       unsigned rdlo = (instr >> 12) & 0xf;
   22500                       unsigned rdhi = (instr >> 8) & 0xf;
   22501                       unsigned rn = (instr >> 16) & 0xf;
   22502                       unsigned rm = instr & 0xf;
   22503                       // SMLALD{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; T1
   22504                       smlald(CurrentCond(),
   22505                              Register(rdlo),
   22506                              Register(rdhi),
   22507                              Register(rn),
   22508                              Register(rm));
   22509                       break;
   22510                     }
   22511                     case 0x004000d0: {
   22512                       // 0xfbc000d0
   22513                       unsigned rdlo = (instr >> 12) & 0xf;
   22514                       unsigned rdhi = (instr >> 8) & 0xf;
   22515                       unsigned rn = (instr >> 16) & 0xf;
   22516                       unsigned rm = instr & 0xf;
   22517                       // SMLALDX{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; T1
   22518                       smlaldx(CurrentCond(),
   22519                               Register(rdlo),
   22520                               Register(rdhi),
   22521                               Register(rn),
   22522                               Register(rm));
   22523                       break;
   22524                     }
   22525                     case 0x00600000: {
   22526                       // 0xfbe00000
   22527                       unsigned rdlo = (instr >> 12) & 0xf;
   22528                       unsigned rdhi = (instr >> 8) & 0xf;
   22529                       unsigned rn = (instr >> 16) & 0xf;
   22530                       unsigned rm = instr & 0xf;
   22531                       // UMLAL{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; T1
   22532                       umlal(CurrentCond(),
   22533                             Register(rdlo),
   22534                             Register(rdhi),
   22535                             Register(rn),
   22536                             Register(rm));
   22537                       break;
   22538                     }
   22539                     case 0x00600060: {
   22540                       // 0xfbe00060
   22541                       unsigned rdlo = (instr >> 12) & 0xf;
   22542                       unsigned rdhi = (instr >> 8) & 0xf;
   22543                       unsigned rn = (instr >> 16) & 0xf;
   22544                       unsigned rm = instr & 0xf;
   22545                       // UMAAL{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; T1
   22546                       umaal(CurrentCond(),
   22547                             Register(rdlo),
   22548                             Register(rdhi),
   22549                             Register(rn),
   22550                             Register(rm));
   22551                       break;
   22552                     }
   22553                     default:
   22554                       UnallocatedT32(instr);
   22555                       break;
   22556                   }
   22557                   break;
   22558                 }
   22559                 case 0x11900000: {
   22560                   // 0xfb900000
   22561                   switch (instr & 0x006000f0) {
   22562                     case 0x000000f0: {
   22563                       // 0xfb9000f0
   22564                       unsigned rd = (instr >> 8) & 0xf;
   22565                       unsigned rn = (instr >> 16) & 0xf;
   22566                       unsigned rm = instr & 0xf;
   22567                       // SDIV{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
   22568                       sdiv(CurrentCond(),
   22569                            Register(rd),
   22570                            Register(rn),
   22571                            Register(rm));
   22572                       if (((instr & 0xfff0f0f0) != 0xfb90f0f0)) {
   22573                         UnpredictableT32(instr);
   22574                       }
   22575                       break;
   22576                     }
   22577                     case 0x002000f0: {
   22578                       // 0xfbb000f0
   22579                       unsigned rd = (instr >> 8) & 0xf;
   22580                       unsigned rn = (instr >> 16) & 0xf;
   22581                       unsigned rm = instr & 0xf;
   22582                       // UDIV{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
   22583                       udiv(CurrentCond(),
   22584                            Register(rd),
   22585                            Register(rn),
   22586                            Register(rm));
   22587                       if (((instr & 0xfff0f0f0) != 0xfbb0f0f0)) {
   22588                         UnpredictableT32(instr);
   22589                       }
   22590                       break;
   22591                     }
   22592                     case 0x004000c0: {
   22593                       // 0xfbd000c0
   22594                       unsigned rdlo = (instr >> 12) & 0xf;
   22595                       unsigned rdhi = (instr >> 8) & 0xf;
   22596                       unsigned rn = (instr >> 16) & 0xf;
   22597                       unsigned rm = instr & 0xf;
   22598                       // SMLSLD{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; T1
   22599                       smlsld(CurrentCond(),
   22600                              Register(rdlo),
   22601                              Register(rdhi),
   22602                              Register(rn),
   22603                              Register(rm));
   22604                       break;
   22605                     }
   22606                     case 0x004000d0: {
   22607                       // 0xfbd000d0
   22608                       unsigned rdlo = (instr >> 12) & 0xf;
   22609                       unsigned rdhi = (instr >> 8) & 0xf;
   22610                       unsigned rn = (instr >> 16) & 0xf;
   22611                       unsigned rm = instr & 0xf;
   22612                       // SMLSLDX{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; T1
   22613                       smlsldx(CurrentCond(),
   22614                               Register(rdlo),
   22615                               Register(rdhi),
   22616                               Register(rn),
   22617                               Register(rm));
   22618                       break;
   22619                     }
   22620                     default:
   22621                       UnallocatedT32(instr);
   22622                       break;
   22623                   }
   22624                   break;
   22625                 }
   22626               }
   22627               break;
   22628             }
   22629             case 0x04000000: {
   22630               // 0xec000000
   22631               switch (instr & 0x11100000) {
   22632                 case 0x00000000: {
   22633                   // 0xec000000
   22634                   switch (instr & 0x00000e00) {
   22635                     case 0x00000a00: {
   22636                       // 0xec000a00
   22637                       switch (instr & 0x00800100) {
   22638                         case 0x00000000: {
   22639                           // 0xec000a00
   22640                           if ((instr & 0x006000d0) == 0x00400010) {
   22641                             unsigned rm = ExtractSRegister(instr, 5, 0);
   22642                             unsigned rt = (instr >> 12) & 0xf;
   22643                             unsigned rt2 = (instr >> 16) & 0xf;
   22644                             // VMOV{<c>}{<q>} <Sm>, <Sm1>, <Rt>, <Rt2> ; T1
   22645                             vmov(CurrentCond(),
   22646                                  SRegister(rm),
   22647                                  SRegister(rm + 1),
   22648                                  Register(rt),
   22649                                  Register(rt2));
   22650                           } else {
   22651                             UnallocatedT32(instr);
   22652                           }
   22653                           break;
   22654                         }
   22655                         case 0x00000100: {
   22656                           // 0xec000b00
   22657                           if ((instr & 0x006000d0) == 0x00400010) {
   22658                             unsigned rm = ExtractDRegister(instr, 5, 0);
   22659                             unsigned rt = (instr >> 12) & 0xf;
   22660                             unsigned rt2 = (instr >> 16) & 0xf;
   22661                             // VMOV{<c>}{<q>} <Dm>, <Rt>, <Rt2> ; T1
   22662                             vmov(CurrentCond(),
   22663                                  DRegister(rm),
   22664                                  Register(rt),
   22665                                  Register(rt2));
   22666                           } else {
   22667                             UnallocatedT32(instr);
   22668                           }
   22669                           break;
   22670                         }
   22671                         case 0x00800000: {
   22672                           // 0xec800a00
   22673                           unsigned rn = (instr >> 16) & 0xf;
   22674                           WriteBack write_back((instr >> 21) & 0x1);
   22675                           unsigned first = ExtractSRegister(instr, 22, 12);
   22676                           unsigned len = instr & 0xff;
   22677                           // VSTM{<c>}{<q>}{.<size>} <Rn>{!}, <sreglist> ; T2
   22678                           vstm(CurrentCond(),
   22679                                kDataTypeValueNone,
   22680                                Register(rn),
   22681                                write_back,
   22682                                SRegisterList(SRegister(first), len));
   22683                           if ((len == 0) ||
   22684                               ((first + len) > kNumberOfSRegisters)) {
   22685                             UnpredictableT32(instr);
   22686                           }
   22687                           break;
   22688                         }
   22689                         case 0x00800100: {
   22690                           // 0xec800b00
   22691                           switch (instr & 0x00000001) {
   22692                             case 0x00000000: {
   22693                               // 0xec800b00
   22694                               unsigned rn = (instr >> 16) & 0xf;
   22695                               WriteBack write_back((instr >> 21) & 0x1);
   22696                               unsigned first = ExtractDRegister(instr, 22, 12);
   22697                               unsigned imm8 = (instr & 0xff);
   22698                               unsigned len = imm8 / 2;
   22699                               unsigned end = first + len;
   22700                               // VSTM{<c>}{<q>}{.<size>} <Rn>{!}, <dreglist> ; T1 NOLINT(whitespace/line_length)
   22701                               vstm(CurrentCond(),
   22702                                    kDataTypeValueNone,
   22703                                    Register(rn),
   22704                                    write_back,
   22705                                    DRegisterList(DRegister(first), len));
   22706                               if ((len == 0) || (len > 16) ||
   22707                                   (end > kMaxNumberOfDRegisters)) {
   22708                                 UnpredictableT32(instr);
   22709                               }
   22710                               break;
   22711                             }
   22712                             case 0x00000001: {
   22713                               // 0xec800b01
   22714                               unsigned rn = (instr >> 16) & 0xf;
   22715                               WriteBack write_back((instr >> 21) & 0x1);
   22716                               unsigned first = ExtractDRegister(instr, 22, 12);
   22717                               unsigned imm8 = (instr & 0xff);
   22718                               unsigned len = imm8 / 2;
   22719                               unsigned end = first + len;
   22720                               // FSTMIAX{<c>}{<q>} <Rn>{!}, <dreglist> ; T1
   22721                               fstmiax(CurrentCond(),
   22722                                       Register(rn),
   22723                                       write_back,
   22724                                       DRegisterList(DRegister(first), len));
   22725                               if ((len == 0) || (len > 16) || (end > 16)) {
   22726                                 UnpredictableT32(instr);
   22727                               }
   22728                               break;
   22729                             }
   22730                           }
   22731                           break;
   22732                         }
   22733                       }
   22734                       break;
   22735                     }
   22736                     default: {
   22737                       switch (instr & 0x00200000) {
   22738                         case 0x00000000: {
   22739                           // 0xec000000
   22740                           switch (instr & 0x00800000) {
   22741                             case 0x00000000: {
   22742                               // 0xec000000
   22743                               if ((instr & 0x00400000) == 0x00400000) {
   22744                                 if (((instr & 0xe00) == 0xa00)) {
   22745                                   UnallocatedT32(instr);
   22746                                   return;
   22747                                 }
   22748                                 UnimplementedT32_32("MCRR", instr);
   22749                               } else {
   22750                                 UnallocatedT32(instr);
   22751                               }
   22752                               break;
   22753                             }
   22754                             case 0x00800000: {
   22755                               // 0xec800000
   22756                               if (((instr & 0xe00) == 0xa00)) {
   22757                                 UnallocatedT32(instr);
   22758                                 return;
   22759                               }
   22760                               UnimplementedT32_32("STC", instr);
   22761                               break;
   22762                             }
   22763                           }
   22764                           break;
   22765                         }
   22766                         case 0x00200000: {
   22767                           // 0xec200000
   22768                           if (((instr & 0xe00) == 0xa00)) {
   22769                             UnallocatedT32(instr);
   22770                             return;
   22771                           }
   22772                           UnimplementedT32_32("STC", instr);
   22773                           break;
   22774                         }
   22775                       }
   22776                       break;
   22777                     }
   22778                   }
   22779                   break;
   22780                 }
   22781                 case 0x00100000: {
   22782                   // 0xec100000
   22783                   switch (instr & 0x00000e00) {
   22784                     case 0x00000a00: {
   22785                       // 0xec100a00
   22786                       switch (instr & 0x00800100) {
   22787                         case 0x00000000: {
   22788                           // 0xec100a00
   22789                           if ((instr & 0x006000d0) == 0x00400010) {
   22790                             unsigned rt = (instr >> 12) & 0xf;
   22791                             unsigned rt2 = (instr >> 16) & 0xf;
   22792                             unsigned rm = ExtractSRegister(instr, 5, 0);
   22793                             // VMOV{<c>}{<q>} <Rt>, <Rt2>, <Sm>, <Sm1> ; T1
   22794                             vmov(CurrentCond(),
   22795                                  Register(rt),
   22796                                  Register(rt2),
   22797                                  SRegister(rm),
   22798                                  SRegister(rm + 1));
   22799                           } else {
   22800                             UnallocatedT32(instr);
   22801                           }
   22802                           break;
   22803                         }
   22804                         case 0x00000100: {
   22805                           // 0xec100b00
   22806                           if ((instr & 0x006000d0) == 0x00400010) {
   22807                             unsigned rt = (instr >> 12) & 0xf;
   22808                             unsigned rt2 = (instr >> 16) & 0xf;
   22809                             unsigned rm = ExtractDRegister(instr, 5, 0);
   22810                             // VMOV{<c>}{<q>} <Rt>, <Rt2>, <Dm> ; T1
   22811                             vmov(CurrentCond(),
   22812                                  Register(rt),
   22813                                  Register(rt2),
   22814                                  DRegister(rm));
   22815                           } else {
   22816                             UnallocatedT32(instr);
   22817                           }
   22818                           break;
   22819                         }
   22820                         case 0x00800000: {
   22821                           // 0xec900a00
   22822                           if (((Uint32((instr >> 21)) & Uint32(0x1)) ==
   22823                                Uint32(0x1)) &&
   22824                               ((Uint32((instr >> 16)) & Uint32(0xf)) ==
   22825                                Uint32(0xd))) {
   22826                             unsigned first = ExtractSRegister(instr, 22, 12);
   22827                             unsigned len = instr & 0xff;
   22828                             // VPOP{<c>}{<q>}{.<size>} <sreglist> ; T2
   22829                             vpop(CurrentCond(),
   22830                                  kDataTypeValueNone,
   22831                                  SRegisterList(SRegister(first), len));
   22832                             if ((len == 0) ||
   22833                                 ((first + len) > kNumberOfSRegisters)) {
   22834                               UnpredictableT32(instr);
   22835                             }
   22836                             return;
   22837                           }
   22838                           unsigned rn = (instr >> 16) & 0xf;
   22839                           WriteBack write_back((instr >> 21) & 0x1);
   22840                           unsigned first = ExtractSRegister(instr, 22, 12);
   22841                           unsigned len = instr & 0xff;
   22842                           // VLDM{<c>}{<q>}{.<size>} <Rn>{!}, <sreglist> ; T2
   22843                           vldm(CurrentCond(),
   22844                                kDataTypeValueNone,
   22845                                Register(rn),
   22846                                write_back,
   22847                                SRegisterList(SRegister(first), len));
   22848                           if ((len == 0) ||
   22849                               ((first + len) > kNumberOfSRegisters)) {
   22850                             UnpredictableT32(instr);
   22851                           }
   22852                           break;
   22853                         }
   22854                         case 0x00800100: {
   22855                           // 0xec900b00
   22856                           switch (instr & 0x00000001) {
   22857                             case 0x00000000: {
   22858                               // 0xec900b00
   22859                               if (((Uint32((instr >> 21)) & Uint32(0x1)) ==
   22860                                    Uint32(0x1)) &&
   22861                                   ((Uint32((instr >> 16)) & Uint32(0xf)) ==
   22862                                    Uint32(0xd))) {
   22863                                 unsigned first =
   22864                                     ExtractDRegister(instr, 22, 12);
   22865                                 unsigned imm8 = (instr & 0xff);
   22866                                 unsigned len = imm8 / 2;
   22867                                 unsigned end = first + len;
   22868                                 // VPOP{<c>}{<q>}{.<size>} <dreglist> ; T1
   22869                                 vpop(CurrentCond(),
   22870                                      kDataTypeValueNone,
   22871                                      DRegisterList(DRegister(first), len));
   22872                                 if ((len == 0) || (len > 16) ||
   22873                                     (end > kMaxNumberOfDRegisters)) {
   22874                                   UnpredictableT32(instr);
   22875                                 }
   22876                                 return;
   22877                               }
   22878                               unsigned rn = (instr >> 16) & 0xf;
   22879                               WriteBack write_back((instr >> 21) & 0x1);
   22880                               unsigned first = ExtractDRegister(instr, 22, 12);
   22881                               unsigned imm8 = (instr & 0xff);
   22882                               unsigned len = imm8 / 2;
   22883                               unsigned end = first + len;
   22884                               // VLDM{<c>}{<q>}{.<size>} <Rn>{!}, <dreglist> ; T1 NOLINT(whitespace/line_length)
   22885                               vldm(CurrentCond(),
   22886                                    kDataTypeValueNone,
   22887                                    Register(rn),
   22888                                    write_back,
   22889                                    DRegisterList(DRegister(first), len));
   22890                               if ((len == 0) || (len > 16) ||
   22891                                   (end > kMaxNumberOfDRegisters)) {
   22892                                 UnpredictableT32(instr);
   22893                               }
   22894                               break;
   22895                             }
   22896                             case 0x00000001: {
   22897                               // 0xec900b01
   22898                               unsigned rn = (instr >> 16) & 0xf;
   22899                               WriteBack write_back((instr >> 21) & 0x1);
   22900                               unsigned first = ExtractDRegister(instr, 22, 12);
   22901                               unsigned imm8 = (instr & 0xff);
   22902                               unsigned len = imm8 / 2;
   22903                               unsigned end = first + len;
   22904                               // FLDMIAX{<c>}{<q>} <Rn>{!}, <dreglist> ; T1
   22905                               fldmiax(CurrentCond(),
   22906                                       Register(rn),
   22907                                       write_back,
   22908                                       DRegisterList(DRegister(first), len));
   22909                               if ((len == 0) || (len > 16) || (end > 16)) {
   22910                                 UnpredictableT32(instr);
   22911                               }
   22912                               break;
   22913                             }
   22914                           }
   22915                           break;
   22916                         }
   22917                       }
   22918                       break;
   22919                     }
   22920                     default: {
   22921                       switch (instr & 0x00200000) {
   22922                         case 0x00000000: {
   22923                           // 0xec100000
   22924                           switch (instr & 0x00800000) {
   22925                             case 0x00000000: {
   22926                               // 0xec100000
   22927                               if ((instr & 0x00400000) == 0x00400000) {
   22928                                 if (((instr & 0xe00) == 0xa00)) {
   22929                                   UnallocatedT32(instr);
   22930                                   return;
   22931                                 }
   22932                                 UnimplementedT32_32("MRRC", instr);
   22933                               } else {
   22934                                 UnallocatedT32(instr);
   22935                               }
   22936                               break;
   22937                             }
   22938                             case 0x00800000: {
   22939                               // 0xec900000
   22940                               if (((instr & 0xf0000) == 0xf0000) ||
   22941                                   ((instr & 0xe00) == 0xa00)) {
   22942                                 UnallocatedT32(instr);
   22943                                 return;
   22944                               }
   22945                               UnimplementedT32_32("LDC", instr);
   22946                               break;
   22947                             }
   22948                           }
   22949                           break;
   22950                         }
   22951                         case 0x00200000: {
   22952                           // 0xec300000
   22953                           if (((instr & 0xf0000) == 0xf0000) ||
   22954                               ((instr & 0xe00) == 0xa00)) {
   22955                             UnallocatedT32(instr);
   22956                             return;
   22957                           }
   22958                           UnimplementedT32_32("LDC", instr);
   22959                           break;
   22960                         }
   22961                       }
   22962                       break;
   22963                     }
   22964                   }
   22965                   break;
   22966                 }
   22967                 case 0x01000000: {
   22968                   // 0xed000000
   22969                   switch (instr & 0x00200000) {
   22970                     case 0x00000000: {
   22971                       // 0xed000000
   22972                       switch (instr & 0x00000e00) {
   22973                         case 0x00000a00: {
   22974                           // 0xed000a00
   22975                           switch (instr & 0x00000100) {
   22976                             case 0x00000000: {
   22977                               // 0xed000a00
   22978                               unsigned rd = ExtractSRegister(instr, 22, 12);
   22979                               unsigned rn = (instr >> 16) & 0xf;
   22980                               Sign sign((((instr >> 23) & 0x1) == 0) ? minus
   22981                                                                      : plus);
   22982                               int32_t offset = (instr & 0xff) << 2;
   22983                               // VSTR{<c>}{<q>}{.32} <Sd>, [<Rn>{, #{+/-}<imm>}] ; T2 NOLINT(whitespace/line_length)
   22984                               vstr(CurrentCond(),
   22985                                    Untyped32,
   22986                                    SRegister(rd),
   22987                                    MemOperand(Register(rn),
   22988                                               sign,
   22989                                               offset,
   22990                                               Offset));
   22991                               break;
   22992                             }
   22993                             case 0x00000100: {
   22994                               // 0xed000b00
   22995                               unsigned rd = ExtractDRegister(instr, 22, 12);
   22996                               unsigned rn = (instr >> 16) & 0xf;
   22997                               Sign sign((((instr >> 23) & 0x1) == 0) ? minus
   22998                                                                      : plus);
   22999                               int32_t offset = (instr & 0xff) << 2;
   23000                               // VSTR{<c>}{<q>}{.64} <Dd>, [<Rn>{, #{+/-}<imm>}] ; T1 NOLINT(whitespace/line_length)
   23001                               vstr(CurrentCond(),
   23002                                    Untyped64,
   23003                                    DRegister(rd),
   23004                                    MemOperand(Register(rn),
   23005                                               sign,
   23006                                               offset,
   23007                                               Offset));
   23008                               break;
   23009                             }
   23010                           }
   23011                           break;
   23012                         }
   23013                         default: {
   23014                           if (((instr & 0xe00) == 0xa00)) {
   23015                             UnallocatedT32(instr);
   23016                             return;
   23017                           }
   23018                           UnimplementedT32_32("STC", instr);
   23019                           break;
   23020                         }
   23021                       }
   23022                       break;
   23023                     }
   23024                     case 0x00200000: {
   23025                       // 0xed200000
   23026                       switch (instr & 0x00000e00) {
   23027                         case 0x00000a00: {
   23028                           // 0xed200a00
   23029                           switch (instr & 0x00800100) {
   23030                             case 0x00000000: {
   23031                               // 0xed200a00
   23032                               if (((Uint32((instr >> 16)) & Uint32(0xf)) ==
   23033                                    Uint32(0xd))) {
   23034                                 unsigned first =
   23035                                     ExtractSRegister(instr, 22, 12);
   23036                                 unsigned len = instr & 0xff;
   23037                                 // VPUSH{<c>}{<q>}{.<size>} <sreglist> ; T2
   23038                                 vpush(CurrentCond(),
   23039                                       kDataTypeValueNone,
   23040                                       SRegisterList(SRegister(first), len));
   23041                                 if ((len == 0) ||
   23042                                     ((first + len) > kNumberOfSRegisters)) {
   23043                                   UnpredictableT32(instr);
   23044                                 }
   23045                                 return;
   23046                               }
   23047                               unsigned rn = (instr >> 16) & 0xf;
   23048                               unsigned first = ExtractSRegister(instr, 22, 12);
   23049                               unsigned len = instr & 0xff;
   23050                               // VSTMDB{<c>}{<q>}{.<size>} <Rn>!, <sreglist> ; T2 NOLINT(whitespace/line_length)
   23051                               vstmdb(CurrentCond(),
   23052                                      kDataTypeValueNone,
   23053                                      Register(rn),
   23054                                      WriteBack(WRITE_BACK),
   23055                                      SRegisterList(SRegister(first), len));
   23056                               if ((len == 0) ||
   23057                                   ((first + len) > kNumberOfSRegisters)) {
   23058                                 UnpredictableT32(instr);
   23059                               }
   23060                               break;
   23061                             }
   23062                             case 0x00000100: {
   23063                               // 0xed200b00
   23064                               switch (instr & 0x00000001) {
   23065                                 case 0x00000000: {
   23066                                   // 0xed200b00
   23067                                   if (((Uint32((instr >> 16)) & Uint32(0xf)) ==
   23068                                        Uint32(0xd))) {
   23069                                     unsigned first =
   23070                                         ExtractDRegister(instr, 22, 12);
   23071                                     unsigned imm8 = (instr & 0xff);
   23072                                     unsigned len = imm8 / 2;
   23073                                     unsigned end = first + len;
   23074                                     // VPUSH{<c>}{<q>}{.<size>} <dreglist> ; T1
   23075                                     vpush(CurrentCond(),
   23076                                           kDataTypeValueNone,
   23077                                           DRegisterList(DRegister(first), len));
   23078                                     if ((len == 0) || (len > 16) ||
   23079                                         (end > kMaxNumberOfDRegisters)) {
   23080                                       UnpredictableT32(instr);
   23081                                     }
   23082                                     return;
   23083                                   }
   23084                                   unsigned rn = (instr >> 16) & 0xf;
   23085                                   unsigned first =
   23086                                       ExtractDRegister(instr, 22, 12);
   23087                                   unsigned imm8 = (instr & 0xff);
   23088                                   unsigned len = imm8 / 2;
   23089                                   unsigned end = first + len;
   23090                                   // VSTMDB{<c>}{<q>}{.<size>} <Rn>!, <dreglist> ; T1 NOLINT(whitespace/line_length)
   23091                                   vstmdb(CurrentCond(),
   23092                                          kDataTypeValueNone,
   23093                                          Register(rn),
   23094                                          WriteBack(WRITE_BACK),
   23095                                          DRegisterList(DRegister(first), len));
   23096                                   if ((len == 0) || (len > 16) ||
   23097                                       (end > kMaxNumberOfDRegisters)) {
   23098                                     UnpredictableT32(instr);
   23099                                   }
   23100                                   break;
   23101                                 }
   23102                                 case 0x00000001: {
   23103                                   // 0xed200b01
   23104                                   unsigned rn = (instr >> 16) & 0xf;
   23105                                   unsigned first =
   23106                                       ExtractDRegister(instr, 22, 12);
   23107                                   unsigned imm8 = (instr & 0xff);
   23108                                   unsigned len = imm8 / 2;
   23109                                   unsigned end = first + len;
   23110                                   // FSTMDBX{<c>}{<q>} <Rn>!, <dreglist> ; T1
   23111                                   fstmdbx(CurrentCond(),
   23112                                           Register(rn),
   23113                                           WriteBack(WRITE_BACK),
   23114                                           DRegisterList(DRegister(first), len));
   23115                                   if ((len == 0) || (len > 16) || (end > 16)) {
   23116                                     UnpredictableT32(instr);
   23117                                   }
   23118                                   break;
   23119                                 }
   23120                               }
   23121                               break;
   23122                             }
   23123                             default:
   23124                               UnallocatedT32(instr);
   23125                               break;
   23126                           }
   23127                           break;
   23128                         }
   23129                         default: {
   23130                           if (((instr & 0xe00) == 0xa00)) {
   23131                             UnallocatedT32(instr);
   23132                             return;
   23133                           }
   23134                           UnimplementedT32_32("STC", instr);
   23135                           break;
   23136                         }
   23137                       }
   23138                       break;
   23139                     }
   23140                   }
   23141                   break;
   23142                 }
   23143                 case 0x01100000: {
   23144                   // 0xed100000
   23145                   switch (instr & 0x00200000) {
   23146                     case 0x00000000: {
   23147                       // 0xed100000
   23148                       switch (instr & 0x000f0000) {
   23149                         case 0x000f0000: {
   23150                           // 0xed1f0000
   23151                           switch (instr & 0x00000e00) {
   23152                             case 0x00000a00: {
   23153                               // 0xed1f0a00
   23154                               switch (instr & 0x00000100) {
   23155                                 case 0x00000000: {
   23156                                   // 0xed1f0a00
   23157                                   unsigned rd = ExtractSRegister(instr, 22, 12);
   23158                                   uint32_t U = (instr >> 23) & 0x1;
   23159                                   int32_t imm = instr & 0xff;
   23160                                   imm <<= 2;
   23161                                   if (U == 0) imm = -imm;
   23162                                   bool minus_zero = (imm == 0) && (U == 0);
   23163                                   Location location(imm, kT32PcDelta);
   23164                                   // VLDR{<c>}{<q>}{.32} <Sd>, <label> ; T2
   23165                                   if (minus_zero) {
   23166                                     vldr(CurrentCond(),
   23167                                          Untyped32,
   23168                                          SRegister(rd),
   23169                                          MemOperand(pc, minus, 0));
   23170                                   } else {
   23171                                     vldr(CurrentCond(),
   23172                                          Untyped32,
   23173                                          SRegister(rd),
   23174                                          &location);
   23175                                   }
   23176                                   break;
   23177                                 }
   23178                                 case 0x00000100: {
   23179                                   // 0xed1f0b00
   23180                                   unsigned rd = ExtractDRegister(instr, 22, 12);
   23181                                   uint32_t U = (instr >> 23) & 0x1;
   23182                                   int32_t imm = instr & 0xff;
   23183                                   imm <<= 2;
   23184                                   if (U == 0) imm = -imm;
   23185                                   bool minus_zero = (imm == 0) && (U == 0);
   23186                                   Location location(imm, kT32PcDelta);
   23187                                   // VLDR{<c>}{<q>}{.64} <Dd>, <label> ; T1
   23188                                   if (minus_zero) {
   23189                                     vldr(CurrentCond(),
   23190                                          Untyped64,
   23191                                          DRegister(rd),
   23192                                          MemOperand(pc, minus, 0));
   23193                                   } else {
   23194                                     vldr(CurrentCond(),
   23195                                          Untyped64,
   23196                                          DRegister(rd),
   23197                                          &location);
   23198                                   }
   23199                                   break;
   23200                                 }
   23201                               }
   23202                               break;
   23203                             }
   23204                             default: {
   23205                               if (((instr & 0xe00) == 0xa00)) {
   23206                                 UnallocatedT32(instr);
   23207                                 return;
   23208                               }
   23209                               UnimplementedT32_32("LDC", instr);
   23210                               break;
   23211                             }
   23212                           }
   23213                           break;
   23214                         }
   23215                         default: {
   23216                           switch (instr & 0x00000e00) {
   23217                             case 0x00000a00: {
   23218                               // 0xed100a00
   23219                               switch (instr & 0x00000100) {
   23220                                 case 0x00000000: {
   23221                                   // 0xed100a00
   23222                                   if (((instr & 0xf0000) == 0xf0000)) {
   23223                                     UnallocatedT32(instr);
   23224                                     return;
   23225                                   }
   23226                                   unsigned rd = ExtractSRegister(instr, 22, 12);
   23227                                   unsigned rn = (instr >> 16) & 0xf;
   23228                                   Sign sign((((instr >> 23) & 0x1) == 0)
   23229                                                 ? minus
   23230                                                 : plus);
   23231                                   int32_t offset = (instr & 0xff) << 2;
   23232                                   // VLDR{<c>}{<q>}{.32} <Sd>, [<Rn>{, #{+/-}<imm>}] ; T2 NOLINT(whitespace/line_length)
   23233                                   vldr(CurrentCond(),
   23234                                        Untyped32,
   23235                                        SRegister(rd),
   23236                                        MemOperand(Register(rn),
   23237                                                   sign,
   23238                                                   offset,
   23239                                                   Offset));
   23240                                   break;
   23241                                 }
   23242                                 case 0x00000100: {
   23243                                   // 0xed100b00
   23244                                   if (((instr & 0xf0000) == 0xf0000)) {
   23245                                     UnallocatedT32(instr);
   23246                                     return;
   23247                                   }
   23248                                   unsigned rd = ExtractDRegister(instr, 22, 12);
   23249                                   unsigned rn = (instr >> 16) & 0xf;
   23250                                   Sign sign((((instr >> 23) & 0x1) == 0)
   23251                                                 ? minus
   23252                                                 : plus);
   23253                                   int32_t offset = (instr & 0xff) << 2;
   23254                                   // VLDR{<c>}{<q>}{.64} <Dd>, [<Rn>{, #{+/-}<imm>}] ; T1 NOLINT(whitespace/line_length)
   23255                                   vldr(CurrentCond(),
   23256                                        Untyped64,
   23257                                        DRegister(rd),
   23258                                        MemOperand(Register(rn),
   23259                                                   sign,
   23260                                                   offset,
   23261                                                   Offset));
   23262                                   break;
   23263                                 }
   23264                               }
   23265                               break;
   23266                             }
   23267                             default: {
   23268                               if (((instr & 0xf0000) == 0xf0000) ||
   23269                                   ((instr & 0xe00) == 0xa00)) {
   23270                                 UnallocatedT32(instr);
   23271                                 return;
   23272                               }
   23273                               UnimplementedT32_32("LDC", instr);
   23274                               break;
   23275                             }
   23276                           }
   23277                           break;
   23278                         }
   23279                       }
   23280                       break;
   23281                     }
   23282                     case 0x00200000: {
   23283                       // 0xed300000
   23284                       switch (instr & 0x00000e00) {
   23285                         case 0x00000a00: {
   23286                           // 0xed300a00
   23287                           switch (instr & 0x00800100) {
   23288                             case 0x00000000: {
   23289                               // 0xed300a00
   23290                               unsigned rn = (instr >> 16) & 0xf;
   23291                               unsigned first = ExtractSRegister(instr, 22, 12);
   23292                               unsigned len = instr & 0xff;
   23293                               // VLDMDB{<c>}{<q>}{.<size>} <Rn>!, <sreglist> ; T2 NOLINT(whitespace/line_length)
   23294                               vldmdb(CurrentCond(),
   23295                                      kDataTypeValueNone,
   23296                                      Register(rn),
   23297                                      WriteBack(WRITE_BACK),
   23298                                      SRegisterList(SRegister(first), len));
   23299                               if ((len == 0) ||
   23300                                   ((first + len) > kNumberOfSRegisters)) {
   23301                                 UnpredictableT32(instr);
   23302                               }
   23303                               break;
   23304                             }
   23305                             case 0x00000100: {
   23306                               // 0xed300b00
   23307                               switch (instr & 0x00000001) {
   23308                                 case 0x00000000: {
   23309                                   // 0xed300b00
   23310                                   unsigned rn = (instr >> 16) & 0xf;
   23311                                   unsigned first =
   23312                                       ExtractDRegister(instr, 22, 12);
   23313                                   unsigned imm8 = (instr & 0xff);
   23314                                   unsigned len = imm8 / 2;
   23315                                   unsigned end = first + len;
   23316                                   // VLDMDB{<c>}{<q>}{.<size>} <Rn>!, <dreglist> ; T1 NOLINT(whitespace/line_length)
   23317                                   vldmdb(CurrentCond(),
   23318                                          kDataTypeValueNone,
   23319                                          Register(rn),
   23320                                          WriteBack(WRITE_BACK),
   23321                                          DRegisterList(DRegister(first), len));
   23322                                   if ((len == 0) || (len > 16) ||
   23323                                       (end > kMaxNumberOfDRegisters)) {
   23324                                     UnpredictableT32(instr);
   23325                                   }
   23326                                   break;
   23327                                 }
   23328                                 case 0x00000001: {
   23329                                   // 0xed300b01
   23330                                   unsigned rn = (instr >> 16) & 0xf;
   23331                                   unsigned first =
   23332                                       ExtractDRegister(instr, 22, 12);
   23333                                   unsigned imm8 = (instr & 0xff);
   23334                                   unsigned len = imm8 / 2;
   23335                                   unsigned end = first + len;
   23336                                   // FLDMDBX{<c>}{<q>} <Rn>!, <dreglist> ; T1
   23337                                   fldmdbx(CurrentCond(),
   23338                                           Register(rn),
   23339                                           WriteBack(WRITE_BACK),
   23340                                           DRegisterList(DRegister(first), len));
   23341                                   if ((len == 0) || (len > 16) || (end > 16)) {
   23342                                     UnpredictableT32(instr);
   23343                                   }
   23344                                   break;
   23345                                 }
   23346                               }
   23347                               break;
   23348                             }
   23349                             default:
   23350                               UnallocatedT32(instr);
   23351                               break;
   23352                           }
   23353                           break;
   23354                         }
   23355                         default: {
   23356                           if (((instr & 0xf0000) == 0xf0000) ||
   23357                               ((instr & 0xe00) == 0xa00)) {
   23358                             UnallocatedT32(instr);
   23359                             return;
   23360                           }
   23361                           UnimplementedT32_32("LDC", instr);
   23362                           break;
   23363                         }
   23364                       }
   23365                       break;
   23366                     }
   23367                   }
   23368                   break;
   23369                 }
   23370                 case 0x10000000: {
   23371                   // 0xfc000000
   23372                   switch (instr & 0x00200000) {
   23373                     case 0x00000000: {
   23374                       // 0xfc000000
   23375                       switch (instr & 0x00800000) {
   23376                         case 0x00000000: {
   23377                           // 0xfc000000
   23378                           if ((instr & 0x00400000) == 0x00400000) {
   23379                             if (((instr & 0xe00) == 0xa00)) {
   23380                               UnallocatedT32(instr);
   23381                               return;
   23382                             }
   23383                             UnimplementedT32_32("MCRR2", instr);
   23384                           } else {
   23385                             UnallocatedT32(instr);
   23386                           }
   23387                           break;
   23388                         }
   23389                         case 0x00800000: {
   23390                           // 0xfc800000
   23391                           if (((instr & 0xe00) == 0xa00)) {
   23392                             UnallocatedT32(instr);
   23393                             return;
   23394                           }
   23395                           UnimplementedT32_32("STC2", instr);
   23396                           break;
   23397                         }
   23398                       }
   23399                       break;
   23400                     }
   23401                     case 0x00200000: {
   23402                       // 0xfc200000
   23403                       if (((instr & 0xe00) == 0xa00)) {
   23404                         UnallocatedT32(instr);
   23405                         return;
   23406                       }
   23407                       UnimplementedT32_32("STC2", instr);
   23408                       break;
   23409                     }
   23410                   }
   23411                   break;
   23412                 }
   23413                 case 0x10100000: {
   23414                   // 0xfc100000
   23415                   switch (instr & 0x00200000) {
   23416                     case 0x00000000: {
   23417                       // 0xfc100000
   23418                       switch (instr & 0x00800000) {
   23419                         case 0x00000000: {
   23420                           // 0xfc100000
   23421                           if ((instr & 0x00400000) == 0x00400000) {
   23422                             if (((instr & 0xe00) == 0xa00)) {
   23423                               UnallocatedT32(instr);
   23424                               return;
   23425                             }
   23426                             UnimplementedT32_32("MRRC2", instr);
   23427                           } else {
   23428                             UnallocatedT32(instr);
   23429                           }
   23430                           break;
   23431                         }
   23432                         case 0x00800000: {
   23433                           // 0xfc900000
   23434                           if (((instr & 0xf0000) == 0xf0000) ||
   23435                               ((instr & 0xe00) == 0xa00)) {
   23436                             UnallocatedT32(instr);
   23437                             return;
   23438                           }
   23439                           UnimplementedT32_32("LDC2", instr);
   23440                           break;
   23441                         }
   23442                       }
   23443                       break;
   23444                     }
   23445                     case 0x00200000: {
   23446                       // 0xfc300000
   23447                       if (((instr & 0xf0000) == 0xf0000) ||
   23448                           ((instr & 0xe00) == 0xa00)) {
   23449                         UnallocatedT32(instr);
   23450                         return;
   23451                       }
   23452                       UnimplementedT32_32("LDC2", instr);
   23453                       break;
   23454                     }
   23455                   }
   23456                   break;
   23457                 }
   23458                 case 0x11000000: {
   23459                   // 0xfd000000
   23460                   switch (instr & 0x00200000) {
   23461                     case 0x00000000: {
   23462                       // 0xfd000000
   23463                       if (((instr & 0xe00) == 0xa00)) {
   23464                         UnallocatedT32(instr);
   23465                         return;
   23466                       }
   23467                       UnimplementedT32_32("STC2", instr);
   23468                       break;
   23469                     }
   23470                     case 0x00200000: {
   23471                       // 0xfd200000
   23472                       if (((instr & 0xe00) == 0xa00)) {
   23473                         UnallocatedT32(instr);
   23474                         return;
   23475                       }
   23476                       UnimplementedT32_32("STC2", instr);
   23477                       break;
   23478                     }
   23479                   }
   23480                   break;
   23481                 }
   23482                 case 0x11100000: {
   23483                   // 0xfd100000
   23484                   switch (instr & 0x00200000) {
   23485                     case 0x00000000: {
   23486                       // 0xfd100000
   23487                       switch (instr & 0x00000e00) {
   23488                         case 0x00000a00: {
   23489                           // 0xfd100a00
   23490                           UnallocatedT32(instr);
   23491                           break;
   23492                         }
   23493                         default: {
   23494                           switch (instr & 0x000f0000) {
   23495                             case 0x000f0000: {
   23496                               // 0xfd1f0000
   23497                               if (((instr & 0xe00) == 0xa00)) {
   23498                                 UnallocatedT32(instr);
   23499                                 return;
   23500                               }
   23501                               UnimplementedT32_32("LDC2", instr);
   23502                               break;
   23503                             }
   23504                             default: {
   23505                               if (((instr & 0xf0000) == 0xf0000) ||
   23506                                   ((instr & 0xe00) == 0xa00)) {
   23507                                 UnallocatedT32(instr);
   23508                                 return;
   23509                               }
   23510                               UnimplementedT32_32("LDC2", instr);
   23511                               break;
   23512                             }
   23513                           }
   23514                           break;
   23515                         }
   23516                       }
   23517                       break;
   23518                     }
   23519                     case 0x00200000: {
   23520                       // 0xfd300000
   23521                       if (((instr & 0xf0000) == 0xf0000) ||
   23522                           ((instr & 0xe00) == 0xa00)) {
   23523                         UnallocatedT32(instr);
   23524                         return;
   23525                       }
   23526                       UnimplementedT32_32("LDC2", instr);
   23527                       break;
   23528                     }
   23529                   }
   23530                   break;
   23531                 }
   23532               }
   23533               break;
   23534             }
   23535             case 0x06000000: {
   23536               // 0xee000000
   23537               switch (instr & 0x01000010) {
   23538                 case 0x00000000: {
   23539                   // 0xee000000
   23540                   switch (instr & 0x10000000) {
   23541                     case 0x00000000: {
   23542                       // 0xee000000
   23543                       switch (instr & 0x00000e00) {
   23544                         case 0x00000a00: {
   23545                           // 0xee000a00
   23546                           switch (instr & 0x00b00140) {
   23547                             case 0x00000000: {
   23548                               // 0xee000a00
   23549                               unsigned rd = ExtractSRegister(instr, 22, 12);
   23550                               unsigned rn = ExtractSRegister(instr, 7, 16);
   23551                               unsigned rm = ExtractSRegister(instr, 5, 0);
   23552                               // VMLA{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; T2
   23553                               vmla(CurrentCond(),
   23554                                    F32,
   23555                                    SRegister(rd),
   23556                                    SRegister(rn),
   23557                                    SRegister(rm));
   23558                               break;
   23559                             }
   23560                             case 0x00000040: {
   23561                               // 0xee000a40
   23562                               unsigned rd = ExtractSRegister(instr, 22, 12);
   23563                               unsigned rn = ExtractSRegister(instr, 7, 16);
   23564                               unsigned rm = ExtractSRegister(instr, 5, 0);
   23565                               // VMLS{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; T2
   23566                               vmls(CurrentCond(),
   23567                                    F32,
   23568                                    SRegister(rd),
   23569                                    SRegister(rn),
   23570                                    SRegister(rm));
   23571                               break;
   23572                             }
   23573                             case 0x00000100: {
   23574                               // 0xee000b00
   23575                               unsigned rd = ExtractDRegister(instr, 22, 12);
   23576                               unsigned rn = ExtractDRegister(instr, 7, 16);
   23577                               unsigned rm = ExtractDRegister(instr, 5, 0);
   23578                               // VMLA{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; T2
   23579                               vmla(CurrentCond(),
   23580                                    F64,
   23581                                    DRegister(rd),
   23582                                    DRegister(rn),
   23583                                    DRegister(rm));
   23584                               break;
   23585                             }
   23586                             case 0x00000140: {
   23587                               // 0xee000b40
   23588                               unsigned rd = ExtractDRegister(instr, 22, 12);
   23589                               unsigned rn = ExtractDRegister(instr, 7, 16);
   23590                               unsigned rm = ExtractDRegister(instr, 5, 0);
   23591                               // VMLS{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; T2
   23592                               vmls(CurrentCond(),
   23593                                    F64,
   23594                                    DRegister(rd),
   23595                                    DRegister(rn),
   23596                                    DRegister(rm));
   23597                               break;
   23598                             }
   23599                             case 0x00100000: {
   23600                               // 0xee100a00
   23601                               unsigned rd = ExtractSRegister(instr, 22, 12);
   23602                               unsigned rn = ExtractSRegister(instr, 7, 16);
   23603                               unsigned rm = ExtractSRegister(instr, 5, 0);
   23604                               // VNMLS{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; T1
   23605                               vnmls(CurrentCond(),
   23606                                     F32,
   23607                                     SRegister(rd),
   23608                                     SRegister(rn),
   23609                                     SRegister(rm));
   23610                               break;
   23611                             }
   23612                             case 0x00100040: {
   23613                               // 0xee100a40
   23614                               unsigned rd = ExtractSRegister(instr, 22, 12);
   23615                               unsigned rn = ExtractSRegister(instr, 7, 16);
   23616                               unsigned rm = ExtractSRegister(instr, 5, 0);
   23617                               // VNMLA{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; T1
   23618                               vnmla(CurrentCond(),
   23619                                     F32,
   23620                                     SRegister(rd),
   23621                                     SRegister(rn),
   23622                                     SRegister(rm));
   23623                               break;
   23624                             }
   23625                             case 0x00100100: {
   23626                               // 0xee100b00
   23627                               unsigned rd = ExtractDRegister(instr, 22, 12);
   23628                               unsigned rn = ExtractDRegister(instr, 7, 16);
   23629                               unsigned rm = ExtractDRegister(instr, 5, 0);
   23630                               // VNMLS{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; T1
   23631                               vnmls(CurrentCond(),
   23632                                     F64,
   23633                                     DRegister(rd),
   23634                                     DRegister(rn),
   23635                                     DRegister(rm));
   23636                               break;
   23637                             }
   23638                             case 0x00100140: {
   23639                               // 0xee100b40
   23640                               unsigned rd = ExtractDRegister(instr, 22, 12);
   23641                               unsigned rn = ExtractDRegister(instr, 7, 16);
   23642                               unsigned rm = ExtractDRegister(instr, 5, 0);
   23643                               // VNMLA{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; T1
   23644                               vnmla(CurrentCond(),
   23645                                     F64,
   23646                                     DRegister(rd),
   23647                                     DRegister(rn),
   23648                                     DRegister(rm));
   23649                               break;
   23650                             }
   23651                             case 0x00200000: {
   23652                               // 0xee200a00
   23653                               unsigned rd = ExtractSRegister(instr, 22, 12);
   23654                               unsigned rn = ExtractSRegister(instr, 7, 16);
   23655                               unsigned rm = ExtractSRegister(instr, 5, 0);
   23656                               // VMUL{<c>}{<q>}.F32 {<Sd>}, <Sn>, <Sm> ; T2
   23657                               vmul(CurrentCond(),
   23658                                    F32,
   23659                                    SRegister(rd),
   23660                                    SRegister(rn),
   23661                                    SRegister(rm));
   23662                               break;
   23663                             }
   23664                             case 0x00200040: {
   23665                               // 0xee200a40
   23666                               unsigned rd = ExtractSRegister(instr, 22, 12);
   23667                               unsigned rn = ExtractSRegister(instr, 7, 16);
   23668                               unsigned rm = ExtractSRegister(instr, 5, 0);
   23669                               // VNMUL{<c>}{<q>}.F32 {<Sd>}, <Sn>, <Sm> ; T1
   23670                               vnmul(CurrentCond(),
   23671                                     F32,
   23672                                     SRegister(rd),
   23673                                     SRegister(rn),
   23674                                     SRegister(rm));
   23675                               break;
   23676                             }
   23677                             case 0x00200100: {
   23678                               // 0xee200b00
   23679                               unsigned rd = ExtractDRegister(instr, 22, 12);
   23680                               unsigned rn = ExtractDRegister(instr, 7, 16);
   23681                               unsigned rm = ExtractDRegister(instr, 5, 0);
   23682                               // VMUL{<c>}{<q>}.F64 {<Dd>}, <Dn>, <Dm> ; T2
   23683                               vmul(CurrentCond(),
   23684                                    F64,
   23685                                    DRegister(rd),
   23686                                    DRegister(rn),
   23687                                    DRegister(rm));
   23688                               break;
   23689                             }
   23690                             case 0x00200140: {
   23691                               // 0xee200b40
   23692                               unsigned rd = ExtractDRegister(instr, 22, 12);
   23693                               unsigned rn = ExtractDRegister(instr, 7, 16);
   23694                               unsigned rm = ExtractDRegister(instr, 5, 0);
   23695                               // VNMUL{<c>}{<q>}.F64 {<Dd>}, <Dn>, <Dm> ; T1
   23696                               vnmul(CurrentCond(),
   23697                                     F64,
   23698                                     DRegister(rd),
   23699                                     DRegister(rn),
   23700                                     DRegister(rm));
   23701                               break;
   23702                             }
   23703                             case 0x00300000: {
   23704                               // 0xee300a00
   23705                               unsigned rd = ExtractSRegister(instr, 22, 12);
   23706                               unsigned rn = ExtractSRegister(instr, 7, 16);
   23707                               unsigned rm = ExtractSRegister(instr, 5, 0);
   23708                               // VADD{<c>}{<q>}.F32 {<Sd>}, <Sn>, <Sm> ; T2
   23709                               vadd(CurrentCond(),
   23710                                    F32,
   23711                                    SRegister(rd),
   23712                                    SRegister(rn),
   23713                                    SRegister(rm));
   23714                               break;
   23715                             }
   23716                             case 0x00300040: {
   23717                               // 0xee300a40
   23718                               unsigned rd = ExtractSRegister(instr, 22, 12);
   23719                               unsigned rn = ExtractSRegister(instr, 7, 16);
   23720                               unsigned rm = ExtractSRegister(instr, 5, 0);
   23721                               // VSUB{<c>}{<q>}.F32 {<Sd>}, <Sn>, <Sm> ; T2
   23722                               vsub(CurrentCond(),
   23723                                    F32,
   23724                                    SRegister(rd),
   23725                                    SRegister(rn),
   23726                                    SRegister(rm));
   23727                               break;
   23728                             }
   23729                             case 0x00300100: {
   23730                               // 0xee300b00
   23731                               unsigned rd = ExtractDRegister(instr, 22, 12);
   23732                               unsigned rn = ExtractDRegister(instr, 7, 16);
   23733                               unsigned rm = ExtractDRegister(instr, 5, 0);
   23734                               // VADD{<c>}{<q>}.F64 {<Dd>}, <Dn>, <Dm> ; T2
   23735                               vadd(CurrentCond(),
   23736                                    F64,
   23737                                    DRegister(rd),
   23738                                    DRegister(rn),
   23739                                    DRegister(rm));
   23740                               break;
   23741                             }
   23742                             case 0x00300140: {
   23743                               // 0xee300b40
   23744                               unsigned rd = ExtractDRegister(instr, 22, 12);
   23745                               unsigned rn = ExtractDRegister(instr, 7, 16);
   23746                               unsigned rm = ExtractDRegister(instr, 5, 0);
   23747                               // VSUB{<c>}{<q>}.F64 {<Dd>}, <Dn>, <Dm> ; T2
   23748                               vsub(CurrentCond(),
   23749                                    F64,
   23750                                    DRegister(rd),
   23751                                    DRegister(rn),
   23752                                    DRegister(rm));
   23753                               break;
   23754                             }
   23755                             case 0x00800000: {
   23756                               // 0xee800a00
   23757                               unsigned rd = ExtractSRegister(instr, 22, 12);
   23758                               unsigned rn = ExtractSRegister(instr, 7, 16);
   23759                               unsigned rm = ExtractSRegister(instr, 5, 0);
   23760                               // VDIV{<c>}{<q>}.F32 {<Sd>}, <Sn>, <Sm> ; T1
   23761                               vdiv(CurrentCond(),
   23762                                    F32,
   23763                                    SRegister(rd),
   23764                                    SRegister(rn),
   23765                                    SRegister(rm));
   23766                               break;
   23767                             }
   23768                             case 0x00800100: {
   23769                               // 0xee800b00
   23770                               unsigned rd = ExtractDRegister(instr, 22, 12);
   23771                               unsigned rn = ExtractDRegister(instr, 7, 16);
   23772                               unsigned rm = ExtractDRegister(instr, 5, 0);
   23773                               // VDIV{<c>}{<q>}.F64 {<Dd>}, <Dn>, <Dm> ; T1
   23774                               vdiv(CurrentCond(),
   23775                                    F64,
   23776                                    DRegister(rd),
   23777                                    DRegister(rn),
   23778                                    DRegister(rm));
   23779                               break;
   23780                             }
   23781                             case 0x00900000: {
   23782                               // 0xee900a00
   23783                               unsigned rd = ExtractSRegister(instr, 22, 12);
   23784                               unsigned rn = ExtractSRegister(instr, 7, 16);
   23785                               unsigned rm = ExtractSRegister(instr, 5, 0);
   23786                               // VFNMS{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; T1
   23787                               vfnms(CurrentCond(),
   23788                                     F32,
   23789                                     SRegister(rd),
   23790                                     SRegister(rn),
   23791                                     SRegister(rm));
   23792                               break;
   23793                             }
   23794                             case 0x00900040: {
   23795                               // 0xee900a40
   23796                               unsigned rd = ExtractSRegister(instr, 22, 12);
   23797                               unsigned rn = ExtractSRegister(instr, 7, 16);
   23798                               unsigned rm = ExtractSRegister(instr, 5, 0);
   23799                               // VFNMA{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; T1
   23800                               vfnma(CurrentCond(),
   23801                                     F32,
   23802                                     SRegister(rd),
   23803                                     SRegister(rn),
   23804                                     SRegister(rm));
   23805                               break;
   23806                             }
   23807                             case 0x00900100: {
   23808                               // 0xee900b00
   23809                               unsigned rd = ExtractDRegister(instr, 22, 12);
   23810                               unsigned rn = ExtractDRegister(instr, 7, 16);
   23811                               unsigned rm = ExtractDRegister(instr, 5, 0);
   23812                               // VFNMS{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; T1
   23813                               vfnms(CurrentCond(),
   23814                                     F64,
   23815                                     DRegister(rd),
   23816                                     DRegister(rn),
   23817                                     DRegister(rm));
   23818                               break;
   23819                             }
   23820                             case 0x00900140: {
   23821                               // 0xee900b40
   23822                               unsigned rd = ExtractDRegister(instr, 22, 12);
   23823                               unsigned rn = ExtractDRegister(instr, 7, 16);
   23824                               unsigned rm = ExtractDRegister(instr, 5, 0);
   23825                               // VFNMA{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; T1
   23826                               vfnma(CurrentCond(),
   23827                                     F64,
   23828                                     DRegister(rd),
   23829                                     DRegister(rn),
   23830                                     DRegister(rm));
   23831                               break;
   23832                             }
   23833                             case 0x00a00000: {
   23834                               // 0xeea00a00
   23835                               unsigned rd = ExtractSRegister(instr, 22, 12);
   23836                               unsigned rn = ExtractSRegister(instr, 7, 16);
   23837                               unsigned rm = ExtractSRegister(instr, 5, 0);
   23838                               // VFMA{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; T2
   23839                               vfma(CurrentCond(),
   23840                                    F32,
   23841                                    SRegister(rd),
   23842                                    SRegister(rn),
   23843                                    SRegister(rm));
   23844                               break;
   23845                             }
   23846                             case 0x00a00040: {
   23847                               // 0xeea00a40
   23848                               unsigned rd = ExtractSRegister(instr, 22, 12);
   23849                               unsigned rn = ExtractSRegister(instr, 7, 16);
   23850                               unsigned rm = ExtractSRegister(instr, 5, 0);
   23851                               // VFMS{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; T2
   23852                               vfms(CurrentCond(),
   23853                                    F32,
   23854                                    SRegister(rd),
   23855                                    SRegister(rn),
   23856                                    SRegister(rm));
   23857                               break;
   23858                             }
   23859                             case 0x00a00100: {
   23860                               // 0xeea00b00
   23861                               unsigned rd = ExtractDRegister(instr, 22, 12);
   23862                               unsigned rn = ExtractDRegister(instr, 7, 16);
   23863                               unsigned rm = ExtractDRegister(instr, 5, 0);
   23864                               // VFMA{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; T2
   23865                               vfma(CurrentCond(),
   23866                                    F64,
   23867                                    DRegister(rd),
   23868                                    DRegister(rn),
   23869                                    DRegister(rm));
   23870                               break;
   23871                             }
   23872                             case 0x00a00140: {
   23873                               // 0xeea00b40
   23874                               unsigned rd = ExtractDRegister(instr, 22, 12);
   23875                               unsigned rn = ExtractDRegister(instr, 7, 16);
   23876                               unsigned rm = ExtractDRegister(instr, 5, 0);
   23877                               // VFMS{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; T2
   23878                               vfms(CurrentCond(),
   23879                                    F64,
   23880                                    DRegister(rd),
   23881                                    DRegister(rn),
   23882                                    DRegister(rm));
   23883                               break;
   23884                             }
   23885                             case 0x00b00000: {
   23886                               // 0xeeb00a00
   23887                               unsigned rd = ExtractSRegister(instr, 22, 12);
   23888                               uint32_t encoded_imm =
   23889                                   (instr & 0xf) | ((instr >> 12) & 0xf0);
   23890                               NeonImmediate imm =
   23891                                   ImmediateVFP::Decode<float>(encoded_imm);
   23892                               // VMOV{<c>}{<q>}.F32 <Sd>, #<imm> ; T2
   23893                               vmov(CurrentCond(), F32, SRegister(rd), imm);
   23894                               if (((instr & 0xffb00ff0) != 0xeeb00a00)) {
   23895                                 UnpredictableT32(instr);
   23896                               }
   23897                               break;
   23898                             }
   23899                             case 0x00b00040: {
   23900                               // 0xeeb00a40
   23901                               switch (instr & 0x000e0000) {
   23902                                 case 0x00000000: {
   23903                                   // 0xeeb00a40
   23904                                   switch (instr & 0x00010080) {
   23905                                     case 0x00000000: {
   23906                                       // 0xeeb00a40
   23907                                       unsigned rd =
   23908                                           ExtractSRegister(instr, 22, 12);
   23909                                       unsigned rm =
   23910                                           ExtractSRegister(instr, 5, 0);
   23911                                       // VMOV{<c>}{<q>}.F32 <Sd>, <Sm> ; T2
   23912                                       vmov(CurrentCond(),
   23913                                            F32,
   23914                                            SRegister(rd),
   23915                                            SRegister(rm));
   23916                                       break;
   23917                                     }
   23918                                     case 0x00000080: {
   23919                                       // 0xeeb00ac0
   23920                                       unsigned rd =
   23921                                           ExtractSRegister(instr, 22, 12);
   23922                                       unsigned rm =
   23923                                           ExtractSRegister(instr, 5, 0);
   23924                                       // VABS{<c>}{<q>}.F32 <Sd>, <Sm> ; T2
   23925                                       vabs(CurrentCond(),
   23926                                            F32,
   23927                                            SRegister(rd),
   23928                                            SRegister(rm));
   23929                                       break;
   23930                                     }
   23931                                     case 0x00010000: {
   23932                                       // 0xeeb10a40
   23933                                       unsigned rd =
   23934                                           ExtractSRegister(instr, 22, 12);
   23935                                       unsigned rm =
   23936                                           ExtractSRegister(instr, 5, 0);
   23937                                       // VNEG{<c>}{<q>}.F32 <Sd>, <Sm> ; T2
   23938                                       vneg(CurrentCond(),
   23939                                            F32,
   23940                                            SRegister(rd),
   23941                                            SRegister(rm));
   23942                                       break;
   23943                                     }
   23944                                     case 0x00010080: {
   23945                                       // 0xeeb10ac0
   23946                                       unsigned rd =
   23947                                           ExtractSRegister(instr, 22, 12);
   23948                                       unsigned rm =
   23949                                           ExtractSRegister(instr, 5, 0);
   23950                                       // VSQRT{<c>}{<q>}.F32 <Sd>, <Sm> ; T1
   23951                                       vsqrt(CurrentCond(),
   23952                                             F32,
   23953                                             SRegister(rd),
   23954                                             SRegister(rm));
   23955                                       break;
   23956                                     }
   23957                                   }
   23958                                   break;
   23959                                 }
   23960                                 case 0x00020000: {
   23961                                   // 0xeeb20a40
   23962                                   switch (instr & 0x00010080) {
   23963                                     case 0x00000000: {
   23964                                       // 0xeeb20a40
   23965                                       unsigned rd =
   23966                                           ExtractSRegister(instr, 22, 12);
   23967                                       unsigned rm =
   23968                                           ExtractSRegister(instr, 5, 0);
   23969                                       // VCVTB{<c>}{<q>}.F32.F16 <Sd>, <Sm> ; T1
   23970                                       vcvtb(CurrentCond(),
   23971                                             F32,
   23972                                             F16,
   23973                                             SRegister(rd),
   23974                                             SRegister(rm));
   23975                                       break;
   23976                                     }
   23977                                     case 0x00000080: {
   23978                                       // 0xeeb20ac0
   23979                                       unsigned rd =
   23980                                           ExtractSRegister(instr, 22, 12);
   23981                                       unsigned rm =
   23982                                           ExtractSRegister(instr, 5, 0);
   23983                                       // VCVTT{<c>}{<q>}.F32.F16 <Sd>, <Sm> ; T1
   23984                                       vcvtt(CurrentCond(),
   23985                                             F32,
   23986                                             F16,
   23987                                             SRegister(rd),
   23988                                             SRegister(rm));
   23989                                       break;
   23990                                     }
   23991                                     case 0x00010000: {
   23992                                       // 0xeeb30a40
   23993                                       unsigned rd =
   23994                                           ExtractSRegister(instr, 22, 12);
   23995                                       unsigned rm =
   23996                                           ExtractSRegister(instr, 5, 0);
   23997                                       // VCVTB{<c>}{<q>}.F16.F32 <Sd>, <Sm> ; T1
   23998                                       vcvtb(CurrentCond(),
   23999                                             F16,
   24000                                             F32,
   24001                                             SRegister(rd),
   24002                                             SRegister(rm));
   24003                                       break;
   24004                                     }
   24005                                     case 0x00010080: {
   24006                                       // 0xeeb30ac0
   24007                                       unsigned rd =
   24008                                           ExtractSRegister(instr, 22, 12);
   24009                                       unsigned rm =
   24010                                           ExtractSRegister(instr, 5, 0);
   24011                                       // VCVTT{<c>}{<q>}.F16.F32 <Sd>, <Sm> ; T1
   24012                                       vcvtt(CurrentCond(),
   24013                                             F16,
   24014                                             F32,
   24015                                             SRegister(rd),
   24016                                             SRegister(rm));
   24017                                       break;
   24018                                     }
   24019                                   }
   24020                                   break;
   24021                                 }
   24022                                 case 0x00040000: {
   24023                                   // 0xeeb40a40
   24024                                   switch (instr & 0x00010080) {
   24025                                     case 0x00000000: {
   24026                                       // 0xeeb40a40
   24027                                       unsigned rd =
   24028                                           ExtractSRegister(instr, 22, 12);
   24029                                       unsigned rm =
   24030                                           ExtractSRegister(instr, 5, 0);
   24031                                       // VCMP{<c>}{<q>}.F32 <Sd>, <Sm> ; T1
   24032                                       vcmp(CurrentCond(),
   24033                                            F32,
   24034                                            SRegister(rd),
   24035                                            SRegister(rm));
   24036                                       break;
   24037                                     }
   24038                                     case 0x00000080: {
   24039                                       // 0xeeb40ac0
   24040                                       unsigned rd =
   24041                                           ExtractSRegister(instr, 22, 12);
   24042                                       unsigned rm =
   24043                                           ExtractSRegister(instr, 5, 0);
   24044                                       // VCMPE{<c>}{<q>}.F32 <Sd>, <Sm> ; T1
   24045                                       vcmpe(CurrentCond(),
   24046                                             F32,
   24047                                             SRegister(rd),
   24048                                             SRegister(rm));
   24049                                       break;
   24050                                     }
   24051                                     case 0x00010000: {
   24052                                       // 0xeeb50a40
   24053                                       unsigned rd =
   24054                                           ExtractSRegister(instr, 22, 12);
   24055                                       // VCMP{<c>}{<q>}.F32 <Sd>, #0.0 ; T2
   24056                                       vcmp(CurrentCond(),
   24057                                            F32,
   24058                                            SRegister(rd),
   24059                                            0.0);
   24060                                       if (((instr & 0xffbf0fff) !=
   24061                                            0xeeb50a40)) {
   24062                                         UnpredictableT32(instr);
   24063                                       }
   24064                                       break;
   24065                                     }
   24066                                     case 0x00010080: {
   24067                                       // 0xeeb50ac0
   24068                                       unsigned rd =
   24069                                           ExtractSRegister(instr, 22, 12);
   24070                                       // VCMPE{<c>}{<q>}.F32 <Sd>, #0.0 ; T2
   24071                                       vcmpe(CurrentCond(),
   24072                                             F32,
   24073                                             SRegister(rd),
   24074                                             0.0);
   24075                                       if (((instr & 0xffbf0fff) !=
   24076                                            0xeeb50ac0)) {
   24077                                         UnpredictableT32(instr);
   24078                                       }
   24079                                       break;
   24080                                     }
   24081                                   }
   24082                                   break;
   24083                                 }
   24084                                 case 0x00060000: {
   24085                                   // 0xeeb60a40
   24086                                   switch (instr & 0x00010080) {
   24087                                     case 0x00000000: {
   24088                                       // 0xeeb60a40
   24089                                       unsigned rd =
   24090                                           ExtractSRegister(instr, 22, 12);
   24091                                       unsigned rm =
   24092                                           ExtractSRegister(instr, 5, 0);
   24093                                       // VRINTR{<c>}{<q>}.F32.F32 <Sd>, <Sm> ; T1 NOLINT(whitespace/line_length)
   24094                                       vrintr(CurrentCond(),
   24095                                              F32,
   24096                                              F32,
   24097                                              SRegister(rd),
   24098                                              SRegister(rm));
   24099                                       break;
   24100                                     }
   24101                                     case 0x00000080: {
   24102                                       // 0xeeb60ac0
   24103                                       unsigned rd =
   24104                                           ExtractSRegister(instr, 22, 12);
   24105                                       unsigned rm =
   24106                                           ExtractSRegister(instr, 5, 0);
   24107                                       // VRINTZ{<c>}{<q>}.F32.F32 <Sd>, <Sm> ; T1 NOLINT(whitespace/line_length)
   24108                                       vrintz(CurrentCond(),
   24109                                              F32,
   24110                                              F32,
   24111                                              SRegister(rd),
   24112                                              SRegister(rm));
   24113                                       break;
   24114                                     }
   24115                                     case 0x00010000: {
   24116                                       // 0xeeb70a40
   24117                                       unsigned rd =
   24118                                           ExtractSRegister(instr, 22, 12);
   24119                                       unsigned rm =
   24120                                           ExtractSRegister(instr, 5, 0);
   24121                                       // VRINTX{<c>}{<q>}.F32.F32 <Sd>, <Sm> ; T1 NOLINT(whitespace/line_length)
   24122                                       vrintx(CurrentCond(),
   24123                                              F32,
   24124                                              F32,
   24125                                              SRegister(rd),
   24126                                              SRegister(rm));
   24127                                       break;
   24128                                     }
   24129                                     case 0x00010080: {
   24130                                       // 0xeeb70ac0
   24131                                       unsigned rd =
   24132                                           ExtractDRegister(instr, 22, 12);
   24133                                       unsigned rm =
   24134                                           ExtractSRegister(instr, 5, 0);
   24135                                       // VCVT{<c>}{<q>}.F64.F32 <Dd>, <Sm> ; T1
   24136                                       vcvt(CurrentCond(),
   24137                                            F64,
   24138                                            F32,
   24139                                            DRegister(rd),
   24140                                            SRegister(rm));
   24141                                       break;
   24142                                     }
   24143                                   }
   24144                                   break;
   24145                                 }
   24146                                 case 0x00080000: {
   24147                                   // 0xeeb80a40
   24148                                   if ((instr & 0x00010000) == 0x00000000) {
   24149                                     DataType dt =
   24150                                         Dt_op_2_Decode((instr >> 7) & 0x1);
   24151                                     if (dt.Is(kDataTypeValueInvalid)) {
   24152                                       UnallocatedT32(instr);
   24153                                       return;
   24154                                     }
   24155                                     unsigned rd =
   24156                                         ExtractSRegister(instr, 22, 12);
   24157                                     unsigned rm = ExtractSRegister(instr, 5, 0);
   24158                                     // VCVT{<c>}{<q>}.F32.<dt> <Sd>, <Sm> ; T1
   24159                                     vcvt(CurrentCond(),
   24160                                          F32,
   24161                                          dt,
   24162                                          SRegister(rd),
   24163                                          SRegister(rm));
   24164                                   } else {
   24165                                     UnallocatedT32(instr);
   24166                                   }
   24167                                   break;
   24168                                 }
   24169                                 case 0x000a0000: {
   24170                                   // 0xeeba0a40
   24171                                   DataType dt =
   24172                                       Dt_U_sx_1_Decode(((instr >> 7) & 0x1) |
   24173                                                        ((instr >> 15) & 0x2));
   24174                                   if (dt.Is(kDataTypeValueInvalid)) {
   24175                                     UnallocatedT32(instr);
   24176                                     return;
   24177                                   }
   24178                                   unsigned rd = ExtractSRegister(instr, 22, 12);
   24179                                   unsigned offset = 32;
   24180                                   if (dt.Is(S16) || dt.Is(U16)) {
   24181                                     offset = 16;
   24182                                   }
   24183                                   uint32_t fbits =
   24184                                       offset - (((instr >> 5) & 0x1) |
   24185                                                 ((instr << 1) & 0x1e));
   24186                                   // VCVT{<c>}{<q>}.F32.<dt> <Sdm>, <Sdm>, #<fbits> ; T1 NOLINT(whitespace/line_length)
   24187                                   vcvt(CurrentCond(),
   24188                                        F32,
   24189                                        dt,
   24190                                        SRegister(rd),
   24191                                        SRegister(rd),
   24192                                        fbits);
   24193                                   break;
   24194                                 }
   24195                                 case 0x000c0000: {
   24196                                   // 0xeebc0a40
   24197                                   switch (instr & 0x00010080) {
   24198                                     case 0x00000000: {
   24199                                       // 0xeebc0a40
   24200                                       unsigned rd =
   24201                                           ExtractSRegister(instr, 22, 12);
   24202                                       unsigned rm =
   24203                                           ExtractSRegister(instr, 5, 0);
   24204                                       // VCVTR{<c>}{<q>}.U32.F32 <Sd>, <Sm> ; T1
   24205                                       vcvtr(CurrentCond(),
   24206                                             U32,
   24207                                             F32,
   24208                                             SRegister(rd),
   24209                                             SRegister(rm));
   24210                                       break;
   24211                                     }
   24212                                     case 0x00000080: {
   24213                                       // 0xeebc0ac0
   24214                                       unsigned rd =
   24215                                           ExtractSRegister(instr, 22, 12);
   24216                                       unsigned rm =
   24217                                           ExtractSRegister(instr, 5, 0);
   24218                                       // VCVT{<c>}{<q>}.U32.F32 <Sd>, <Sm> ; T1
   24219                                       vcvt(CurrentCond(),
   24220                                            U32,
   24221                                            F32,
   24222                                            SRegister(rd),
   24223                                            SRegister(rm));
   24224                                       break;
   24225                                     }
   24226                                     case 0x00010000: {
   24227                                       // 0xeebd0a40
   24228                                       unsigned rd =
   24229                                           ExtractSRegister(instr, 22, 12);
   24230                                       unsigned rm =
   24231                                           ExtractSRegister(instr, 5, 0);
   24232                                       // VCVTR{<c>}{<q>}.S32.F32 <Sd>, <Sm> ; T1
   24233                                       vcvtr(CurrentCond(),
   24234                                             S32,
   24235                                             F32,
   24236                                             SRegister(rd),
   24237                                             SRegister(rm));
   24238                                       break;
   24239                                     }
   24240                                     case 0x00010080: {
   24241                                       // 0xeebd0ac0
   24242                                       unsigned rd =
   24243                                           ExtractSRegister(instr, 22, 12);
   24244                                       unsigned rm =
   24245                                           ExtractSRegister(instr, 5, 0);
   24246                                       // VCVT{<c>}{<q>}.S32.F32 <Sd>, <Sm> ; T1
   24247                                       vcvt(CurrentCond(),
   24248                                            S32,
   24249                                            F32,
   24250                                            SRegister(rd),
   24251                                            SRegister(rm));
   24252                                       break;
   24253                                     }
   24254                                   }
   24255                                   break;
   24256                                 }
   24257                                 case 0x000e0000: {
   24258                                   // 0xeebe0a40
   24259                                   DataType dt =
   24260                                       Dt_U_sx_1_Decode(((instr >> 7) & 0x1) |
   24261                                                        ((instr >> 15) & 0x2));
   24262                                   if (dt.Is(kDataTypeValueInvalid)) {
   24263                                     UnallocatedT32(instr);
   24264                                     return;
   24265                                   }
   24266                                   unsigned rd = ExtractSRegister(instr, 22, 12);
   24267                                   unsigned offset = 32;
   24268                                   if (dt.Is(S16) || dt.Is(U16)) {
   24269                                     offset = 16;
   24270                                   }
   24271                                   uint32_t fbits =
   24272                                       offset - (((instr >> 5) & 0x1) |
   24273                                                 ((instr << 1) & 0x1e));
   24274                                   // VCVT{<c>}{<q>}.<dt>.F32 <Sdm>, <Sdm>, #<fbits> ; T1 NOLINT(whitespace/line_length)
   24275                                   vcvt(CurrentCond(),
   24276                                        dt,
   24277                                        F32,
   24278                                        SRegister(rd),
   24279                                        SRegister(rd),
   24280                                        fbits);
   24281                                   break;
   24282                                 }
   24283                               }
   24284                               break;
   24285                             }
   24286                             case 0x00b00100: {
   24287                               // 0xeeb00b00
   24288                               unsigned rd = ExtractDRegister(instr, 22, 12);
   24289                               uint32_t encoded_imm =
   24290                                   (instr & 0xf) | ((instr >> 12) & 0xf0);
   24291                               NeonImmediate imm =
   24292                                   ImmediateVFP::Decode<double>(encoded_imm);
   24293                               // VMOV{<c>}{<q>}.F64 <Dd>, #<imm> ; T2
   24294                               vmov(CurrentCond(), F64, DRegister(rd), imm);
   24295                               if (((instr & 0xffb00ff0) != 0xeeb00b00)) {
   24296                                 UnpredictableT32(instr);
   24297                               }
   24298                               break;
   24299                             }
   24300                             case 0x00b00140: {
   24301                               // 0xeeb00b40
   24302                               switch (instr & 0x000e0000) {
   24303                                 case 0x00000000: {
   24304                                   // 0xeeb00b40
   24305                                   switch (instr & 0x00010080) {
   24306                                     case 0x00000000: {
   24307                                       // 0xeeb00b40
   24308                                       unsigned rd =
   24309                                           ExtractDRegister(instr, 22, 12);
   24310                                       unsigned rm =
   24311                                           ExtractDRegister(instr, 5, 0);
   24312                                       // VMOV{<c>}{<q>}.F64 <Dd>, <Dm> ; T2
   24313                                       vmov(CurrentCond(),
   24314                                            F64,
   24315                                            DRegister(rd),
   24316                                            DRegister(rm));
   24317                                       break;
   24318                                     }
   24319                                     case 0x00000080: {
   24320                                       // 0xeeb00bc0
   24321                                       unsigned rd =
   24322                                           ExtractDRegister(instr, 22, 12);
   24323                                       unsigned rm =
   24324                                           ExtractDRegister(instr, 5, 0);
   24325                                       // VABS{<c>}{<q>}.F64 <Dd>, <Dm> ; T2
   24326                                       vabs(CurrentCond(),
   24327                                            F64,
   24328                                            DRegister(rd),
   24329                                            DRegister(rm));
   24330                                       break;
   24331                                     }
   24332                                     case 0x00010000: {
   24333                                       // 0xeeb10b40
   24334                                       unsigned rd =
   24335                                           ExtractDRegister(instr, 22, 12);
   24336                                       unsigned rm =
   24337                                           ExtractDRegister(instr, 5, 0);
   24338                                       // VNEG{<c>}{<q>}.F64 <Dd>, <Dm> ; T2
   24339                                       vneg(CurrentCond(),
   24340                                            F64,
   24341                                            DRegister(rd),
   24342                                            DRegister(rm));
   24343                                       break;
   24344                                     }
   24345                                     case 0x00010080: {
   24346                                       // 0xeeb10bc0
   24347                                       unsigned rd =
   24348                                           ExtractDRegister(instr, 22, 12);
   24349                                       unsigned rm =
   24350                                           ExtractDRegister(instr, 5, 0);
   24351                                       // VSQRT{<c>}{<q>}.F64 <Dd>, <Dm> ; T1
   24352                                       vsqrt(CurrentCond(),
   24353                                             F64,
   24354                                             DRegister(rd),
   24355                                             DRegister(rm));
   24356                                       break;
   24357                                     }
   24358                                   }
   24359                                   break;
   24360                                 }
   24361                                 case 0x00020000: {
   24362                                   // 0xeeb20b40
   24363                                   switch (instr & 0x00010080) {
   24364                                     case 0x00000000: {
   24365                                       // 0xeeb20b40
   24366                                       unsigned rd =
   24367                                           ExtractDRegister(instr, 22, 12);
   24368                                       unsigned rm =
   24369                                           ExtractSRegister(instr, 5, 0);
   24370                                       // VCVTB{<c>}{<q>}.F64.F16 <Dd>, <Sm> ; T1
   24371                                       vcvtb(CurrentCond(),
   24372                                             F64,
   24373                                             F16,
   24374                                             DRegister(rd),
   24375                                             SRegister(rm));
   24376                                       break;
   24377                                     }
   24378                                     case 0x00000080: {
   24379                                       // 0xeeb20bc0
   24380                                       unsigned rd =
   24381                                           ExtractDRegister(instr, 22, 12);
   24382                                       unsigned rm =
   24383                                           ExtractSRegister(instr, 5, 0);
   24384                                       // VCVTT{<c>}{<q>}.F64.F16 <Dd>, <Sm> ; T1
   24385                                       vcvtt(CurrentCond(),
   24386                                             F64,
   24387                                             F16,
   24388                                             DRegister(rd),
   24389                                             SRegister(rm));
   24390                                       break;
   24391                                     }
   24392                                     case 0x00010000: {
   24393                                       // 0xeeb30b40
   24394                                       unsigned rd =
   24395                                           ExtractSRegister(instr, 22, 12);
   24396                                       unsigned rm =
   24397                                           ExtractDRegister(instr, 5, 0);
   24398                                       // VCVTB{<c>}{<q>}.F16.F64 <Sd>, <Dm> ; T1
   24399                                       vcvtb(CurrentCond(),
   24400                                             F16,
   24401                                             F64,
   24402                                             SRegister(rd),
   24403                                             DRegister(rm));
   24404                                       break;
   24405                                     }
   24406                                     case 0x00010080: {
   24407                                       // 0xeeb30bc0
   24408                                       unsigned rd =
   24409                                           ExtractSRegister(instr, 22, 12);
   24410                                       unsigned rm =
   24411                                           ExtractDRegister(instr, 5, 0);
   24412                                       // VCVTT{<c>}{<q>}.F16.F64 <Sd>, <Dm> ; T1
   24413                                       vcvtt(CurrentCond(),
   24414                                             F16,
   24415                                             F64,
   24416                                             SRegister(rd),
   24417                                             DRegister(rm));
   24418                                       break;
   24419                                     }
   24420                                   }
   24421                                   break;
   24422                                 }
   24423                                 case 0x00040000: {
   24424                                   // 0xeeb40b40
   24425                                   switch (instr & 0x00010080) {
   24426                                     case 0x00000000: {
   24427                                       // 0xeeb40b40
   24428                                       unsigned rd =
   24429                                           ExtractDRegister(instr, 22, 12);
   24430                                       unsigned rm =
   24431                                           ExtractDRegister(instr, 5, 0);
   24432                                       // VCMP{<c>}{<q>}.F64 <Dd>, <Dm> ; T1
   24433                                       vcmp(CurrentCond(),
   24434                                            F64,
   24435                                            DRegister(rd),
   24436                                            DRegister(rm));
   24437                                       break;
   24438                                     }
   24439                                     case 0x00000080: {
   24440                                       // 0xeeb40bc0
   24441                                       unsigned rd =
   24442                                           ExtractDRegister(instr, 22, 12);
   24443                                       unsigned rm =
   24444                                           ExtractDRegister(instr, 5, 0);
   24445                                       // VCMPE{<c>}{<q>}.F64 <Dd>, <Dm> ; T1
   24446                                       vcmpe(CurrentCond(),
   24447                                             F64,
   24448                                             DRegister(rd),
   24449                                             DRegister(rm));
   24450                                       break;
   24451                                     }
   24452                                     case 0x00010000: {
   24453                                       // 0xeeb50b40
   24454                                       unsigned rd =
   24455                                           ExtractDRegister(instr, 22, 12);
   24456                                       // VCMP{<c>}{<q>}.F64 <Dd>, #0.0 ; T2
   24457                                       vcmp(CurrentCond(),
   24458                                            F64,
   24459                                            DRegister(rd),
   24460                                            0.0);
   24461                                       if (((instr & 0xffbf0fff) !=
   24462                                            0xeeb50b40)) {
   24463                                         UnpredictableT32(instr);
   24464                                       }
   24465                                       break;
   24466                                     }
   24467                                     case 0x00010080: {
   24468                                       // 0xeeb50bc0
   24469                                       unsigned rd =
   24470                                           ExtractDRegister(instr, 22, 12);
   24471                                       // VCMPE{<c>}{<q>}.F64 <Dd>, #0.0 ; T2
   24472                                       vcmpe(CurrentCond(),
   24473                                             F64,
   24474                                             DRegister(rd),
   24475                                             0.0);
   24476                                       if (((instr & 0xffbf0fff) !=
   24477                                            0xeeb50bc0)) {
   24478                                         UnpredictableT32(instr);
   24479                                       }
   24480                                       break;
   24481                                     }
   24482                                   }
   24483                                   break;
   24484                                 }
   24485                                 case 0x00060000: {
   24486                                   // 0xeeb60b40
   24487                                   switch (instr & 0x00010080) {
   24488                                     case 0x00000000: {
   24489                                       // 0xeeb60b40
   24490                                       unsigned rd =
   24491                                           ExtractDRegister(instr, 22, 12);
   24492                                       unsigned rm =
   24493                                           ExtractDRegister(instr, 5, 0);
   24494                                       // VRINTR{<c>}{<q>}.F64.F64 <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
   24495                                       vrintr(CurrentCond(),
   24496                                              F64,
   24497                                              F64,
   24498                                              DRegister(rd),
   24499                                              DRegister(rm));
   24500                                       break;
   24501                                     }
   24502                                     case 0x00000080: {
   24503                                       // 0xeeb60bc0
   24504                                       unsigned rd =
   24505                                           ExtractDRegister(instr, 22, 12);
   24506                                       unsigned rm =
   24507                                           ExtractDRegister(instr, 5, 0);
   24508                                       // VRINTZ{<c>}{<q>}.F64.F64 <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
   24509                                       vrintz(CurrentCond(),
   24510                                              F64,
   24511                                              F64,
   24512                                              DRegister(rd),
   24513                                              DRegister(rm));
   24514                                       break;
   24515                                     }
   24516                                     case 0x00010000: {
   24517                                       // 0xeeb70b40
   24518                                       unsigned rd =
   24519                                           ExtractDRegister(instr, 22, 12);
   24520                                       unsigned rm =
   24521                                           ExtractDRegister(instr, 5, 0);
   24522                                       // VRINTX{<c>}{<q>}.F64.F64 <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
   24523                                       vrintx(CurrentCond(),
   24524                                              F64,
   24525                                              F64,
   24526                                              DRegister(rd),
   24527                                              DRegister(rm));
   24528                                       break;
   24529                                     }
   24530                                     case 0x00010080: {
   24531                                       // 0xeeb70bc0
   24532                                       unsigned rd =
   24533                                           ExtractSRegister(instr, 22, 12);
   24534                                       unsigned rm =
   24535                                           ExtractDRegister(instr, 5, 0);
   24536                                       // VCVT{<c>}{<q>}.F32.F64 <Sd>, <Dm> ; T1
   24537                                       vcvt(CurrentCond(),
   24538                                            F32,
   24539                                            F64,
   24540                                            SRegister(rd),
   24541                                            DRegister(rm));
   24542                                       break;
   24543                                     }
   24544                                   }
   24545                                   break;
   24546                                 }
   24547                                 case 0x00080000: {
   24548                                   // 0xeeb80b40
   24549                                   if ((instr & 0x00010000) == 0x00000000) {
   24550                                     DataType dt =
   24551                                         Dt_op_2_Decode((instr >> 7) & 0x1);
   24552                                     if (dt.Is(kDataTypeValueInvalid)) {
   24553                                       UnallocatedT32(instr);
   24554                                       return;
   24555                                     }
   24556                                     unsigned rd =
   24557                                         ExtractDRegister(instr, 22, 12);
   24558                                     unsigned rm = ExtractSRegister(instr, 5, 0);
   24559                                     // VCVT{<c>}{<q>}.F64.<dt> <Dd>, <Sm> ; T1
   24560                                     vcvt(CurrentCond(),
   24561                                          F64,
   24562                                          dt,
   24563                                          DRegister(rd),
   24564                                          SRegister(rm));
   24565                                   } else {
   24566                                     UnallocatedT32(instr);
   24567                                   }
   24568                                   break;
   24569                                 }
   24570                                 case 0x000a0000: {
   24571                                   // 0xeeba0b40
   24572                                   DataType dt =
   24573                                       Dt_U_sx_1_Decode(((instr >> 7) & 0x1) |
   24574                                                        ((instr >> 15) & 0x2));
   24575                                   if (dt.Is(kDataTypeValueInvalid)) {
   24576                                     UnallocatedT32(instr);
   24577                                     return;
   24578                                   }
   24579                                   unsigned rd = ExtractDRegister(instr, 22, 12);
   24580                                   unsigned offset = 32;
   24581                                   if (dt.Is(S16) || dt.Is(U16)) {
   24582                                     offset = 16;
   24583                                   }
   24584                                   uint32_t fbits =
   24585                                       offset - (((instr >> 5) & 0x1) |
   24586                                                 ((instr << 1) & 0x1e));
   24587                                   // VCVT{<c>}{<q>}.F64.<dt> <Ddm>, <Ddm>, #<fbits> ; T1 NOLINT(whitespace/line_length)
   24588                                   vcvt(CurrentCond(),
   24589                                        F64,
   24590                                        dt,
   24591                                        DRegister(rd),
   24592                                        DRegister(rd),
   24593                                        fbits);
   24594                                   break;
   24595                                 }
   24596                                 case 0x000c0000: {
   24597                                   // 0xeebc0b40
   24598                                   switch (instr & 0x00010080) {
   24599                                     case 0x00000000: {
   24600                                       // 0xeebc0b40
   24601                                       unsigned rd =
   24602                                           ExtractSRegister(instr, 22, 12);
   24603                                       unsigned rm =
   24604                                           ExtractDRegister(instr, 5, 0);
   24605                                       // VCVTR{<c>}{<q>}.U32.F64 <Sd>, <Dm> ; T1
   24606                                       vcvtr(CurrentCond(),
   24607                                             U32,
   24608                                             F64,
   24609                                             SRegister(rd),
   24610                                             DRegister(rm));
   24611                                       break;
   24612                                     }
   24613                                     case 0x00000080: {
   24614                                       // 0xeebc0bc0
   24615                                       unsigned rd =
   24616                                           ExtractSRegister(instr, 22, 12);
   24617                                       unsigned rm =
   24618                                           ExtractDRegister(instr, 5, 0);
   24619                                       // VCVT{<c>}{<q>}.U32.F64 <Sd>, <Dm> ; T1
   24620                                       vcvt(CurrentCond(),
   24621                                            U32,
   24622                                            F64,
   24623                                            SRegister(rd),
   24624                                            DRegister(rm));
   24625                                       break;
   24626                                     }
   24627                                     case 0x00010000: {
   24628                                       // 0xeebd0b40
   24629                                       unsigned rd =
   24630                                           ExtractSRegister(instr, 22, 12);
   24631                                       unsigned rm =
   24632                                           ExtractDRegister(instr, 5, 0);
   24633                                       // VCVTR{<c>}{<q>}.S32.F64 <Sd>, <Dm> ; T1
   24634                                       vcvtr(CurrentCond(),
   24635                                             S32,
   24636                                             F64,
   24637                                             SRegister(rd),
   24638                                             DRegister(rm));
   24639                                       break;
   24640                                     }
   24641                                     case 0x00010080: {
   24642                                       // 0xeebd0bc0
   24643                                       unsigned rd =
   24644                                           ExtractSRegister(instr, 22, 12);
   24645                                       unsigned rm =
   24646                                           ExtractDRegister(instr, 5, 0);
   24647                                       // VCVT{<c>}{<q>}.S32.F64 <Sd>, <Dm> ; T1
   24648                                       vcvt(CurrentCond(),
   24649                                            S32,
   24650                                            F64,
   24651                                            SRegister(rd),
   24652                                            DRegister(rm));
   24653                                       break;
   24654                                     }
   24655                                   }
   24656                                   break;
   24657                                 }
   24658                                 case 0x000e0000: {
   24659                                   // 0xeebe0b40
   24660                                   DataType dt =
   24661                                       Dt_U_sx_1_Decode(((instr >> 7) & 0x1) |
   24662                                                        ((instr >> 15) & 0x2));
   24663                                   if (dt.Is(kDataTypeValueInvalid)) {
   24664                                     UnallocatedT32(instr);
   24665                                     return;
   24666                                   }
   24667                                   unsigned rd = ExtractDRegister(instr, 22, 12);
   24668                                   unsigned offset = 32;
   24669                                   if (dt.Is(S16) || dt.Is(U16)) {
   24670                                     offset = 16;
   24671                                   }
   24672                                   uint32_t fbits =
   24673                                       offset - (((instr >> 5) & 0x1) |
   24674                                                 ((instr << 1) & 0x1e));
   24675                                   // VCVT{<c>}{<q>}.<dt>.F64 <Ddm>, <Ddm>, #<fbits> ; T1 NOLINT(whitespace/line_length)
   24676                                   vcvt(CurrentCond(),
   24677                                        dt,
   24678                                        F64,
   24679                                        DRegister(rd),
   24680                                        DRegister(rd),
   24681                                        fbits);
   24682                                   break;
   24683                                 }
   24684                               }
   24685                               break;
   24686                             }
   24687                             default:
   24688                               UnallocatedT32(instr);
   24689                               break;
   24690                           }
   24691                           break;
   24692                         }
   24693                         default: {
   24694                           if (((instr & 0xe00) == 0xa00)) {
   24695                             UnallocatedT32(instr);
   24696                             return;
   24697                           }
   24698                           UnimplementedT32_32("CDP", instr);
   24699                           break;
   24700                         }
   24701                       }
   24702                       break;
   24703                     }
   24704                     case 0x10000000: {
   24705                       // 0xfe000000
   24706                       switch (instr & 0x00000e00) {
   24707                         case 0x00000a00: {
   24708                           // 0xfe000a00
   24709                           switch (instr & 0x00b00140) {
   24710                             case 0x00000000: {
   24711                               // 0xfe000a00
   24712                               unsigned rd = ExtractSRegister(instr, 22, 12);
   24713                               unsigned rn = ExtractSRegister(instr, 7, 16);
   24714                               unsigned rm = ExtractSRegister(instr, 5, 0);
   24715                               // VSELEQ.F32 <Sd>, <Sn>, <Sm> ; T1
   24716                               vseleq(F32,
   24717                                      SRegister(rd),
   24718                                      SRegister(rn),
   24719                                      SRegister(rm));
   24720                               break;
   24721                             }
   24722                             case 0x00000100: {
   24723                               // 0xfe000b00
   24724                               unsigned rd = ExtractDRegister(instr, 22, 12);
   24725                               unsigned rn = ExtractDRegister(instr, 7, 16);
   24726                               unsigned rm = ExtractDRegister(instr, 5, 0);
   24727                               // VSELEQ.F64 <Dd>, <Dn>, <Dm> ; T1
   24728                               vseleq(F64,
   24729                                      DRegister(rd),
   24730                                      DRegister(rn),
   24731                                      DRegister(rm));
   24732                               break;
   24733                             }
   24734                             case 0x00100000: {
   24735                               // 0xfe100a00
   24736                               unsigned rd = ExtractSRegister(instr, 22, 12);
   24737                               unsigned rn = ExtractSRegister(instr, 7, 16);
   24738                               unsigned rm = ExtractSRegister(instr, 5, 0);
   24739                               // VSELVS.F32 <Sd>, <Sn>, <Sm> ; T1
   24740                               vselvs(F32,
   24741                                      SRegister(rd),
   24742                                      SRegister(rn),
   24743                                      SRegister(rm));
   24744                               break;
   24745                             }
   24746                             case 0x00100100: {
   24747                               // 0xfe100b00
   24748                               unsigned rd = ExtractDRegister(instr, 22, 12);
   24749                               unsigned rn = ExtractDRegister(instr, 7, 16);
   24750                               unsigned rm = ExtractDRegister(instr, 5, 0);
   24751                               // VSELVS.F64 <Dd>, <Dn>, <Dm> ; T1
   24752                               vselvs(F64,
   24753                                      DRegister(rd),
   24754                                      DRegister(rn),
   24755                                      DRegister(rm));
   24756                               break;
   24757                             }
   24758                             case 0x00200000: {
   24759                               // 0xfe200a00
   24760                               unsigned rd = ExtractSRegister(instr, 22, 12);
   24761                               unsigned rn = ExtractSRegister(instr, 7, 16);
   24762                               unsigned rm = ExtractSRegister(instr, 5, 0);
   24763                               // VSELGE.F32 <Sd>, <Sn>, <Sm> ; T1
   24764                               vselge(F32,
   24765                                      SRegister(rd),
   24766                                      SRegister(rn),
   24767                                      SRegister(rm));
   24768                               break;
   24769                             }
   24770                             case 0x00200100: {
   24771                               // 0xfe200b00
   24772                               unsigned rd = ExtractDRegister(instr, 22, 12);
   24773                               unsigned rn = ExtractDRegister(instr, 7, 16);
   24774                               unsigned rm = ExtractDRegister(instr, 5, 0);
   24775                               // VSELGE.F64 <Dd>, <Dn>, <Dm> ; T1
   24776                               vselge(F64,
   24777                                      DRegister(rd),
   24778                                      DRegister(rn),
   24779                                      DRegister(rm));
   24780                               break;
   24781                             }
   24782                             case 0x00300000: {
   24783                               // 0xfe300a00
   24784                               unsigned rd = ExtractSRegister(instr, 22, 12);
   24785                               unsigned rn = ExtractSRegister(instr, 7, 16);
   24786                               unsigned rm = ExtractSRegister(instr, 5, 0);
   24787                               // VSELGT.F32 <Sd>, <Sn>, <Sm> ; T1
   24788                               vselgt(F32,
   24789                                      SRegister(rd),
   24790                                      SRegister(rn),
   24791                                      SRegister(rm));
   24792                               break;
   24793                             }
   24794                             case 0x00300100: {
   24795                               // 0xfe300b00
   24796                               unsigned rd = ExtractDRegister(instr, 22, 12);
   24797                               unsigned rn = ExtractDRegister(instr, 7, 16);
   24798                               unsigned rm = ExtractDRegister(instr, 5, 0);
   24799                               // VSELGT.F64 <Dd>, <Dn>, <Dm> ; T1
   24800                               vselgt(F64,
   24801                                      DRegister(rd),
   24802                                      DRegister(rn),
   24803                                      DRegister(rm));
   24804                               break;
   24805                             }
   24806                             case 0x00800000: {
   24807                               // 0xfe800a00
   24808                               unsigned rd = ExtractSRegister(instr, 22, 12);
   24809                               unsigned rn = ExtractSRegister(instr, 7, 16);
   24810                               unsigned rm = ExtractSRegister(instr, 5, 0);
   24811                               // VMAXNM{<q>}.F32 <Sd>, <Sn>, <Sm> ; T2
   24812                               vmaxnm(F32,
   24813                                      SRegister(rd),
   24814                                      SRegister(rn),
   24815                                      SRegister(rm));
   24816                               break;
   24817                             }
   24818                             case 0x00800040: {
   24819                               // 0xfe800a40
   24820                               unsigned rd = ExtractSRegister(instr, 22, 12);
   24821                               unsigned rn = ExtractSRegister(instr, 7, 16);
   24822                               unsigned rm = ExtractSRegister(instr, 5, 0);
   24823                               // VMINNM{<q>}.F32 <Sd>, <Sn>, <Sm> ; T2
   24824                               vminnm(F32,
   24825                                      SRegister(rd),
   24826                                      SRegister(rn),
   24827                                      SRegister(rm));
   24828                               break;
   24829                             }
   24830                             case 0x00800100: {
   24831                               // 0xfe800b00
   24832                               unsigned rd = ExtractDRegister(instr, 22, 12);
   24833                               unsigned rn = ExtractDRegister(instr, 7, 16);
   24834                               unsigned rm = ExtractDRegister(instr, 5, 0);
   24835                               // VMAXNM{<q>}.F64 <Dd>, <Dn>, <Dm> ; T2
   24836                               vmaxnm(F64,
   24837                                      DRegister(rd),
   24838                                      DRegister(rn),
   24839                                      DRegister(rm));
   24840                               break;
   24841                             }
   24842                             case 0x00800140: {
   24843                               // 0xfe800b40
   24844                               unsigned rd = ExtractDRegister(instr, 22, 12);
   24845                               unsigned rn = ExtractDRegister(instr, 7, 16);
   24846                               unsigned rm = ExtractDRegister(instr, 5, 0);
   24847                               // VMINNM{<q>}.F64 <Dd>, <Dn>, <Dm> ; T2
   24848                               vminnm(F64,
   24849                                      DRegister(rd),
   24850                                      DRegister(rn),
   24851                                      DRegister(rm));
   24852                               break;
   24853                             }
   24854                             case 0x00b00040: {
   24855                               // 0xfeb00a40
   24856                               switch (instr & 0x000f0000) {
   24857                                 case 0x00080000: {
   24858                                   // 0xfeb80a40
   24859                                   if ((instr & 0x00000080) == 0x00000000) {
   24860                                     unsigned rd =
   24861                                         ExtractSRegister(instr, 22, 12);
   24862                                     unsigned rm = ExtractSRegister(instr, 5, 0);
   24863                                     // VRINTA{<q>}.F32.F32 <Sd>, <Sm> ; T1
   24864                                     vrinta(F32,
   24865                                            F32,
   24866                                            SRegister(rd),
   24867                                            SRegister(rm));
   24868                                   } else {
   24869                                     UnallocatedT32(instr);
   24870                                   }
   24871                                   break;
   24872                                 }
   24873                                 case 0x00090000: {
   24874                                   // 0xfeb90a40
   24875                                   if ((instr & 0x00000080) == 0x00000000) {
   24876                                     unsigned rd =
   24877                                         ExtractSRegister(instr, 22, 12);
   24878                                     unsigned rm = ExtractSRegister(instr, 5, 0);
   24879                                     // VRINTN{<q>}.F32.F32 <Sd>, <Sm> ; T1
   24880                                     vrintn(F32,
   24881                                            F32,
   24882                                            SRegister(rd),
   24883                                            SRegister(rm));
   24884                                   } else {
   24885                                     UnallocatedT32(instr);
   24886                                   }
   24887                                   break;
   24888                                 }
   24889                                 case 0x000a0000: {
   24890                                   // 0xfeba0a40
   24891                                   if ((instr & 0x00000080) == 0x00000000) {
   24892                                     unsigned rd =
   24893                                         ExtractSRegister(instr, 22, 12);
   24894                                     unsigned rm = ExtractSRegister(instr, 5, 0);
   24895                                     // VRINTP{<q>}.F32.F32 <Sd>, <Sm> ; T1
   24896                                     vrintp(F32,
   24897                                            F32,
   24898                                            SRegister(rd),
   24899                                            SRegister(rm));
   24900                                   } else {
   24901                                     UnallocatedT32(instr);
   24902                                   }
   24903                                   break;
   24904                                 }
   24905                                 case 0x000b0000: {
   24906                                   // 0xfebb0a40
   24907                                   if ((instr & 0x00000080) == 0x00000000) {
   24908                                     unsigned rd =
   24909                                         ExtractSRegister(instr, 22, 12);
   24910                                     unsigned rm = ExtractSRegister(instr, 5, 0);
   24911                                     // VRINTM{<q>}.F32.F32 <Sd>, <Sm> ; T1
   24912                                     vrintm(F32,
   24913                                            F32,
   24914                                            SRegister(rd),
   24915                                            SRegister(rm));
   24916                                   } else {
   24917                                     UnallocatedT32(instr);
   24918                                   }
   24919                                   break;
   24920                                 }
   24921                                 case 0x000c0000: {
   24922                                   // 0xfebc0a40
   24923                                   DataType dt =
   24924                                       Dt_op_2_Decode((instr >> 7) & 0x1);
   24925                                   if (dt.Is(kDataTypeValueInvalid)) {
   24926                                     UnallocatedT32(instr);
   24927                                     return;
   24928                                   }
   24929                                   unsigned rd = ExtractSRegister(instr, 22, 12);
   24930                                   unsigned rm = ExtractSRegister(instr, 5, 0);
   24931                                   // VCVTA{<q>}.<dt>.F32 <Sd>, <Sm> ; T1
   24932                                   vcvta(dt, F32, SRegister(rd), SRegister(rm));
   24933                                   break;
   24934                                 }
   24935                                 case 0x000d0000: {
   24936                                   // 0xfebd0a40
   24937                                   DataType dt =
   24938                                       Dt_op_2_Decode((instr >> 7) & 0x1);
   24939                                   if (dt.Is(kDataTypeValueInvalid)) {
   24940                                     UnallocatedT32(instr);
   24941                                     return;
   24942                                   }
   24943                                   unsigned rd = ExtractSRegister(instr, 22, 12);
   24944                                   unsigned rm = ExtractSRegister(instr, 5, 0);
   24945                                   // VCVTN{<q>}.<dt>.F32 <Sd>, <Sm> ; T1
   24946                                   vcvtn(dt, F32, SRegister(rd), SRegister(rm));
   24947                                   break;
   24948                                 }
   24949                                 case 0x000e0000: {
   24950                                   // 0xfebe0a40
   24951                                   DataType dt =
   24952                                       Dt_op_2_Decode((instr >> 7) & 0x1);
   24953                                   if (dt.Is(kDataTypeValueInvalid)) {
   24954                                     UnallocatedT32(instr);
   24955                                     return;
   24956                                   }
   24957                                   unsigned rd = ExtractSRegister(instr, 22, 12);
   24958                                   unsigned rm = ExtractSRegister(instr, 5, 0);
   24959                                   // VCVTP{<q>}.<dt>.F32 <Sd>, <Sm> ; T1
   24960                                   vcvtp(dt, F32, SRegister(rd), SRegister(rm));
   24961                                   break;
   24962                                 }
   24963                                 case 0x000f0000: {
   24964                                   // 0xfebf0a40
   24965                                   DataType dt =
   24966                                       Dt_op_2_Decode((instr >> 7) & 0x1);
   24967                                   if (dt.Is(kDataTypeValueInvalid)) {
   24968                                     UnallocatedT32(instr);
   24969                                     return;
   24970                                   }
   24971                                   unsigned rd = ExtractSRegister(instr, 22, 12);
   24972                                   unsigned rm = ExtractSRegister(instr, 5, 0);
   24973                                   // VCVTM{<q>}.<dt>.F32 <Sd>, <Sm> ; T1
   24974                                   vcvtm(dt, F32, SRegister(rd), SRegister(rm));
   24975                                   break;
   24976                                 }
   24977                                 default:
   24978                                   UnallocatedT32(instr);
   24979                                   break;
   24980                               }
   24981                               break;
   24982                             }
   24983                             case 0x00b00140: {
   24984                               // 0xfeb00b40
   24985                               switch (instr & 0x000f0000) {
   24986                                 case 0x00080000: {
   24987                                   // 0xfeb80b40
   24988                                   if ((instr & 0x00000080) == 0x00000000) {
   24989                                     unsigned rd =
   24990                                         ExtractDRegister(instr, 22, 12);
   24991                                     unsigned rm = ExtractDRegister(instr, 5, 0);
   24992                                     // VRINTA{<q>}.F64.F64 <Dd>, <Dm> ; T1
   24993                                     vrinta(F64,
   24994                                            F64,
   24995                                            DRegister(rd),
   24996                                            DRegister(rm));
   24997                                   } else {
   24998                                     UnallocatedT32(instr);
   24999                                   }
   25000                                   break;
   25001                                 }
   25002                                 case 0x00090000: {
   25003                                   // 0xfeb90b40
   25004                                   if ((instr & 0x00000080) == 0x00000000) {
   25005                                     unsigned rd =
   25006                                         ExtractDRegister(instr, 22, 12);
   25007                                     unsigned rm = ExtractDRegister(instr, 5, 0);
   25008                                     // VRINTN{<q>}.F64.F64 <Dd>, <Dm> ; T1
   25009                                     vrintn(F64,
   25010                                            F64,
   25011                                            DRegister(rd),
   25012                                            DRegister(rm));
   25013                                   } else {
   25014                                     UnallocatedT32(instr);
   25015                                   }
   25016                                   break;
   25017                                 }
   25018                                 case 0x000a0000: {
   25019                                   // 0xfeba0b40
   25020                                   if ((instr & 0x00000080) == 0x00000000) {
   25021                                     unsigned rd =
   25022                                         ExtractDRegister(instr, 22, 12);
   25023                                     unsigned rm = ExtractDRegister(instr, 5, 0);
   25024                                     // VRINTP{<q>}.F64.F64 <Dd>, <Dm> ; T1
   25025                                     vrintp(F64,
   25026                                            F64,
   25027                                            DRegister(rd),
   25028                                            DRegister(rm));
   25029                                   } else {
   25030                                     UnallocatedT32(instr);
   25031                                   }
   25032                                   break;
   25033                                 }
   25034                                 case 0x000b0000: {
   25035                                   // 0xfebb0b40
   25036                                   if ((instr & 0x00000080) == 0x00000000) {
   25037                                     unsigned rd =
   25038                                         ExtractDRegister(instr, 22, 12);
   25039                                     unsigned rm = ExtractDRegister(instr, 5, 0);
   25040                                     // VRINTM{<q>}.F64.F64 <Dd>, <Dm> ; T1
   25041                                     vrintm(F64,
   25042                                            F64,
   25043                                            DRegister(rd),
   25044                                            DRegister(rm));
   25045                                   } else {
   25046                                     UnallocatedT32(instr);
   25047                                   }
   25048                                   break;
   25049                                 }
   25050                                 case 0x000c0000: {
   25051                                   // 0xfebc0b40
   25052                                   DataType dt =
   25053                                       Dt_op_2_Decode((instr >> 7) & 0x1);
   25054                                   if (dt.Is(kDataTypeValueInvalid)) {
   25055                                     UnallocatedT32(instr);
   25056                                     return;
   25057                                   }
   25058                                   unsigned rd = ExtractSRegister(instr, 22, 12);
   25059                                   unsigned rm = ExtractDRegister(instr, 5, 0);
   25060                                   // VCVTA{<q>}.<dt>.F64 <Sd>, <Dm> ; T1
   25061                                   vcvta(dt, F64, SRegister(rd), DRegister(rm));
   25062                                   break;
   25063                                 }
   25064                                 case 0x000d0000: {
   25065                                   // 0xfebd0b40
   25066                                   DataType dt =
   25067                                       Dt_op_2_Decode((instr >> 7) & 0x1);
   25068                                   if (dt.Is(kDataTypeValueInvalid)) {
   25069                                     UnallocatedT32(instr);
   25070                                     return;
   25071                                   }
   25072                                   unsigned rd = ExtractSRegister(instr, 22, 12);
   25073                                   unsigned rm = ExtractDRegister(instr, 5, 0);
   25074                                   // VCVTN{<q>}.<dt>.F64 <Sd>, <Dm> ; T1
   25075                                   vcvtn(dt, F64, SRegister(rd), DRegister(rm));
   25076                                   break;
   25077                                 }
   25078                                 case 0x000e0000: {
   25079                                   // 0xfebe0b40
   25080                                   DataType dt =
   25081                                       Dt_op_2_Decode((instr >> 7) & 0x1);
   25082                                   if (dt.Is(kDataTypeValueInvalid)) {
   25083                                     UnallocatedT32(instr);
   25084                                     return;
   25085                                   }
   25086                                   unsigned rd = ExtractSRegister(instr, 22, 12);
   25087                                   unsigned rm = ExtractDRegister(instr, 5, 0);
   25088                                   // VCVTP{<q>}.<dt>.F64 <Sd>, <Dm> ; T1
   25089                                   vcvtp(dt, F64, SRegister(rd), DRegister(rm));
   25090                                   break;
   25091                                 }
   25092                                 case 0x000f0000: {
   25093                                   // 0xfebf0b40
   25094                                   DataType dt =
   25095                                       Dt_op_2_Decode((instr >> 7) & 0x1);
   25096                                   if (dt.Is(kDataTypeValueInvalid)) {
   25097                                     UnallocatedT32(instr);
   25098                                     return;
   25099                                   }
   25100                                   unsigned rd = ExtractSRegister(instr, 22, 12);
   25101                                   unsigned rm = ExtractDRegister(instr, 5, 0);
   25102                                   // VCVTM{<q>}.<dt>.F64 <Sd>, <Dm> ; T1
   25103                                   vcvtm(dt, F64, SRegister(rd), DRegister(rm));
   25104                                   break;
   25105                                 }
   25106                                 default:
   25107                                   UnallocatedT32(instr);
   25108                                   break;
   25109                               }
   25110                               break;
   25111                             }
   25112                             default:
   25113                               UnallocatedT32(instr);
   25114                               break;
   25115                           }
   25116                           break;
   25117                         }
   25118                         default: {
   25119                           if (((instr & 0xe00) == 0xa00)) {
   25120                             UnallocatedT32(instr);
   25121                             return;
   25122                           }
   25123                           UnimplementedT32_32("CDP2", instr);
   25124                           break;
   25125                         }
   25126                       }
   25127                       break;
   25128                     }
   25129                   }
   25130                   break;
   25131                 }
   25132                 case 0x00000010: {
   25133                   // 0xee000010
   25134                   switch (instr & 0x10100000) {
   25135                     case 0x00000000: {
   25136                       // 0xee000010
   25137                       switch (instr & 0x00000e00) {
   25138                         case 0x00000a00: {
   25139                           // 0xee000a10
   25140                           switch (instr & 0x00800100) {
   25141                             case 0x00000000: {
   25142                               // 0xee000a10
   25143                               if ((instr & 0x00600000) == 0x00000000) {
   25144                                 unsigned rn = ExtractSRegister(instr, 7, 16);
   25145                                 unsigned rt = (instr >> 12) & 0xf;
   25146                                 // VMOV{<c>}{<q>} <Sn>, <Rt> ; T1
   25147                                 vmov(CurrentCond(),
   25148                                      SRegister(rn),
   25149                                      Register(rt));
   25150                                 if (((instr & 0xfff00f7f) != 0xee000a10)) {
   25151                                   UnpredictableT32(instr);
   25152                                 }
   25153                               } else {
   25154                                 UnallocatedT32(instr);
   25155                               }
   25156                               break;
   25157                             }
   25158                             case 0x00000100: {
   25159                               // 0xee000b10
   25160                               unsigned lane;
   25161                               DataType dt =
   25162                                   Dt_opc1_opc2_1_Decode(((instr >> 5) & 0x3) |
   25163                                                             ((instr >> 19) &
   25164                                                              0xc),
   25165                                                         &lane);
   25166                               if (dt.Is(kDataTypeValueInvalid)) {
   25167                                 UnallocatedT32(instr);
   25168                                 return;
   25169                               }
   25170                               unsigned rd = ExtractDRegister(instr, 7, 16);
   25171                               unsigned rt = (instr >> 12) & 0xf;
   25172                               // VMOV{<c>}{<q>}{.<size>} <Dd[x]>, <Rt> ; T1
   25173                               vmov(CurrentCond(),
   25174                                    dt,
   25175                                    DRegisterLane(rd, lane),
   25176                                    Register(rt));
   25177                               if (((instr & 0xff900f1f) != 0xee000b10)) {
   25178                                 UnpredictableT32(instr);
   25179                               }
   25180                               break;
   25181                             }
   25182                             case 0x00800000: {
   25183                               // 0xee800a10
   25184                               if ((instr & 0x00600000) == 0x00600000) {
   25185                                 unsigned spec_reg = (instr >> 16) & 0xf;
   25186                                 unsigned rt = (instr >> 12) & 0xf;
   25187                                 switch (spec_reg) {
   25188                                   case 0x0:
   25189                                   case 0x1:
   25190                                   case 0x8: {
   25191                                     // VMSR{<c>}{<q>} <spec_reg>, <Rt> ; T1
   25192                                     vmsr(CurrentCond(),
   25193                                          SpecialFPRegister(spec_reg),
   25194                                          Register(rt));
   25195                                     if (((instr & 0xfff00fff) != 0xeee00a10)) {
   25196                                       UnpredictableT32(instr);
   25197                                     }
   25198                                     break;
   25199                                   }
   25200                                   default:
   25201                                     UnallocatedT32(instr);
   25202                                     break;
   25203                                 }
   25204                               } else {
   25205                                 UnallocatedT32(instr);
   25206                               }
   25207                               break;
   25208                             }
   25209                             case 0x00800100: {
   25210                               // 0xee800b10
   25211                               switch (instr & 0x00200040) {
   25212                                 case 0x00000000: {
   25213                                   // 0xee800b10
   25214                                   DataType dt =
   25215                                       Dt_B_E_1_Decode(((instr >> 5) & 0x1) |
   25216                                                       ((instr >> 21) & 0x2));
   25217                                   if (dt.Is(kDataTypeValueInvalid)) {
   25218                                     UnallocatedT32(instr);
   25219                                     return;
   25220                                   }
   25221                                   unsigned rd = ExtractDRegister(instr, 7, 16);
   25222                                   unsigned rt = (instr >> 12) & 0xf;
   25223                                   // VDUP{<c>}{<q>}.<dt> <Dd>, <Rt> ; T1
   25224                                   vdup(CurrentCond(),
   25225                                        dt,
   25226                                        DRegister(rd),
   25227                                        Register(rt));
   25228                                   if (((instr & 0xffb00f5f) != 0xee800b10)) {
   25229                                     UnpredictableT32(instr);
   25230                                   }
   25231                                   break;
   25232                                 }
   25233                                 case 0x00200000: {
   25234                                   // 0xeea00b10
   25235                                   DataType dt =
   25236                                       Dt_B_E_1_Decode(((instr >> 5) & 0x1) |
   25237                                                       ((instr >> 21) & 0x2));
   25238                                   if (dt.Is(kDataTypeValueInvalid)) {
   25239                                     UnallocatedT32(instr);
   25240                                     return;
   25241                                   }
   25242                                   if (((instr >> 16) & 1) != 0) {
   25243                                     UnallocatedT32(instr);
   25244                                     return;
   25245                                   }
   25246                                   unsigned rd = ExtractQRegister(instr, 7, 16);
   25247                                   unsigned rt = (instr >> 12) & 0xf;
   25248                                   // VDUP{<c>}{<q>}.<dt> <Qd>, <Rt> ; T1
   25249                                   vdup(CurrentCond(),
   25250                                        dt,
   25251                                        QRegister(rd),
   25252                                        Register(rt));
   25253                                   if (((instr & 0xffb00f5f) != 0xeea00b10)) {
   25254                                     UnpredictableT32(instr);
   25255                                   }
   25256                                   break;
   25257                                 }
   25258                                 default:
   25259                                   UnallocatedT32(instr);
   25260                                   break;
   25261                               }
   25262                               break;
   25263                             }
   25264                           }
   25265                           break;
   25266                         }
   25267                         default: {
   25268                           if (((instr & 0xe00) == 0xa00)) {
   25269                             UnallocatedT32(instr);
   25270                             return;
   25271                           }
   25272                           UnimplementedT32_32("MCR", instr);
   25273                           break;
   25274                         }
   25275                       }
   25276                       break;
   25277                     }
   25278                     case 0x00100000: {
   25279                       // 0xee100010
   25280                       switch (instr & 0x00000e00) {
   25281                         case 0x00000a00: {
   25282                           // 0xee100a10
   25283                           switch (instr & 0x00000100) {
   25284                             case 0x00000000: {
   25285                               // 0xee100a10
   25286                               switch (instr & 0x00e00000) {
   25287                                 case 0x00000000: {
   25288                                   // 0xee100a10
   25289                                   unsigned rt = (instr >> 12) & 0xf;
   25290                                   unsigned rn = ExtractSRegister(instr, 7, 16);
   25291                                   // VMOV{<c>}{<q>} <Rt>, <Sn> ; T1
   25292                                   vmov(CurrentCond(),
   25293                                        Register(rt),
   25294                                        SRegister(rn));
   25295                                   if (((instr & 0xfff00f7f) != 0xee100a10)) {
   25296                                     UnpredictableT32(instr);
   25297                                   }
   25298                                   break;
   25299                                 }
   25300                                 case 0x00e00000: {
   25301                                   // 0xeef00a10
   25302                                   unsigned rt = (instr >> 12) & 0xf;
   25303                                   unsigned spec_reg = (instr >> 16) & 0xf;
   25304                                   switch (spec_reg) {
   25305                                     case 0x0:
   25306                                     case 0x1:
   25307                                     case 0x5:
   25308                                     case 0x6:
   25309                                     case 0x7:
   25310                                     case 0x8: {
   25311                                       // VMRS{<c>}{<q>} <Rt>, <spec_reg> ; T1
   25312                                       vmrs(CurrentCond(),
   25313                                            RegisterOrAPSR_nzcv(rt),
   25314                                            SpecialFPRegister(spec_reg));
   25315                                       if (((instr & 0xfff00fff) !=
   25316                                            0xeef00a10)) {
   25317                                         UnpredictableT32(instr);
   25318                                       }
   25319                                       break;
   25320                                     }
   25321                                     default:
   25322                                       UnallocatedT32(instr);
   25323                                       break;
   25324                                   }
   25325                                   break;
   25326                                 }
   25327                                 default:
   25328                                   UnallocatedT32(instr);
   25329                                   break;
   25330                               }
   25331                               break;
   25332                             }
   25333                             case 0x00000100: {
   25334                               // 0xee100b10
   25335                               unsigned lane;
   25336                               DataType dt =
   25337                                   Dt_U_opc1_opc2_1_Decode(((instr >> 5) & 0x3) |
   25338                                                               ((instr >> 19) &
   25339                                                                0xc) |
   25340                                                               ((instr >> 19) &
   25341                                                                0x10),
   25342                                                           &lane);
   25343                               if (dt.Is(kDataTypeValueInvalid)) {
   25344                                 UnallocatedT32(instr);
   25345                                 return;
   25346                               }
   25347                               unsigned rt = (instr >> 12) & 0xf;
   25348                               unsigned rn = ExtractDRegister(instr, 7, 16);
   25349                               // VMOV{<c>}{<q>}{.<dt>} <Rt>, <Dn[x]> ; T1
   25350                               vmov(CurrentCond(),
   25351                                    dt,
   25352                                    Register(rt),
   25353                                    DRegisterLane(rn, lane));
   25354                               if (((instr & 0xff100f1f) != 0xee100b10)) {
   25355                                 UnpredictableT32(instr);
   25356                               }
   25357                               break;
   25358                             }
   25359                           }
   25360                           break;
   25361                         }
   25362                         default: {
   25363                           if (((instr & 0xe00) == 0xa00)) {
   25364                             UnallocatedT32(instr);
   25365                             return;
   25366                           }
   25367                           UnimplementedT32_32("MRC", instr);
   25368                           break;
   25369                         }
   25370                       }
   25371                       break;
   25372                     }
   25373                     case 0x10000000: {
   25374                       // 0xfe000010
   25375                       if (((instr & 0xe00) == 0xa00)) {
   25376                         UnallocatedT32(instr);
   25377                         return;
   25378                       }
   25379                       UnimplementedT32_32("MCR2", instr);
   25380                       break;
   25381                     }
   25382                     case 0x10100000: {
   25383                       // 0xfe100010
   25384                       if (((instr & 0xe00) == 0xa00)) {
   25385                         UnallocatedT32(instr);
   25386                         return;
   25387                       }
   25388                       UnimplementedT32_32("MRC2", instr);
   25389                       break;
   25390                     }
   25391                   }
   25392                   break;
   25393                 }
   25394                 case 0x01000000: {
   25395                   // 0xef000000
   25396                   switch (instr & 0x00800000) {
   25397                     case 0x00000000: {
   25398                       // 0xef000000
   25399                       switch (instr & 0x00000f40) {
   25400                         case 0x00000000: {
   25401                           // 0xef000000
   25402                           DataType dt = Dt_U_size_1_Decode(
   25403                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
   25404                           if (dt.Is(kDataTypeValueInvalid)) {
   25405                             UnallocatedT32(instr);
   25406                             return;
   25407                           }
   25408                           unsigned rd = ExtractDRegister(instr, 22, 12);
   25409                           unsigned rn = ExtractDRegister(instr, 7, 16);
   25410                           unsigned rm = ExtractDRegister(instr, 5, 0);
   25411                           // VHADD{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
   25412                           vhadd(CurrentCond(),
   25413                                 dt,
   25414                                 DRegister(rd),
   25415                                 DRegister(rn),
   25416                                 DRegister(rm));
   25417                           break;
   25418                         }
   25419                         case 0x00000040: {
   25420                           // 0xef000040
   25421                           DataType dt = Dt_U_size_1_Decode(
   25422                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
   25423                           if (dt.Is(kDataTypeValueInvalid)) {
   25424                             UnallocatedT32(instr);
   25425                             return;
   25426                           }
   25427                           if (((instr >> 12) & 1) != 0) {
   25428                             UnallocatedT32(instr);
   25429                             return;
   25430                           }
   25431                           unsigned rd = ExtractQRegister(instr, 22, 12);
   25432                           if (((instr >> 16) & 1) != 0) {
   25433                             UnallocatedT32(instr);
   25434                             return;
   25435                           }
   25436                           unsigned rn = ExtractQRegister(instr, 7, 16);
   25437                           if ((instr & 1) != 0) {
   25438                             UnallocatedT32(instr);
   25439                             return;
   25440                           }
   25441                           unsigned rm = ExtractQRegister(instr, 5, 0);
   25442                           // VHADD{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
   25443                           vhadd(CurrentCond(),
   25444                                 dt,
   25445                                 QRegister(rd),
   25446                                 QRegister(rn),
   25447                                 QRegister(rm));
   25448                           break;
   25449                         }
   25450                         case 0x00000100: {
   25451                           // 0xef000100
   25452                           DataType dt = Dt_U_size_1_Decode(
   25453                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
   25454                           if (dt.Is(kDataTypeValueInvalid)) {
   25455                             UnallocatedT32(instr);
   25456                             return;
   25457                           }
   25458                           unsigned rd = ExtractDRegister(instr, 22, 12);
   25459                           unsigned rn = ExtractDRegister(instr, 7, 16);
   25460                           unsigned rm = ExtractDRegister(instr, 5, 0);
   25461                           // VRHADD{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
   25462                           vrhadd(CurrentCond(),
   25463                                  dt,
   25464                                  DRegister(rd),
   25465                                  DRegister(rn),
   25466                                  DRegister(rm));
   25467                           break;
   25468                         }
   25469                         case 0x00000140: {
   25470                           // 0xef000140
   25471                           DataType dt = Dt_U_size_1_Decode(
   25472                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
   25473                           if (dt.Is(kDataTypeValueInvalid)) {
   25474                             UnallocatedT32(instr);
   25475                             return;
   25476                           }
   25477                           if (((instr >> 12) & 1) != 0) {
   25478                             UnallocatedT32(instr);
   25479                             return;
   25480                           }
   25481                           unsigned rd = ExtractQRegister(instr, 22, 12);
   25482                           if (((instr >> 16) & 1) != 0) {
   25483                             UnallocatedT32(instr);
   25484                             return;
   25485                           }
   25486                           unsigned rn = ExtractQRegister(instr, 7, 16);
   25487                           if ((instr & 1) != 0) {
   25488                             UnallocatedT32(instr);
   25489                             return;
   25490                           }
   25491                           unsigned rm = ExtractQRegister(instr, 5, 0);
   25492                           // VRHADD{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
   25493                           vrhadd(CurrentCond(),
   25494                                  dt,
   25495                                  QRegister(rd),
   25496                                  QRegister(rn),
   25497                                  QRegister(rm));
   25498                           break;
   25499                         }
   25500                         case 0x00000200: {
   25501                           // 0xef000200
   25502                           DataType dt = Dt_U_size_1_Decode(
   25503                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
   25504                           if (dt.Is(kDataTypeValueInvalid)) {
   25505                             UnallocatedT32(instr);
   25506                             return;
   25507                           }
   25508                           unsigned rd = ExtractDRegister(instr, 22, 12);
   25509                           unsigned rn = ExtractDRegister(instr, 7, 16);
   25510                           unsigned rm = ExtractDRegister(instr, 5, 0);
   25511                           // VHSUB{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
   25512                           vhsub(CurrentCond(),
   25513                                 dt,
   25514                                 DRegister(rd),
   25515                                 DRegister(rn),
   25516                                 DRegister(rm));
   25517                           break;
   25518                         }
   25519                         case 0x00000240: {
   25520                           // 0xef000240
   25521                           DataType dt = Dt_U_size_1_Decode(
   25522                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
   25523                           if (dt.Is(kDataTypeValueInvalid)) {
   25524                             UnallocatedT32(instr);
   25525                             return;
   25526                           }
   25527                           if (((instr >> 12) & 1) != 0) {
   25528                             UnallocatedT32(instr);
   25529                             return;
   25530                           }
   25531                           unsigned rd = ExtractQRegister(instr, 22, 12);
   25532                           if (((instr >> 16) & 1) != 0) {
   25533                             UnallocatedT32(instr);
   25534                             return;
   25535                           }
   25536                           unsigned rn = ExtractQRegister(instr, 7, 16);
   25537                           if ((instr & 1) != 0) {
   25538                             UnallocatedT32(instr);
   25539                             return;
   25540                           }
   25541                           unsigned rm = ExtractQRegister(instr, 5, 0);
   25542                           // VHSUB{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
   25543                           vhsub(CurrentCond(),
   25544                                 dt,
   25545                                 QRegister(rd),
   25546                                 QRegister(rn),
   25547                                 QRegister(rm));
   25548                           break;
   25549                         }
   25550                         case 0x00000300: {
   25551                           // 0xef000300
   25552                           DataType dt = Dt_U_size_1_Decode(
   25553                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
   25554                           if (dt.Is(kDataTypeValueInvalid)) {
   25555                             UnallocatedT32(instr);
   25556                             return;
   25557                           }
   25558                           unsigned rd = ExtractDRegister(instr, 22, 12);
   25559                           unsigned rn = ExtractDRegister(instr, 7, 16);
   25560                           unsigned rm = ExtractDRegister(instr, 5, 0);
   25561                           // VCGT{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
   25562                           vcgt(CurrentCond(),
   25563                                dt,
   25564                                DRegister(rd),
   25565                                DRegister(rn),
   25566                                DRegister(rm));
   25567                           break;
   25568                         }
   25569                         case 0x00000340: {
   25570                           // 0xef000340
   25571                           DataType dt = Dt_U_size_1_Decode(
   25572                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
   25573                           if (dt.Is(kDataTypeValueInvalid)) {
   25574                             UnallocatedT32(instr);
   25575                             return;
   25576                           }
   25577                           if (((instr >> 12) & 1) != 0) {
   25578                             UnallocatedT32(instr);
   25579                             return;
   25580                           }
   25581                           unsigned rd = ExtractQRegister(instr, 22, 12);
   25582                           if (((instr >> 16) & 1) != 0) {
   25583                             UnallocatedT32(instr);
   25584                             return;
   25585                           }
   25586                           unsigned rn = ExtractQRegister(instr, 7, 16);
   25587                           if ((instr & 1) != 0) {
   25588                             UnallocatedT32(instr);
   25589                             return;
   25590                           }
   25591                           unsigned rm = ExtractQRegister(instr, 5, 0);
   25592                           // VCGT{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
   25593                           vcgt(CurrentCond(),
   25594                                dt,
   25595                                QRegister(rd),
   25596                                QRegister(rn),
   25597                                QRegister(rm));
   25598                           break;
   25599                         }
   25600                         case 0x00000400: {
   25601                           // 0xef000400
   25602                           DataType dt = Dt_U_size_3_Decode(
   25603                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
   25604                           if (dt.Is(kDataTypeValueInvalid)) {
   25605                             UnallocatedT32(instr);
   25606                             return;
   25607                           }
   25608                           unsigned rd = ExtractDRegister(instr, 22, 12);
   25609                           unsigned rm = ExtractDRegister(instr, 5, 0);
   25610                           unsigned rn = ExtractDRegister(instr, 7, 16);
   25611                           // VSHL{<c>}{<q>}.<dt> {<Dd>}, <Dm>, <Dn> ; T1
   25612                           vshl(CurrentCond(),
   25613                                dt,
   25614                                DRegister(rd),
   25615                                DRegister(rm),
   25616                                DRegister(rn));
   25617                           break;
   25618                         }
   25619                         case 0x00000440: {
   25620                           // 0xef000440
   25621                           DataType dt = Dt_U_size_3_Decode(
   25622                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
   25623                           if (dt.Is(kDataTypeValueInvalid)) {
   25624                             UnallocatedT32(instr);
   25625                             return;
   25626                           }
   25627                           if (((instr >> 12) & 1) != 0) {
   25628                             UnallocatedT32(instr);
   25629                             return;
   25630                           }
   25631                           unsigned rd = ExtractQRegister(instr, 22, 12);
   25632                           if ((instr & 1) != 0) {
   25633                             UnallocatedT32(instr);
   25634                             return;
   25635                           }
   25636                           unsigned rm = ExtractQRegister(instr, 5, 0);
   25637                           if (((instr >> 16) & 1) != 0) {
   25638                             UnallocatedT32(instr);
   25639                             return;
   25640                           }
   25641                           unsigned rn = ExtractQRegister(instr, 7, 16);
   25642                           // VSHL{<c>}{<q>}.<dt> {<Qd>}, <Qm>, <Qn> ; T1
   25643                           vshl(CurrentCond(),
   25644                                dt,
   25645                                QRegister(rd),
   25646                                QRegister(rm),
   25647                                QRegister(rn));
   25648                           break;
   25649                         }
   25650                         case 0x00000500: {
   25651                           // 0xef000500
   25652                           DataType dt = Dt_U_size_3_Decode(
   25653                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
   25654                           if (dt.Is(kDataTypeValueInvalid)) {
   25655                             UnallocatedT32(instr);
   25656                             return;
   25657                           }
   25658                           unsigned rd = ExtractDRegister(instr, 22, 12);
   25659                           unsigned rm = ExtractDRegister(instr, 5, 0);
   25660                           unsigned rn = ExtractDRegister(instr, 7, 16);
   25661                           // VRSHL{<c>}{<q>}.<dt> {<Dd>}, <Dm>, <Dn> ; T1
   25662                           vrshl(CurrentCond(),
   25663                                 dt,
   25664                                 DRegister(rd),
   25665                                 DRegister(rm),
   25666                                 DRegister(rn));
   25667                           break;
   25668                         }
   25669                         case 0x00000540: {
   25670                           // 0xef000540
   25671                           DataType dt = Dt_U_size_3_Decode(
   25672                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
   25673                           if (dt.Is(kDataTypeValueInvalid)) {
   25674                             UnallocatedT32(instr);
   25675                             return;
   25676                           }
   25677                           if (((instr >> 12) & 1) != 0) {
   25678                             UnallocatedT32(instr);
   25679                             return;
   25680                           }
   25681                           unsigned rd = ExtractQRegister(instr, 22, 12);
   25682                           if ((instr & 1) != 0) {
   25683                             UnallocatedT32(instr);
   25684                             return;
   25685                           }
   25686                           unsigned rm = ExtractQRegister(instr, 5, 0);
   25687                           if (((instr >> 16) & 1) != 0) {
   25688                             UnallocatedT32(instr);
   25689                             return;
   25690                           }
   25691                           unsigned rn = ExtractQRegister(instr, 7, 16);
   25692                           // VRSHL{<c>}{<q>}.<dt> {<Qd>}, <Qm>, <Qn> ; T1
   25693                           vrshl(CurrentCond(),
   25694                                 dt,
   25695                                 QRegister(rd),
   25696                                 QRegister(rm),
   25697                                 QRegister(rn));
   25698                           break;
   25699                         }
   25700                         case 0x00000600: {
   25701                           // 0xef000600
   25702                           DataType dt = Dt_U_size_1_Decode(
   25703                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
   25704                           if (dt.Is(kDataTypeValueInvalid)) {
   25705                             UnallocatedT32(instr);
   25706                             return;
   25707                           }
   25708                           unsigned rd = ExtractDRegister(instr, 22, 12);
   25709                           unsigned rn = ExtractDRegister(instr, 7, 16);
   25710                           unsigned rm = ExtractDRegister(instr, 5, 0);
   25711                           // VMAX{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
   25712                           vmax(CurrentCond(),
   25713                                dt,
   25714                                DRegister(rd),
   25715                                DRegister(rn),
   25716                                DRegister(rm));
   25717                           break;
   25718                         }
   25719                         case 0x00000640: {
   25720                           // 0xef000640
   25721                           DataType dt = Dt_U_size_1_Decode(
   25722                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
   25723                           if (dt.Is(kDataTypeValueInvalid)) {
   25724                             UnallocatedT32(instr);
   25725                             return;
   25726                           }
   25727                           if (((instr >> 12) & 1) != 0) {
   25728                             UnallocatedT32(instr);
   25729                             return;
   25730                           }
   25731                           unsigned rd = ExtractQRegister(instr, 22, 12);
   25732                           if (((instr >> 16) & 1) != 0) {
   25733                             UnallocatedT32(instr);
   25734                             return;
   25735                           }
   25736                           unsigned rn = ExtractQRegister(instr, 7, 16);
   25737                           if ((instr & 1) != 0) {
   25738                             UnallocatedT32(instr);
   25739                             return;
   25740                           }
   25741                           unsigned rm = ExtractQRegister(instr, 5, 0);
   25742                           // VMAX{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
   25743                           vmax(CurrentCond(),
   25744                                dt,
   25745                                QRegister(rd),
   25746                                QRegister(rn),
   25747                                QRegister(rm));
   25748                           break;
   25749                         }
   25750                         case 0x00000700: {
   25751                           // 0xef000700
   25752                           DataType dt = Dt_U_size_1_Decode(
   25753                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
   25754                           if (dt.Is(kDataTypeValueInvalid)) {
   25755                             UnallocatedT32(instr);
   25756                             return;
   25757                           }
   25758                           unsigned rd = ExtractDRegister(instr, 22, 12);
   25759                           unsigned rn = ExtractDRegister(instr, 7, 16);
   25760                           unsigned rm = ExtractDRegister(instr, 5, 0);
   25761                           // VABD{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
   25762                           vabd(CurrentCond(),
   25763                                dt,
   25764                                DRegister(rd),
   25765                                DRegister(rn),
   25766                                DRegister(rm));
   25767                           break;
   25768                         }
   25769                         case 0x00000740: {
   25770                           // 0xef000740
   25771                           DataType dt = Dt_U_size_1_Decode(
   25772                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
   25773                           if (dt.Is(kDataTypeValueInvalid)) {
   25774                             UnallocatedT32(instr);
   25775                             return;
   25776                           }
   25777                           if (((instr >> 12) & 1) != 0) {
   25778                             UnallocatedT32(instr);
   25779                             return;
   25780                           }
   25781                           unsigned rd = ExtractQRegister(instr, 22, 12);
   25782                           if (((instr >> 16) & 1) != 0) {
   25783                             UnallocatedT32(instr);
   25784                             return;
   25785                           }
   25786                           unsigned rn = ExtractQRegister(instr, 7, 16);
   25787                           if ((instr & 1) != 0) {
   25788                             UnallocatedT32(instr);
   25789                             return;
   25790                           }
   25791                           unsigned rm = ExtractQRegister(instr, 5, 0);
   25792                           // VABD{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
   25793                           vabd(CurrentCond(),
   25794                                dt,
   25795                                QRegister(rd),
   25796                                QRegister(rn),
   25797                                QRegister(rm));
   25798                           break;
   25799                         }
   25800                         case 0x00000800: {
   25801                           // 0xef000800
   25802                           switch (instr & 0x10000000) {
   25803                             case 0x00000000: {
   25804                               // 0xef000800
   25805                               DataType dt =
   25806                                   Dt_size_2_Decode((instr >> 20) & 0x3);
   25807                               if (dt.Is(kDataTypeValueInvalid)) {
   25808                                 UnallocatedT32(instr);
   25809                                 return;
   25810                               }
   25811                               unsigned rd = ExtractDRegister(instr, 22, 12);
   25812                               unsigned rn = ExtractDRegister(instr, 7, 16);
   25813                               unsigned rm = ExtractDRegister(instr, 5, 0);
   25814                               // VADD{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
   25815                               vadd(CurrentCond(),
   25816                                    dt,
   25817                                    DRegister(rd),
   25818                                    DRegister(rn),
   25819                                    DRegister(rm));
   25820                               break;
   25821                             }
   25822                             case 0x10000000: {
   25823                               // 0xff000800
   25824                               DataType dt =
   25825                                   Dt_size_2_Decode((instr >> 20) & 0x3);
   25826                               if (dt.Is(kDataTypeValueInvalid)) {
   25827                                 UnallocatedT32(instr);
   25828                                 return;
   25829                               }
   25830                               unsigned rd = ExtractDRegister(instr, 22, 12);
   25831                               unsigned rn = ExtractDRegister(instr, 7, 16);
   25832                               unsigned rm = ExtractDRegister(instr, 5, 0);
   25833                               // VSUB{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
   25834                               vsub(CurrentCond(),
   25835                                    dt,
   25836                                    DRegister(rd),
   25837                                    DRegister(rn),
   25838                                    DRegister(rm));
   25839                               break;
   25840                             }
   25841                           }
   25842                           break;
   25843                         }
   25844                         case 0x00000840: {
   25845                           // 0xef000840
   25846                           switch (instr & 0x10000000) {
   25847                             case 0x00000000: {
   25848                               // 0xef000840
   25849                               DataType dt =
   25850                                   Dt_size_2_Decode((instr >> 20) & 0x3);
   25851                               if (dt.Is(kDataTypeValueInvalid)) {
   25852                                 UnallocatedT32(instr);
   25853                                 return;
   25854                               }
   25855                               if (((instr >> 12) & 1) != 0) {
   25856                                 UnallocatedT32(instr);
   25857                                 return;
   25858                               }
   25859                               unsigned rd = ExtractQRegister(instr, 22, 12);
   25860                               if (((instr >> 16) & 1) != 0) {
   25861                                 UnallocatedT32(instr);
   25862                                 return;
   25863                               }
   25864                               unsigned rn = ExtractQRegister(instr, 7, 16);
   25865                               if ((instr & 1) != 0) {
   25866                                 UnallocatedT32(instr);
   25867                                 return;
   25868                               }
   25869                               unsigned rm = ExtractQRegister(instr, 5, 0);
   25870                               // VADD{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
   25871                               vadd(CurrentCond(),
   25872                                    dt,
   25873                                    QRegister(rd),
   25874                                    QRegister(rn),
   25875                                    QRegister(rm));
   25876                               break;
   25877                             }
   25878                             case 0x10000000: {
   25879                               // 0xff000840
   25880                               DataType dt =
   25881                                   Dt_size_2_Decode((instr >> 20) & 0x3);
   25882                               if (dt.Is(kDataTypeValueInvalid)) {
   25883                                 UnallocatedT32(instr);
   25884                                 return;
   25885                               }
   25886                               if (((instr >> 12) & 1) != 0) {
   25887                                 UnallocatedT32(instr);
   25888                                 return;
   25889                               }
   25890                               unsigned rd = ExtractQRegister(instr, 22, 12);
   25891                               if (((instr >> 16) & 1) != 0) {
   25892                                 UnallocatedT32(instr);
   25893                                 return;
   25894                               }
   25895                               unsigned rn = ExtractQRegister(instr, 7, 16);
   25896                               if ((instr & 1) != 0) {
   25897                                 UnallocatedT32(instr);
   25898                                 return;
   25899                               }
   25900                               unsigned rm = ExtractQRegister(instr, 5, 0);
   25901                               // VSUB{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
   25902                               vsub(CurrentCond(),
   25903                                    dt,
   25904                                    QRegister(rd),
   25905                                    QRegister(rn),
   25906                                    QRegister(rm));
   25907                               break;
   25908                             }
   25909                           }
   25910                           break;
   25911                         }
   25912                         case 0x00000900: {
   25913                           // 0xef000900
   25914                           switch (instr & 0x10000000) {
   25915                             case 0x00000000: {
   25916                               // 0xef000900
   25917                               DataType dt =
   25918                                   Dt_size_10_Decode((instr >> 20) & 0x3);
   25919                               if (dt.Is(kDataTypeValueInvalid)) {
   25920                                 UnallocatedT32(instr);
   25921                                 return;
   25922                               }
   25923                               unsigned rd = ExtractDRegister(instr, 22, 12);
   25924                               unsigned rn = ExtractDRegister(instr, 7, 16);
   25925                               unsigned rm = ExtractDRegister(instr, 5, 0);
   25926                               // VMLA{<c>}{<q>}.<type><size> <Dd>, <Dn>, <Dm> ; T1 NOLINT(whitespace/line_length)
   25927                               vmla(CurrentCond(),
   25928                                    dt,
   25929                                    DRegister(rd),
   25930                                    DRegister(rn),
   25931                                    DRegister(rm));
   25932                               break;
   25933                             }
   25934                             case 0x10000000: {
   25935                               // 0xff000900
   25936                               DataType dt =
   25937                                   Dt_size_10_Decode((instr >> 20) & 0x3);
   25938                               if (dt.Is(kDataTypeValueInvalid)) {
   25939                                 UnallocatedT32(instr);
   25940                                 return;
   25941                               }
   25942                               unsigned rd = ExtractDRegister(instr, 22, 12);
   25943                               unsigned rn = ExtractDRegister(instr, 7, 16);
   25944                               unsigned rm = ExtractDRegister(instr, 5, 0);
   25945                               // VMLS{<c>}{<q>}.<type><size> <Dd>, <Dn>, <Dm> ; T1 NOLINT(whitespace/line_length)
   25946                               vmls(CurrentCond(),
   25947                                    dt,
   25948                                    DRegister(rd),
   25949                                    DRegister(rn),
   25950                                    DRegister(rm));
   25951                               break;
   25952                             }
   25953                           }
   25954                           break;
   25955                         }
   25956                         case 0x00000940: {
   25957                           // 0xef000940
   25958                           switch (instr & 0x10000000) {
   25959                             case 0x00000000: {
   25960                               // 0xef000940
   25961                               DataType dt =
   25962                                   Dt_size_10_Decode((instr >> 20) & 0x3);
   25963                               if (dt.Is(kDataTypeValueInvalid)) {
   25964                                 UnallocatedT32(instr);
   25965                                 return;
   25966                               }
   25967                               if (((instr >> 12) & 1) != 0) {
   25968                                 UnallocatedT32(instr);
   25969                                 return;
   25970                               }
   25971                               unsigned rd = ExtractQRegister(instr, 22, 12);
   25972                               if (((instr >> 16) & 1) != 0) {
   25973                                 UnallocatedT32(instr);
   25974                                 return;
   25975                               }
   25976                               unsigned rn = ExtractQRegister(instr, 7, 16);
   25977                               if ((instr & 1) != 0) {
   25978                                 UnallocatedT32(instr);
   25979                                 return;
   25980                               }
   25981                               unsigned rm = ExtractQRegister(instr, 5, 0);
   25982                               // VMLA{<c>}{<q>}.<type><size> <Qd>, <Qn>, <Qm> ; T1 NOLINT(whitespace/line_length)
   25983                               vmla(CurrentCond(),
   25984                                    dt,
   25985                                    QRegister(rd),
   25986                                    QRegister(rn),
   25987                                    QRegister(rm));
   25988                               break;
   25989                             }
   25990                             case 0x10000000: {
   25991                               // 0xff000940
   25992                               DataType dt =
   25993                                   Dt_size_10_Decode((instr >> 20) & 0x3);
   25994                               if (dt.Is(kDataTypeValueInvalid)) {
   25995                                 UnallocatedT32(instr);
   25996                                 return;
   25997                               }
   25998                               if (((instr >> 12) & 1) != 0) {
   25999                                 UnallocatedT32(instr);
   26000                                 return;
   26001                               }
   26002                               unsigned rd = ExtractQRegister(instr, 22, 12);
   26003                               if (((instr >> 16) & 1) != 0) {
   26004                                 UnallocatedT32(instr);
   26005                                 return;
   26006                               }
   26007                               unsigned rn = ExtractQRegister(instr, 7, 16);
   26008                               if ((instr & 1) != 0) {
   26009                                 UnallocatedT32(instr);
   26010                                 return;
   26011                               }
   26012                               unsigned rm = ExtractQRegister(instr, 5, 0);
   26013                               // VMLS{<c>}{<q>}.<type><size> <Qd>, <Qn>, <Qm> ; T1 NOLINT(whitespace/line_length)
   26014                               vmls(CurrentCond(),
   26015                                    dt,
   26016                                    QRegister(rd),
   26017                                    QRegister(rn),
   26018                                    QRegister(rm));
   26019                               break;
   26020                             }
   26021                           }
   26022                           break;
   26023                         }
   26024                         case 0x00000a00: {
   26025                           // 0xef000a00
   26026                           DataType dt = Dt_U_size_1_Decode(
   26027                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
   26028                           if (dt.Is(kDataTypeValueInvalid)) {
   26029                             UnallocatedT32(instr);
   26030                             return;
   26031                           }
   26032                           unsigned rd = ExtractDRegister(instr, 22, 12);
   26033                           unsigned rn = ExtractDRegister(instr, 7, 16);
   26034                           unsigned rm = ExtractDRegister(instr, 5, 0);
   26035                           // VPMAX{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
   26036                           vpmax(CurrentCond(),
   26037                                 dt,
   26038                                 DRegister(rd),
   26039                                 DRegister(rn),
   26040                                 DRegister(rm));
   26041                           break;
   26042                         }
   26043                         case 0x00000b00: {
   26044                           // 0xef000b00
   26045                           switch (instr & 0x10000000) {
   26046                             case 0x00000000: {
   26047                               // 0xef000b00
   26048                               DataType dt =
   26049                                   Dt_size_13_Decode((instr >> 20) & 0x3);
   26050                               if (dt.Is(kDataTypeValueInvalid)) {
   26051                                 UnallocatedT32(instr);
   26052                                 return;
   26053                               }
   26054                               unsigned rd = ExtractDRegister(instr, 22, 12);
   26055                               unsigned rn = ExtractDRegister(instr, 7, 16);
   26056                               unsigned rm = ExtractDRegister(instr, 5, 0);
   26057                               // VQDMULH{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
   26058                               vqdmulh(CurrentCond(),
   26059                                       dt,
   26060                                       DRegister(rd),
   26061                                       DRegister(rn),
   26062                                       DRegister(rm));
   26063                               break;
   26064                             }
   26065                             case 0x10000000: {
   26066                               // 0xff000b00
   26067                               DataType dt =
   26068                                   Dt_size_13_Decode((instr >> 20) & 0x3);
   26069                               if (dt.Is(kDataTypeValueInvalid)) {
   26070                                 UnallocatedT32(instr);
   26071                                 return;
   26072                               }
   26073                               unsigned rd = ExtractDRegister(instr, 22, 12);
   26074                               unsigned rn = ExtractDRegister(instr, 7, 16);
   26075                               unsigned rm = ExtractDRegister(instr, 5, 0);
   26076                               // VQRDMULH{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
   26077                               vqrdmulh(CurrentCond(),
   26078                                        dt,
   26079                                        DRegister(rd),
   26080                                        DRegister(rn),
   26081                                        DRegister(rm));
   26082                               break;
   26083                             }
   26084                           }
   26085                           break;
   26086                         }
   26087                         case 0x00000b40: {
   26088                           // 0xef000b40
   26089                           switch (instr & 0x10000000) {
   26090                             case 0x00000000: {
   26091                               // 0xef000b40
   26092                               DataType dt =
   26093                                   Dt_size_13_Decode((instr >> 20) & 0x3);
   26094                               if (dt.Is(kDataTypeValueInvalid)) {
   26095                                 UnallocatedT32(instr);
   26096                                 return;
   26097                               }
   26098                               if (((instr >> 12) & 1) != 0) {
   26099                                 UnallocatedT32(instr);
   26100                                 return;
   26101                               }
   26102                               unsigned rd = ExtractQRegister(instr, 22, 12);
   26103                               if (((instr >> 16) & 1) != 0) {
   26104                                 UnallocatedT32(instr);
   26105                                 return;
   26106                               }
   26107                               unsigned rn = ExtractQRegister(instr, 7, 16);
   26108                               if ((instr & 1) != 0) {
   26109                                 UnallocatedT32(instr);
   26110                                 return;
   26111                               }
   26112                               unsigned rm = ExtractQRegister(instr, 5, 0);
   26113                               // VQDMULH{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
   26114                               vqdmulh(CurrentCond(),
   26115                                       dt,
   26116                                       QRegister(rd),
   26117                                       QRegister(rn),
   26118                                       QRegister(rm));
   26119                               break;
   26120                             }
   26121                             case 0x10000000: {
   26122                               // 0xff000b40
   26123                               DataType dt =
   26124                                   Dt_size_13_Decode((instr >> 20) & 0x3);
   26125                               if (dt.Is(kDataTypeValueInvalid)) {
   26126                                 UnallocatedT32(instr);
   26127                                 return;
   26128                               }
   26129                               if (((instr >> 12) & 1) != 0) {
   26130                                 UnallocatedT32(instr);
   26131                                 return;
   26132                               }
   26133                               unsigned rd = ExtractQRegister(instr, 22, 12);
   26134                               if (((instr >> 16) & 1) != 0) {
   26135                                 UnallocatedT32(instr);
   26136                                 return;
   26137                               }
   26138                               unsigned rn = ExtractQRegister(instr, 7, 16);
   26139                               if ((instr & 1) != 0) {
   26140                                 UnallocatedT32(instr);
   26141                                 return;
   26142                               }
   26143                               unsigned rm = ExtractQRegister(instr, 5, 0);
   26144                               // VQRDMULH{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
   26145                               vqrdmulh(CurrentCond(),
   26146                                        dt,
   26147                                        QRegister(rd),
   26148                                        QRegister(rn),
   26149                                        QRegister(rm));
   26150                               break;
   26151                             }
   26152                           }
   26153                           break;
   26154                         }
   26155                         case 0x00000c40: {
   26156                           // 0xef000c40
   26157                           switch (instr & 0x10300000) {
   26158                             case 0x00000000: {
   26159                               // 0xef000c40
   26160                               UnimplementedT32_32("SHA1C", instr);
   26161                               break;
   26162                             }
   26163                             case 0x00100000: {
   26164                               // 0xef100c40
   26165                               UnimplementedT32_32("SHA1P", instr);
   26166                               break;
   26167                             }
   26168                             case 0x00200000: {
   26169                               // 0xef200c40
   26170                               UnimplementedT32_32("SHA1M", instr);
   26171                               break;
   26172                             }
   26173                             case 0x00300000: {
   26174                               // 0xef300c40
   26175                               UnimplementedT32_32("SHA1SU0", instr);
   26176                               break;
   26177                             }
   26178                             case 0x10000000: {
   26179                               // 0xff000c40
   26180                               UnimplementedT32_32("SHA256H", instr);
   26181                               break;
   26182                             }
   26183                             case 0x10100000: {
   26184                               // 0xff100c40
   26185                               UnimplementedT32_32("SHA256H2", instr);
   26186                               break;
   26187                             }
   26188                             case 0x10200000: {
   26189                               // 0xff200c40
   26190                               UnimplementedT32_32("SHA256SU1", instr);
   26191                               break;
   26192                             }
   26193                             default:
   26194                               UnallocatedT32(instr);
   26195                               break;
   26196                           }
   26197                           break;
   26198                         }
   26199                         case 0x00000d00: {
   26200                           // 0xef000d00
   26201                           switch (instr & 0x10300000) {
   26202                             case 0x00000000: {
   26203                               // 0xef000d00
   26204                               unsigned rd = ExtractDRegister(instr, 22, 12);
   26205                               unsigned rn = ExtractDRegister(instr, 7, 16);
   26206                               unsigned rm = ExtractDRegister(instr, 5, 0);
   26207                               // VADD{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T1
   26208                               vadd(CurrentCond(),
   26209                                    F32,
   26210                                    DRegister(rd),
   26211                                    DRegister(rn),
   26212                                    DRegister(rm));
   26213                               break;
   26214                             }
   26215                             case 0x00200000: {
   26216                               // 0xef200d00
   26217                               unsigned rd = ExtractDRegister(instr, 22, 12);
   26218                               unsigned rn = ExtractDRegister(instr, 7, 16);
   26219                               unsigned rm = ExtractDRegister(instr, 5, 0);
   26220                               // VSUB{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T1
   26221                               vsub(CurrentCond(),
   26222                                    F32,
   26223                                    DRegister(rd),
   26224                                    DRegister(rn),
   26225                                    DRegister(rm));
   26226                               break;
   26227                             }
   26228                             case 0x10000000: {
   26229                               // 0xff000d00
   26230                               unsigned rd = ExtractDRegister(instr, 22, 12);
   26231                               unsigned rn = ExtractDRegister(instr, 7, 16);
   26232                               unsigned rm = ExtractDRegister(instr, 5, 0);
   26233                               // VPADD{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T1
   26234                               vpadd(CurrentCond(),
   26235                                     F32,
   26236                                     DRegister(rd),
   26237                                     DRegister(rn),
   26238                                     DRegister(rm));
   26239                               break;
   26240                             }
   26241                             case 0x10200000: {
   26242                               // 0xff200d00
   26243                               unsigned rd = ExtractDRegister(instr, 22, 12);
   26244                               unsigned rn = ExtractDRegister(instr, 7, 16);
   26245                               unsigned rm = ExtractDRegister(instr, 5, 0);
   26246                               // VABD{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T1
   26247                               vabd(CurrentCond(),
   26248                                    F32,
   26249                                    DRegister(rd),
   26250                                    DRegister(rn),
   26251                                    DRegister(rm));
   26252                               break;
   26253                             }
   26254                             default:
   26255                               UnallocatedT32(instr);
   26256                               break;
   26257                           }
   26258                           break;
   26259                         }
   26260                         case 0x00000d40: {
   26261                           // 0xef000d40
   26262                           switch (instr & 0x10300000) {
   26263                             case 0x00000000: {
   26264                               // 0xef000d40
   26265                               if (((instr >> 12) & 1) != 0) {
   26266                                 UnallocatedT32(instr);
   26267                                 return;
   26268                               }
   26269                               unsigned rd = ExtractQRegister(instr, 22, 12);
   26270                               if (((instr >> 16) & 1) != 0) {
   26271                                 UnallocatedT32(instr);
   26272                                 return;
   26273                               }
   26274                               unsigned rn = ExtractQRegister(instr, 7, 16);
   26275                               if ((instr & 1) != 0) {
   26276                                 UnallocatedT32(instr);
   26277                                 return;
   26278                               }
   26279                               unsigned rm = ExtractQRegister(instr, 5, 0);
   26280                               // VADD{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; T1
   26281                               vadd(CurrentCond(),
   26282                                    F32,
   26283                                    QRegister(rd),
   26284                                    QRegister(rn),
   26285                                    QRegister(rm));
   26286                               break;
   26287                             }
   26288                             case 0x00200000: {
   26289                               // 0xef200d40
   26290                               if (((instr >> 12) & 1) != 0) {
   26291                                 UnallocatedT32(instr);
   26292                                 return;
   26293                               }
   26294                               unsigned rd = ExtractQRegister(instr, 22, 12);
   26295                               if (((instr >> 16) & 1) != 0) {
   26296                                 UnallocatedT32(instr);
   26297                                 return;
   26298                               }
   26299                               unsigned rn = ExtractQRegister(instr, 7, 16);
   26300                               if ((instr & 1) != 0) {
   26301                                 UnallocatedT32(instr);
   26302                                 return;
   26303                               }
   26304                               unsigned rm = ExtractQRegister(instr, 5, 0);
   26305                               // VSUB{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; T1
   26306                               vsub(CurrentCond(),
   26307                                    F32,
   26308                                    QRegister(rd),
   26309                                    QRegister(rn),
   26310                                    QRegister(rm));
   26311                               break;
   26312                             }
   26313                             case 0x10200000: {
   26314                               // 0xff200d40
   26315                               if (((instr >> 12) & 1) != 0) {
   26316                                 UnallocatedT32(instr);
   26317                                 return;
   26318                               }
   26319                               unsigned rd = ExtractQRegister(instr, 22, 12);
   26320                               if (((instr >> 16) & 1) != 0) {
   26321                                 UnallocatedT32(instr);
   26322                                 return;
   26323                               }
   26324                               unsigned rn = ExtractQRegister(instr, 7, 16);
   26325                               if ((instr & 1) != 0) {
   26326                                 UnallocatedT32(instr);
   26327                                 return;
   26328                               }
   26329                               unsigned rm = ExtractQRegister(instr, 5, 0);
   26330                               // VABD{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; T1
   26331                               vabd(CurrentCond(),
   26332                                    F32,
   26333                                    QRegister(rd),
   26334                                    QRegister(rn),
   26335                                    QRegister(rm));
   26336                               break;
   26337                             }
   26338                             default:
   26339                               UnallocatedT32(instr);
   26340                               break;
   26341                           }
   26342                           break;
   26343                         }
   26344                         case 0x00000e00: {
   26345                           // 0xef000e00
   26346                           switch (instr & 0x10200000) {
   26347                             case 0x00000000: {
   26348                               // 0xef000e00
   26349                               DataType dt = Dt_sz_1_Decode((instr >> 20) & 0x1);
   26350                               if (dt.Is(kDataTypeValueInvalid)) {
   26351                                 UnallocatedT32(instr);
   26352                                 return;
   26353                               }
   26354                               unsigned rd = ExtractDRegister(instr, 22, 12);
   26355                               unsigned rn = ExtractDRegister(instr, 7, 16);
   26356                               unsigned rm = ExtractDRegister(instr, 5, 0);
   26357                               // VCEQ{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T2
   26358                               vceq(CurrentCond(),
   26359                                    dt,
   26360                                    DRegister(rd),
   26361                                    DRegister(rn),
   26362                                    DRegister(rm));
   26363                               break;
   26364                             }
   26365                             case 0x10000000: {
   26366                               // 0xff000e00
   26367                               if ((instr & 0x00100000) == 0x00000000) {
   26368                                 unsigned rd = ExtractDRegister(instr, 22, 12);
   26369                                 unsigned rn = ExtractDRegister(instr, 7, 16);
   26370                                 unsigned rm = ExtractDRegister(instr, 5, 0);
   26371                                 // VCGE{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T2
   26372                                 vcge(CurrentCond(),
   26373                                      F32,
   26374                                      DRegister(rd),
   26375                                      DRegister(rn),
   26376                                      DRegister(rm));
   26377                               } else {
   26378                                 UnallocatedT32(instr);
   26379                               }
   26380                               break;
   26381                             }
   26382                             case 0x10200000: {
   26383                               // 0xff200e00
   26384                               if ((instr & 0x00100000) == 0x00000000) {
   26385                                 unsigned rd = ExtractDRegister(instr, 22, 12);
   26386                                 unsigned rn = ExtractDRegister(instr, 7, 16);
   26387                                 unsigned rm = ExtractDRegister(instr, 5, 0);
   26388                                 // VCGT{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T2
   26389                                 vcgt(CurrentCond(),
   26390                                      F32,
   26391                                      DRegister(rd),
   26392                                      DRegister(rn),
   26393                                      DRegister(rm));
   26394                               } else {
   26395                                 UnallocatedT32(instr);
   26396                               }
   26397                               break;
   26398                             }
   26399                             default:
   26400                               UnallocatedT32(instr);
   26401                               break;
   26402                           }
   26403                           break;
   26404                         }
   26405                         case 0x00000e40: {
   26406                           // 0xef000e40
   26407                           switch (instr & 0x10200000) {
   26408                             case 0x00000000: {
   26409                               // 0xef000e40
   26410                               DataType dt = Dt_sz_1_Decode((instr >> 20) & 0x1);
   26411                               if (dt.Is(kDataTypeValueInvalid)) {
   26412                                 UnallocatedT32(instr);
   26413                                 return;
   26414                               }
   26415                               if (((instr >> 12) & 1) != 0) {
   26416                                 UnallocatedT32(instr);
   26417                                 return;
   26418                               }
   26419                               unsigned rd = ExtractQRegister(instr, 22, 12);
   26420                               if (((instr >> 16) & 1) != 0) {
   26421                                 UnallocatedT32(instr);
   26422                                 return;
   26423                               }
   26424                               unsigned rn = ExtractQRegister(instr, 7, 16);
   26425                               if ((instr & 1) != 0) {
   26426                                 UnallocatedT32(instr);
   26427                                 return;
   26428                               }
   26429                               unsigned rm = ExtractQRegister(instr, 5, 0);
   26430                               // VCEQ{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T2
   26431                               vceq(CurrentCond(),
   26432                                    dt,
   26433                                    QRegister(rd),
   26434                                    QRegister(rn),
   26435                                    QRegister(rm));
   26436                               break;
   26437                             }
   26438                             case 0x10000000: {
   26439                               // 0xff000e40
   26440                               if ((instr & 0x00100000) == 0x00000000) {
   26441                                 if (((instr >> 12) & 1) != 0) {
   26442                                   UnallocatedT32(instr);
   26443                                   return;
   26444                                 }
   26445                                 unsigned rd = ExtractQRegister(instr, 22, 12);
   26446                                 if (((instr >> 16) & 1) != 0) {
   26447                                   UnallocatedT32(instr);
   26448                                   return;
   26449                                 }
   26450                                 unsigned rn = ExtractQRegister(instr, 7, 16);
   26451                                 if ((instr & 1) != 0) {
   26452                                   UnallocatedT32(instr);
   26453                                   return;
   26454                                 }
   26455                                 unsigned rm = ExtractQRegister(instr, 5, 0);
   26456                                 // VCGE{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; T2
   26457                                 vcge(CurrentCond(),
   26458                                      F32,
   26459                                      QRegister(rd),
   26460                                      QRegister(rn),
   26461                                      QRegister(rm));
   26462                               } else {
   26463                                 UnallocatedT32(instr);
   26464                               }
   26465                               break;
   26466                             }
   26467                             case 0x10200000: {
   26468                               // 0xff200e40
   26469                               if ((instr & 0x00100000) == 0x00000000) {
   26470                                 if (((instr >> 12) & 1) != 0) {
   26471                                   UnallocatedT32(instr);
   26472                                   return;
   26473                                 }
   26474                                 unsigned rd = ExtractQRegister(instr, 22, 12);
   26475                                 if (((instr >> 16) & 1) != 0) {
   26476                                   UnallocatedT32(instr);
   26477                                   return;
   26478                                 }
   26479                                 unsigned rn = ExtractQRegister(instr, 7, 16);
   26480                                 if ((instr & 1) != 0) {
   26481                                   UnallocatedT32(instr);
   26482                                   return;
   26483                                 }
   26484                                 unsigned rm = ExtractQRegister(instr, 5, 0);
   26485                                 // VCGT{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; T2
   26486                                 vcgt(CurrentCond(),
   26487                                      F32,
   26488                                      QRegister(rd),
   26489                                      QRegister(rn),
   26490                                      QRegister(rm));
   26491                               } else {
   26492                                 UnallocatedT32(instr);
   26493                               }
   26494                               break;
   26495                             }
   26496                             default:
   26497                               UnallocatedT32(instr);
   26498                               break;
   26499                           }
   26500                           break;
   26501                         }
   26502                         case 0x00000f00: {
   26503                           // 0xef000f00
   26504                           switch (instr & 0x10300000) {
   26505                             case 0x00000000: {
   26506                               // 0xef000f00
   26507                               unsigned rd = ExtractDRegister(instr, 22, 12);
   26508                               unsigned rn = ExtractDRegister(instr, 7, 16);
   26509                               unsigned rm = ExtractDRegister(instr, 5, 0);
   26510                               // VMAX{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T1
   26511                               vmax(CurrentCond(),
   26512                                    F32,
   26513                                    DRegister(rd),
   26514                                    DRegister(rn),
   26515                                    DRegister(rm));
   26516                               break;
   26517                             }
   26518                             case 0x00200000: {
   26519                               // 0xef200f00
   26520                               unsigned rd = ExtractDRegister(instr, 22, 12);
   26521                               unsigned rn = ExtractDRegister(instr, 7, 16);
   26522                               unsigned rm = ExtractDRegister(instr, 5, 0);
   26523                               // VMIN{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T1
   26524                               vmin(CurrentCond(),
   26525                                    F32,
   26526                                    DRegister(rd),
   26527                                    DRegister(rn),
   26528                                    DRegister(rm));
   26529                               break;
   26530                             }
   26531                             case 0x10000000: {
   26532                               // 0xff000f00
   26533                               unsigned rd = ExtractDRegister(instr, 22, 12);
   26534                               unsigned rn = ExtractDRegister(instr, 7, 16);
   26535                               unsigned rm = ExtractDRegister(instr, 5, 0);
   26536                               // VPMAX{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T1
   26537                               vpmax(CurrentCond(),
   26538                                     F32,
   26539                                     DRegister(rd),
   26540                                     DRegister(rn),
   26541                                     DRegister(rm));
   26542                               break;
   26543                             }
   26544                             case 0x10200000: {
   26545                               // 0xff200f00
   26546                               unsigned rd = ExtractDRegister(instr, 22, 12);
   26547                               unsigned rn = ExtractDRegister(instr, 7, 16);
   26548                               unsigned rm = ExtractDRegister(instr, 5, 0);
   26549                               // VPMIN{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T1
   26550                               vpmin(CurrentCond(),
   26551                                     F32,
   26552                                     DRegister(rd),
   26553                                     DRegister(rn),
   26554                                     DRegister(rm));
   26555                               break;
   26556                             }
   26557                             default:
   26558                               UnallocatedT32(instr);
   26559                               break;
   26560                           }
   26561                           break;
   26562                         }
   26563                         case 0x00000f40: {
   26564                           // 0xef000f40
   26565                           switch (instr & 0x10300000) {
   26566                             case 0x00000000: {
   26567                               // 0xef000f40
   26568                               if (((instr >> 12) & 1) != 0) {
   26569                                 UnallocatedT32(instr);
   26570                                 return;
   26571                               }
   26572                               unsigned rd = ExtractQRegister(instr, 22, 12);
   26573                               if (((instr >> 16) & 1) != 0) {
   26574                                 UnallocatedT32(instr);
   26575                                 return;
   26576                               }
   26577                               unsigned rn = ExtractQRegister(instr, 7, 16);
   26578                               if ((instr & 1) != 0) {
   26579                                 UnallocatedT32(instr);
   26580                                 return;
   26581                               }
   26582                               unsigned rm = ExtractQRegister(instr, 5, 0);
   26583                               // VMAX{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; T1
   26584                               vmax(CurrentCond(),
   26585                                    F32,
   26586                                    QRegister(rd),
   26587                                    QRegister(rn),
   26588                                    QRegister(rm));
   26589                               break;
   26590                             }
   26591                             case 0x00200000: {
   26592                               // 0xef200f40
   26593                               if (((instr >> 12) & 1) != 0) {
   26594                                 UnallocatedT32(instr);
   26595                                 return;
   26596                               }
   26597                               unsigned rd = ExtractQRegister(instr, 22, 12);
   26598                               if (((instr >> 16) & 1) != 0) {
   26599                                 UnallocatedT32(instr);
   26600                                 return;
   26601                               }
   26602                               unsigned rn = ExtractQRegister(instr, 7, 16);
   26603                               if ((instr & 1) != 0) {
   26604                                 UnallocatedT32(instr);
   26605                                 return;
   26606                               }
   26607                               unsigned rm = ExtractQRegister(instr, 5, 0);
   26608                               // VMIN{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; T1
   26609                               vmin(CurrentCond(),
   26610                                    F32,
   26611                                    QRegister(rd),
   26612                                    QRegister(rn),
   26613                                    QRegister(rm));
   26614                               break;
   26615                             }
   26616                             default:
   26617                               UnallocatedT32(instr);
   26618                               break;
   26619                           }
   26620                           break;
   26621                         }
   26622                         default:
   26623                           UnallocatedT32(instr);
   26624                           break;
   26625                       }
   26626                       break;
   26627                     }
   26628                     case 0x00800000: {
   26629                       // 0xef800000
   26630                       switch (instr & 0x00300000) {
   26631                         case 0x00300000: {
   26632                           // 0xefb00000
   26633                           switch (instr & 0x10000000) {
   26634                             case 0x00000000: {
   26635                               // 0xefb00000
   26636                               switch (instr & 0x00000040) {
   26637                                 case 0x00000000: {
   26638                                   // 0xefb00000
   26639                                   if (((instr & 0x800) == 0x800)) {
   26640                                     UnallocatedT32(instr);
   26641                                     return;
   26642                                   }
   26643                                   unsigned rd = ExtractDRegister(instr, 22, 12);
   26644                                   unsigned rn = ExtractDRegister(instr, 7, 16);
   26645                                   unsigned rm = ExtractDRegister(instr, 5, 0);
   26646                                   uint32_t imm = (instr >> 8) & 0xf;
   26647                                   // VEXT{<c>}{<q>}.8 {<Dd>}, <Dn>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   26648                                   vext(CurrentCond(),
   26649                                        Untyped8,
   26650                                        DRegister(rd),
   26651                                        DRegister(rn),
   26652                                        DRegister(rm),
   26653                                        imm);
   26654                                   break;
   26655                                 }
   26656                                 case 0x00000040: {
   26657                                   // 0xefb00040
   26658                                   if (((instr >> 12) & 1) != 0) {
   26659                                     UnallocatedT32(instr);
   26660                                     return;
   26661                                   }
   26662                                   unsigned rd = ExtractQRegister(instr, 22, 12);
   26663                                   if (((instr >> 16) & 1) != 0) {
   26664                                     UnallocatedT32(instr);
   26665                                     return;
   26666                                   }
   26667                                   unsigned rn = ExtractQRegister(instr, 7, 16);
   26668                                   if ((instr & 1) != 0) {
   26669                                     UnallocatedT32(instr);
   26670                                     return;
   26671                                   }
   26672                                   unsigned rm = ExtractQRegister(instr, 5, 0);
   26673                                   uint32_t imm = (instr >> 8) & 0xf;
   26674                                   // VEXT{<c>}{<q>}.8 {<Qd>}, <Qn>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   26675                                   vext(CurrentCond(),
   26676                                        Untyped8,
   26677                                        QRegister(rd),
   26678                                        QRegister(rn),
   26679                                        QRegister(rm),
   26680                                        imm);
   26681                                   break;
   26682                                 }
   26683                               }
   26684                               break;
   26685                             }
   26686                             case 0x10000000: {
   26687                               // 0xffb00000
   26688                               switch (instr & 0x00000800) {
   26689                                 case 0x00000000: {
   26690                                   // 0xffb00000
   26691                                   switch (instr & 0x00030200) {
   26692                                     case 0x00000000: {
   26693                                       // 0xffb00000
   26694                                       switch (instr & 0x000005c0) {
   26695                                         case 0x00000000: {
   26696                                           // 0xffb00000
   26697                                           DataType dt = Dt_size_7_Decode(
   26698                                               (instr >> 18) & 0x3);
   26699                                           if (dt.Is(kDataTypeValueInvalid)) {
   26700                                             UnallocatedT32(instr);
   26701                                             return;
   26702                                           }
   26703                                           unsigned rd =
   26704                                               ExtractDRegister(instr, 22, 12);
   26705                                           unsigned rm =
   26706                                               ExtractDRegister(instr, 5, 0);
   26707                                           // VREV64{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
   26708                                           vrev64(CurrentCond(),
   26709                                                  dt,
   26710                                                  DRegister(rd),
   26711                                                  DRegister(rm));
   26712                                           break;
   26713                                         }
   26714                                         case 0x00000040: {
   26715                                           // 0xffb00040
   26716                                           DataType dt = Dt_size_7_Decode(
   26717                                               (instr >> 18) & 0x3);
   26718                                           if (dt.Is(kDataTypeValueInvalid)) {
   26719                                             UnallocatedT32(instr);
   26720                                             return;
   26721                                           }
   26722                                           if (((instr >> 12) & 1) != 0) {
   26723                                             UnallocatedT32(instr);
   26724                                             return;
   26725                                           }
   26726                                           unsigned rd =
   26727                                               ExtractQRegister(instr, 22, 12);
   26728                                           if ((instr & 1) != 0) {
   26729                                             UnallocatedT32(instr);
   26730                                             return;
   26731                                           }
   26732                                           unsigned rm =
   26733                                               ExtractQRegister(instr, 5, 0);
   26734                                           // VREV64{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
   26735                                           vrev64(CurrentCond(),
   26736                                                  dt,
   26737                                                  QRegister(rd),
   26738                                                  QRegister(rm));
   26739                                           break;
   26740                                         }
   26741                                         case 0x00000080: {
   26742                                           // 0xffb00080
   26743                                           DataType dt = Dt_size_15_Decode(
   26744                                               (instr >> 18) & 0x3);
   26745                                           if (dt.Is(kDataTypeValueInvalid)) {
   26746                                             UnallocatedT32(instr);
   26747                                             return;
   26748                                           }
   26749                                           unsigned rd =
   26750                                               ExtractDRegister(instr, 22, 12);
   26751                                           unsigned rm =
   26752                                               ExtractDRegister(instr, 5, 0);
   26753                                           // VREV32{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
   26754                                           vrev32(CurrentCond(),
   26755                                                  dt,
   26756                                                  DRegister(rd),
   26757                                                  DRegister(rm));
   26758                                           break;
   26759                                         }
   26760                                         case 0x000000c0: {
   26761                                           // 0xffb000c0
   26762                                           DataType dt = Dt_size_15_Decode(
   26763                                               (instr >> 18) & 0x3);
   26764                                           if (dt.Is(kDataTypeValueInvalid)) {
   26765                                             UnallocatedT32(instr);
   26766                                             return;
   26767                                           }
   26768                                           if (((instr >> 12) & 1) != 0) {
   26769                                             UnallocatedT32(instr);
   26770                                             return;
   26771                                           }
   26772                                           unsigned rd =
   26773                                               ExtractQRegister(instr, 22, 12);
   26774                                           if ((instr & 1) != 0) {
   26775                                             UnallocatedT32(instr);
   26776                                             return;
   26777                                           }
   26778                                           unsigned rm =
   26779                                               ExtractQRegister(instr, 5, 0);
   26780                                           // VREV32{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
   26781                                           vrev32(CurrentCond(),
   26782                                                  dt,
   26783                                                  QRegister(rd),
   26784                                                  QRegister(rm));
   26785                                           break;
   26786                                         }
   26787                                         case 0x00000100: {
   26788                                           // 0xffb00100
   26789                                           DataType dt = Dt_size_1_Decode(
   26790                                               (instr >> 18) & 0x3);
   26791                                           if (dt.Is(kDataTypeValueInvalid)) {
   26792                                             UnallocatedT32(instr);
   26793                                             return;
   26794                                           }
   26795                                           unsigned rd =
   26796                                               ExtractDRegister(instr, 22, 12);
   26797                                           unsigned rm =
   26798                                               ExtractDRegister(instr, 5, 0);
   26799                                           // VREV16{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
   26800                                           vrev16(CurrentCond(),
   26801                                                  dt,
   26802                                                  DRegister(rd),
   26803                                                  DRegister(rm));
   26804                                           break;
   26805                                         }
   26806                                         case 0x00000140: {
   26807                                           // 0xffb00140
   26808                                           DataType dt = Dt_size_1_Decode(
   26809                                               (instr >> 18) & 0x3);
   26810                                           if (dt.Is(kDataTypeValueInvalid)) {
   26811                                             UnallocatedT32(instr);
   26812                                             return;
   26813                                           }
   26814                                           if (((instr >> 12) & 1) != 0) {
   26815                                             UnallocatedT32(instr);
   26816                                             return;
   26817                                           }
   26818                                           unsigned rd =
   26819                                               ExtractQRegister(instr, 22, 12);
   26820                                           if ((instr & 1) != 0) {
   26821                                             UnallocatedT32(instr);
   26822                                             return;
   26823                                           }
   26824                                           unsigned rm =
   26825                                               ExtractQRegister(instr, 5, 0);
   26826                                           // VREV16{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
   26827                                           vrev16(CurrentCond(),
   26828                                                  dt,
   26829                                                  QRegister(rd),
   26830                                                  QRegister(rm));
   26831                                           break;
   26832                                         }
   26833                                         case 0x00000400: {
   26834                                           // 0xffb00400
   26835                                           DataType dt = Dt_size_5_Decode(
   26836                                               (instr >> 18) & 0x3);
   26837                                           if (dt.Is(kDataTypeValueInvalid)) {
   26838                                             UnallocatedT32(instr);
   26839                                             return;
   26840                                           }
   26841                                           unsigned rd =
   26842                                               ExtractDRegister(instr, 22, 12);
   26843                                           unsigned rm =
   26844                                               ExtractDRegister(instr, 5, 0);
   26845                                           // VCLS{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1
   26846                                           vcls(CurrentCond(),
   26847                                                dt,
   26848                                                DRegister(rd),
   26849                                                DRegister(rm));
   26850                                           break;
   26851                                         }
   26852                                         case 0x00000440: {
   26853                                           // 0xffb00440
   26854                                           DataType dt = Dt_size_5_Decode(
   26855                                               (instr >> 18) & 0x3);
   26856                                           if (dt.Is(kDataTypeValueInvalid)) {
   26857                                             UnallocatedT32(instr);
   26858                                             return;
   26859                                           }
   26860                                           if (((instr >> 12) & 1) != 0) {
   26861                                             UnallocatedT32(instr);
   26862                                             return;
   26863                                           }
   26864                                           unsigned rd =
   26865                                               ExtractQRegister(instr, 22, 12);
   26866                                           if ((instr & 1) != 0) {
   26867                                             UnallocatedT32(instr);
   26868                                             return;
   26869                                           }
   26870                                           unsigned rm =
   26871                                               ExtractQRegister(instr, 5, 0);
   26872                                           // VCLS{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1
   26873                                           vcls(CurrentCond(),
   26874                                                dt,
   26875                                                QRegister(rd),
   26876                                                QRegister(rm));
   26877                                           break;
   26878                                         }
   26879                                         case 0x00000480: {
   26880                                           // 0xffb00480
   26881                                           DataType dt = Dt_size_4_Decode(
   26882                                               (instr >> 18) & 0x3);
   26883                                           if (dt.Is(kDataTypeValueInvalid)) {
   26884                                             UnallocatedT32(instr);
   26885                                             return;
   26886                                           }
   26887                                           unsigned rd =
   26888                                               ExtractDRegister(instr, 22, 12);
   26889                                           unsigned rm =
   26890                                               ExtractDRegister(instr, 5, 0);
   26891                                           // VCLZ{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1
   26892                                           vclz(CurrentCond(),
   26893                                                dt,
   26894                                                DRegister(rd),
   26895                                                DRegister(rm));
   26896                                           break;
   26897                                         }
   26898                                         case 0x000004c0: {
   26899                                           // 0xffb004c0
   26900                                           DataType dt = Dt_size_4_Decode(
   26901                                               (instr >> 18) & 0x3);
   26902                                           if (dt.Is(kDataTypeValueInvalid)) {
   26903                                             UnallocatedT32(instr);
   26904                                             return;
   26905                                           }
   26906                                           if (((instr >> 12) & 1) != 0) {
   26907                                             UnallocatedT32(instr);
   26908                                             return;
   26909                                           }
   26910                                           unsigned rd =
   26911                                               ExtractQRegister(instr, 22, 12);
   26912                                           if ((instr & 1) != 0) {
   26913                                             UnallocatedT32(instr);
   26914                                             return;
   26915                                           }
   26916                                           unsigned rm =
   26917                                               ExtractQRegister(instr, 5, 0);
   26918                                           // VCLZ{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1
   26919                                           vclz(CurrentCond(),
   26920                                                dt,
   26921                                                QRegister(rd),
   26922                                                QRegister(rm));
   26923                                           break;
   26924                                         }
   26925                                         case 0x00000500: {
   26926                                           // 0xffb00500
   26927                                           if ((instr & 0x000c0000) ==
   26928                                               0x00000000) {
   26929                                             unsigned rd =
   26930                                                 ExtractDRegister(instr, 22, 12);
   26931                                             unsigned rm =
   26932                                                 ExtractDRegister(instr, 5, 0);
   26933                                             // VCNT{<c>}{<q>}.8 <Dd>, <Dm> ; T1
   26934                                             vcnt(CurrentCond(),
   26935                                                  Untyped8,
   26936                                                  DRegister(rd),
   26937                                                  DRegister(rm));
   26938                                           } else {
   26939                                             UnallocatedT32(instr);
   26940                                           }
   26941                                           break;
   26942                                         }
   26943                                         case 0x00000540: {
   26944                                           // 0xffb00540
   26945                                           if ((instr & 0x000c0000) ==
   26946                                               0x00000000) {
   26947                                             if (((instr >> 12) & 1) != 0) {
   26948                                               UnallocatedT32(instr);
   26949                                               return;
   26950                                             }
   26951                                             unsigned rd =
   26952                                                 ExtractQRegister(instr, 22, 12);
   26953                                             if ((instr & 1) != 0) {
   26954                                               UnallocatedT32(instr);
   26955                                               return;
   26956                                             }
   26957                                             unsigned rm =
   26958                                                 ExtractQRegister(instr, 5, 0);
   26959                                             // VCNT{<c>}{<q>}.8 <Qd>, <Qm> ; T1
   26960                                             vcnt(CurrentCond(),
   26961                                                  Untyped8,
   26962                                                  QRegister(rd),
   26963                                                  QRegister(rm));
   26964                                           } else {
   26965                                             UnallocatedT32(instr);
   26966                                           }
   26967                                           break;
   26968                                         }
   26969                                         case 0x00000580: {
   26970                                           // 0xffb00580
   26971                                           if ((instr & 0x000c0000) ==
   26972                                               0x00000000) {
   26973                                             unsigned rd =
   26974                                                 ExtractDRegister(instr, 22, 12);
   26975                                             unsigned rm =
   26976                                                 ExtractDRegister(instr, 5, 0);
   26977                                             // VMVN{<c>}{<q>}{.<dt>} <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
   26978                                             vmvn(CurrentCond(),
   26979                                                  kDataTypeValueNone,
   26980                                                  DRegister(rd),
   26981                                                  DRegister(rm));
   26982                                           } else {
   26983                                             UnallocatedT32(instr);
   26984                                           }
   26985                                           break;
   26986                                         }
   26987                                         case 0x000005c0: {
   26988                                           // 0xffb005c0
   26989                                           if ((instr & 0x000c0000) ==
   26990                                               0x00000000) {
   26991                                             if (((instr >> 12) & 1) != 0) {
   26992                                               UnallocatedT32(instr);
   26993                                               return;
   26994                                             }
   26995                                             unsigned rd =
   26996                                                 ExtractQRegister(instr, 22, 12);
   26997                                             if ((instr & 1) != 0) {
   26998                                               UnallocatedT32(instr);
   26999                                               return;
   27000                                             }
   27001                                             unsigned rm =
   27002                                                 ExtractQRegister(instr, 5, 0);
   27003                                             // VMVN{<c>}{<q>}{.<dt>} <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
   27004                                             vmvn(CurrentCond(),
   27005                                                  kDataTypeValueNone,
   27006                                                  QRegister(rd),
   27007                                                  QRegister(rm));
   27008                                           } else {
   27009                                             UnallocatedT32(instr);
   27010                                           }
   27011                                           break;
   27012                                         }
   27013                                         default:
   27014                                           UnallocatedT32(instr);
   27015                                           break;
   27016                                       }
   27017                                       break;
   27018                                     }
   27019                                     case 0x00000200: {
   27020                                       // 0xffb00200
   27021                                       switch (instr & 0x00000540) {
   27022                                         case 0x00000000: {
   27023                                           // 0xffb00200
   27024                                           DataType dt = Dt_op_size_2_Decode(
   27025                                               ((instr >> 18) & 0x3) |
   27026                                               ((instr >> 5) & 0x4));
   27027                                           if (dt.Is(kDataTypeValueInvalid)) {
   27028                                             UnallocatedT32(instr);
   27029                                             return;
   27030                                           }
   27031                                           unsigned rd =
   27032                                               ExtractDRegister(instr, 22, 12);
   27033                                           unsigned rm =
   27034                                               ExtractDRegister(instr, 5, 0);
   27035                                           // VPADDL{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
   27036                                           vpaddl(CurrentCond(),
   27037                                                  dt,
   27038                                                  DRegister(rd),
   27039                                                  DRegister(rm));
   27040                                           break;
   27041                                         }
   27042                                         case 0x00000040: {
   27043                                           // 0xffb00240
   27044                                           DataType dt = Dt_op_size_2_Decode(
   27045                                               ((instr >> 18) & 0x3) |
   27046                                               ((instr >> 5) & 0x4));
   27047                                           if (dt.Is(kDataTypeValueInvalid)) {
   27048                                             UnallocatedT32(instr);
   27049                                             return;
   27050                                           }
   27051                                           if (((instr >> 12) & 1) != 0) {
   27052                                             UnallocatedT32(instr);
   27053                                             return;
   27054                                           }
   27055                                           unsigned rd =
   27056                                               ExtractQRegister(instr, 22, 12);
   27057                                           if ((instr & 1) != 0) {
   27058                                             UnallocatedT32(instr);
   27059                                             return;
   27060                                           }
   27061                                           unsigned rm =
   27062                                               ExtractQRegister(instr, 5, 0);
   27063                                           // VPADDL{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
   27064                                           vpaddl(CurrentCond(),
   27065                                                  dt,
   27066                                                  QRegister(rd),
   27067                                                  QRegister(rm));
   27068                                           break;
   27069                                         }
   27070                                         case 0x00000100: {
   27071                                           // 0xffb00300
   27072                                           switch (instr & 0x00000080) {
   27073                                             case 0x00000000: {
   27074                                               // 0xffb00300
   27075                                               UnimplementedT32_32("AESE",
   27076                                                                   instr);
   27077                                               break;
   27078                                             }
   27079                                             case 0x00000080: {
   27080                                               // 0xffb00380
   27081                                               UnimplementedT32_32("AESMC",
   27082                                                                   instr);
   27083                                               break;
   27084                                             }
   27085                                           }
   27086                                           break;
   27087                                         }
   27088                                         case 0x00000140: {
   27089                                           // 0xffb00340
   27090                                           switch (instr & 0x00000080) {
   27091                                             case 0x00000000: {
   27092                                               // 0xffb00340
   27093                                               UnimplementedT32_32("AESD",
   27094                                                                   instr);
   27095                                               break;
   27096                                             }
   27097                                             case 0x00000080: {
   27098                                               // 0xffb003c0
   27099                                               UnimplementedT32_32("AESIMC",
   27100                                                                   instr);
   27101                                               break;
   27102                                             }
   27103                                           }
   27104                                           break;
   27105                                         }
   27106                                         case 0x00000400: {
   27107                                           // 0xffb00600
   27108                                           DataType dt = Dt_op_size_2_Decode(
   27109                                               ((instr >> 18) & 0x3) |
   27110                                               ((instr >> 5) & 0x4));
   27111                                           if (dt.Is(kDataTypeValueInvalid)) {
   27112                                             UnallocatedT32(instr);
   27113                                             return;
   27114                                           }
   27115                                           unsigned rd =
   27116                                               ExtractDRegister(instr, 22, 12);
   27117                                           unsigned rm =
   27118                                               ExtractDRegister(instr, 5, 0);
   27119                                           // VPADAL{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
   27120                                           vpadal(CurrentCond(),
   27121                                                  dt,
   27122                                                  DRegister(rd),
   27123                                                  DRegister(rm));
   27124                                           break;
   27125                                         }
   27126                                         case 0x00000440: {
   27127                                           // 0xffb00640
   27128                                           DataType dt = Dt_op_size_2_Decode(
   27129                                               ((instr >> 18) & 0x3) |
   27130                                               ((instr >> 5) & 0x4));
   27131                                           if (dt.Is(kDataTypeValueInvalid)) {
   27132                                             UnallocatedT32(instr);
   27133                                             return;
   27134                                           }
   27135                                           if (((instr >> 12) & 1) != 0) {
   27136                                             UnallocatedT32(instr);
   27137                                             return;
   27138                                           }
   27139                                           unsigned rd =
   27140                                               ExtractQRegister(instr, 22, 12);
   27141                                           if ((instr & 1) != 0) {
   27142                                             UnallocatedT32(instr);
   27143                                             return;
   27144                                           }
   27145                                           unsigned rm =
   27146                                               ExtractQRegister(instr, 5, 0);
   27147                                           // VPADAL{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
   27148                                           vpadal(CurrentCond(),
   27149                                                  dt,
   27150                                                  QRegister(rd),
   27151                                                  QRegister(rm));
   27152                                           break;
   27153                                         }
   27154                                         case 0x00000500: {
   27155                                           // 0xffb00700
   27156                                           switch (instr & 0x00000080) {
   27157                                             case 0x00000000: {
   27158                                               // 0xffb00700
   27159                                               DataType dt = Dt_size_5_Decode(
   27160                                                   (instr >> 18) & 0x3);
   27161                                               if (dt.Is(
   27162                                                       kDataTypeValueInvalid)) {
   27163                                                 UnallocatedT32(instr);
   27164                                                 return;
   27165                                               }
   27166                                               unsigned rd =
   27167                                                   ExtractDRegister(instr,
   27168                                                                    22,
   27169                                                                    12);
   27170                                               unsigned rm =
   27171                                                   ExtractDRegister(instr, 5, 0);
   27172                                               // VQABS{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
   27173                                               vqabs(CurrentCond(),
   27174                                                     dt,
   27175                                                     DRegister(rd),
   27176                                                     DRegister(rm));
   27177                                               break;
   27178                                             }
   27179                                             case 0x00000080: {
   27180                                               // 0xffb00780
   27181                                               DataType dt = Dt_size_5_Decode(
   27182                                                   (instr >> 18) & 0x3);
   27183                                               if (dt.Is(
   27184                                                       kDataTypeValueInvalid)) {
   27185                                                 UnallocatedT32(instr);
   27186                                                 return;
   27187                                               }
   27188                                               unsigned rd =
   27189                                                   ExtractDRegister(instr,
   27190                                                                    22,
   27191                                                                    12);
   27192                                               unsigned rm =
   27193                                                   ExtractDRegister(instr, 5, 0);
   27194                                               // VQNEG{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
   27195                                               vqneg(CurrentCond(),
   27196                                                     dt,
   27197                                                     DRegister(rd),
   27198                                                     DRegister(rm));
   27199                                               break;
   27200                                             }
   27201                                           }
   27202                                           break;
   27203                                         }
   27204                                         case 0x00000540: {
   27205                                           // 0xffb00740
   27206                                           switch (instr & 0x00000080) {
   27207                                             case 0x00000000: {
   27208                                               // 0xffb00740
   27209                                               DataType dt = Dt_size_5_Decode(
   27210                                                   (instr >> 18) & 0x3);
   27211                                               if (dt.Is(
   27212                                                       kDataTypeValueInvalid)) {
   27213                                                 UnallocatedT32(instr);
   27214                                                 return;
   27215                                               }
   27216                                               if (((instr >> 12) & 1) != 0) {
   27217                                                 UnallocatedT32(instr);
   27218                                                 return;
   27219                                               }
   27220                                               unsigned rd =
   27221                                                   ExtractQRegister(instr,
   27222                                                                    22,
   27223                                                                    12);
   27224                                               if ((instr & 1) != 0) {
   27225                                                 UnallocatedT32(instr);
   27226                                                 return;
   27227                                               }
   27228                                               unsigned rm =
   27229                                                   ExtractQRegister(instr, 5, 0);
   27230                                               // VQABS{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
   27231                                               vqabs(CurrentCond(),
   27232                                                     dt,
   27233                                                     QRegister(rd),
   27234                                                     QRegister(rm));
   27235                                               break;
   27236                                             }
   27237                                             case 0x00000080: {
   27238                                               // 0xffb007c0
   27239                                               DataType dt = Dt_size_5_Decode(
   27240                                                   (instr >> 18) & 0x3);
   27241                                               if (dt.Is(
   27242                                                       kDataTypeValueInvalid)) {
   27243                                                 UnallocatedT32(instr);
   27244                                                 return;
   27245                                               }
   27246                                               if (((instr >> 12) & 1) != 0) {
   27247                                                 UnallocatedT32(instr);
   27248                                                 return;
   27249                                               }
   27250                                               unsigned rd =
   27251                                                   ExtractQRegister(instr,
   27252                                                                    22,
   27253                                                                    12);
   27254                                               if ((instr & 1) != 0) {
   27255                                                 UnallocatedT32(instr);
   27256                                                 return;
   27257                                               }
   27258                                               unsigned rm =
   27259                                                   ExtractQRegister(instr, 5, 0);
   27260                                               // VQNEG{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
   27261                                               vqneg(CurrentCond(),
   27262                                                     dt,
   27263                                                     QRegister(rd),
   27264                                                     QRegister(rm));
   27265                                               break;
   27266                                             }
   27267                                           }
   27268                                           break;
   27269                                         }
   27270                                       }
   27271                                       break;
   27272                                     }
   27273                                     case 0x00010000: {
   27274                                       // 0xffb10000
   27275                                       switch (instr & 0x000001c0) {
   27276                                         case 0x00000000: {
   27277                                           // 0xffb10000
   27278                                           DataType dt = Dt_F_size_1_Decode(
   27279                                               ((instr >> 18) & 0x3) |
   27280                                               ((instr >> 8) & 0x4));
   27281                                           if (dt.Is(kDataTypeValueInvalid)) {
   27282                                             UnallocatedT32(instr);
   27283                                             return;
   27284                                           }
   27285                                           unsigned rd =
   27286                                               ExtractDRegister(instr, 22, 12);
   27287                                           unsigned rm =
   27288                                               ExtractDRegister(instr, 5, 0);
   27289                                           // VCGT{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #0 ; T1 NOLINT(whitespace/line_length)
   27290                                           vcgt(CurrentCond(),
   27291                                                dt,
   27292                                                DRegister(rd),
   27293                                                DRegister(rm),
   27294                                                UINT32_C(0));
   27295                                           break;
   27296                                         }
   27297                                         case 0x00000040: {
   27298                                           // 0xffb10040
   27299                                           DataType dt = Dt_F_size_1_Decode(
   27300                                               ((instr >> 18) & 0x3) |
   27301                                               ((instr >> 8) & 0x4));
   27302                                           if (dt.Is(kDataTypeValueInvalid)) {
   27303                                             UnallocatedT32(instr);
   27304                                             return;
   27305                                           }
   27306                                           if (((instr >> 12) & 1) != 0) {
   27307                                             UnallocatedT32(instr);
   27308                                             return;
   27309                                           }
   27310                                           unsigned rd =
   27311                                               ExtractQRegister(instr, 22, 12);
   27312                                           if ((instr & 1) != 0) {
   27313                                             UnallocatedT32(instr);
   27314                                             return;
   27315                                           }
   27316                                           unsigned rm =
   27317                                               ExtractQRegister(instr, 5, 0);
   27318                                           // VCGT{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #0 ; T1 NOLINT(whitespace/line_length)
   27319                                           vcgt(CurrentCond(),
   27320                                                dt,
   27321                                                QRegister(rd),
   27322                                                QRegister(rm),
   27323                                                UINT32_C(0));
   27324                                           break;
   27325                                         }
   27326                                         case 0x00000080: {
   27327                                           // 0xffb10080
   27328                                           DataType dt = Dt_F_size_1_Decode(
   27329                                               ((instr >> 18) & 0x3) |
   27330                                               ((instr >> 8) & 0x4));
   27331                                           if (dt.Is(kDataTypeValueInvalid)) {
   27332                                             UnallocatedT32(instr);
   27333                                             return;
   27334                                           }
   27335                                           unsigned rd =
   27336                                               ExtractDRegister(instr, 22, 12);
   27337                                           unsigned rm =
   27338                                               ExtractDRegister(instr, 5, 0);
   27339                                           // VCGE{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #0 ; T1 NOLINT(whitespace/line_length)
   27340                                           vcge(CurrentCond(),
   27341                                                dt,
   27342                                                DRegister(rd),
   27343                                                DRegister(rm),
   27344                                                UINT32_C(0));
   27345                                           break;
   27346                                         }
   27347                                         case 0x000000c0: {
   27348                                           // 0xffb100c0
   27349                                           DataType dt = Dt_F_size_1_Decode(
   27350                                               ((instr >> 18) & 0x3) |
   27351                                               ((instr >> 8) & 0x4));
   27352                                           if (dt.Is(kDataTypeValueInvalid)) {
   27353                                             UnallocatedT32(instr);
   27354                                             return;
   27355                                           }
   27356                                           if (((instr >> 12) & 1) != 0) {
   27357                                             UnallocatedT32(instr);
   27358                                             return;
   27359                                           }
   27360                                           unsigned rd =
   27361                                               ExtractQRegister(instr, 22, 12);
   27362                                           if ((instr & 1) != 0) {
   27363                                             UnallocatedT32(instr);
   27364                                             return;
   27365                                           }
   27366                                           unsigned rm =
   27367                                               ExtractQRegister(instr, 5, 0);
   27368                                           // VCGE{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #0 ; T1 NOLINT(whitespace/line_length)
   27369                                           vcge(CurrentCond(),
   27370                                                dt,
   27371                                                QRegister(rd),
   27372                                                QRegister(rm),
   27373                                                UINT32_C(0));
   27374                                           break;
   27375                                         }
   27376                                         case 0x00000100: {
   27377                                           // 0xffb10100
   27378                                           DataType dt = Dt_F_size_2_Decode(
   27379                                               ((instr >> 18) & 0x3) |
   27380                                               ((instr >> 8) & 0x4));
   27381                                           if (dt.Is(kDataTypeValueInvalid)) {
   27382                                             UnallocatedT32(instr);
   27383                                             return;
   27384                                           }
   27385                                           unsigned rd =
   27386                                               ExtractDRegister(instr, 22, 12);
   27387                                           unsigned rm =
   27388                                               ExtractDRegister(instr, 5, 0);
   27389                                           // VCEQ{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #0 ; T1 NOLINT(whitespace/line_length)
   27390                                           vceq(CurrentCond(),
   27391                                                dt,
   27392                                                DRegister(rd),
   27393                                                DRegister(rm),
   27394                                                UINT32_C(0));
   27395                                           break;
   27396                                         }
   27397                                         case 0x00000140: {
   27398                                           // 0xffb10140
   27399                                           DataType dt = Dt_F_size_2_Decode(
   27400                                               ((instr >> 18) & 0x3) |
   27401                                               ((instr >> 8) & 0x4));
   27402                                           if (dt.Is(kDataTypeValueInvalid)) {
   27403                                             UnallocatedT32(instr);
   27404                                             return;
   27405                                           }
   27406                                           if (((instr >> 12) & 1) != 0) {
   27407                                             UnallocatedT32(instr);
   27408                                             return;
   27409                                           }
   27410                                           unsigned rd =
   27411                                               ExtractQRegister(instr, 22, 12);
   27412                                           if ((instr & 1) != 0) {
   27413                                             UnallocatedT32(instr);
   27414                                             return;
   27415                                           }
   27416                                           unsigned rm =
   27417                                               ExtractQRegister(instr, 5, 0);
   27418                                           // VCEQ{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #0 ; T1 NOLINT(whitespace/line_length)
   27419                                           vceq(CurrentCond(),
   27420                                                dt,
   27421                                                QRegister(rd),
   27422                                                QRegister(rm),
   27423                                                UINT32_C(0));
   27424                                           break;
   27425                                         }
   27426                                         case 0x00000180: {
   27427                                           // 0xffb10180
   27428                                           DataType dt = Dt_F_size_1_Decode(
   27429                                               ((instr >> 18) & 0x3) |
   27430                                               ((instr >> 8) & 0x4));
   27431                                           if (dt.Is(kDataTypeValueInvalid)) {
   27432                                             UnallocatedT32(instr);
   27433                                             return;
   27434                                           }
   27435                                           unsigned rd =
   27436                                               ExtractDRegister(instr, 22, 12);
   27437                                           unsigned rm =
   27438                                               ExtractDRegister(instr, 5, 0);
   27439                                           // VCLE{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #0 ; T1 NOLINT(whitespace/line_length)
   27440                                           vcle(CurrentCond(),
   27441                                                dt,
   27442                                                DRegister(rd),
   27443                                                DRegister(rm),
   27444                                                UINT32_C(0));
   27445                                           break;
   27446                                         }
   27447                                         case 0x000001c0: {
   27448                                           // 0xffb101c0
   27449                                           DataType dt = Dt_F_size_1_Decode(
   27450                                               ((instr >> 18) & 0x3) |
   27451                                               ((instr >> 8) & 0x4));
   27452                                           if (dt.Is(kDataTypeValueInvalid)) {
   27453                                             UnallocatedT32(instr);
   27454                                             return;
   27455                                           }
   27456                                           if (((instr >> 12) & 1) != 0) {
   27457                                             UnallocatedT32(instr);
   27458                                             return;
   27459                                           }
   27460                                           unsigned rd =
   27461                                               ExtractQRegister(instr, 22, 12);
   27462                                           if ((instr & 1) != 0) {
   27463                                             UnallocatedT32(instr);
   27464                                             return;
   27465                                           }
   27466                                           unsigned rm =
   27467                                               ExtractQRegister(instr, 5, 0);
   27468                                           // VCLE{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #0 ; T1 NOLINT(whitespace/line_length)
   27469                                           vcle(CurrentCond(),
   27470                                                dt,
   27471                                                QRegister(rd),
   27472                                                QRegister(rm),
   27473                                                UINT32_C(0));
   27474                                           break;
   27475                                         }
   27476                                       }
   27477                                       break;
   27478                                     }
   27479                                     case 0x00010200: {
   27480                                       // 0xffb10200
   27481                                       switch (instr & 0x000001c0) {
   27482                                         case 0x00000000: {
   27483                                           // 0xffb10200
   27484                                           DataType dt = Dt_F_size_1_Decode(
   27485                                               ((instr >> 18) & 0x3) |
   27486                                               ((instr >> 8) & 0x4));
   27487                                           if (dt.Is(kDataTypeValueInvalid)) {
   27488                                             UnallocatedT32(instr);
   27489                                             return;
   27490                                           }
   27491                                           unsigned rd =
   27492                                               ExtractDRegister(instr, 22, 12);
   27493                                           unsigned rm =
   27494                                               ExtractDRegister(instr, 5, 0);
   27495                                           // VCLT{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #0 ; T1 NOLINT(whitespace/line_length)
   27496                                           vclt(CurrentCond(),
   27497                                                dt,
   27498                                                DRegister(rd),
   27499                                                DRegister(rm),
   27500                                                UINT32_C(0));
   27501                                           break;
   27502                                         }
   27503                                         case 0x00000040: {
   27504                                           // 0xffb10240
   27505                                           DataType dt = Dt_F_size_1_Decode(
   27506                                               ((instr >> 18) & 0x3) |
   27507                                               ((instr >> 8) & 0x4));
   27508                                           if (dt.Is(kDataTypeValueInvalid)) {
   27509                                             UnallocatedT32(instr);
   27510                                             return;
   27511                                           }
   27512                                           if (((instr >> 12) & 1) != 0) {
   27513                                             UnallocatedT32(instr);
   27514                                             return;
   27515                                           }
   27516                                           unsigned rd =
   27517                                               ExtractQRegister(instr, 22, 12);
   27518                                           if ((instr & 1) != 0) {
   27519                                             UnallocatedT32(instr);
   27520                                             return;
   27521                                           }
   27522                                           unsigned rm =
   27523                                               ExtractQRegister(instr, 5, 0);
   27524                                           // VCLT{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #0 ; T1 NOLINT(whitespace/line_length)
   27525                                           vclt(CurrentCond(),
   27526                                                dt,
   27527                                                QRegister(rd),
   27528                                                QRegister(rm),
   27529                                                UINT32_C(0));
   27530                                           break;
   27531                                         }
   27532                                         case 0x000000c0: {
   27533                                           // 0xffb102c0
   27534                                           if ((instr & 0x000c0400) ==
   27535                                               0x00080000) {
   27536                                             UnimplementedT32_32("SHA1H", instr);
   27537                                           } else {
   27538                                             UnallocatedT32(instr);
   27539                                           }
   27540                                           break;
   27541                                         }
   27542                                         case 0x00000100: {
   27543                                           // 0xffb10300
   27544                                           DataType dt = Dt_F_size_1_Decode(
   27545                                               ((instr >> 18) & 0x3) |
   27546                                               ((instr >> 8) & 0x4));
   27547                                           if (dt.Is(kDataTypeValueInvalid)) {
   27548                                             UnallocatedT32(instr);
   27549                                             return;
   27550                                           }
   27551                                           unsigned rd =
   27552                                               ExtractDRegister(instr, 22, 12);
   27553                                           unsigned rm =
   27554                                               ExtractDRegister(instr, 5, 0);
   27555                                           // VABS{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1
   27556                                           vabs(CurrentCond(),
   27557                                                dt,
   27558                                                DRegister(rd),
   27559                                                DRegister(rm));
   27560                                           break;
   27561                                         }
   27562                                         case 0x00000140: {
   27563                                           // 0xffb10340
   27564                                           DataType dt = Dt_F_size_1_Decode(
   27565                                               ((instr >> 18) & 0x3) |
   27566                                               ((instr >> 8) & 0x4));
   27567                                           if (dt.Is(kDataTypeValueInvalid)) {
   27568                                             UnallocatedT32(instr);
   27569                                             return;
   27570                                           }
   27571                                           if (((instr >> 12) & 1) != 0) {
   27572                                             UnallocatedT32(instr);
   27573                                             return;
   27574                                           }
   27575                                           unsigned rd =
   27576                                               ExtractQRegister(instr, 22, 12);
   27577                                           if ((instr & 1) != 0) {
   27578                                             UnallocatedT32(instr);
   27579                                             return;
   27580                                           }
   27581                                           unsigned rm =
   27582                                               ExtractQRegister(instr, 5, 0);
   27583                                           // VABS{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1
   27584                                           vabs(CurrentCond(),
   27585                                                dt,
   27586                                                QRegister(rd),
   27587                                                QRegister(rm));
   27588                                           break;
   27589                                         }
   27590                                         case 0x00000180: {
   27591                                           // 0xffb10380
   27592                                           DataType dt = Dt_F_size_1_Decode(
   27593                                               ((instr >> 18) & 0x3) |
   27594                                               ((instr >> 8) & 0x4));
   27595                                           if (dt.Is(kDataTypeValueInvalid)) {
   27596                                             UnallocatedT32(instr);
   27597                                             return;
   27598                                           }
   27599                                           unsigned rd =
   27600                                               ExtractDRegister(instr, 22, 12);
   27601                                           unsigned rm =
   27602                                               ExtractDRegister(instr, 5, 0);
   27603                                           // VNEG{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1
   27604                                           vneg(CurrentCond(),
   27605                                                dt,
   27606                                                DRegister(rd),
   27607                                                DRegister(rm));
   27608                                           break;
   27609                                         }
   27610                                         case 0x000001c0: {
   27611                                           // 0xffb103c0
   27612                                           DataType dt = Dt_F_size_1_Decode(
   27613                                               ((instr >> 18) & 0x3) |
   27614                                               ((instr >> 8) & 0x4));
   27615                                           if (dt.Is(kDataTypeValueInvalid)) {
   27616                                             UnallocatedT32(instr);
   27617                                             return;
   27618                                           }
   27619                                           if (((instr >> 12) & 1) != 0) {
   27620                                             UnallocatedT32(instr);
   27621                                             return;
   27622                                           }
   27623                                           unsigned rd =
   27624                                               ExtractQRegister(instr, 22, 12);
   27625                                           if ((instr & 1) != 0) {
   27626                                             UnallocatedT32(instr);
   27627                                             return;
   27628                                           }
   27629                                           unsigned rm =
   27630                                               ExtractQRegister(instr, 5, 0);
   27631                                           // VNEG{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1
   27632                                           vneg(CurrentCond(),
   27633                                                dt,
   27634                                                QRegister(rd),
   27635                                                QRegister(rm));
   27636                                           break;
   27637                                         }
   27638                                         default:
   27639                                           UnallocatedT32(instr);
   27640                                           break;
   27641                                       }
   27642                                       break;
   27643                                     }
   27644                                     case 0x00020000: {
   27645                                       // 0xffb20000
   27646                                       switch (instr & 0x000005c0) {
   27647                                         case 0x00000000: {
   27648                                           // 0xffb20000
   27649                                           if ((instr & 0x000c0000) ==
   27650                                               0x00000000) {
   27651                                             unsigned rd =
   27652                                                 ExtractDRegister(instr, 22, 12);
   27653                                             unsigned rm =
   27654                                                 ExtractDRegister(instr, 5, 0);
   27655                                             // VSWP{<c>}{<q>}{.<dt>} <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
   27656                                             vswp(CurrentCond(),
   27657                                                  kDataTypeValueNone,
   27658                                                  DRegister(rd),
   27659                                                  DRegister(rm));
   27660                                           } else {
   27661                                             UnallocatedT32(instr);
   27662                                           }
   27663                                           break;
   27664                                         }
   27665                                         case 0x00000040: {
   27666                                           // 0xffb20040
   27667                                           if ((instr & 0x000c0000) ==
   27668                                               0x00000000) {
   27669                                             if (((instr >> 12) & 1) != 0) {
   27670                                               UnallocatedT32(instr);
   27671                                               return;
   27672                                             }
   27673                                             unsigned rd =
   27674                                                 ExtractQRegister(instr, 22, 12);
   27675                                             if ((instr & 1) != 0) {
   27676                                               UnallocatedT32(instr);
   27677                                               return;
   27678                                             }
   27679                                             unsigned rm =
   27680                                                 ExtractQRegister(instr, 5, 0);
   27681                                             // VSWP{<c>}{<q>}{.<dt>} <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
   27682                                             vswp(CurrentCond(),
   27683                                                  kDataTypeValueNone,
   27684                                                  QRegister(rd),
   27685                                                  QRegister(rm));
   27686                                           } else {
   27687                                             UnallocatedT32(instr);
   27688                                           }
   27689                                           break;
   27690                                         }
   27691                                         case 0x00000080: {
   27692                                           // 0xffb20080
   27693                                           DataType dt = Dt_size_7_Decode(
   27694                                               (instr >> 18) & 0x3);
   27695                                           if (dt.Is(kDataTypeValueInvalid)) {
   27696                                             UnallocatedT32(instr);
   27697                                             return;
   27698                                           }
   27699                                           unsigned rd =
   27700                                               ExtractDRegister(instr, 22, 12);
   27701                                           unsigned rm =
   27702                                               ExtractDRegister(instr, 5, 0);
   27703                                           // VTRN{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1
   27704                                           vtrn(CurrentCond(),
   27705                                                dt,
   27706                                                DRegister(rd),
   27707                                                DRegister(rm));
   27708                                           break;
   27709                                         }
   27710                                         case 0x000000c0: {
   27711                                           // 0xffb200c0
   27712                                           DataType dt = Dt_size_7_Decode(
   27713                                               (instr >> 18) & 0x3);
   27714                                           if (dt.Is(kDataTypeValueInvalid)) {
   27715                                             UnallocatedT32(instr);
   27716                                             return;
   27717                                           }
   27718                                           if (((instr >> 12) & 1) != 0) {
   27719                                             UnallocatedT32(instr);
   27720                                             return;
   27721                                           }
   27722                                           unsigned rd =
   27723                                               ExtractQRegister(instr, 22, 12);
   27724                                           if ((instr & 1) != 0) {
   27725                                             UnallocatedT32(instr);
   27726                                             return;
   27727                                           }
   27728                                           unsigned rm =
   27729                                               ExtractQRegister(instr, 5, 0);
   27730                                           // VTRN{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1
   27731                                           vtrn(CurrentCond(),
   27732                                                dt,
   27733                                                QRegister(rd),
   27734                                                QRegister(rm));
   27735                                           break;
   27736                                         }
   27737                                         case 0x00000100: {
   27738                                           // 0xffb20100
   27739                                           DataType dt = Dt_size_15_Decode(
   27740                                               (instr >> 18) & 0x3);
   27741                                           if (dt.Is(kDataTypeValueInvalid)) {
   27742                                             UnallocatedT32(instr);
   27743                                             return;
   27744                                           }
   27745                                           unsigned rd =
   27746                                               ExtractDRegister(instr, 22, 12);
   27747                                           unsigned rm =
   27748                                               ExtractDRegister(instr, 5, 0);
   27749                                           // VUZP{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1
   27750                                           vuzp(CurrentCond(),
   27751                                                dt,
   27752                                                DRegister(rd),
   27753                                                DRegister(rm));
   27754                                           break;
   27755                                         }
   27756                                         case 0x00000140: {
   27757                                           // 0xffb20140
   27758                                           DataType dt = Dt_size_7_Decode(
   27759                                               (instr >> 18) & 0x3);
   27760                                           if (dt.Is(kDataTypeValueInvalid)) {
   27761                                             UnallocatedT32(instr);
   27762                                             return;
   27763                                           }
   27764                                           if (((instr >> 12) & 1) != 0) {
   27765                                             UnallocatedT32(instr);
   27766                                             return;
   27767                                           }
   27768                                           unsigned rd =
   27769                                               ExtractQRegister(instr, 22, 12);
   27770                                           if ((instr & 1) != 0) {
   27771                                             UnallocatedT32(instr);
   27772                                             return;
   27773                                           }
   27774                                           unsigned rm =
   27775                                               ExtractQRegister(instr, 5, 0);
   27776                                           // VUZP{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1
   27777                                           vuzp(CurrentCond(),
   27778                                                dt,
   27779                                                QRegister(rd),
   27780                                                QRegister(rm));
   27781                                           break;
   27782                                         }
   27783                                         case 0x00000180: {
   27784                                           // 0xffb20180
   27785                                           DataType dt = Dt_size_15_Decode(
   27786                                               (instr >> 18) & 0x3);
   27787                                           if (dt.Is(kDataTypeValueInvalid)) {
   27788                                             UnallocatedT32(instr);
   27789                                             return;
   27790                                           }
   27791                                           unsigned rd =
   27792                                               ExtractDRegister(instr, 22, 12);
   27793                                           unsigned rm =
   27794                                               ExtractDRegister(instr, 5, 0);
   27795                                           // VZIP{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1
   27796                                           vzip(CurrentCond(),
   27797                                                dt,
   27798                                                DRegister(rd),
   27799                                                DRegister(rm));
   27800                                           break;
   27801                                         }
   27802                                         case 0x000001c0: {
   27803                                           // 0xffb201c0
   27804                                           DataType dt = Dt_size_7_Decode(
   27805                                               (instr >> 18) & 0x3);
   27806                                           if (dt.Is(kDataTypeValueInvalid)) {
   27807                                             UnallocatedT32(instr);
   27808                                             return;
   27809                                           }
   27810                                           if (((instr >> 12) & 1) != 0) {
   27811                                             UnallocatedT32(instr);
   27812                                             return;
   27813                                           }
   27814                                           unsigned rd =
   27815                                               ExtractQRegister(instr, 22, 12);
   27816                                           if ((instr & 1) != 0) {
   27817                                             UnallocatedT32(instr);
   27818                                             return;
   27819                                           }
   27820                                           unsigned rm =
   27821                                               ExtractQRegister(instr, 5, 0);
   27822                                           // VZIP{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1
   27823                                           vzip(CurrentCond(),
   27824                                                dt,
   27825                                                QRegister(rd),
   27826                                                QRegister(rm));
   27827                                           break;
   27828                                         }
   27829                                         case 0x00000400: {
   27830                                           // 0xffb20400
   27831                                           if ((instr & 0x000c0000) ==
   27832                                               0x00080000) {
   27833                                             unsigned rd =
   27834                                                 ExtractDRegister(instr, 22, 12);
   27835                                             unsigned rm =
   27836                                                 ExtractDRegister(instr, 5, 0);
   27837                                             // VRINTN{<q>}.F32.F32 <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
   27838                                             vrintn(F32,
   27839                                                    F32,
   27840                                                    DRegister(rd),
   27841                                                    DRegister(rm));
   27842                                           } else {
   27843                                             UnallocatedT32(instr);
   27844                                           }
   27845                                           break;
   27846                                         }
   27847                                         case 0x00000440: {
   27848                                           // 0xffb20440
   27849                                           if ((instr & 0x000c0000) ==
   27850                                               0x00080000) {
   27851                                             if (((instr >> 12) & 1) != 0) {
   27852                                               UnallocatedT32(instr);
   27853                                               return;
   27854                                             }
   27855                                             unsigned rd =
   27856                                                 ExtractQRegister(instr, 22, 12);
   27857                                             if ((instr & 1) != 0) {
   27858                                               UnallocatedT32(instr);
   27859                                               return;
   27860                                             }
   27861                                             unsigned rm =
   27862                                                 ExtractQRegister(instr, 5, 0);
   27863                                             // VRINTN{<q>}.F32.F32 <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
   27864                                             vrintn(F32,
   27865                                                    F32,
   27866                                                    QRegister(rd),
   27867                                                    QRegister(rm));
   27868                                           } else {
   27869                                             UnallocatedT32(instr);
   27870                                           }
   27871                                           break;
   27872                                         }
   27873                                         case 0x00000480: {
   27874                                           // 0xffb20480
   27875                                           if ((instr & 0x000c0000) ==
   27876                                               0x00080000) {
   27877                                             unsigned rd =
   27878                                                 ExtractDRegister(instr, 22, 12);
   27879                                             unsigned rm =
   27880                                                 ExtractDRegister(instr, 5, 0);
   27881                                             // VRINTX{<q>}.F32.F32 <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
   27882                                             vrintx(Condition::None(),
   27883                                                    F32,
   27884                                                    F32,
   27885                                                    DRegister(rd),
   27886                                                    DRegister(rm));
   27887                                           } else {
   27888                                             UnallocatedT32(instr);
   27889                                           }
   27890                                           break;
   27891                                         }
   27892                                         case 0x000004c0: {
   27893                                           // 0xffb204c0
   27894                                           if ((instr & 0x000c0000) ==
   27895                                               0x00080000) {
   27896                                             if (((instr >> 12) & 1) != 0) {
   27897                                               UnallocatedT32(instr);
   27898                                               return;
   27899                                             }
   27900                                             unsigned rd =
   27901                                                 ExtractQRegister(instr, 22, 12);
   27902                                             if ((instr & 1) != 0) {
   27903                                               UnallocatedT32(instr);
   27904                                               return;
   27905                                             }
   27906                                             unsigned rm =
   27907                                                 ExtractQRegister(instr, 5, 0);
   27908                                             // VRINTX{<q>}.F32.F32 <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
   27909                                             vrintx(F32,
   27910                                                    F32,
   27911                                                    QRegister(rd),
   27912                                                    QRegister(rm));
   27913                                           } else {
   27914                                             UnallocatedT32(instr);
   27915                                           }
   27916                                           break;
   27917                                         }
   27918                                         case 0x00000500: {
   27919                                           // 0xffb20500
   27920                                           if ((instr & 0x000c0000) ==
   27921                                               0x00080000) {
   27922                                             unsigned rd =
   27923                                                 ExtractDRegister(instr, 22, 12);
   27924                                             unsigned rm =
   27925                                                 ExtractDRegister(instr, 5, 0);
   27926                                             // VRINTA{<q>}.F32.F32 <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
   27927                                             vrinta(F32,
   27928                                                    F32,
   27929                                                    DRegister(rd),
   27930                                                    DRegister(rm));
   27931                                           } else {
   27932                                             UnallocatedT32(instr);
   27933                                           }
   27934                                           break;
   27935                                         }
   27936                                         case 0x00000540: {
   27937                                           // 0xffb20540
   27938                                           if ((instr & 0x000c0000) ==
   27939                                               0x00080000) {
   27940                                             if (((instr >> 12) & 1) != 0) {
   27941                                               UnallocatedT32(instr);
   27942                                               return;
   27943                                             }
   27944                                             unsigned rd =
   27945                                                 ExtractQRegister(instr, 22, 12);
   27946                                             if ((instr & 1) != 0) {
   27947                                               UnallocatedT32(instr);
   27948                                               return;
   27949                                             }
   27950                                             unsigned rm =
   27951                                                 ExtractQRegister(instr, 5, 0);
   27952                                             // VRINTA{<q>}.F32.F32 <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
   27953                                             vrinta(F32,
   27954                                                    F32,
   27955                                                    QRegister(rd),
   27956                                                    QRegister(rm));
   27957                                           } else {
   27958                                             UnallocatedT32(instr);
   27959                                           }
   27960                                           break;
   27961                                         }
   27962                                         case 0x00000580: {
   27963                                           // 0xffb20580
   27964                                           if ((instr & 0x000c0000) ==
   27965                                               0x00080000) {
   27966                                             unsigned rd =
   27967                                                 ExtractDRegister(instr, 22, 12);
   27968                                             unsigned rm =
   27969                                                 ExtractDRegister(instr, 5, 0);
   27970                                             // VRINTZ{<q>}.F32.F32 <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
   27971                                             vrintz(Condition::None(),
   27972                                                    F32,
   27973                                                    F32,
   27974                                                    DRegister(rd),
   27975                                                    DRegister(rm));
   27976                                           } else {
   27977                                             UnallocatedT32(instr);
   27978                                           }
   27979                                           break;
   27980                                         }
   27981                                         case 0x000005c0: {
   27982                                           // 0xffb205c0
   27983                                           if ((instr & 0x000c0000) ==
   27984                                               0x00080000) {
   27985                                             if (((instr >> 12) & 1) != 0) {
   27986                                               UnallocatedT32(instr);
   27987                                               return;
   27988                                             }
   27989                                             unsigned rd =
   27990                                                 ExtractQRegister(instr, 22, 12);
   27991                                             if ((instr & 1) != 0) {
   27992                                               UnallocatedT32(instr);
   27993                                               return;
   27994                                             }
   27995                                             unsigned rm =
   27996                                                 ExtractQRegister(instr, 5, 0);
   27997                                             // VRINTZ{<q>}.F32.F32 <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
   27998                                             vrintz(F32,
   27999                                                    F32,
   28000                                                    QRegister(rd),
   28001                                                    QRegister(rm));
   28002                                           } else {
   28003                                             UnallocatedT32(instr);
   28004                                           }
   28005                                           break;
   28006                                         }
   28007                                       }
   28008                                       break;
   28009                                     }
   28010                                     case 0x00020200: {
   28011                                       // 0xffb20200
   28012                                       switch (instr & 0x00000580) {
   28013                                         case 0x00000000: {
   28014                                           // 0xffb20200
   28015                                           switch (instr & 0x00000040) {
   28016                                             case 0x00000000: {
   28017                                               // 0xffb20200
   28018                                               DataType dt = Dt_size_3_Decode(
   28019                                                   (instr >> 18) & 0x3);
   28020                                               if (dt.Is(
   28021                                                       kDataTypeValueInvalid)) {
   28022                                                 UnallocatedT32(instr);
   28023                                                 return;
   28024                                               }
   28025                                               unsigned rd =
   28026                                                   ExtractDRegister(instr,
   28027                                                                    22,
   28028                                                                    12);
   28029                                               if ((instr & 1) != 0) {
   28030                                                 UnallocatedT32(instr);
   28031                                                 return;
   28032                                               }
   28033                                               unsigned rm =
   28034                                                   ExtractQRegister(instr, 5, 0);
   28035                                               // VMOVN{<c>}{<q>}.<dt> <Dd>, <Qm> ; T1 NOLINT(whitespace/line_length)
   28036                                               vmovn(CurrentCond(),
   28037                                                     dt,
   28038                                                     DRegister(rd),
   28039                                                     QRegister(rm));
   28040                                               break;
   28041                                             }
   28042                                             case 0x00000040: {
   28043                                               // 0xffb20240
   28044                                               DataType dt = Dt_size_14_Decode(
   28045                                                   (instr >> 18) & 0x3);
   28046                                               if (dt.Is(
   28047                                                       kDataTypeValueInvalid)) {
   28048                                                 UnallocatedT32(instr);
   28049                                                 return;
   28050                                               }
   28051                                               unsigned rd =
   28052                                                   ExtractDRegister(instr,
   28053                                                                    22,
   28054                                                                    12);
   28055                                               if ((instr & 1) != 0) {
   28056                                                 UnallocatedT32(instr);
   28057                                                 return;
   28058                                               }
   28059                                               unsigned rm =
   28060                                                   ExtractQRegister(instr, 5, 0);
   28061                                               // VQMOVUN{<c>}{<q>}.<dt> <Dd>, <Qm> ; T1 NOLINT(whitespace/line_length)
   28062                                               vqmovun(CurrentCond(),
   28063                                                       dt,
   28064                                                       DRegister(rd),
   28065                                                       QRegister(rm));
   28066                                               break;
   28067                                             }
   28068                                           }
   28069                                           break;
   28070                                         }
   28071                                         case 0x00000080: {
   28072                                           // 0xffb20280
   28073                                           DataType dt = Dt_op_size_3_Decode(
   28074                                               ((instr >> 18) & 0x3) |
   28075                                               ((instr >> 4) & 0x4));
   28076                                           if (dt.Is(kDataTypeValueInvalid)) {
   28077                                             UnallocatedT32(instr);
   28078                                             return;
   28079                                           }
   28080                                           unsigned rd =
   28081                                               ExtractDRegister(instr, 22, 12);
   28082                                           if ((instr & 1) != 0) {
   28083                                             UnallocatedT32(instr);
   28084                                             return;
   28085                                           }
   28086                                           unsigned rm =
   28087                                               ExtractQRegister(instr, 5, 0);
   28088                                           // VQMOVN{<c>}{<q>}.<dt> <Dd>, <Qm> ; T1 NOLINT(whitespace/line_length)
   28089                                           vqmovn(CurrentCond(),
   28090                                                  dt,
   28091                                                  DRegister(rd),
   28092                                                  QRegister(rm));
   28093                                           break;
   28094                                         }
   28095                                         case 0x00000100: {
   28096                                           // 0xffb20300
   28097                                           if ((instr & 0x00000040) ==
   28098                                               0x00000000) {
   28099                                             DataType dt = Dt_size_16_Decode(
   28100                                                 (instr >> 18) & 0x3);
   28101                                             if (dt.Is(kDataTypeValueInvalid)) {
   28102                                               UnallocatedT32(instr);
   28103                                               return;
   28104                                             }
   28105                                             if (((instr >> 12) & 1) != 0) {
   28106                                               UnallocatedT32(instr);
   28107                                               return;
   28108                                             }
   28109                                             unsigned rd =
   28110                                                 ExtractQRegister(instr, 22, 12);
   28111                                             unsigned rm =
   28112                                                 ExtractDRegister(instr, 5, 0);
   28113                                             uint32_t imm = dt.GetSize();
   28114                                             // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T2 NOLINT(whitespace/line_length)
   28115                                             vshll(CurrentCond(),
   28116                                                   dt,
   28117                                                   QRegister(rd),
   28118                                                   DRegister(rm),
   28119                                                   imm);
   28120                                           } else {
   28121                                             UnallocatedT32(instr);
   28122                                           }
   28123                                           break;
   28124                                         }
   28125                                         case 0x00000180: {
   28126                                           // 0xffb20380
   28127                                           switch (instr & 0x000c0040) {
   28128                                             case 0x00080000: {
   28129                                               // 0xffba0380
   28130                                               UnimplementedT32_32("SHA1SU1",
   28131                                                                   instr);
   28132                                               break;
   28133                                             }
   28134                                             case 0x00080040: {
   28135                                               // 0xffba03c0
   28136                                               UnimplementedT32_32("SHA256SU0",
   28137                                                                   instr);
   28138                                               break;
   28139                                             }
   28140                                             default:
   28141                                               UnallocatedT32(instr);
   28142                                               break;
   28143                                           }
   28144                                           break;
   28145                                         }
   28146                                         case 0x00000400: {
   28147                                           // 0xffb20600
   28148                                           if ((instr & 0x000c0040) ==
   28149                                               0x00040000) {
   28150                                             unsigned rd =
   28151                                                 ExtractDRegister(instr, 22, 12);
   28152                                             if ((instr & 1) != 0) {
   28153                                               UnallocatedT32(instr);
   28154                                               return;
   28155                                             }
   28156                                             unsigned rm =
   28157                                                 ExtractQRegister(instr, 5, 0);
   28158                                             // VCVT{<c>}{<q>}.F16.F32 <Dd>, <Qm> ; T1 NOLINT(whitespace/line_length)
   28159                                             vcvt(CurrentCond(),
   28160                                                  F16,
   28161                                                  F32,
   28162                                                  DRegister(rd),
   28163                                                  QRegister(rm));
   28164                                           } else {
   28165                                             UnallocatedT32(instr);
   28166                                           }
   28167                                           break;
   28168                                         }
   28169                                         case 0x00000480: {
   28170                                           // 0xffb20680
   28171                                           switch (instr & 0x000c0040) {
   28172                                             case 0x00080000: {
   28173                                               // 0xffba0680
   28174                                               unsigned rd =
   28175                                                   ExtractDRegister(instr,
   28176                                                                    22,
   28177                                                                    12);
   28178                                               unsigned rm =
   28179                                                   ExtractDRegister(instr, 5, 0);
   28180                                               // VRINTM{<q>}.F32.F32 <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
   28181                                               vrintm(F32,
   28182                                                      F32,
   28183                                                      DRegister(rd),
   28184                                                      DRegister(rm));
   28185                                               break;
   28186                                             }
   28187                                             case 0x00080040: {
   28188                                               // 0xffba06c0
   28189                                               if (((instr >> 12) & 1) != 0) {
   28190                                                 UnallocatedT32(instr);
   28191                                                 return;
   28192                                               }
   28193                                               unsigned rd =
   28194                                                   ExtractQRegister(instr,
   28195                                                                    22,
   28196                                                                    12);
   28197                                               if ((instr & 1) != 0) {
   28198                                                 UnallocatedT32(instr);
   28199                                                 return;
   28200                                               }
   28201                                               unsigned rm =
   28202                                                   ExtractQRegister(instr, 5, 0);
   28203                                               // VRINTM{<q>}.F32.F32 <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
   28204                                               vrintm(F32,
   28205                                                      F32,
   28206                                                      QRegister(rd),
   28207                                                      QRegister(rm));
   28208                                               break;
   28209                                             }
   28210                                             default:
   28211                                               UnallocatedT32(instr);
   28212                                               break;
   28213                                           }
   28214                                           break;
   28215                                         }
   28216                                         case 0x00000500: {
   28217                                           // 0xffb20700
   28218                                           if ((instr & 0x000c0040) ==
   28219                                               0x00040000) {
   28220                                             if (((instr >> 12) & 1) != 0) {
   28221                                               UnallocatedT32(instr);
   28222                                               return;
   28223                                             }
   28224                                             unsigned rd =
   28225                                                 ExtractQRegister(instr, 22, 12);
   28226                                             unsigned rm =
   28227                                                 ExtractDRegister(instr, 5, 0);
   28228                                             // VCVT{<c>}{<q>}.F32.F16 <Qd>, <Dm> ; T1 NOLINT(whitespace/line_length)
   28229                                             vcvt(CurrentCond(),
   28230                                                  F32,
   28231                                                  F16,
   28232                                                  QRegister(rd),
   28233                                                  DRegister(rm));
   28234                                           } else {
   28235                                             UnallocatedT32(instr);
   28236                                           }
   28237                                           break;
   28238                                         }
   28239                                         case 0x00000580: {
   28240                                           // 0xffb20780
   28241                                           switch (instr & 0x000c0040) {
   28242                                             case 0x00080000: {
   28243                                               // 0xffba0780
   28244                                               unsigned rd =
   28245                                                   ExtractDRegister(instr,
   28246                                                                    22,
   28247                                                                    12);
   28248                                               unsigned rm =
   28249                                                   ExtractDRegister(instr, 5, 0);
   28250                                               // VRINTP{<q>}.F32.F32 <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
   28251                                               vrintp(F32,
   28252                                                      F32,
   28253                                                      DRegister(rd),
   28254                                                      DRegister(rm));
   28255                                               break;
   28256                                             }
   28257                                             case 0x00080040: {
   28258                                               // 0xffba07c0
   28259                                               if (((instr >> 12) & 1) != 0) {
   28260                                                 UnallocatedT32(instr);
   28261                                                 return;
   28262                                               }
   28263                                               unsigned rd =
   28264                                                   ExtractQRegister(instr,
   28265                                                                    22,
   28266                                                                    12);
   28267                                               if ((instr & 1) != 0) {
   28268                                                 UnallocatedT32(instr);
   28269                                                 return;
   28270                                               }
   28271                                               unsigned rm =
   28272                                                   ExtractQRegister(instr, 5, 0);
   28273                                               // VRINTP{<q>}.F32.F32 <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
   28274                                               vrintp(F32,
   28275                                                      F32,
   28276                                                      QRegister(rd),
   28277                                                      QRegister(rm));
   28278                                               break;
   28279                                             }
   28280                                             default:
   28281                                               UnallocatedT32(instr);
   28282                                               break;
   28283                                           }
   28284                                           break;
   28285                                         }
   28286                                       }
   28287                                       break;
   28288                                     }
   28289                                     case 0x00030000: {
   28290                                       // 0xffb30000
   28291                                       switch (instr & 0x00000440) {
   28292                                         case 0x00000000: {
   28293                                           // 0xffb30000
   28294                                           switch (instr & 0x000c0100) {
   28295                                             case 0x00080000: {
   28296                                               // 0xffbb0000
   28297                                               DataType dt = Dt_op_3_Decode(
   28298                                                   (instr >> 7) & 0x1);
   28299                                               if (dt.Is(
   28300                                                       kDataTypeValueInvalid)) {
   28301                                                 UnallocatedT32(instr);
   28302                                                 return;
   28303                                               }
   28304                                               unsigned rd =
   28305                                                   ExtractDRegister(instr,
   28306                                                                    22,
   28307                                                                    12);
   28308                                               unsigned rm =
   28309                                                   ExtractDRegister(instr, 5, 0);
   28310                                               // VCVTA{<q>}.<dt>.F32 <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
   28311                                               vcvta(dt,
   28312                                                     F32,
   28313                                                     DRegister(rd),
   28314                                                     DRegister(rm));
   28315                                               break;
   28316                                             }
   28317                                             case 0x00080100: {
   28318                                               // 0xffbb0100
   28319                                               DataType dt = Dt_op_3_Decode(
   28320                                                   (instr >> 7) & 0x1);
   28321                                               if (dt.Is(
   28322                                                       kDataTypeValueInvalid)) {
   28323                                                 UnallocatedT32(instr);
   28324                                                 return;
   28325                                               }
   28326                                               unsigned rd =
   28327                                                   ExtractDRegister(instr,
   28328                                                                    22,
   28329                                                                    12);
   28330                                               unsigned rm =
   28331                                                   ExtractDRegister(instr, 5, 0);
   28332                                               // VCVTN{<q>}.<dt>.F32 <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
   28333                                               vcvtn(dt,
   28334                                                     F32,
   28335                                                     DRegister(rd),
   28336                                                     DRegister(rm));
   28337                                               break;
   28338                                             }
   28339                                             default:
   28340                                               UnallocatedT32(instr);
   28341                                               break;
   28342                                           }
   28343                                           break;
   28344                                         }
   28345                                         case 0x00000040: {
   28346                                           // 0xffb30040
   28347                                           switch (instr & 0x000c0100) {
   28348                                             case 0x00080000: {
   28349                                               // 0xffbb0040
   28350                                               DataType dt = Dt_op_3_Decode(
   28351                                                   (instr >> 7) & 0x1);
   28352                                               if (dt.Is(
   28353                                                       kDataTypeValueInvalid)) {
   28354                                                 UnallocatedT32(instr);
   28355                                                 return;
   28356                                               }
   28357                                               if (((instr >> 12) & 1) != 0) {
   28358                                                 UnallocatedT32(instr);
   28359                                                 return;
   28360                                               }
   28361                                               unsigned rd =
   28362                                                   ExtractQRegister(instr,
   28363                                                                    22,
   28364                                                                    12);
   28365                                               if ((instr & 1) != 0) {
   28366                                                 UnallocatedT32(instr);
   28367                                                 return;
   28368                                               }
   28369                                               unsigned rm =
   28370                                                   ExtractQRegister(instr, 5, 0);
   28371                                               // VCVTA{<q>}.<dt>.F32 <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
   28372                                               vcvta(dt,
   28373                                                     F32,
   28374                                                     QRegister(rd),
   28375                                                     QRegister(rm));
   28376                                               break;
   28377                                             }
   28378                                             case 0x00080100: {
   28379                                               // 0xffbb0140
   28380                                               DataType dt = Dt_op_3_Decode(
   28381                                                   (instr >> 7) & 0x1);
   28382                                               if (dt.Is(
   28383                                                       kDataTypeValueInvalid)) {
   28384                                                 UnallocatedT32(instr);
   28385                                                 return;
   28386                                               }
   28387                                               if (((instr >> 12) & 1) != 0) {
   28388                                                 UnallocatedT32(instr);
   28389                                                 return;
   28390                                               }
   28391                                               unsigned rd =
   28392                                                   ExtractQRegister(instr,
   28393                                                                    22,
   28394                                                                    12);
   28395                                               if ((instr & 1) != 0) {
   28396                                                 UnallocatedT32(instr);
   28397                                                 return;
   28398                                               }
   28399                                               unsigned rm =
   28400                                                   ExtractQRegister(instr, 5, 0);
   28401                                               // VCVTN{<q>}.<dt>.F32 <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
   28402                                               vcvtn(dt,
   28403                                                     F32,
   28404                                                     QRegister(rd),
   28405                                                     QRegister(rm));
   28406                                               break;
   28407                                             }
   28408                                             default:
   28409                                               UnallocatedT32(instr);
   28410                                               break;
   28411                                           }
   28412                                           break;
   28413                                         }
   28414                                         case 0x00000400: {
   28415                                           // 0xffb30400
   28416                                           switch (instr & 0x00000080) {
   28417                                             case 0x00000000: {
   28418                                               // 0xffb30400
   28419                                               DataType dt = Dt_F_size_4_Decode(
   28420                                                   ((instr >> 18) & 0x3) |
   28421                                                   ((instr >> 6) & 0x4));
   28422                                               if (dt.Is(
   28423                                                       kDataTypeValueInvalid)) {
   28424                                                 UnallocatedT32(instr);
   28425                                                 return;
   28426                                               }
   28427                                               unsigned rd =
   28428                                                   ExtractDRegister(instr,
   28429                                                                    22,
   28430                                                                    12);
   28431                                               unsigned rm =
   28432                                                   ExtractDRegister(instr, 5, 0);
   28433                                               // VRECPE{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
   28434                                               vrecpe(CurrentCond(),
   28435                                                      dt,
   28436                                                      DRegister(rd),
   28437                                                      DRegister(rm));
   28438                                               break;
   28439                                             }
   28440                                             case 0x00000080: {
   28441                                               // 0xffb30480
   28442                                               DataType dt = Dt_F_size_4_Decode(
   28443                                                   ((instr >> 18) & 0x3) |
   28444                                                   ((instr >> 6) & 0x4));
   28445                                               if (dt.Is(
   28446                                                       kDataTypeValueInvalid)) {
   28447                                                 UnallocatedT32(instr);
   28448                                                 return;
   28449                                               }
   28450                                               unsigned rd =
   28451                                                   ExtractDRegister(instr,
   28452                                                                    22,
   28453                                                                    12);
   28454                                               unsigned rm =
   28455                                                   ExtractDRegister(instr, 5, 0);
   28456                                               // VRSQRTE{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
   28457                                               vrsqrte(CurrentCond(),
   28458                                                       dt,
   28459                                                       DRegister(rd),
   28460                                                       DRegister(rm));
   28461                                               break;
   28462                                             }
   28463                                           }
   28464                                           break;
   28465                                         }
   28466                                         case 0x00000440: {
   28467                                           // 0xffb30440
   28468                                           switch (instr & 0x00000080) {
   28469                                             case 0x00000000: {
   28470                                               // 0xffb30440
   28471                                               DataType dt = Dt_F_size_4_Decode(
   28472                                                   ((instr >> 18) & 0x3) |
   28473                                                   ((instr >> 6) & 0x4));
   28474                                               if (dt.Is(
   28475                                                       kDataTypeValueInvalid)) {
   28476                                                 UnallocatedT32(instr);
   28477                                                 return;
   28478                                               }
   28479                                               if (((instr >> 12) & 1) != 0) {
   28480                                                 UnallocatedT32(instr);
   28481                                                 return;
   28482                                               }
   28483                                               unsigned rd =
   28484                                                   ExtractQRegister(instr,
   28485                                                                    22,
   28486                                                                    12);
   28487                                               if ((instr & 1) != 0) {
   28488                                                 UnallocatedT32(instr);
   28489                                                 return;
   28490                                               }
   28491                                               unsigned rm =
   28492                                                   ExtractQRegister(instr, 5, 0);
   28493                                               // VRECPE{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
   28494                                               vrecpe(CurrentCond(),
   28495                                                      dt,
   28496                                                      QRegister(rd),
   28497                                                      QRegister(rm));
   28498                                               break;
   28499                                             }
   28500                                             case 0x00000080: {
   28501                                               // 0xffb304c0
   28502                                               DataType dt = Dt_F_size_4_Decode(
   28503                                                   ((instr >> 18) & 0x3) |
   28504                                                   ((instr >> 6) & 0x4));
   28505                                               if (dt.Is(
   28506                                                       kDataTypeValueInvalid)) {
   28507                                                 UnallocatedT32(instr);
   28508                                                 return;
   28509                                               }
   28510                                               if (((instr >> 12) & 1) != 0) {
   28511                                                 UnallocatedT32(instr);
   28512                                                 return;
   28513                                               }
   28514                                               unsigned rd =
   28515                                                   ExtractQRegister(instr,
   28516                                                                    22,
   28517                                                                    12);
   28518                                               if ((instr & 1) != 0) {
   28519                                                 UnallocatedT32(instr);
   28520                                                 return;
   28521                                               }
   28522                                               unsigned rm =
   28523                                                   ExtractQRegister(instr, 5, 0);
   28524                                               // VRSQRTE{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
   28525                                               vrsqrte(CurrentCond(),
   28526                                                       dt,
   28527                                                       QRegister(rd),
   28528                                                       QRegister(rm));
   28529                                               break;
   28530                                             }
   28531                                           }
   28532                                           break;
   28533                                         }
   28534                                       }
   28535                                       break;
   28536                                     }
   28537                                     case 0x00030200: {
   28538                                       // 0xffb30200
   28539                                       switch (instr & 0x000c0440) {
   28540                                         case 0x00080000: {
   28541                                           // 0xffbb0200
   28542                                           switch (instr & 0x00000100) {
   28543                                             case 0x00000000: {
   28544                                               // 0xffbb0200
   28545                                               DataType dt = Dt_op_3_Decode(
   28546                                                   (instr >> 7) & 0x1);
   28547                                               if (dt.Is(
   28548                                                       kDataTypeValueInvalid)) {
   28549                                                 UnallocatedT32(instr);
   28550                                                 return;
   28551                                               }
   28552                                               unsigned rd =
   28553                                                   ExtractDRegister(instr,
   28554                                                                    22,
   28555                                                                    12);
   28556                                               unsigned rm =
   28557                                                   ExtractDRegister(instr, 5, 0);
   28558                                               // VCVTP{<q>}.<dt>.F32 <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
   28559                                               vcvtp(dt,
   28560                                                     F32,
   28561                                                     DRegister(rd),
   28562                                                     DRegister(rm));
   28563                                               break;
   28564                                             }
   28565                                             case 0x00000100: {
   28566                                               // 0xffbb0300
   28567                                               DataType dt = Dt_op_3_Decode(
   28568                                                   (instr >> 7) & 0x1);
   28569                                               if (dt.Is(
   28570                                                       kDataTypeValueInvalid)) {
   28571                                                 UnallocatedT32(instr);
   28572                                                 return;
   28573                                               }
   28574                                               unsigned rd =
   28575                                                   ExtractDRegister(instr,
   28576                                                                    22,
   28577                                                                    12);
   28578                                               unsigned rm =
   28579                                                   ExtractDRegister(instr, 5, 0);
   28580                                               // VCVTM{<q>}.<dt>.F32 <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
   28581                                               vcvtm(dt,
   28582                                                     F32,
   28583                                                     DRegister(rd),
   28584                                                     DRegister(rm));
   28585                                               break;
   28586                                             }
   28587                                           }
   28588                                           break;
   28589                                         }
   28590                                         case 0x00080040: {
   28591                                           // 0xffbb0240
   28592                                           switch (instr & 0x00000100) {
   28593                                             case 0x00000000: {
   28594                                               // 0xffbb0240
   28595                                               DataType dt = Dt_op_3_Decode(
   28596                                                   (instr >> 7) & 0x1);
   28597                                               if (dt.Is(
   28598                                                       kDataTypeValueInvalid)) {
   28599                                                 UnallocatedT32(instr);
   28600                                                 return;
   28601                                               }
   28602                                               if (((instr >> 12) & 1) != 0) {
   28603                                                 UnallocatedT32(instr);
   28604                                                 return;
   28605                                               }
   28606                                               unsigned rd =
   28607                                                   ExtractQRegister(instr,
   28608                                                                    22,
   28609                                                                    12);
   28610                                               if ((instr & 1) != 0) {
   28611                                                 UnallocatedT32(instr);
   28612                                                 return;
   28613                                               }
   28614                                               unsigned rm =
   28615                                                   ExtractQRegister(instr, 5, 0);
   28616                                               // VCVTP{<q>}.<dt>.F32 <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
   28617                                               vcvtp(dt,
   28618                                                     F32,
   28619                                                     QRegister(rd),
   28620                                                     QRegister(rm));
   28621                                               break;
   28622                                             }
   28623                                             case 0x00000100: {
   28624                                               // 0xffbb0340
   28625                                               DataType dt = Dt_op_3_Decode(
   28626                                                   (instr >> 7) & 0x1);
   28627                                               if (dt.Is(
   28628                                                       kDataTypeValueInvalid)) {
   28629                                                 UnallocatedT32(instr);
   28630                                                 return;
   28631                                               }
   28632                                               if (((instr >> 12) & 1) != 0) {
   28633                                                 UnallocatedT32(instr);
   28634                                                 return;
   28635                                               }
   28636                                               unsigned rd =
   28637                                                   ExtractQRegister(instr,
   28638                                                                    22,
   28639                                                                    12);
   28640                                               if ((instr & 1) != 0) {
   28641                                                 UnallocatedT32(instr);
   28642                                                 return;
   28643                                               }
   28644                                               unsigned rm =
   28645                                                   ExtractQRegister(instr, 5, 0);
   28646                                               // VCVTM{<q>}.<dt>.F32 <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
   28647                                               vcvtm(dt,
   28648                                                     F32,
   28649                                                     QRegister(rd),
   28650                                                     QRegister(rm));
   28651                                               break;
   28652                                             }
   28653                                           }
   28654                                           break;
   28655                                         }
   28656                                         case 0x00080400: {
   28657                                           // 0xffbb0600
   28658                                           DataType dt1 = Dt_op_1_Decode1(
   28659                                               (instr >> 7) & 0x3);
   28660                                           if (dt1.Is(kDataTypeValueInvalid)) {
   28661                                             UnallocatedT32(instr);
   28662                                             return;
   28663                                           }
   28664                                           DataType dt2 = Dt_op_1_Decode2(
   28665                                               (instr >> 7) & 0x3);
   28666                                           if (dt2.Is(kDataTypeValueInvalid)) {
   28667                                             UnallocatedT32(instr);
   28668                                             return;
   28669                                           }
   28670                                           unsigned rd =
   28671                                               ExtractDRegister(instr, 22, 12);
   28672                                           unsigned rm =
   28673                                               ExtractDRegister(instr, 5, 0);
   28674                                           // VCVT{<c>}{<q>}.<dt>.<dt> <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
   28675                                           vcvt(CurrentCond(),
   28676                                                dt1,
   28677                                                dt2,
   28678                                                DRegister(rd),
   28679                                                DRegister(rm));
   28680                                           break;
   28681                                         }
   28682                                         case 0x00080440: {
   28683                                           // 0xffbb0640
   28684                                           DataType dt1 = Dt_op_1_Decode1(
   28685                                               (instr >> 7) & 0x3);
   28686                                           if (dt1.Is(kDataTypeValueInvalid)) {
   28687                                             UnallocatedT32(instr);
   28688                                             return;
   28689                                           }
   28690                                           DataType dt2 = Dt_op_1_Decode2(
   28691                                               (instr >> 7) & 0x3);
   28692                                           if (dt2.Is(kDataTypeValueInvalid)) {
   28693                                             UnallocatedT32(instr);
   28694                                             return;
   28695                                           }
   28696                                           if (((instr >> 12) & 1) != 0) {
   28697                                             UnallocatedT32(instr);
   28698                                             return;
   28699                                           }
   28700                                           unsigned rd =
   28701                                               ExtractQRegister(instr, 22, 12);
   28702                                           if ((instr & 1) != 0) {
   28703                                             UnallocatedT32(instr);
   28704                                             return;
   28705                                           }
   28706                                           unsigned rm =
   28707                                               ExtractQRegister(instr, 5, 0);
   28708                                           // VCVT{<c>}{<q>}.<dt>.<dt> <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
   28709                                           vcvt(CurrentCond(),
   28710                                                dt1,
   28711                                                dt2,
   28712                                                QRegister(rd),
   28713                                                QRegister(rm));
   28714                                           break;
   28715                                         }
   28716                                         default:
   28717                                           UnallocatedT32(instr);
   28718                                           break;
   28719                                       }
   28720                                       break;
   28721                                     }
   28722                                   }
   28723                                   break;
   28724                                 }
   28725                                 case 0x00000800: {
   28726                                   // 0xffb00800
   28727                                   switch (instr & 0x00000440) {
   28728                                     case 0x00000000: {
   28729                                       // 0xffb00800
   28730                                       unsigned rd =
   28731                                           ExtractDRegister(instr, 22, 12);
   28732                                       unsigned first =
   28733                                           ExtractDRegister(instr, 7, 16);
   28734                                       unsigned length;
   28735                                       SpacingType spacing = kSingle;
   28736                                       switch ((instr >> 8) & 0x3) {
   28737                                         default:
   28738                                           VIXL_UNREACHABLE_OR_FALLTHROUGH();
   28739                                         case 0x0:
   28740                                           length = 1;
   28741                                           break;
   28742                                         case 0x1:
   28743                                           length = 2;
   28744                                           break;
   28745                                         case 0x2:
   28746                                           length = 3;
   28747                                           break;
   28748                                         case 0x3:
   28749                                           length = 4;
   28750                                           break;
   28751                                       }
   28752                                       unsigned last = first + length - 1;
   28753                                       TransferType transfer = kMultipleLanes;
   28754                                       unsigned rm =
   28755                                           ExtractDRegister(instr, 5, 0);
   28756                                       // VTBL{<c>}{<q>}.8 <Dd>, <list>, <Dm> ; T1 NOLINT(whitespace/line_length)
   28757                                       vtbl(CurrentCond(),
   28758                                            Untyped8,
   28759                                            DRegister(rd),
   28760                                            NeonRegisterList(DRegister(first),
   28761                                                             DRegister(last),
   28762                                                             spacing,
   28763                                                             transfer),
   28764                                            DRegister(rm));
   28765                                       break;
   28766                                     }
   28767                                     case 0x00000040: {
   28768                                       // 0xffb00840
   28769                                       unsigned rd =
   28770                                           ExtractDRegister(instr, 22, 12);
   28771                                       unsigned first =
   28772                                           ExtractDRegister(instr, 7, 16);
   28773                                       unsigned length;
   28774                                       SpacingType spacing = kSingle;
   28775                                       switch ((instr >> 8) & 0x3) {
   28776                                         default:
   28777                                           VIXL_UNREACHABLE_OR_FALLTHROUGH();
   28778                                         case 0x0:
   28779                                           length = 1;
   28780                                           break;
   28781                                         case 0x1:
   28782                                           length = 2;
   28783                                           break;
   28784                                         case 0x2:
   28785                                           length = 3;
   28786                                           break;
   28787                                         case 0x3:
   28788                                           length = 4;
   28789                                           break;
   28790                                       }
   28791                                       unsigned last = first + length - 1;
   28792                                       TransferType transfer = kMultipleLanes;
   28793                                       unsigned rm =
   28794                                           ExtractDRegister(instr, 5, 0);
   28795                                       // VTBX{<c>}{<q>}.8 <Dd>, <list>, <Dm> ; T1 NOLINT(whitespace/line_length)
   28796                                       vtbx(CurrentCond(),
   28797                                            Untyped8,
   28798                                            DRegister(rd),
   28799                                            NeonRegisterList(DRegister(first),
   28800                                                             DRegister(last),
   28801                                                             spacing,
   28802                                                             transfer),
   28803                                            DRegister(rm));
   28804                                       break;
   28805                                     }
   28806                                     case 0x00000400: {
   28807                                       // 0xffb00c00
   28808                                       if ((instr & 0x00000380) == 0x00000000) {
   28809                                         unsigned lane;
   28810                                         DataType dt =
   28811                                             Dt_imm4_1_Decode((instr >> 16) &
   28812                                                                  0xf,
   28813                                                              &lane);
   28814                                         if (dt.Is(kDataTypeValueInvalid)) {
   28815                                           UnallocatedT32(instr);
   28816                                           return;
   28817                                         }
   28818                                         unsigned rd =
   28819                                             ExtractDRegister(instr, 22, 12);
   28820                                         unsigned rm =
   28821                                             ExtractDRegister(instr, 5, 0);
   28822                                         // VDUP{<c>}{<q>}.<dt> <Dd>, <Dm[x]> ; T1 NOLINT(whitespace/line_length)
   28823                                         vdup(CurrentCond(),
   28824                                              dt,
   28825                                              DRegister(rd),
   28826                                              DRegisterLane(rm, lane));
   28827                                       } else {
   28828                                         UnallocatedT32(instr);
   28829                                       }
   28830                                       break;
   28831                                     }
   28832                                     case 0x00000440: {
   28833                                       // 0xffb00c40
   28834                                       if ((instr & 0x00000380) == 0x00000000) {
   28835                                         unsigned lane;
   28836                                         DataType dt =
   28837                                             Dt_imm4_1_Decode((instr >> 16) &
   28838                                                                  0xf,
   28839                                                              &lane);
   28840                                         if (dt.Is(kDataTypeValueInvalid)) {
   28841                                           UnallocatedT32(instr);
   28842                                           return;
   28843                                         }
   28844                                         if (((instr >> 12) & 1) != 0) {
   28845                                           UnallocatedT32(instr);
   28846                                           return;
   28847                                         }
   28848                                         unsigned rd =
   28849                                             ExtractQRegister(instr, 22, 12);
   28850                                         unsigned rm =
   28851                                             ExtractDRegister(instr, 5, 0);
   28852                                         // VDUP{<c>}{<q>}.<dt> <Qd>, <Dm[x]> ; T1 NOLINT(whitespace/line_length)
   28853                                         vdup(CurrentCond(),
   28854                                              dt,
   28855                                              QRegister(rd),
   28856                                              DRegisterLane(rm, lane));
   28857                                       } else {
   28858                                         UnallocatedT32(instr);
   28859                                       }
   28860                                       break;
   28861                                     }
   28862                                   }
   28863                                   break;
   28864                                 }
   28865                               }
   28866                               break;
   28867                             }
   28868                           }
   28869                           break;
   28870                         }
   28871                         default: {
   28872                           switch (instr & 0x00000c40) {
   28873                             case 0x00000000: {
   28874                               // 0xef800000
   28875                               switch (instr & 0x00000300) {
   28876                                 case 0x00000000: {
   28877                                   // 0xef800000
   28878                                   if (((instr & 0x300000) == 0x300000)) {
   28879                                     UnallocatedT32(instr);
   28880                                     return;
   28881                                   }
   28882                                   DataType dt =
   28883                                       Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
   28884                                                          ((instr >> 26) & 0x4));
   28885                                   if (dt.Is(kDataTypeValueInvalid)) {
   28886                                     UnallocatedT32(instr);
   28887                                     return;
   28888                                   }
   28889                                   if (((instr >> 12) & 1) != 0) {
   28890                                     UnallocatedT32(instr);
   28891                                     return;
   28892                                   }
   28893                                   unsigned rd = ExtractQRegister(instr, 22, 12);
   28894                                   unsigned rn = ExtractDRegister(instr, 7, 16);
   28895                                   unsigned rm = ExtractDRegister(instr, 5, 0);
   28896                                   // VADDL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; T1
   28897                                   vaddl(CurrentCond(),
   28898                                         dt,
   28899                                         QRegister(rd),
   28900                                         DRegister(rn),
   28901                                         DRegister(rm));
   28902                                   break;
   28903                                 }
   28904                                 case 0x00000100: {
   28905                                   // 0xef800100
   28906                                   if (((instr & 0x300000) == 0x300000)) {
   28907                                     UnallocatedT32(instr);
   28908                                     return;
   28909                                   }
   28910                                   DataType dt =
   28911                                       Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
   28912                                                          ((instr >> 26) & 0x4));
   28913                                   if (dt.Is(kDataTypeValueInvalid)) {
   28914                                     UnallocatedT32(instr);
   28915                                     return;
   28916                                   }
   28917                                   if (((instr >> 12) & 1) != 0) {
   28918                                     UnallocatedT32(instr);
   28919                                     return;
   28920                                   }
   28921                                   unsigned rd = ExtractQRegister(instr, 22, 12);
   28922                                   if (((instr >> 16) & 1) != 0) {
   28923                                     UnallocatedT32(instr);
   28924                                     return;
   28925                                   }
   28926                                   unsigned rn = ExtractQRegister(instr, 7, 16);
   28927                                   unsigned rm = ExtractDRegister(instr, 5, 0);
   28928                                   // VADDW{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Dm> ; T1 NOLINT(whitespace/line_length)
   28929                                   vaddw(CurrentCond(),
   28930                                         dt,
   28931                                         QRegister(rd),
   28932                                         QRegister(rn),
   28933                                         DRegister(rm));
   28934                                   break;
   28935                                 }
   28936                                 case 0x00000200: {
   28937                                   // 0xef800200
   28938                                   if (((instr & 0x300000) == 0x300000)) {
   28939                                     UnallocatedT32(instr);
   28940                                     return;
   28941                                   }
   28942                                   DataType dt =
   28943                                       Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
   28944                                                          ((instr >> 26) & 0x4));
   28945                                   if (dt.Is(kDataTypeValueInvalid)) {
   28946                                     UnallocatedT32(instr);
   28947                                     return;
   28948                                   }
   28949                                   if (((instr >> 12) & 1) != 0) {
   28950                                     UnallocatedT32(instr);
   28951                                     return;
   28952                                   }
   28953                                   unsigned rd = ExtractQRegister(instr, 22, 12);
   28954                                   unsigned rn = ExtractDRegister(instr, 7, 16);
   28955                                   unsigned rm = ExtractDRegister(instr, 5, 0);
   28956                                   // VSUBL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; T1
   28957                                   vsubl(CurrentCond(),
   28958                                         dt,
   28959                                         QRegister(rd),
   28960                                         DRegister(rn),
   28961                                         DRegister(rm));
   28962                                   break;
   28963                                 }
   28964                                 case 0x00000300: {
   28965                                   // 0xef800300
   28966                                   if (((instr & 0x300000) == 0x300000)) {
   28967                                     UnallocatedT32(instr);
   28968                                     return;
   28969                                   }
   28970                                   DataType dt =
   28971                                       Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
   28972                                                          ((instr >> 26) & 0x4));
   28973                                   if (dt.Is(kDataTypeValueInvalid)) {
   28974                                     UnallocatedT32(instr);
   28975                                     return;
   28976                                   }
   28977                                   if (((instr >> 12) & 1) != 0) {
   28978                                     UnallocatedT32(instr);
   28979                                     return;
   28980                                   }
   28981                                   unsigned rd = ExtractQRegister(instr, 22, 12);
   28982                                   if (((instr >> 16) & 1) != 0) {
   28983                                     UnallocatedT32(instr);
   28984                                     return;
   28985                                   }
   28986                                   unsigned rn = ExtractQRegister(instr, 7, 16);
   28987                                   unsigned rm = ExtractDRegister(instr, 5, 0);
   28988                                   // VSUBW{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Dm> ; T1 NOLINT(whitespace/line_length)
   28989                                   vsubw(CurrentCond(),
   28990                                         dt,
   28991                                         QRegister(rd),
   28992                                         QRegister(rn),
   28993                                         DRegister(rm));
   28994                                   break;
   28995                                 }
   28996                               }
   28997                               break;
   28998                             }
   28999                             case 0x00000040: {
   29000                               // 0xef800040
   29001                               switch (instr & 0x00000200) {
   29002                                 case 0x00000000: {
   29003                                   // 0xef800040
   29004                                   switch (instr & 0x10000000) {
   29005                                     case 0x00000000: {
   29006                                       // 0xef800040
   29007                                       if (((instr & 0x300000) == 0x300000)) {
   29008                                         UnallocatedT32(instr);
   29009                                         return;
   29010                                       }
   29011                                       DataType dt =
   29012                                           Dt_size_9_Decode((instr >> 20) & 0x3,
   29013                                                            (instr >> 8) & 0x1);
   29014                                       if (dt.Is(kDataTypeValueInvalid)) {
   29015                                         UnallocatedT32(instr);
   29016                                         return;
   29017                                       }
   29018                                       unsigned rd =
   29019                                           ExtractDRegister(instr, 22, 12);
   29020                                       unsigned rn =
   29021                                           ExtractDRegister(instr, 7, 16);
   29022                                       int lane;
   29023                                       unsigned rm =
   29024                                           ExtractDRegisterAndLane(instr,
   29025                                                                   dt,
   29026                                                                   5,
   29027                                                                   0,
   29028                                                                   &lane);
   29029                                       // VMLA{<c>}{<q>}.<type><size> <Dd>, <Dn>, <Dm[x]> ; T1 NOLINT(whitespace/line_length)
   29030                                       vmla(CurrentCond(),
   29031                                            dt,
   29032                                            DRegister(rd),
   29033                                            DRegister(rn),
   29034                                            DRegisterLane(rm, lane));
   29035                                       break;
   29036                                     }
   29037                                     case 0x10000000: {
   29038                                       // 0xff800040
   29039                                       if (((instr & 0x300000) == 0x300000)) {
   29040                                         UnallocatedT32(instr);
   29041                                         return;
   29042                                       }
   29043                                       DataType dt =
   29044                                           Dt_size_9_Decode((instr >> 20) & 0x3,
   29045                                                            (instr >> 8) & 0x1);
   29046                                       if (dt.Is(kDataTypeValueInvalid)) {
   29047                                         UnallocatedT32(instr);
   29048                                         return;
   29049                                       }
   29050                                       if (((instr >> 12) & 1) != 0) {
   29051                                         UnallocatedT32(instr);
   29052                                         return;
   29053                                       }
   29054                                       unsigned rd =
   29055                                           ExtractQRegister(instr, 22, 12);
   29056                                       if (((instr >> 16) & 1) != 0) {
   29057                                         UnallocatedT32(instr);
   29058                                         return;
   29059                                       }
   29060                                       unsigned rn =
   29061                                           ExtractQRegister(instr, 7, 16);
   29062                                       int lane;
   29063                                       unsigned rm =
   29064                                           ExtractDRegisterAndLane(instr,
   29065                                                                   dt,
   29066                                                                   5,
   29067                                                                   0,
   29068                                                                   &lane);
   29069                                       // VMLA{<c>}{<q>}.<type><size> <Qd>, <Qn>, <Dm[x]> ; T1 NOLINT(whitespace/line_length)
   29070                                       vmla(CurrentCond(),
   29071                                            dt,
   29072                                            QRegister(rd),
   29073                                            QRegister(rn),
   29074                                            DRegisterLane(rm, lane));
   29075                                       break;
   29076                                     }
   29077                                   }
   29078                                   break;
   29079                                 }
   29080                                 case 0x00000200: {
   29081                                   // 0xef800240
   29082                                   switch (instr & 0x00000100) {
   29083                                     case 0x00000000: {
   29084                                       // 0xef800240
   29085                                       if (((instr & 0x300000) == 0x300000)) {
   29086                                         UnallocatedT32(instr);
   29087                                         return;
   29088                                       }
   29089                                       DataType dt =
   29090                                           Dt_size_11_Decode((instr >> 20) & 0x3,
   29091                                                             (instr >> 28) &
   29092                                                                 0x1);
   29093                                       if (dt.Is(kDataTypeValueInvalid)) {
   29094                                         UnallocatedT32(instr);
   29095                                         return;
   29096                                       }
   29097                                       if (((instr >> 12) & 1) != 0) {
   29098                                         UnallocatedT32(instr);
   29099                                         return;
   29100                                       }
   29101                                       unsigned rd =
   29102                                           ExtractQRegister(instr, 22, 12);
   29103                                       unsigned rn =
   29104                                           ExtractDRegister(instr, 7, 16);
   29105                                       int lane;
   29106                                       unsigned rm =
   29107                                           ExtractDRegisterAndLane(instr,
   29108                                                                   dt,
   29109                                                                   5,
   29110                                                                   0,
   29111                                                                   &lane);
   29112                                       // VMLAL{<c>}{<q>}.<type><size> <Qd>, <Dn>, <Dm[x]> ; T1 NOLINT(whitespace/line_length)
   29113                                       vmlal(CurrentCond(),
   29114                                             dt,
   29115                                             QRegister(rd),
   29116                                             DRegister(rn),
   29117                                             DRegisterLane(rm, lane));
   29118                                       break;
   29119                                     }
   29120                                     case 0x00000100: {
   29121                                       // 0xef800340
   29122                                       if ((instr & 0x10000000) == 0x00000000) {
   29123                                         if (((instr & 0x300000) == 0x300000)) {
   29124                                           UnallocatedT32(instr);
   29125                                           return;
   29126                                         }
   29127                                         DataType dt = Dt_size_13_Decode(
   29128                                             (instr >> 20) & 0x3);
   29129                                         if (dt.Is(kDataTypeValueInvalid)) {
   29130                                           UnallocatedT32(instr);
   29131                                           return;
   29132                                         }
   29133                                         if (((instr >> 12) & 1) != 0) {
   29134                                           UnallocatedT32(instr);
   29135                                           return;
   29136                                         }
   29137                                         unsigned rd =
   29138                                             ExtractQRegister(instr, 22, 12);
   29139                                         unsigned rn =
   29140                                             ExtractDRegister(instr, 7, 16);
   29141                                         uint32_t mvm = (instr & 0xf) |
   29142                                                        ((instr >> 1) & 0x10);
   29143                                         uint32_t shift = 4;
   29144                                         if (dt.Is(S16)) {
   29145                                           shift = 3;
   29146                                         }
   29147                                         uint32_t vm = mvm & ((1 << shift) - 1);
   29148                                         uint32_t index = mvm >> shift;
   29149                                         // VQDMLAL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm>[<index>] ; T2 NOLINT(whitespace/line_length)
   29150                                         vqdmlal(CurrentCond(),
   29151                                                 dt,
   29152                                                 QRegister(rd),
   29153                                                 DRegister(rn),
   29154                                                 DRegister(vm),
   29155                                                 index);
   29156                                       } else {
   29157                                         UnallocatedT32(instr);
   29158                                       }
   29159                                       break;
   29160                                     }
   29161                                   }
   29162                                   break;
   29163                                 }
   29164                               }
   29165                               break;
   29166                             }
   29167                             case 0x00000400: {
   29168                               // 0xef800400
   29169                               switch (instr & 0x00000300) {
   29170                                 case 0x00000000: {
   29171                                   // 0xef800400
   29172                                   switch (instr & 0x10000000) {
   29173                                     case 0x00000000: {
   29174                                       // 0xef800400
   29175                                       if (((instr & 0x300000) == 0x300000)) {
   29176                                         UnallocatedT32(instr);
   29177                                         return;
   29178                                       }
   29179                                       DataType dt =
   29180                                           Dt_size_3_Decode((instr >> 20) & 0x3);
   29181                                       if (dt.Is(kDataTypeValueInvalid)) {
   29182                                         UnallocatedT32(instr);
   29183                                         return;
   29184                                       }
   29185                                       unsigned rd =
   29186                                           ExtractDRegister(instr, 22, 12);
   29187                                       if (((instr >> 16) & 1) != 0) {
   29188                                         UnallocatedT32(instr);
   29189                                         return;
   29190                                       }
   29191                                       unsigned rn =
   29192                                           ExtractQRegister(instr, 7, 16);
   29193                                       if ((instr & 1) != 0) {
   29194                                         UnallocatedT32(instr);
   29195                                         return;
   29196                                       }
   29197                                       unsigned rm =
   29198                                           ExtractQRegister(instr, 5, 0);
   29199                                       // VADDHN{<c>}{<q>}.<dt> <Dd>, <Qn>, <Qm> ; T1 NOLINT(whitespace/line_length)
   29200                                       vaddhn(CurrentCond(),
   29201                                              dt,
   29202                                              DRegister(rd),
   29203                                              QRegister(rn),
   29204                                              QRegister(rm));
   29205                                       break;
   29206                                     }
   29207                                     case 0x10000000: {
   29208                                       // 0xff800400
   29209                                       if (((instr & 0x300000) == 0x300000)) {
   29210                                         UnallocatedT32(instr);
   29211                                         return;
   29212                                       }
   29213                                       DataType dt =
   29214                                           Dt_size_3_Decode((instr >> 20) & 0x3);
   29215                                       if (dt.Is(kDataTypeValueInvalid)) {
   29216                                         UnallocatedT32(instr);
   29217                                         return;
   29218                                       }
   29219                                       unsigned rd =
   29220                                           ExtractDRegister(instr, 22, 12);
   29221                                       if (((instr >> 16) & 1) != 0) {
   29222                                         UnallocatedT32(instr);
   29223                                         return;
   29224                                       }
   29225                                       unsigned rn =
   29226                                           ExtractQRegister(instr, 7, 16);
   29227                                       if ((instr & 1) != 0) {
   29228                                         UnallocatedT32(instr);
   29229                                         return;
   29230                                       }
   29231                                       unsigned rm =
   29232                                           ExtractQRegister(instr, 5, 0);
   29233                                       // VRADDHN{<c>}{<q>}.<dt> <Dd>, <Qn>, <Qm> ; T1 NOLINT(whitespace/line_length)
   29234                                       vraddhn(CurrentCond(),
   29235                                               dt,
   29236                                               DRegister(rd),
   29237                                               QRegister(rn),
   29238                                               QRegister(rm));
   29239                                       break;
   29240                                     }
   29241                                   }
   29242                                   break;
   29243                                 }
   29244                                 case 0x00000100: {
   29245                                   // 0xef800500
   29246                                   if (((instr & 0x300000) == 0x300000)) {
   29247                                     UnallocatedT32(instr);
   29248                                     return;
   29249                                   }
   29250                                   DataType dt =
   29251                                       Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
   29252                                                          ((instr >> 26) & 0x4));
   29253                                   if (dt.Is(kDataTypeValueInvalid)) {
   29254                                     UnallocatedT32(instr);
   29255                                     return;
   29256                                   }
   29257                                   if (((instr >> 12) & 1) != 0) {
   29258                                     UnallocatedT32(instr);
   29259                                     return;
   29260                                   }
   29261                                   unsigned rd = ExtractQRegister(instr, 22, 12);
   29262                                   unsigned rn = ExtractDRegister(instr, 7, 16);
   29263                                   unsigned rm = ExtractDRegister(instr, 5, 0);
   29264                                   // VABAL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; T1
   29265                                   vabal(CurrentCond(),
   29266                                         dt,
   29267                                         QRegister(rd),
   29268                                         DRegister(rn),
   29269                                         DRegister(rm));
   29270                                   break;
   29271                                 }
   29272                                 case 0x00000200: {
   29273                                   // 0xef800600
   29274                                   switch (instr & 0x10000000) {
   29275                                     case 0x00000000: {
   29276                                       // 0xef800600
   29277                                       if (((instr & 0x300000) == 0x300000)) {
   29278                                         UnallocatedT32(instr);
   29279                                         return;
   29280                                       }
   29281                                       DataType dt =
   29282                                           Dt_size_3_Decode((instr >> 20) & 0x3);
   29283                                       if (dt.Is(kDataTypeValueInvalid)) {
   29284                                         UnallocatedT32(instr);
   29285                                         return;
   29286                                       }
   29287                                       unsigned rd =
   29288                                           ExtractDRegister(instr, 22, 12);
   29289                                       if (((instr >> 16) & 1) != 0) {
   29290                                         UnallocatedT32(instr);
   29291                                         return;
   29292                                       }
   29293                                       unsigned rn =
   29294                                           ExtractQRegister(instr, 7, 16);
   29295                                       if ((instr & 1) != 0) {
   29296                                         UnallocatedT32(instr);
   29297                                         return;
   29298                                       }
   29299                                       unsigned rm =
   29300                                           ExtractQRegister(instr, 5, 0);
   29301                                       // VSUBHN{<c>}{<q>}.<dt> <Dd>, <Qn>, <Qm> ; T1 NOLINT(whitespace/line_length)
   29302                                       vsubhn(CurrentCond(),
   29303                                              dt,
   29304                                              DRegister(rd),
   29305                                              QRegister(rn),
   29306                                              QRegister(rm));
   29307                                       break;
   29308                                     }
   29309                                     case 0x10000000: {
   29310                                       // 0xff800600
   29311                                       if (((instr & 0x300000) == 0x300000)) {
   29312                                         UnallocatedT32(instr);
   29313                                         return;
   29314                                       }
   29315                                       DataType dt =
   29316                                           Dt_size_3_Decode((instr >> 20) & 0x3);
   29317                                       if (dt.Is(kDataTypeValueInvalid)) {
   29318                                         UnallocatedT32(instr);
   29319                                         return;
   29320                                       }
   29321                                       unsigned rd =
   29322                                           ExtractDRegister(instr, 22, 12);
   29323                                       if (((instr >> 16) & 1) != 0) {
   29324                                         UnallocatedT32(instr);
   29325                                         return;
   29326                                       }
   29327                                       unsigned rn =
   29328                                           ExtractQRegister(instr, 7, 16);
   29329                                       if ((instr & 1) != 0) {
   29330                                         UnallocatedT32(instr);
   29331                                         return;
   29332                                       }
   29333                                       unsigned rm =
   29334                                           ExtractQRegister(instr, 5, 0);
   29335                                       // VRSUBHN{<c>}{<q>}.<dt> <Dd>, <Qn>, <Qm> ; T1 NOLINT(whitespace/line_length)
   29336                                       vrsubhn(CurrentCond(),
   29337                                               dt,
   29338                                               DRegister(rd),
   29339                                               QRegister(rn),
   29340                                               QRegister(rm));
   29341                                       break;
   29342                                     }
   29343                                   }
   29344                                   break;
   29345                                 }
   29346                                 case 0x00000300: {
   29347                                   // 0xef800700
   29348                                   if (((instr & 0x300000) == 0x300000)) {
   29349                                     UnallocatedT32(instr);
   29350                                     return;
   29351                                   }
   29352                                   DataType dt =
   29353                                       Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
   29354                                                          ((instr >> 26) & 0x4));
   29355                                   if (dt.Is(kDataTypeValueInvalid)) {
   29356                                     UnallocatedT32(instr);
   29357                                     return;
   29358                                   }
   29359                                   if (((instr >> 12) & 1) != 0) {
   29360                                     UnallocatedT32(instr);
   29361                                     return;
   29362                                   }
   29363                                   unsigned rd = ExtractQRegister(instr, 22, 12);
   29364                                   unsigned rn = ExtractDRegister(instr, 7, 16);
   29365                                   unsigned rm = ExtractDRegister(instr, 5, 0);
   29366                                   // VABDL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; T1
   29367                                   vabdl(CurrentCond(),
   29368                                         dt,
   29369                                         QRegister(rd),
   29370                                         DRegister(rn),
   29371                                         DRegister(rm));
   29372                                   break;
   29373                                 }
   29374                               }
   29375                               break;
   29376                             }
   29377                             case 0x00000440: {
   29378                               // 0xef800440
   29379                               switch (instr & 0x00000200) {
   29380                                 case 0x00000000: {
   29381                                   // 0xef800440
   29382                                   switch (instr & 0x10000000) {
   29383                                     case 0x00000000: {
   29384                                       // 0xef800440
   29385                                       if (((instr & 0x300000) == 0x300000)) {
   29386                                         UnallocatedT32(instr);
   29387                                         return;
   29388                                       }
   29389                                       DataType dt =
   29390                                           Dt_size_9_Decode((instr >> 20) & 0x3,
   29391                                                            (instr >> 8) & 0x1);
   29392                                       if (dt.Is(kDataTypeValueInvalid)) {
   29393                                         UnallocatedT32(instr);
   29394                                         return;
   29395                                       }
   29396                                       unsigned rd =
   29397                                           ExtractDRegister(instr, 22, 12);
   29398                                       unsigned rn =
   29399                                           ExtractDRegister(instr, 7, 16);
   29400                                       int lane;
   29401                                       unsigned rm =
   29402                                           ExtractDRegisterAndLane(instr,
   29403                                                                   dt,
   29404                                                                   5,
   29405                                                                   0,
   29406                                                                   &lane);
   29407                                       // VMLS{<c>}{<q>}.<type><size> <Dd>, <Dn>, <Dm[x]> ; T1 NOLINT(whitespace/line_length)
   29408                                       vmls(CurrentCond(),
   29409                                            dt,
   29410                                            DRegister(rd),
   29411                                            DRegister(rn),
   29412                                            DRegisterLane(rm, lane));
   29413                                       break;
   29414                                     }
   29415                                     case 0x10000000: {
   29416                                       // 0xff800440
   29417                                       if (((instr & 0x300000) == 0x300000)) {
   29418                                         UnallocatedT32(instr);
   29419                                         return;
   29420                                       }
   29421                                       DataType dt =
   29422                                           Dt_size_9_Decode((instr >> 20) & 0x3,
   29423                                                            (instr >> 8) & 0x1);
   29424                                       if (dt.Is(kDataTypeValueInvalid)) {
   29425                                         UnallocatedT32(instr);
   29426                                         return;
   29427                                       }
   29428                                       if (((instr >> 12) & 1) != 0) {
   29429                                         UnallocatedT32(instr);
   29430                                         return;
   29431                                       }
   29432                                       unsigned rd =
   29433                                           ExtractQRegister(instr, 22, 12);
   29434                                       if (((instr >> 16) & 1) != 0) {
   29435                                         UnallocatedT32(instr);
   29436                                         return;
   29437                                       }
   29438                                       unsigned rn =
   29439                                           ExtractQRegister(instr, 7, 16);
   29440                                       int lane;
   29441                                       unsigned rm =
   29442                                           ExtractDRegisterAndLane(instr,
   29443                                                                   dt,
   29444                                                                   5,
   29445                                                                   0,
   29446                                                                   &lane);
   29447                                       // VMLS{<c>}{<q>}.<type><size> <Qd>, <Qn>, <Dm[x]> ; T1 NOLINT(whitespace/line_length)
   29448                                       vmls(CurrentCond(),
   29449                                            dt,
   29450                                            QRegister(rd),
   29451                                            QRegister(rn),
   29452                                            DRegisterLane(rm, lane));
   29453                                       break;
   29454                                     }
   29455                                   }
   29456                                   break;
   29457                                 }
   29458                                 case 0x00000200: {
   29459                                   // 0xef800640
   29460                                   switch (instr & 0x00000100) {
   29461                                     case 0x00000000: {
   29462                                       // 0xef800640
   29463                                       if (((instr & 0x300000) == 0x300000)) {
   29464                                         UnallocatedT32(instr);
   29465                                         return;
   29466                                       }
   29467                                       DataType dt =
   29468                                           Dt_size_11_Decode((instr >> 20) & 0x3,
   29469                                                             (instr >> 28) &
   29470                                                                 0x1);
   29471                                       if (dt.Is(kDataTypeValueInvalid)) {
   29472                                         UnallocatedT32(instr);
   29473                                         return;
   29474                                       }
   29475                                       if (((instr >> 12) & 1) != 0) {
   29476                                         UnallocatedT32(instr);
   29477                                         return;
   29478                                       }
   29479                                       unsigned rd =
   29480                                           ExtractQRegister(instr, 22, 12);
   29481                                       unsigned rn =
   29482                                           ExtractDRegister(instr, 7, 16);
   29483                                       int lane;
   29484                                       unsigned rm =
   29485                                           ExtractDRegisterAndLane(instr,
   29486                                                                   dt,
   29487                                                                   5,
   29488                                                                   0,
   29489                                                                   &lane);
   29490                                       // VMLSL{<c>}{<q>}.<type><size> <Qd>, <Dn>, <Dm[x]> ; T1 NOLINT(whitespace/line_length)
   29491                                       vmlsl(CurrentCond(),
   29492                                             dt,
   29493                                             QRegister(rd),
   29494                                             DRegister(rn),
   29495                                             DRegisterLane(rm, lane));
   29496                                       break;
   29497                                     }
   29498                                     case 0x00000100: {
   29499                                       // 0xef800740
   29500                                       if ((instr & 0x10000000) == 0x00000000) {
   29501                                         if (((instr & 0x300000) == 0x300000)) {
   29502                                           UnallocatedT32(instr);
   29503                                           return;
   29504                                         }
   29505                                         DataType dt = Dt_size_13_Decode(
   29506                                             (instr >> 20) & 0x3);
   29507                                         if (dt.Is(kDataTypeValueInvalid)) {
   29508                                           UnallocatedT32(instr);
   29509                                           return;
   29510                                         }
   29511                                         if (((instr >> 12) & 1) != 0) {
   29512                                           UnallocatedT32(instr);
   29513                                           return;
   29514                                         }
   29515                                         unsigned rd =
   29516                                             ExtractQRegister(instr, 22, 12);
   29517                                         unsigned rn =
   29518                                             ExtractDRegister(instr, 7, 16);
   29519                                         uint32_t mvm = (instr & 0xf) |
   29520                                                        ((instr >> 1) & 0x10);
   29521                                         uint32_t shift = 4;
   29522                                         if (dt.Is(S16)) {
   29523                                           shift = 3;
   29524                                         }
   29525                                         uint32_t vm = mvm & ((1 << shift) - 1);
   29526                                         uint32_t index = mvm >> shift;
   29527                                         // VQDMLSL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm>[<index>] ; T2 NOLINT(whitespace/line_length)
   29528                                         vqdmlsl(CurrentCond(),
   29529                                                 dt,
   29530                                                 QRegister(rd),
   29531                                                 DRegister(rn),
   29532                                                 DRegister(vm),
   29533                                                 index);
   29534                                       } else {
   29535                                         UnallocatedT32(instr);
   29536                                       }
   29537                                       break;
   29538                                     }
   29539                                   }
   29540                                   break;
   29541                                 }
   29542                               }
   29543                               break;
   29544                             }
   29545                             case 0x00000800: {
   29546                               // 0xef800800
   29547                               switch (instr & 0x00000300) {
   29548                                 case 0x00000000: {
   29549                                   // 0xef800800
   29550                                   if (((instr & 0x300000) == 0x300000)) {
   29551                                     UnallocatedT32(instr);
   29552                                     return;
   29553                                   }
   29554                                   DataType dt =
   29555                                       Dt_size_12_Decode((instr >> 20) & 0x3,
   29556                                                         (instr >> 28) & 0x1);
   29557                                   if (dt.Is(kDataTypeValueInvalid)) {
   29558                                     UnallocatedT32(instr);
   29559                                     return;
   29560                                   }
   29561                                   if (((instr >> 12) & 1) != 0) {
   29562                                     UnallocatedT32(instr);
   29563                                     return;
   29564                                   }
   29565                                   unsigned rd = ExtractQRegister(instr, 22, 12);
   29566                                   unsigned rn = ExtractDRegister(instr, 7, 16);
   29567                                   unsigned rm = ExtractDRegister(instr, 5, 0);
   29568                                   // VMLAL{<c>}{<q>}.<type><size> <Qd>, <Dn>, <Dm> ; T1 NOLINT(whitespace/line_length)
   29569                                   vmlal(CurrentCond(),
   29570                                         dt,
   29571                                         QRegister(rd),
   29572                                         DRegister(rn),
   29573                                         DRegister(rm));
   29574                                   break;
   29575                                 }
   29576                                 case 0x00000100: {
   29577                                   // 0xef800900
   29578                                   if ((instr & 0x10000000) == 0x00000000) {
   29579                                     if (((instr & 0x300000) == 0x300000)) {
   29580                                       UnallocatedT32(instr);
   29581                                       return;
   29582                                     }
   29583                                     DataType dt =
   29584                                         Dt_size_13_Decode((instr >> 20) & 0x3);
   29585                                     if (dt.Is(kDataTypeValueInvalid)) {
   29586                                       UnallocatedT32(instr);
   29587                                       return;
   29588                                     }
   29589                                     if (((instr >> 12) & 1) != 0) {
   29590                                       UnallocatedT32(instr);
   29591                                       return;
   29592                                     }
   29593                                     unsigned rd =
   29594                                         ExtractQRegister(instr, 22, 12);
   29595                                     unsigned rn =
   29596                                         ExtractDRegister(instr, 7, 16);
   29597                                     unsigned rm = ExtractDRegister(instr, 5, 0);
   29598                                     // VQDMLAL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; T1 NOLINT(whitespace/line_length)
   29599                                     vqdmlal(CurrentCond(),
   29600                                             dt,
   29601                                             QRegister(rd),
   29602                                             DRegister(rn),
   29603                                             DRegister(rm));
   29604                                   } else {
   29605                                     UnallocatedT32(instr);
   29606                                   }
   29607                                   break;
   29608                                 }
   29609                                 case 0x00000200: {
   29610                                   // 0xef800a00
   29611                                   if (((instr & 0x300000) == 0x300000)) {
   29612                                     UnallocatedT32(instr);
   29613                                     return;
   29614                                   }
   29615                                   DataType dt =
   29616                                       Dt_size_12_Decode((instr >> 20) & 0x3,
   29617                                                         (instr >> 28) & 0x1);
   29618                                   if (dt.Is(kDataTypeValueInvalid)) {
   29619                                     UnallocatedT32(instr);
   29620                                     return;
   29621                                   }
   29622                                   if (((instr >> 12) & 1) != 0) {
   29623                                     UnallocatedT32(instr);
   29624                                     return;
   29625                                   }
   29626                                   unsigned rd = ExtractQRegister(instr, 22, 12);
   29627                                   unsigned rn = ExtractDRegister(instr, 7, 16);
   29628                                   unsigned rm = ExtractDRegister(instr, 5, 0);
   29629                                   // VMLSL{<c>}{<q>}.<type><size> <Qd>, <Dn>, <Dm> ; T1 NOLINT(whitespace/line_length)
   29630                                   vmlsl(CurrentCond(),
   29631                                         dt,
   29632                                         QRegister(rd),
   29633                                         DRegister(rn),
   29634                                         DRegister(rm));
   29635                                   break;
   29636                                 }
   29637                                 case 0x00000300: {
   29638                                   // 0xef800b00
   29639                                   if ((instr & 0x10000000) == 0x00000000) {
   29640                                     if (((instr & 0x300000) == 0x300000)) {
   29641                                       UnallocatedT32(instr);
   29642                                       return;
   29643                                     }
   29644                                     DataType dt =
   29645                                         Dt_size_13_Decode((instr >> 20) & 0x3);
   29646                                     if (dt.Is(kDataTypeValueInvalid)) {
   29647                                       UnallocatedT32(instr);
   29648                                       return;
   29649                                     }
   29650                                     if (((instr >> 12) & 1) != 0) {
   29651                                       UnallocatedT32(instr);
   29652                                       return;
   29653                                     }
   29654                                     unsigned rd =
   29655                                         ExtractQRegister(instr, 22, 12);
   29656                                     unsigned rn =
   29657                                         ExtractDRegister(instr, 7, 16);
   29658                                     unsigned rm = ExtractDRegister(instr, 5, 0);
   29659                                     // VQDMLSL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; T1 NOLINT(whitespace/line_length)
   29660                                     vqdmlsl(CurrentCond(),
   29661                                             dt,
   29662                                             QRegister(rd),
   29663                                             DRegister(rn),
   29664                                             DRegister(rm));
   29665                                   } else {
   29666                                     UnallocatedT32(instr);
   29667                                   }
   29668                                   break;
   29669                                 }
   29670                               }
   29671                               break;
   29672                             }
   29673                             case 0x00000840: {
   29674                               // 0xef800840
   29675                               switch (instr & 0x00000200) {
   29676                                 case 0x00000000: {
   29677                                   // 0xef800840
   29678                                   switch (instr & 0x10000000) {
   29679                                     case 0x00000000: {
   29680                                       // 0xef800840
   29681                                       if (((instr & 0x300000) == 0x300000)) {
   29682                                         UnallocatedT32(instr);
   29683                                         return;
   29684                                       }
   29685                                       DataType dt = Dt_F_size_3_Decode(
   29686                                           ((instr >> 20) & 0x3) |
   29687                                           ((instr >> 6) & 0x4));
   29688                                       if (dt.Is(kDataTypeValueInvalid)) {
   29689                                         UnallocatedT32(instr);
   29690                                         return;
   29691                                       }
   29692                                       unsigned rd =
   29693                                           ExtractDRegister(instr, 22, 12);
   29694                                       unsigned rn =
   29695                                           ExtractDRegister(instr, 7, 16);
   29696                                       uint32_t mvm =
   29697                                           (instr & 0xf) | ((instr >> 1) & 0x10);
   29698                                       uint32_t shift = 4;
   29699                                       if (dt.Is(I16)) {
   29700                                         shift = 3;
   29701                                       }
   29702                                       uint32_t vm = mvm & ((1 << shift) - 1);
   29703                                       uint32_t index = mvm >> shift;
   29704                                       // VMUL{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm>[<index>] ; T1 NOLINT(whitespace/line_length)
   29705                                       vmul(CurrentCond(),
   29706                                            dt,
   29707                                            DRegister(rd),
   29708                                            DRegister(rn),
   29709                                            DRegister(vm),
   29710                                            index);
   29711                                       break;
   29712                                     }
   29713                                     case 0x10000000: {
   29714                                       // 0xff800840
   29715                                       if (((instr & 0x300000) == 0x300000)) {
   29716                                         UnallocatedT32(instr);
   29717                                         return;
   29718                                       }
   29719                                       DataType dt = Dt_F_size_3_Decode(
   29720                                           ((instr >> 20) & 0x3) |
   29721                                           ((instr >> 6) & 0x4));
   29722                                       if (dt.Is(kDataTypeValueInvalid)) {
   29723                                         UnallocatedT32(instr);
   29724                                         return;
   29725                                       }
   29726                                       if (((instr >> 12) & 1) != 0) {
   29727                                         UnallocatedT32(instr);
   29728                                         return;
   29729                                       }
   29730                                       unsigned rd =
   29731                                           ExtractQRegister(instr, 22, 12);
   29732                                       if (((instr >> 16) & 1) != 0) {
   29733                                         UnallocatedT32(instr);
   29734                                         return;
   29735                                       }
   29736                                       unsigned rn =
   29737                                           ExtractQRegister(instr, 7, 16);
   29738                                       uint32_t mvm =
   29739                                           (instr & 0xf) | ((instr >> 1) & 0x10);
   29740                                       uint32_t shift = 4;
   29741                                       if (dt.Is(I16)) {
   29742                                         shift = 3;
   29743                                       }
   29744                                       uint32_t vm = mvm & ((1 << shift) - 1);
   29745                                       uint32_t index = mvm >> shift;
   29746                                       // VMUL{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Dm>[<index>] ; T1 NOLINT(whitespace/line_length)
   29747                                       vmul(CurrentCond(),
   29748                                            dt,
   29749                                            QRegister(rd),
   29750                                            QRegister(rn),
   29751                                            DRegister(vm),
   29752                                            index);
   29753                                       break;
   29754                                     }
   29755                                   }
   29756                                   break;
   29757                                 }
   29758                                 case 0x00000200: {
   29759                                   // 0xef800a40
   29760                                   switch (instr & 0x00000100) {
   29761                                     case 0x00000000: {
   29762                                       // 0xef800a40
   29763                                       if (((instr & 0x300000) == 0x300000)) {
   29764                                         UnallocatedT32(instr);
   29765                                         return;
   29766                                       }
   29767                                       DataType dt = Dt_U_size_2_Decode(
   29768                                           ((instr >> 20) & 0x3) |
   29769                                           ((instr >> 26) & 0x4));
   29770                                       if (dt.Is(kDataTypeValueInvalid)) {
   29771                                         UnallocatedT32(instr);
   29772                                         return;
   29773                                       }
   29774                                       if (((instr >> 12) & 1) != 0) {
   29775                                         UnallocatedT32(instr);
   29776                                         return;
   29777                                       }
   29778                                       unsigned rd =
   29779                                           ExtractQRegister(instr, 22, 12);
   29780                                       unsigned rn =
   29781                                           ExtractDRegister(instr, 7, 16);
   29782                                       uint32_t mvm =
   29783                                           (instr & 0xf) | ((instr >> 1) & 0x10);
   29784                                       uint32_t shift = 4;
   29785                                       if (dt.Is(S16) || dt.Is(U16)) {
   29786                                         shift = 3;
   29787                                       }
   29788                                       uint32_t vm = mvm & ((1 << shift) - 1);
   29789                                       uint32_t index = mvm >> shift;
   29790                                       // VMULL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm>[<index>] ; T1 NOLINT(whitespace/line_length)
   29791                                       vmull(CurrentCond(),
   29792                                             dt,
   29793                                             QRegister(rd),
   29794                                             DRegister(rn),
   29795                                             DRegister(vm),
   29796                                             index);
   29797                                       break;
   29798                                     }
   29799                                     case 0x00000100: {
   29800                                       // 0xef800b40
   29801                                       if ((instr & 0x10000000) == 0x00000000) {
   29802                                         if (((instr & 0x300000) == 0x300000)) {
   29803                                           UnallocatedT32(instr);
   29804                                           return;
   29805                                         }
   29806                                         DataType dt = Dt_size_13_Decode(
   29807                                             (instr >> 20) & 0x3);
   29808                                         if (dt.Is(kDataTypeValueInvalid)) {
   29809                                           UnallocatedT32(instr);
   29810                                           return;
   29811                                         }
   29812                                         if (((instr >> 12) & 1) != 0) {
   29813                                           UnallocatedT32(instr);
   29814                                           return;
   29815                                         }
   29816                                         unsigned rd =
   29817                                             ExtractQRegister(instr, 22, 12);
   29818                                         unsigned rn =
   29819                                             ExtractDRegister(instr, 7, 16);
   29820                                         int lane;
   29821                                         unsigned rm =
   29822                                             ExtractDRegisterAndLane(instr,
   29823                                                                     dt,
   29824                                                                     5,
   29825                                                                     0,
   29826                                                                     &lane);
   29827                                         // VQDMULL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm[x]> ; T2 NOLINT(whitespace/line_length)
   29828                                         vqdmull(CurrentCond(),
   29829                                                 dt,
   29830                                                 QRegister(rd),
   29831                                                 DRegister(rn),
   29832                                                 DRegisterLane(rm, lane));
   29833                                       } else {
   29834                                         UnallocatedT32(instr);
   29835                                       }
   29836                                       break;
   29837                                     }
   29838                                   }
   29839                                   break;
   29840                                 }
   29841                               }
   29842                               break;
   29843                             }
   29844                             case 0x00000c00: {
   29845                               // 0xef800c00
   29846                               switch (instr & 0x00000100) {
   29847                                 case 0x00000000: {
   29848                                   // 0xef800c00
   29849                                   if (((instr & 0x300000) == 0x300000)) {
   29850                                     UnallocatedT32(instr);
   29851                                     return;
   29852                                   }
   29853                                   DataType dt = Dt_op_U_size_1_Decode(
   29854                                       ((instr >> 20) & 0x3) |
   29855                                       ((instr >> 26) & 0x4) |
   29856                                       ((instr >> 6) & 0x8));
   29857                                   if (dt.Is(kDataTypeValueInvalid)) {
   29858                                     UnallocatedT32(instr);
   29859                                     return;
   29860                                   }
   29861                                   if (((instr >> 12) & 1) != 0) {
   29862                                     UnallocatedT32(instr);
   29863                                     return;
   29864                                   }
   29865                                   unsigned rd = ExtractQRegister(instr, 22, 12);
   29866                                   unsigned rn = ExtractDRegister(instr, 7, 16);
   29867                                   unsigned rm = ExtractDRegister(instr, 5, 0);
   29868                                   // VMULL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; T1
   29869                                   vmull(CurrentCond(),
   29870                                         dt,
   29871                                         QRegister(rd),
   29872                                         DRegister(rn),
   29873                                         DRegister(rm));
   29874                                   break;
   29875                                 }
   29876                                 case 0x00000100: {
   29877                                   // 0xef800d00
   29878                                   if ((instr & 0x10000200) == 0x00000000) {
   29879                                     if (((instr & 0x300000) == 0x300000)) {
   29880                                       UnallocatedT32(instr);
   29881                                       return;
   29882                                     }
   29883                                     DataType dt =
   29884                                         Dt_size_13_Decode((instr >> 20) & 0x3);
   29885                                     if (dt.Is(kDataTypeValueInvalid)) {
   29886                                       UnallocatedT32(instr);
   29887                                       return;
   29888                                     }
   29889                                     if (((instr >> 12) & 1) != 0) {
   29890                                       UnallocatedT32(instr);
   29891                                       return;
   29892                                     }
   29893                                     unsigned rd =
   29894                                         ExtractQRegister(instr, 22, 12);
   29895                                     unsigned rn =
   29896                                         ExtractDRegister(instr, 7, 16);
   29897                                     unsigned rm = ExtractDRegister(instr, 5, 0);
   29898                                     // VQDMULL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; T1 NOLINT(whitespace/line_length)
   29899                                     vqdmull(CurrentCond(),
   29900                                             dt,
   29901                                             QRegister(rd),
   29902                                             DRegister(rn),
   29903                                             DRegister(rm));
   29904                                   } else {
   29905                                     UnallocatedT32(instr);
   29906                                   }
   29907                                   break;
   29908                                 }
   29909                               }
   29910                               break;
   29911                             }
   29912                             case 0x00000c40: {
   29913                               // 0xef800c40
   29914                               switch (instr & 0x10000300) {
   29915                                 case 0x00000000: {
   29916                                   // 0xef800c40
   29917                                   if (((instr & 0x300000) == 0x300000)) {
   29918                                     UnallocatedT32(instr);
   29919                                     return;
   29920                                   }
   29921                                   DataType dt =
   29922                                       Dt_size_13_Decode((instr >> 20) & 0x3);
   29923                                   if (dt.Is(kDataTypeValueInvalid)) {
   29924                                     UnallocatedT32(instr);
   29925                                     return;
   29926                                   }
   29927                                   unsigned rd = ExtractDRegister(instr, 22, 12);
   29928                                   unsigned rn = ExtractDRegister(instr, 7, 16);
   29929                                   int lane;
   29930                                   unsigned rm = ExtractDRegisterAndLane(instr,
   29931                                                                         dt,
   29932                                                                         5,
   29933                                                                         0,
   29934                                                                         &lane);
   29935                                   // VQDMULH{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm[x]> ; T2 NOLINT(whitespace/line_length)
   29936                                   vqdmulh(CurrentCond(),
   29937                                           dt,
   29938                                           DRegister(rd),
   29939                                           DRegister(rn),
   29940                                           DRegisterLane(rm, lane));
   29941                                   break;
   29942                                 }
   29943                                 case 0x00000100: {
   29944                                   // 0xef800d40
   29945                                   if (((instr & 0x300000) == 0x300000)) {
   29946                                     UnallocatedT32(instr);
   29947                                     return;
   29948                                   }
   29949                                   DataType dt =
   29950                                       Dt_size_13_Decode((instr >> 20) & 0x3);
   29951                                   if (dt.Is(kDataTypeValueInvalid)) {
   29952                                     UnallocatedT32(instr);
   29953                                     return;
   29954                                   }
   29955                                   unsigned rd = ExtractDRegister(instr, 22, 12);
   29956                                   unsigned rn = ExtractDRegister(instr, 7, 16);
   29957                                   int lane;
   29958                                   unsigned rm = ExtractDRegisterAndLane(instr,
   29959                                                                         dt,
   29960                                                                         5,
   29961                                                                         0,
   29962                                                                         &lane);
   29963                                   // VQRDMULH{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm[x]> ; T2 NOLINT(whitespace/line_length)
   29964                                   vqrdmulh(CurrentCond(),
   29965                                            dt,
   29966                                            DRegister(rd),
   29967                                            DRegister(rn),
   29968                                            DRegisterLane(rm, lane));
   29969                                   break;
   29970                                 }
   29971                                 case 0x10000000: {
   29972                                   // 0xff800c40
   29973                                   if (((instr & 0x300000) == 0x300000)) {
   29974                                     UnallocatedT32(instr);
   29975                                     return;
   29976                                   }
   29977                                   DataType dt =
   29978                                       Dt_size_13_Decode((instr >> 20) & 0x3);
   29979                                   if (dt.Is(kDataTypeValueInvalid)) {
   29980                                     UnallocatedT32(instr);
   29981                                     return;
   29982                                   }
   29983                                   if (((instr >> 12) & 1) != 0) {
   29984                                     UnallocatedT32(instr);
   29985                                     return;
   29986                                   }
   29987                                   unsigned rd = ExtractQRegister(instr, 22, 12);
   29988                                   if (((instr >> 16) & 1) != 0) {
   29989                                     UnallocatedT32(instr);
   29990                                     return;
   29991                                   }
   29992                                   unsigned rn = ExtractQRegister(instr, 7, 16);
   29993                                   int lane;
   29994                                   unsigned rm = ExtractDRegisterAndLane(instr,
   29995                                                                         dt,
   29996                                                                         5,
   29997                                                                         0,
   29998                                                                         &lane);
   29999                                   // VQDMULH{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Dm[x]> ; T2 NOLINT(whitespace/line_length)
   30000                                   vqdmulh(CurrentCond(),
   30001                                           dt,
   30002                                           QRegister(rd),
   30003                                           QRegister(rn),
   30004                                           DRegisterLane(rm, lane));
   30005                                   break;
   30006                                 }
   30007                                 case 0x10000100: {
   30008                                   // 0xff800d40
   30009                                   if (((instr & 0x300000) == 0x300000)) {
   30010                                     UnallocatedT32(instr);
   30011                                     return;
   30012                                   }
   30013                                   DataType dt =
   30014                                       Dt_size_13_Decode((instr >> 20) & 0x3);
   30015                                   if (dt.Is(kDataTypeValueInvalid)) {
   30016                                     UnallocatedT32(instr);
   30017                                     return;
   30018                                   }
   30019                                   if (((instr >> 12) & 1) != 0) {
   30020                                     UnallocatedT32(instr);
   30021                                     return;
   30022                                   }
   30023                                   unsigned rd = ExtractQRegister(instr, 22, 12);
   30024                                   if (((instr >> 16) & 1) != 0) {
   30025                                     UnallocatedT32(instr);
   30026                                     return;
   30027                                   }
   30028                                   unsigned rn = ExtractQRegister(instr, 7, 16);
   30029                                   int lane;
   30030                                   unsigned rm = ExtractDRegisterAndLane(instr,
   30031                                                                         dt,
   30032                                                                         5,
   30033                                                                         0,
   30034                                                                         &lane);
   30035                                   // VQRDMULH{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Dm[x]> ; T2 NOLINT(whitespace/line_length)
   30036                                   vqrdmulh(CurrentCond(),
   30037                                            dt,
   30038                                            QRegister(rd),
   30039                                            QRegister(rn),
   30040                                            DRegisterLane(rm, lane));
   30041                                   break;
   30042                                 }
   30043                                 default:
   30044                                   UnallocatedT32(instr);
   30045                                   break;
   30046                               }
   30047                               break;
   30048                             }
   30049                           }
   30050                           break;
   30051                         }
   30052                       }
   30053                       break;
   30054                     }
   30055                   }
   30056                   break;
   30057                 }
   30058                 case 0x01000010: {
   30059                   // 0xef000010
   30060                   switch (instr & 0x00800040) {
   30061                     case 0x00000000: {
   30062                       // 0xef000010
   30063                       switch (instr & 0x00000f00) {
   30064                         case 0x00000000: {
   30065                           // 0xef000010
   30066                           DataType dt = Dt_U_size_3_Decode(
   30067                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
   30068                           if (dt.Is(kDataTypeValueInvalid)) {
   30069                             UnallocatedT32(instr);
   30070                             return;
   30071                           }
   30072                           unsigned rd = ExtractDRegister(instr, 22, 12);
   30073                           unsigned rn = ExtractDRegister(instr, 7, 16);
   30074                           unsigned rm = ExtractDRegister(instr, 5, 0);
   30075                           // VQADD{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
   30076                           vqadd(CurrentCond(),
   30077                                 dt,
   30078                                 DRegister(rd),
   30079                                 DRegister(rn),
   30080                                 DRegister(rm));
   30081                           break;
   30082                         }
   30083                         case 0x00000100: {
   30084                           // 0xef000110
   30085                           switch (instr & 0x10300000) {
   30086                             case 0x00000000: {
   30087                               // 0xef000110
   30088                               unsigned rd = ExtractDRegister(instr, 22, 12);
   30089                               unsigned rn = ExtractDRegister(instr, 7, 16);
   30090                               unsigned rm = ExtractDRegister(instr, 5, 0);
   30091                               // VAND{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; T1
   30092                               vand(CurrentCond(),
   30093                                    kDataTypeValueNone,
   30094                                    DRegister(rd),
   30095                                    DRegister(rn),
   30096                                    DRegister(rm));
   30097                               break;
   30098                             }
   30099                             case 0x00100000: {
   30100                               // 0xef100110
   30101                               unsigned rd = ExtractDRegister(instr, 22, 12);
   30102                               unsigned rn = ExtractDRegister(instr, 7, 16);
   30103                               unsigned rm = ExtractDRegister(instr, 5, 0);
   30104                               // VBIC{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; T1
   30105                               vbic(CurrentCond(),
   30106                                    kDataTypeValueNone,
   30107                                    DRegister(rd),
   30108                                    DRegister(rn),
   30109                                    DRegister(rm));
   30110                               break;
   30111                             }
   30112                             case 0x00200000: {
   30113                               // 0xef200110
   30114                               if (((instr & 0x00000040) == 0x00000000) &&
   30115                                   ((((Uint32((instr >> 7)) & Uint32(0x1))
   30116                                      << 4) |
   30117                                     (Uint32((instr >> 16)) & Uint32(0xf))) ==
   30118                                    (((Uint32((instr >> 5)) & Uint32(0x1))
   30119                                      << 4) |
   30120                                     (Uint32(instr) & Uint32(0xf))))) {
   30121                                 unsigned rd = ExtractDRegister(instr, 22, 12);
   30122                                 unsigned rm = ExtractDRegister(instr, 7, 16);
   30123                                 // VMOV{<c>}{<q>}{.<dt>} <Dd>, <Dm> ; T1
   30124                                 vmov(CurrentCond(),
   30125                                      kDataTypeValueNone,
   30126                                      DRegister(rd),
   30127                                      DRegister(rm));
   30128                                 return;
   30129                               }
   30130                               unsigned rd = ExtractDRegister(instr, 22, 12);
   30131                               unsigned rn = ExtractDRegister(instr, 7, 16);
   30132                               unsigned rm = ExtractDRegister(instr, 5, 0);
   30133                               // VORR{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; T1
   30134                               vorr(CurrentCond(),
   30135                                    kDataTypeValueNone,
   30136                                    DRegister(rd),
   30137                                    DRegister(rn),
   30138                                    DRegister(rm));
   30139                               break;
   30140                             }
   30141                             case 0x00300000: {
   30142                               // 0xef300110
   30143                               unsigned rd = ExtractDRegister(instr, 22, 12);
   30144                               unsigned rn = ExtractDRegister(instr, 7, 16);
   30145                               unsigned rm = ExtractDRegister(instr, 5, 0);
   30146                               // VORN{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; T1
   30147                               vorn(CurrentCond(),
   30148                                    kDataTypeValueNone,
   30149                                    DRegister(rd),
   30150                                    DRegister(rn),
   30151                                    DRegister(rm));
   30152                               break;
   30153                             }
   30154                             case 0x10000000: {
   30155                               // 0xff000110
   30156                               unsigned rd = ExtractDRegister(instr, 22, 12);
   30157                               unsigned rn = ExtractDRegister(instr, 7, 16);
   30158                               unsigned rm = ExtractDRegister(instr, 5, 0);
   30159                               // VEOR{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; T1
   30160                               veor(CurrentCond(),
   30161                                    kDataTypeValueNone,
   30162                                    DRegister(rd),
   30163                                    DRegister(rn),
   30164                                    DRegister(rm));
   30165                               break;
   30166                             }
   30167                             case 0x10100000: {
   30168                               // 0xff100110
   30169                               unsigned rd = ExtractDRegister(instr, 22, 12);
   30170                               unsigned rn = ExtractDRegister(instr, 7, 16);
   30171                               unsigned rm = ExtractDRegister(instr, 5, 0);
   30172                               // VBSL{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; T1
   30173                               vbsl(CurrentCond(),
   30174                                    kDataTypeValueNone,
   30175                                    DRegister(rd),
   30176                                    DRegister(rn),
   30177                                    DRegister(rm));
   30178                               break;
   30179                             }
   30180                             case 0x10200000: {
   30181                               // 0xff200110
   30182                               unsigned rd = ExtractDRegister(instr, 22, 12);
   30183                               unsigned rn = ExtractDRegister(instr, 7, 16);
   30184                               unsigned rm = ExtractDRegister(instr, 5, 0);
   30185                               // VBIT{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; T1
   30186                               vbit(CurrentCond(),
   30187                                    kDataTypeValueNone,
   30188                                    DRegister(rd),
   30189                                    DRegister(rn),
   30190                                    DRegister(rm));
   30191                               break;
   30192                             }
   30193                             case 0x10300000: {
   30194                               // 0xff300110
   30195                               unsigned rd = ExtractDRegister(instr, 22, 12);
   30196                               unsigned rn = ExtractDRegister(instr, 7, 16);
   30197                               unsigned rm = ExtractDRegister(instr, 5, 0);
   30198                               // VBIF{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; T1
   30199                               vbif(CurrentCond(),
   30200                                    kDataTypeValueNone,
   30201                                    DRegister(rd),
   30202                                    DRegister(rn),
   30203                                    DRegister(rm));
   30204                               break;
   30205                             }
   30206                           }
   30207                           break;
   30208                         }
   30209                         case 0x00000200: {
   30210                           // 0xef000210
   30211                           DataType dt = Dt_U_size_3_Decode(
   30212                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
   30213                           if (dt.Is(kDataTypeValueInvalid)) {
   30214                             UnallocatedT32(instr);
   30215                             return;
   30216                           }
   30217                           unsigned rd = ExtractDRegister(instr, 22, 12);
   30218                           unsigned rn = ExtractDRegister(instr, 7, 16);
   30219                           unsigned rm = ExtractDRegister(instr, 5, 0);
   30220                           // VQSUB{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
   30221                           vqsub(CurrentCond(),
   30222                                 dt,
   30223                                 DRegister(rd),
   30224                                 DRegister(rn),
   30225                                 DRegister(rm));
   30226                           break;
   30227                         }
   30228                         case 0x00000300: {
   30229                           // 0xef000310
   30230                           DataType dt = Dt_U_size_1_Decode(
   30231                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
   30232                           if (dt.Is(kDataTypeValueInvalid)) {
   30233                             UnallocatedT32(instr);
   30234                             return;
   30235                           }
   30236                           unsigned rd = ExtractDRegister(instr, 22, 12);
   30237                           unsigned rn = ExtractDRegister(instr, 7, 16);
   30238                           unsigned rm = ExtractDRegister(instr, 5, 0);
   30239                           // VCGE{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
   30240                           vcge(CurrentCond(),
   30241                                dt,
   30242                                DRegister(rd),
   30243                                DRegister(rn),
   30244                                DRegister(rm));
   30245                           break;
   30246                         }
   30247                         case 0x00000400: {
   30248                           // 0xef000410
   30249                           DataType dt = Dt_U_size_3_Decode(
   30250                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
   30251                           if (dt.Is(kDataTypeValueInvalid)) {
   30252                             UnallocatedT32(instr);
   30253                             return;
   30254                           }
   30255                           unsigned rd = ExtractDRegister(instr, 22, 12);
   30256                           unsigned rm = ExtractDRegister(instr, 5, 0);
   30257                           unsigned rn = ExtractDRegister(instr, 7, 16);
   30258                           // VQSHL{<c>}{<q>}.<dt> {<Dd>}, <Dm>, <Dn> ; T1
   30259                           vqshl(CurrentCond(),
   30260                                 dt,
   30261                                 DRegister(rd),
   30262                                 DRegister(rm),
   30263                                 DRegister(rn));
   30264                           break;
   30265                         }
   30266                         case 0x00000500: {
   30267                           // 0xef000510
   30268                           DataType dt = Dt_U_size_3_Decode(
   30269                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
   30270                           if (dt.Is(kDataTypeValueInvalid)) {
   30271                             UnallocatedT32(instr);
   30272                             return;
   30273                           }
   30274                           unsigned rd = ExtractDRegister(instr, 22, 12);
   30275                           unsigned rm = ExtractDRegister(instr, 5, 0);
   30276                           unsigned rn = ExtractDRegister(instr, 7, 16);
   30277                           // VQRSHL{<c>}{<q>}.<dt> {<Dd>}, <Dm>, <Dn> ; T1
   30278                           vqrshl(CurrentCond(),
   30279                                  dt,
   30280                                  DRegister(rd),
   30281                                  DRegister(rm),
   30282                                  DRegister(rn));
   30283                           break;
   30284                         }
   30285                         case 0x00000600: {
   30286                           // 0xef000610
   30287                           DataType dt = Dt_U_size_1_Decode(
   30288                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
   30289                           if (dt.Is(kDataTypeValueInvalid)) {
   30290                             UnallocatedT32(instr);
   30291                             return;
   30292                           }
   30293                           unsigned rd = ExtractDRegister(instr, 22, 12);
   30294                           unsigned rn = ExtractDRegister(instr, 7, 16);
   30295                           unsigned rm = ExtractDRegister(instr, 5, 0);
   30296                           // VMIN{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
   30297                           vmin(CurrentCond(),
   30298                                dt,
   30299                                DRegister(rd),
   30300                                DRegister(rn),
   30301                                DRegister(rm));
   30302                           break;
   30303                         }
   30304                         case 0x00000700: {
   30305                           // 0xef000710
   30306                           DataType dt = Dt_U_size_1_Decode(
   30307                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
   30308                           if (dt.Is(kDataTypeValueInvalid)) {
   30309                             UnallocatedT32(instr);
   30310                             return;
   30311                           }
   30312                           unsigned rd = ExtractDRegister(instr, 22, 12);
   30313                           unsigned rn = ExtractDRegister(instr, 7, 16);
   30314                           unsigned rm = ExtractDRegister(instr, 5, 0);
   30315                           // VABA{<c>}{<q>}.<dt> <Dd>, <Dn>, <Dm> ; T1
   30316                           vaba(CurrentCond(),
   30317                                dt,
   30318                                DRegister(rd),
   30319                                DRegister(rn),
   30320                                DRegister(rm));
   30321                           break;
   30322                         }
   30323                         case 0x00000800: {
   30324                           // 0xef000810
   30325                           switch (instr & 0x10000000) {
   30326                             case 0x00000000: {
   30327                               // 0xef000810
   30328                               DataType dt =
   30329                                   Dt_size_7_Decode((instr >> 20) & 0x3);
   30330                               if (dt.Is(kDataTypeValueInvalid)) {
   30331                                 UnallocatedT32(instr);
   30332                                 return;
   30333                               }
   30334                               unsigned rd = ExtractDRegister(instr, 22, 12);
   30335                               unsigned rn = ExtractDRegister(instr, 7, 16);
   30336                               unsigned rm = ExtractDRegister(instr, 5, 0);
   30337                               // VTST{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
   30338                               vtst(CurrentCond(),
   30339                                    dt,
   30340                                    DRegister(rd),
   30341                                    DRegister(rn),
   30342                                    DRegister(rm));
   30343                               break;
   30344                             }
   30345                             case 0x10000000: {
   30346                               // 0xff000810
   30347                               DataType dt =
   30348                                   Dt_size_4_Decode((instr >> 20) & 0x3);
   30349                               if (dt.Is(kDataTypeValueInvalid)) {
   30350                                 UnallocatedT32(instr);
   30351                                 return;
   30352                               }
   30353                               unsigned rd = ExtractDRegister(instr, 22, 12);
   30354                               unsigned rn = ExtractDRegister(instr, 7, 16);
   30355                               unsigned rm = ExtractDRegister(instr, 5, 0);
   30356                               // VCEQ{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
   30357                               vceq(CurrentCond(),
   30358                                    dt,
   30359                                    DRegister(rd),
   30360                                    DRegister(rn),
   30361                                    DRegister(rm));
   30362                               break;
   30363                             }
   30364                           }
   30365                           break;
   30366                         }
   30367                         case 0x00000900: {
   30368                           // 0xef000910
   30369                           DataType dt = Dt_op_size_1_Decode(
   30370                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
   30371                           if (dt.Is(kDataTypeValueInvalid)) {
   30372                             UnallocatedT32(instr);
   30373                             return;
   30374                           }
   30375                           unsigned rd = ExtractDRegister(instr, 22, 12);
   30376                           unsigned rn = ExtractDRegister(instr, 7, 16);
   30377                           unsigned rm = ExtractDRegister(instr, 5, 0);
   30378                           // VMUL{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
   30379                           vmul(CurrentCond(),
   30380                                dt,
   30381                                DRegister(rd),
   30382                                DRegister(rn),
   30383                                DRegister(rm));
   30384                           break;
   30385                         }
   30386                         case 0x00000a00: {
   30387                           // 0xef000a10
   30388                           DataType dt = Dt_U_size_1_Decode(
   30389                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
   30390                           if (dt.Is(kDataTypeValueInvalid)) {
   30391                             UnallocatedT32(instr);
   30392                             return;
   30393                           }
   30394                           unsigned rd = ExtractDRegister(instr, 22, 12);
   30395                           unsigned rn = ExtractDRegister(instr, 7, 16);
   30396                           unsigned rm = ExtractDRegister(instr, 5, 0);
   30397                           // VPMIN{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
   30398                           vpmin(CurrentCond(),
   30399                                 dt,
   30400                                 DRegister(rd),
   30401                                 DRegister(rn),
   30402                                 DRegister(rm));
   30403                           break;
   30404                         }
   30405                         case 0x00000b00: {
   30406                           // 0xef000b10
   30407                           if ((instr & 0x10000000) == 0x00000000) {
   30408                             DataType dt = Dt_size_4_Decode((instr >> 20) & 0x3);
   30409                             if (dt.Is(kDataTypeValueInvalid)) {
   30410                               UnallocatedT32(instr);
   30411                               return;
   30412                             }
   30413                             unsigned rd = ExtractDRegister(instr, 22, 12);
   30414                             unsigned rn = ExtractDRegister(instr, 7, 16);
   30415                             unsigned rm = ExtractDRegister(instr, 5, 0);
   30416                             // VPADD{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
   30417                             vpadd(CurrentCond(),
   30418                                   dt,
   30419                                   DRegister(rd),
   30420                                   DRegister(rn),
   30421                                   DRegister(rm));
   30422                           } else {
   30423                             UnallocatedT32(instr);
   30424                           }
   30425                           break;
   30426                         }
   30427                         case 0x00000c00: {
   30428                           // 0xef000c10
   30429                           switch (instr & 0x10300000) {
   30430                             case 0x00000000: {
   30431                               // 0xef000c10
   30432                               unsigned rd = ExtractDRegister(instr, 22, 12);
   30433                               unsigned rn = ExtractDRegister(instr, 7, 16);
   30434                               unsigned rm = ExtractDRegister(instr, 5, 0);
   30435                               // VFMA{<c>}{<q>}.F32 <Dd>, <Dn>, <Dm> ; T1
   30436                               vfma(CurrentCond(),
   30437                                    F32,
   30438                                    DRegister(rd),
   30439                                    DRegister(rn),
   30440                                    DRegister(rm));
   30441                               break;
   30442                             }
   30443                             case 0x00200000: {
   30444                               // 0xef200c10
   30445                               unsigned rd = ExtractDRegister(instr, 22, 12);
   30446                               unsigned rn = ExtractDRegister(instr, 7, 16);
   30447                               unsigned rm = ExtractDRegister(instr, 5, 0);
   30448                               // VFMS{<c>}{<q>}.F32 <Dd>, <Dn>, <Dm> ; T1
   30449                               vfms(CurrentCond(),
   30450                                    F32,
   30451                                    DRegister(rd),
   30452                                    DRegister(rn),
   30453                                    DRegister(rm));
   30454                               break;
   30455                             }
   30456                             default:
   30457                               UnallocatedT32(instr);
   30458                               break;
   30459                           }
   30460                           break;
   30461                         }
   30462                         case 0x00000d00: {
   30463                           // 0xef000d10
   30464                           switch (instr & 0x10300000) {
   30465                             case 0x00000000: {
   30466                               // 0xef000d10
   30467                               unsigned rd = ExtractDRegister(instr, 22, 12);
   30468                               unsigned rn = ExtractDRegister(instr, 7, 16);
   30469                               unsigned rm = ExtractDRegister(instr, 5, 0);
   30470                               // VMLA{<c>}{<q>}.F32 <Dd>, <Dn>, <Dm> ; T1
   30471                               vmla(CurrentCond(),
   30472                                    F32,
   30473                                    DRegister(rd),
   30474                                    DRegister(rn),
   30475                                    DRegister(rm));
   30476                               break;
   30477                             }
   30478                             case 0x00200000: {
   30479                               // 0xef200d10
   30480                               unsigned rd = ExtractDRegister(instr, 22, 12);
   30481                               unsigned rn = ExtractDRegister(instr, 7, 16);
   30482                               unsigned rm = ExtractDRegister(instr, 5, 0);
   30483                               // VMLS{<c>}{<q>}.F32 <Dd>, <Dn>, <Dm> ; T1
   30484                               vmls(CurrentCond(),
   30485                                    F32,
   30486                                    DRegister(rd),
   30487                                    DRegister(rn),
   30488                                    DRegister(rm));
   30489                               break;
   30490                             }
   30491                             case 0x10000000: {
   30492                               // 0xff000d10
   30493                               unsigned rd = ExtractDRegister(instr, 22, 12);
   30494                               unsigned rn = ExtractDRegister(instr, 7, 16);
   30495                               unsigned rm = ExtractDRegister(instr, 5, 0);
   30496                               // VMUL{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T1
   30497                               vmul(CurrentCond(),
   30498                                    F32,
   30499                                    DRegister(rd),
   30500                                    DRegister(rn),
   30501                                    DRegister(rm));
   30502                               break;
   30503                             }
   30504                             default:
   30505                               UnallocatedT32(instr);
   30506                               break;
   30507                           }
   30508                           break;
   30509                         }
   30510                         case 0x00000e00: {
   30511                           // 0xef000e10
   30512                           switch (instr & 0x10300000) {
   30513                             case 0x10000000: {
   30514                               // 0xff000e10
   30515                               unsigned rd = ExtractDRegister(instr, 22, 12);
   30516                               unsigned rn = ExtractDRegister(instr, 7, 16);
   30517                               unsigned rm = ExtractDRegister(instr, 5, 0);
   30518                               // VACGE{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T1
   30519                               vacge(CurrentCond(),
   30520                                     F32,
   30521                                     DRegister(rd),
   30522                                     DRegister(rn),
   30523                                     DRegister(rm));
   30524                               break;
   30525                             }
   30526                             case 0x10200000: {
   30527                               // 0xff200e10
   30528                               unsigned rd = ExtractDRegister(instr, 22, 12);
   30529                               unsigned rn = ExtractDRegister(instr, 7, 16);
   30530                               unsigned rm = ExtractDRegister(instr, 5, 0);
   30531                               // VACGT{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T1
   30532                               vacgt(CurrentCond(),
   30533                                     F32,
   30534                                     DRegister(rd),
   30535                                     DRegister(rn),
   30536                                     DRegister(rm));
   30537                               break;
   30538                             }
   30539                             default:
   30540                               UnallocatedT32(instr);
   30541                               break;
   30542                           }
   30543                           break;
   30544                         }
   30545                         case 0x00000f00: {
   30546                           // 0xef000f10
   30547                           switch (instr & 0x10300000) {
   30548                             case 0x00000000: {
   30549                               // 0xef000f10
   30550                               unsigned rd = ExtractDRegister(instr, 22, 12);
   30551                               unsigned rn = ExtractDRegister(instr, 7, 16);
   30552                               unsigned rm = ExtractDRegister(instr, 5, 0);
   30553                               // VRECPS{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T1
   30554                               vrecps(CurrentCond(),
   30555                                      F32,
   30556                                      DRegister(rd),
   30557                                      DRegister(rn),
   30558                                      DRegister(rm));
   30559                               break;
   30560                             }
   30561                             case 0x00200000: {
   30562                               // 0xef200f10
   30563                               unsigned rd = ExtractDRegister(instr, 22, 12);
   30564                               unsigned rn = ExtractDRegister(instr, 7, 16);
   30565                               unsigned rm = ExtractDRegister(instr, 5, 0);
   30566                               // VRSQRTS{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T1
   30567                               vrsqrts(CurrentCond(),
   30568                                       F32,
   30569                                       DRegister(rd),
   30570                                       DRegister(rn),
   30571                                       DRegister(rm));
   30572                               break;
   30573                             }
   30574                             case 0x10000000: {
   30575                               // 0xff000f10
   30576                               unsigned rd = ExtractDRegister(instr, 22, 12);
   30577                               unsigned rn = ExtractDRegister(instr, 7, 16);
   30578                               unsigned rm = ExtractDRegister(instr, 5, 0);
   30579                               // VMAXNM{<q>}.F32 <Dd>, <Dn>, <Dm> ; T1
   30580                               vmaxnm(F32,
   30581                                      DRegister(rd),
   30582                                      DRegister(rn),
   30583                                      DRegister(rm));
   30584                               break;
   30585                             }
   30586                             case 0x10200000: {
   30587                               // 0xff200f10
   30588                               unsigned rd = ExtractDRegister(instr, 22, 12);
   30589                               unsigned rn = ExtractDRegister(instr, 7, 16);
   30590                               unsigned rm = ExtractDRegister(instr, 5, 0);
   30591                               // VMINNM{<q>}.F32 <Dd>, <Dn>, <Dm> ; T1
   30592                               vminnm(F32,
   30593                                      DRegister(rd),
   30594                                      DRegister(rn),
   30595                                      DRegister(rm));
   30596                               break;
   30597                             }
   30598                             default:
   30599                               UnallocatedT32(instr);
   30600                               break;
   30601                           }
   30602                           break;
   30603                         }
   30604                       }
   30605                       break;
   30606                     }
   30607                     case 0x00000040: {
   30608                       // 0xef000050
   30609                       switch (instr & 0x00000f00) {
   30610                         case 0x00000000: {
   30611                           // 0xef000050
   30612                           DataType dt = Dt_U_size_3_Decode(
   30613                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
   30614                           if (dt.Is(kDataTypeValueInvalid)) {
   30615                             UnallocatedT32(instr);
   30616                             return;
   30617                           }
   30618                           if (((instr >> 12) & 1) != 0) {
   30619                             UnallocatedT32(instr);
   30620                             return;
   30621                           }
   30622                           unsigned rd = ExtractQRegister(instr, 22, 12);
   30623                           if (((instr >> 16) & 1) != 0) {
   30624                             UnallocatedT32(instr);
   30625                             return;
   30626                           }
   30627                           unsigned rn = ExtractQRegister(instr, 7, 16);
   30628                           if ((instr & 1) != 0) {
   30629                             UnallocatedT32(instr);
   30630                             return;
   30631                           }
   30632                           unsigned rm = ExtractQRegister(instr, 5, 0);
   30633                           // VQADD{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
   30634                           vqadd(CurrentCond(),
   30635                                 dt,
   30636                                 QRegister(rd),
   30637                                 QRegister(rn),
   30638                                 QRegister(rm));
   30639                           break;
   30640                         }
   30641                         case 0x00000100: {
   30642                           // 0xef000150
   30643                           switch (instr & 0x10300000) {
   30644                             case 0x00000000: {
   30645                               // 0xef000150
   30646                               if (((instr >> 12) & 1) != 0) {
   30647                                 UnallocatedT32(instr);
   30648                                 return;
   30649                               }
   30650                               unsigned rd = ExtractQRegister(instr, 22, 12);
   30651                               if (((instr >> 16) & 1) != 0) {
   30652                                 UnallocatedT32(instr);
   30653                                 return;
   30654                               }
   30655                               unsigned rn = ExtractQRegister(instr, 7, 16);
   30656                               if ((instr & 1) != 0) {
   30657                                 UnallocatedT32(instr);
   30658                                 return;
   30659                               }
   30660                               unsigned rm = ExtractQRegister(instr, 5, 0);
   30661                               // VAND{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; T1
   30662                               vand(CurrentCond(),
   30663                                    kDataTypeValueNone,
   30664                                    QRegister(rd),
   30665                                    QRegister(rn),
   30666                                    QRegister(rm));
   30667                               break;
   30668                             }
   30669                             case 0x00100000: {
   30670                               // 0xef100150
   30671                               if (((instr >> 12) & 1) != 0) {
   30672                                 UnallocatedT32(instr);
   30673                                 return;
   30674                               }
   30675                               unsigned rd = ExtractQRegister(instr, 22, 12);
   30676                               if (((instr >> 16) & 1) != 0) {
   30677                                 UnallocatedT32(instr);
   30678                                 return;
   30679                               }
   30680                               unsigned rn = ExtractQRegister(instr, 7, 16);
   30681                               if ((instr & 1) != 0) {
   30682                                 UnallocatedT32(instr);
   30683                                 return;
   30684                               }
   30685                               unsigned rm = ExtractQRegister(instr, 5, 0);
   30686                               // VBIC{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; T1
   30687                               vbic(CurrentCond(),
   30688                                    kDataTypeValueNone,
   30689                                    QRegister(rd),
   30690                                    QRegister(rn),
   30691                                    QRegister(rm));
   30692                               break;
   30693                             }
   30694                             case 0x00200000: {
   30695                               // 0xef200150
   30696                               if (((instr & 0x00000040) == 0x00000040) &&
   30697                                   ((((Uint32((instr >> 7)) & Uint32(0x1))
   30698                                      << 4) |
   30699                                     (Uint32((instr >> 16)) & Uint32(0xf))) ==
   30700                                    (((Uint32((instr >> 5)) & Uint32(0x1))
   30701                                      << 4) |
   30702                                     (Uint32(instr) & Uint32(0xf))))) {
   30703                                 if (((instr >> 12) & 1) != 0) {
   30704                                   UnallocatedT32(instr);
   30705                                   return;
   30706                                 }
   30707                                 unsigned rd = ExtractQRegister(instr, 22, 12);
   30708                                 if (((instr >> 16) & 1) != 0) {
   30709                                   UnallocatedT32(instr);
   30710                                   return;
   30711                                 }
   30712                                 unsigned rm = ExtractQRegister(instr, 7, 16);
   30713                                 // VMOV{<c>}{<q>}{.<dt>} <Qd>, <Qm> ; T1
   30714                                 vmov(CurrentCond(),
   30715                                      kDataTypeValueNone,
   30716                                      QRegister(rd),
   30717                                      QRegister(rm));
   30718                                 return;
   30719                               }
   30720                               if (((instr >> 12) & 1) != 0) {
   30721                                 UnallocatedT32(instr);
   30722                                 return;
   30723                               }
   30724                               unsigned rd = ExtractQRegister(instr, 22, 12);
   30725                               if (((instr >> 16) & 1) != 0) {
   30726                                 UnallocatedT32(instr);
   30727                                 return;
   30728                               }
   30729                               unsigned rn = ExtractQRegister(instr, 7, 16);
   30730                               if ((instr & 1) != 0) {
   30731                                 UnallocatedT32(instr);
   30732                                 return;
   30733                               }
   30734                               unsigned rm = ExtractQRegister(instr, 5, 0);
   30735                               // VORR{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; T1
   30736                               vorr(CurrentCond(),
   30737                                    kDataTypeValueNone,
   30738                                    QRegister(rd),
   30739                                    QRegister(rn),
   30740                                    QRegister(rm));
   30741                               break;
   30742                             }
   30743                             case 0x00300000: {
   30744                               // 0xef300150
   30745                               if (((instr >> 12) & 1) != 0) {
   30746                                 UnallocatedT32(instr);
   30747                                 return;
   30748                               }
   30749                               unsigned rd = ExtractQRegister(instr, 22, 12);
   30750                               if (((instr >> 16) & 1) != 0) {
   30751                                 UnallocatedT32(instr);
   30752                                 return;
   30753                               }
   30754                               unsigned rn = ExtractQRegister(instr, 7, 16);
   30755                               if ((instr & 1) != 0) {
   30756                                 UnallocatedT32(instr);
   30757                                 return;
   30758                               }
   30759                               unsigned rm = ExtractQRegister(instr, 5, 0);
   30760                               // VORN{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; T1
   30761                               vorn(CurrentCond(),
   30762                                    kDataTypeValueNone,
   30763                                    QRegister(rd),
   30764                                    QRegister(rn),
   30765                                    QRegister(rm));
   30766                               break;
   30767                             }
   30768                             case 0x10000000: {
   30769                               // 0xff000150
   30770                               if (((instr >> 12) & 1) != 0) {
   30771                                 UnallocatedT32(instr);
   30772                                 return;
   30773                               }
   30774                               unsigned rd = ExtractQRegister(instr, 22, 12);
   30775                               if (((instr >> 16) & 1) != 0) {
   30776                                 UnallocatedT32(instr);
   30777                                 return;
   30778                               }
   30779                               unsigned rn = ExtractQRegister(instr, 7, 16);
   30780                               if ((instr & 1) != 0) {
   30781                                 UnallocatedT32(instr);
   30782                                 return;
   30783                               }
   30784                               unsigned rm = ExtractQRegister(instr, 5, 0);
   30785                               // VEOR{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; T1
   30786                               veor(CurrentCond(),
   30787                                    kDataTypeValueNone,
   30788                                    QRegister(rd),
   30789                                    QRegister(rn),
   30790                                    QRegister(rm));
   30791                               break;
   30792                             }
   30793                             case 0x10100000: {
   30794                               // 0xff100150
   30795                               if (((instr >> 12) & 1) != 0) {
   30796                                 UnallocatedT32(instr);
   30797                                 return;
   30798                               }
   30799                               unsigned rd = ExtractQRegister(instr, 22, 12);
   30800                               if (((instr >> 16) & 1) != 0) {
   30801                                 UnallocatedT32(instr);
   30802                                 return;
   30803                               }
   30804                               unsigned rn = ExtractQRegister(instr, 7, 16);
   30805                               if ((instr & 1) != 0) {
   30806                                 UnallocatedT32(instr);
   30807                                 return;
   30808                               }
   30809                               unsigned rm = ExtractQRegister(instr, 5, 0);
   30810                               // VBSL{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; T1
   30811                               vbsl(CurrentCond(),
   30812                                    kDataTypeValueNone,
   30813                                    QRegister(rd),
   30814                                    QRegister(rn),
   30815                                    QRegister(rm));
   30816                               break;
   30817                             }
   30818                             case 0x10200000: {
   30819                               // 0xff200150
   30820                               if (((instr >> 12) & 1) != 0) {
   30821                                 UnallocatedT32(instr);
   30822                                 return;
   30823                               }
   30824                               unsigned rd = ExtractQRegister(instr, 22, 12);
   30825                               if (((instr >> 16) & 1) != 0) {
   30826                                 UnallocatedT32(instr);
   30827                                 return;
   30828                               }
   30829                               unsigned rn = ExtractQRegister(instr, 7, 16);
   30830                               if ((instr & 1) != 0) {
   30831                                 UnallocatedT32(instr);
   30832                                 return;
   30833                               }
   30834                               unsigned rm = ExtractQRegister(instr, 5, 0);
   30835                               // VBIT{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; T1
   30836                               vbit(CurrentCond(),
   30837                                    kDataTypeValueNone,
   30838                                    QRegister(rd),
   30839                                    QRegister(rn),
   30840                                    QRegister(rm));
   30841                               break;
   30842                             }
   30843                             case 0x10300000: {
   30844                               // 0xff300150
   30845                               if (((instr >> 12) & 1) != 0) {
   30846                                 UnallocatedT32(instr);
   30847                                 return;
   30848                               }
   30849                               unsigned rd = ExtractQRegister(instr, 22, 12);
   30850                               if (((instr >> 16) & 1) != 0) {
   30851                                 UnallocatedT32(instr);
   30852                                 return;
   30853                               }
   30854                               unsigned rn = ExtractQRegister(instr, 7, 16);
   30855                               if ((instr & 1) != 0) {
   30856                                 UnallocatedT32(instr);
   30857                                 return;
   30858                               }
   30859                               unsigned rm = ExtractQRegister(instr, 5, 0);
   30860                               // VBIF{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; T1
   30861                               vbif(CurrentCond(),
   30862                                    kDataTypeValueNone,
   30863                                    QRegister(rd),
   30864                                    QRegister(rn),
   30865                                    QRegister(rm));
   30866                               break;
   30867                             }
   30868                           }
   30869                           break;
   30870                         }
   30871                         case 0x00000200: {
   30872                           // 0xef000250
   30873                           DataType dt = Dt_U_size_3_Decode(
   30874                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
   30875                           if (dt.Is(kDataTypeValueInvalid)) {
   30876                             UnallocatedT32(instr);
   30877                             return;
   30878                           }
   30879                           if (((instr >> 12) & 1) != 0) {
   30880                             UnallocatedT32(instr);
   30881                             return;
   30882                           }
   30883                           unsigned rd = ExtractQRegister(instr, 22, 12);
   30884                           if (((instr >> 16) & 1) != 0) {
   30885                             UnallocatedT32(instr);
   30886                             return;
   30887                           }
   30888                           unsigned rn = ExtractQRegister(instr, 7, 16);
   30889                           if ((instr & 1) != 0) {
   30890                             UnallocatedT32(instr);
   30891                             return;
   30892                           }
   30893                           unsigned rm = ExtractQRegister(instr, 5, 0);
   30894                           // VQSUB{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
   30895                           vqsub(CurrentCond(),
   30896                                 dt,
   30897                                 QRegister(rd),
   30898                                 QRegister(rn),
   30899                                 QRegister(rm));
   30900                           break;
   30901                         }
   30902                         case 0x00000300: {
   30903                           // 0xef000350
   30904                           DataType dt = Dt_U_size_1_Decode(
   30905                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
   30906                           if (dt.Is(kDataTypeValueInvalid)) {
   30907                             UnallocatedT32(instr);
   30908                             return;
   30909                           }
   30910                           if (((instr >> 12) & 1) != 0) {
   30911                             UnallocatedT32(instr);
   30912                             return;
   30913                           }
   30914                           unsigned rd = ExtractQRegister(instr, 22, 12);
   30915                           if (((instr >> 16) & 1) != 0) {
   30916                             UnallocatedT32(instr);
   30917                             return;
   30918                           }
   30919                           unsigned rn = ExtractQRegister(instr, 7, 16);
   30920                           if ((instr & 1) != 0) {
   30921                             UnallocatedT32(instr);
   30922                             return;
   30923                           }
   30924                           unsigned rm = ExtractQRegister(instr, 5, 0);
   30925                           // VCGE{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
   30926                           vcge(CurrentCond(),
   30927                                dt,
   30928                                QRegister(rd),
   30929                                QRegister(rn),
   30930                                QRegister(rm));
   30931                           break;
   30932                         }
   30933                         case 0x00000400: {
   30934                           // 0xef000450
   30935                           DataType dt = Dt_U_size_3_Decode(
   30936                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
   30937                           if (dt.Is(kDataTypeValueInvalid)) {
   30938                             UnallocatedT32(instr);
   30939                             return;
   30940                           }
   30941                           if (((instr >> 12) & 1) != 0) {
   30942                             UnallocatedT32(instr);
   30943                             return;
   30944                           }
   30945                           unsigned rd = ExtractQRegister(instr, 22, 12);
   30946                           if ((instr & 1) != 0) {
   30947                             UnallocatedT32(instr);
   30948                             return;
   30949                           }
   30950                           unsigned rm = ExtractQRegister(instr, 5, 0);
   30951                           if (((instr >> 16) & 1) != 0) {
   30952                             UnallocatedT32(instr);
   30953                             return;
   30954                           }
   30955                           unsigned rn = ExtractQRegister(instr, 7, 16);
   30956                           // VQSHL{<c>}{<q>}.<dt> {<Qd>}, <Qm>, <Qn> ; T1
   30957                           vqshl(CurrentCond(),
   30958                                 dt,
   30959                                 QRegister(rd),
   30960                                 QRegister(rm),
   30961                                 QRegister(rn));
   30962                           break;
   30963                         }
   30964                         case 0x00000500: {
   30965                           // 0xef000550
   30966                           DataType dt = Dt_U_size_3_Decode(
   30967                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
   30968                           if (dt.Is(kDataTypeValueInvalid)) {
   30969                             UnallocatedT32(instr);
   30970                             return;
   30971                           }
   30972                           if (((instr >> 12) & 1) != 0) {
   30973                             UnallocatedT32(instr);
   30974                             return;
   30975                           }
   30976                           unsigned rd = ExtractQRegister(instr, 22, 12);
   30977                           if ((instr & 1) != 0) {
   30978                             UnallocatedT32(instr);
   30979                             return;
   30980                           }
   30981                           unsigned rm = ExtractQRegister(instr, 5, 0);
   30982                           if (((instr >> 16) & 1) != 0) {
   30983                             UnallocatedT32(instr);
   30984                             return;
   30985                           }
   30986                           unsigned rn = ExtractQRegister(instr, 7, 16);
   30987                           // VQRSHL{<c>}{<q>}.<dt> {<Qd>}, <Qm>, <Qn> ; T1
   30988                           vqrshl(CurrentCond(),
   30989                                  dt,
   30990                                  QRegister(rd),
   30991                                  QRegister(rm),
   30992                                  QRegister(rn));
   30993                           break;
   30994                         }
   30995                         case 0x00000600: {
   30996                           // 0xef000650
   30997                           DataType dt = Dt_U_size_1_Decode(
   30998                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
   30999                           if (dt.Is(kDataTypeValueInvalid)) {
   31000                             UnallocatedT32(instr);
   31001                             return;
   31002                           }
   31003                           if (((instr >> 12) & 1) != 0) {
   31004                             UnallocatedT32(instr);
   31005                             return;
   31006                           }
   31007                           unsigned rd = ExtractQRegister(instr, 22, 12);
   31008                           if (((instr >> 16) & 1) != 0) {
   31009                             UnallocatedT32(instr);
   31010                             return;
   31011                           }
   31012                           unsigned rn = ExtractQRegister(instr, 7, 16);
   31013                           if ((instr & 1) != 0) {
   31014                             UnallocatedT32(instr);
   31015                             return;
   31016                           }
   31017                           unsigned rm = ExtractQRegister(instr, 5, 0);
   31018                           // VMIN{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
   31019                           vmin(CurrentCond(),
   31020                                dt,
   31021                                QRegister(rd),
   31022                                QRegister(rn),
   31023                                QRegister(rm));
   31024                           break;
   31025                         }
   31026                         case 0x00000700: {
   31027                           // 0xef000750
   31028                           DataType dt = Dt_U_size_1_Decode(
   31029                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
   31030                           if (dt.Is(kDataTypeValueInvalid)) {
   31031                             UnallocatedT32(instr);
   31032                             return;
   31033                           }
   31034                           if (((instr >> 12) & 1) != 0) {
   31035                             UnallocatedT32(instr);
   31036                             return;
   31037                           }
   31038                           unsigned rd = ExtractQRegister(instr, 22, 12);
   31039                           if (((instr >> 16) & 1) != 0) {
   31040                             UnallocatedT32(instr);
   31041                             return;
   31042                           }
   31043                           unsigned rn = ExtractQRegister(instr, 7, 16);
   31044                           if ((instr & 1) != 0) {
   31045                             UnallocatedT32(instr);
   31046                             return;
   31047                           }
   31048                           unsigned rm = ExtractQRegister(instr, 5, 0);
   31049                           // VABA{<c>}{<q>}.<dt> <Qd>, <Qn>, <Qm> ; T1
   31050                           vaba(CurrentCond(),
   31051                                dt,
   31052                                QRegister(rd),
   31053                                QRegister(rn),
   31054                                QRegister(rm));
   31055                           break;
   31056                         }
   31057                         case 0x00000800: {
   31058                           // 0xef000850
   31059                           switch (instr & 0x10000000) {
   31060                             case 0x00000000: {
   31061                               // 0xef000850
   31062                               DataType dt =
   31063                                   Dt_size_7_Decode((instr >> 20) & 0x3);
   31064                               if (dt.Is(kDataTypeValueInvalid)) {
   31065                                 UnallocatedT32(instr);
   31066                                 return;
   31067                               }
   31068                               if (((instr >> 12) & 1) != 0) {
   31069                                 UnallocatedT32(instr);
   31070                                 return;
   31071                               }
   31072                               unsigned rd = ExtractQRegister(instr, 22, 12);
   31073                               if (((instr >> 16) & 1) != 0) {
   31074                                 UnallocatedT32(instr);
   31075                                 return;
   31076                               }
   31077                               unsigned rn = ExtractQRegister(instr, 7, 16);
   31078                               if ((instr & 1) != 0) {
   31079                                 UnallocatedT32(instr);
   31080                                 return;
   31081                               }
   31082                               unsigned rm = ExtractQRegister(instr, 5, 0);
   31083                               // VTST{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
   31084                               vtst(CurrentCond(),
   31085                                    dt,
   31086                                    QRegister(rd),
   31087                                    QRegister(rn),
   31088                                    QRegister(rm));
   31089                               break;
   31090                             }
   31091                             case 0x10000000: {
   31092                               // 0xff000850
   31093                               DataType dt =
   31094                                   Dt_size_4_Decode((instr >> 20) & 0x3);
   31095                               if (dt.Is(kDataTypeValueInvalid)) {
   31096                                 UnallocatedT32(instr);
   31097                                 return;
   31098                               }
   31099                               if (((instr >> 12) & 1) != 0) {
   31100                                 UnallocatedT32(instr);
   31101                                 return;
   31102                               }
   31103                               unsigned rd = ExtractQRegister(instr, 22, 12);
   31104                               if (((instr >> 16) & 1) != 0) {
   31105                                 UnallocatedT32(instr);
   31106                                 return;
   31107                               }
   31108                               unsigned rn = ExtractQRegister(instr, 7, 16);
   31109                               if ((instr & 1) != 0) {
   31110                                 UnallocatedT32(instr);
   31111                                 return;
   31112                               }
   31113                               unsigned rm = ExtractQRegister(instr, 5, 0);
   31114                               // VCEQ{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
   31115                               vceq(CurrentCond(),
   31116                                    dt,
   31117                                    QRegister(rd),
   31118                                    QRegister(rn),
   31119                                    QRegister(rm));
   31120                               break;
   31121                             }
   31122                           }
   31123                           break;
   31124                         }
   31125                         case 0x00000900: {
   31126                           // 0xef000950
   31127                           DataType dt = Dt_op_size_1_Decode(
   31128                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
   31129                           if (dt.Is(kDataTypeValueInvalid)) {
   31130                             UnallocatedT32(instr);
   31131                             return;
   31132                           }
   31133                           if (((instr >> 12) & 1) != 0) {
   31134                             UnallocatedT32(instr);
   31135                             return;
   31136                           }
   31137                           unsigned rd = ExtractQRegister(instr, 22, 12);
   31138                           if (((instr >> 16) & 1) != 0) {
   31139                             UnallocatedT32(instr);
   31140                             return;
   31141                           }
   31142                           unsigned rn = ExtractQRegister(instr, 7, 16);
   31143                           if ((instr & 1) != 0) {
   31144                             UnallocatedT32(instr);
   31145                             return;
   31146                           }
   31147                           unsigned rm = ExtractQRegister(instr, 5, 0);
   31148                           // VMUL{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
   31149                           vmul(CurrentCond(),
   31150                                dt,
   31151                                QRegister(rd),
   31152                                QRegister(rn),
   31153                                QRegister(rm));
   31154                           break;
   31155                         }
   31156                         case 0x00000c00: {
   31157                           // 0xef000c50
   31158                           switch (instr & 0x10300000) {
   31159                             case 0x00000000: {
   31160                               // 0xef000c50
   31161                               if (((instr >> 12) & 1) != 0) {
   31162                                 UnallocatedT32(instr);
   31163                                 return;
   31164                               }
   31165                               unsigned rd = ExtractQRegister(instr, 22, 12);
   31166                               if (((instr >> 16) & 1) != 0) {
   31167                                 UnallocatedT32(instr);
   31168                                 return;
   31169                               }
   31170                               unsigned rn = ExtractQRegister(instr, 7, 16);
   31171                               if ((instr & 1) != 0) {
   31172                                 UnallocatedT32(instr);
   31173                                 return;
   31174                               }
   31175                               unsigned rm = ExtractQRegister(instr, 5, 0);
   31176                               // VFMA{<c>}{<q>}.F32 <Qd>, <Qn>, <Qm> ; T1
   31177                               vfma(CurrentCond(),
   31178                                    F32,
   31179                                    QRegister(rd),
   31180                                    QRegister(rn),
   31181                                    QRegister(rm));
   31182                               break;
   31183                             }
   31184                             case 0x00200000: {
   31185                               // 0xef200c50
   31186                               if (((instr >> 12) & 1) != 0) {
   31187                                 UnallocatedT32(instr);
   31188                                 return;
   31189                               }
   31190                               unsigned rd = ExtractQRegister(instr, 22, 12);
   31191                               if (((instr >> 16) & 1) != 0) {
   31192                                 UnallocatedT32(instr);
   31193                                 return;
   31194                               }
   31195                               unsigned rn = ExtractQRegister(instr, 7, 16);
   31196                               if ((instr & 1) != 0) {
   31197                                 UnallocatedT32(instr);
   31198                                 return;
   31199                               }
   31200                               unsigned rm = ExtractQRegister(instr, 5, 0);
   31201                               // VFMS{<c>}{<q>}.F32 <Qd>, <Qn>, <Qm> ; T1
   31202                               vfms(CurrentCond(),
   31203                                    F32,
   31204                                    QRegister(rd),
   31205                                    QRegister(rn),
   31206                                    QRegister(rm));
   31207                               break;
   31208                             }
   31209                             default:
   31210                               UnallocatedT32(instr);
   31211                               break;
   31212                           }
   31213                           break;
   31214                         }
   31215                         case 0x00000d00: {
   31216                           // 0xef000d50
   31217                           switch (instr & 0x10300000) {
   31218                             case 0x00000000: {
   31219                               // 0xef000d50
   31220                               if (((instr >> 12) & 1) != 0) {
   31221                                 UnallocatedT32(instr);
   31222                                 return;
   31223                               }
   31224                               unsigned rd = ExtractQRegister(instr, 22, 12);
   31225                               if (((instr >> 16) & 1) != 0) {
   31226                                 UnallocatedT32(instr);
   31227                                 return;
   31228                               }
   31229                               unsigned rn = ExtractQRegister(instr, 7, 16);
   31230                               if ((instr & 1) != 0) {
   31231                                 UnallocatedT32(instr);
   31232                                 return;
   31233                               }
   31234                               unsigned rm = ExtractQRegister(instr, 5, 0);
   31235                               // VMLA{<c>}{<q>}.F32 <Qd>, <Qn>, <Qm> ; T1
   31236                               vmla(CurrentCond(),
   31237                                    F32,
   31238                                    QRegister(rd),
   31239                                    QRegister(rn),
   31240                                    QRegister(rm));
   31241                               break;
   31242                             }
   31243                             case 0x00200000: {
   31244                               // 0xef200d50
   31245                               if (((instr >> 12) & 1) != 0) {
   31246                                 UnallocatedT32(instr);
   31247                                 return;
   31248                               }
   31249                               unsigned rd = ExtractQRegister(instr, 22, 12);
   31250                               if (((instr >> 16) & 1) != 0) {
   31251                                 UnallocatedT32(instr);
   31252                                 return;
   31253                               }
   31254                               unsigned rn = ExtractQRegister(instr, 7, 16);
   31255                               if ((instr & 1) != 0) {
   31256                                 UnallocatedT32(instr);
   31257                                 return;
   31258                               }
   31259                               unsigned rm = ExtractQRegister(instr, 5, 0);
   31260                               // VMLS{<c>}{<q>}.F32 <Qd>, <Qn>, <Qm> ; T1
   31261                               vmls(CurrentCond(),
   31262                                    F32,
   31263                                    QRegister(rd),
   31264                                    QRegister(rn),
   31265                                    QRegister(rm));
   31266                               break;
   31267                             }
   31268                             case 0x10000000: {
   31269                               // 0xff000d50
   31270                               if (((instr >> 12) & 1) != 0) {
   31271                                 UnallocatedT32(instr);
   31272                                 return;
   31273                               }
   31274                               unsigned rd = ExtractQRegister(instr, 22, 12);
   31275                               if (((instr >> 16) & 1) != 0) {
   31276                                 UnallocatedT32(instr);
   31277                                 return;
   31278                               }
   31279                               unsigned rn = ExtractQRegister(instr, 7, 16);
   31280                               if ((instr & 1) != 0) {
   31281                                 UnallocatedT32(instr);
   31282                                 return;
   31283                               }
   31284                               unsigned rm = ExtractQRegister(instr, 5, 0);
   31285                               // VMUL{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; T1
   31286                               vmul(CurrentCond(),
   31287                                    F32,
   31288                                    QRegister(rd),
   31289                                    QRegister(rn),
   31290                                    QRegister(rm));
   31291                               break;
   31292                             }
   31293                             default:
   31294                               UnallocatedT32(instr);
   31295                               break;
   31296                           }
   31297                           break;
   31298                         }
   31299                         case 0x00000e00: {
   31300                           // 0xef000e50
   31301                           switch (instr & 0x10300000) {
   31302                             case 0x10000000: {
   31303                               // 0xff000e50
   31304                               if (((instr >> 12) & 1) != 0) {
   31305                                 UnallocatedT32(instr);
   31306                                 return;
   31307                               }
   31308                               unsigned rd = ExtractQRegister(instr, 22, 12);
   31309                               if (((instr >> 16) & 1) != 0) {
   31310                                 UnallocatedT32(instr);
   31311                                 return;
   31312                               }
   31313                               unsigned rn = ExtractQRegister(instr, 7, 16);
   31314                               if ((instr & 1) != 0) {
   31315                                 UnallocatedT32(instr);
   31316                                 return;
   31317                               }
   31318                               unsigned rm = ExtractQRegister(instr, 5, 0);
   31319                               // VACGE{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; T1
   31320                               vacge(CurrentCond(),
   31321                                     F32,
   31322                                     QRegister(rd),
   31323                                     QRegister(rn),
   31324                                     QRegister(rm));
   31325                               break;
   31326                             }
   31327                             case 0x10200000: {
   31328                               // 0xff200e50
   31329                               if (((instr >> 12) & 1) != 0) {
   31330                                 UnallocatedT32(instr);
   31331                                 return;
   31332                               }
   31333                               unsigned rd = ExtractQRegister(instr, 22, 12);
   31334                               if (((instr >> 16) & 1) != 0) {
   31335                                 UnallocatedT32(instr);
   31336                                 return;
   31337                               }
   31338                               unsigned rn = ExtractQRegister(instr, 7, 16);
   31339                               if ((instr & 1) != 0) {
   31340                                 UnallocatedT32(instr);
   31341                                 return;
   31342                               }
   31343                               unsigned rm = ExtractQRegister(instr, 5, 0);
   31344                               // VACGT{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; T1
   31345                               vacgt(CurrentCond(),
   31346                                     F32,
   31347                                     QRegister(rd),
   31348                                     QRegister(rn),
   31349                                     QRegister(rm));
   31350                               break;
   31351                             }
   31352                             default:
   31353                               UnallocatedT32(instr);
   31354                               break;
   31355                           }
   31356                           break;
   31357                         }
   31358                         case 0x00000f00: {
   31359                           // 0xef000f50
   31360                           switch (instr & 0x10300000) {
   31361                             case 0x00000000: {
   31362                               // 0xef000f50
   31363                               if (((instr >> 12) & 1) != 0) {
   31364                                 UnallocatedT32(instr);
   31365                                 return;
   31366                               }
   31367                               unsigned rd = ExtractQRegister(instr, 22, 12);
   31368                               if (((instr >> 16) & 1) != 0) {
   31369                                 UnallocatedT32(instr);
   31370                                 return;
   31371                               }
   31372                               unsigned rn = ExtractQRegister(instr, 7, 16);
   31373                               if ((instr & 1) != 0) {
   31374                                 UnallocatedT32(instr);
   31375                                 return;
   31376                               }
   31377                               unsigned rm = ExtractQRegister(instr, 5, 0);
   31378                               // VRECPS{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; T1
   31379                               vrecps(CurrentCond(),
   31380                                      F32,
   31381                                      QRegister(rd),
   31382                                      QRegister(rn),
   31383                                      QRegister(rm));
   31384                               break;
   31385                             }
   31386                             case 0x00200000: {
   31387                               // 0xef200f50
   31388                               if (((instr >> 12) & 1) != 0) {
   31389                                 UnallocatedT32(instr);
   31390                                 return;
   31391                               }
   31392                               unsigned rd = ExtractQRegister(instr, 22, 12);
   31393                               if (((instr >> 16) & 1) != 0) {
   31394                                 UnallocatedT32(instr);
   31395                                 return;
   31396                               }
   31397                               unsigned rn = ExtractQRegister(instr, 7, 16);
   31398                               if ((instr & 1) != 0) {
   31399                                 UnallocatedT32(instr);
   31400                                 return;
   31401                               }
   31402                               unsigned rm = ExtractQRegister(instr, 5, 0);
   31403                               // VRSQRTS{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; T1
   31404                               vrsqrts(CurrentCond(),
   31405                                       F32,
   31406                                       QRegister(rd),
   31407                                       QRegister(rn),
   31408                                       QRegister(rm));
   31409                               break;
   31410                             }
   31411                             case 0x10000000: {
   31412                               // 0xff000f50
   31413                               if (((instr >> 12) & 1) != 0) {
   31414                                 UnallocatedT32(instr);
   31415                                 return;
   31416                               }
   31417                               unsigned rd = ExtractQRegister(instr, 22, 12);
   31418                               if (((instr >> 16) & 1) != 0) {
   31419                                 UnallocatedT32(instr);
   31420                                 return;
   31421                               }
   31422                               unsigned rn = ExtractQRegister(instr, 7, 16);
   31423                               if ((instr & 1) != 0) {
   31424                                 UnallocatedT32(instr);
   31425                                 return;
   31426                               }
   31427                               unsigned rm = ExtractQRegister(instr, 5, 0);
   31428                               // VMAXNM{<q>}.F32 <Qd>, <Qn>, <Qm> ; T1
   31429                               vmaxnm(F32,
   31430                                      QRegister(rd),
   31431                                      QRegister(rn),
   31432                                      QRegister(rm));
   31433                               break;
   31434                             }
   31435                             case 0x10200000: {
   31436                               // 0xff200f50
   31437                               if (((instr >> 12) & 1) != 0) {
   31438                                 UnallocatedT32(instr);
   31439                                 return;
   31440                               }
   31441                               unsigned rd = ExtractQRegister(instr, 22, 12);
   31442                               if (((instr >> 16) & 1) != 0) {
   31443                                 UnallocatedT32(instr);
   31444                                 return;
   31445                               }
   31446                               unsigned rn = ExtractQRegister(instr, 7, 16);
   31447                               if ((instr & 1) != 0) {
   31448                                 UnallocatedT32(instr);
   31449                                 return;
   31450                               }
   31451                               unsigned rm = ExtractQRegister(instr, 5, 0);
   31452                               // VMINNM{<q>}.F32 <Qd>, <Qn>, <Qm> ; T1
   31453                               vminnm(F32,
   31454                                      QRegister(rd),
   31455                                      QRegister(rn),
   31456                                      QRegister(rm));
   31457                               break;
   31458                             }
   31459                             default:
   31460                               UnallocatedT32(instr);
   31461                               break;
   31462                           }
   31463                           break;
   31464                         }
   31465                         default:
   31466                           UnallocatedT32(instr);
   31467                           break;
   31468                       }
   31469                       break;
   31470                     }
   31471                     case 0x00800000: {
   31472                       // 0xef800010
   31473                       switch (instr & 0x00000c00) {
   31474                         case 0x00000000: {
   31475                           // 0xef800010
   31476                           switch (instr & 0x00380080) {
   31477                             case 0x00000000: {
   31478                               // 0xef800010
   31479                               switch (instr & 0x00000100) {
   31480                                 case 0x00000000: {
   31481                                   // 0xef800010
   31482                                   switch (instr & 0x00000200) {
   31483                                     default: {
   31484                                       switch (instr & 0x00000020) {
   31485                                         case 0x00000020: {
   31486                                           // 0xef800030
   31487                                           if (((instr & 0xd00) == 0x100) ||
   31488                                               ((instr & 0xd00) == 0x500) ||
   31489                                               ((instr & 0xd00) == 0x900) ||
   31490                                               ((instr & 0xe00) == 0xe00)) {
   31491                                             UnallocatedT32(instr);
   31492                                             return;
   31493                                           }
   31494                                           unsigned cmode = (instr >> 8) & 0xf;
   31495                                           DataType dt =
   31496                                               ImmediateVmvn::DecodeDt(cmode);
   31497                                           if (dt.Is(kDataTypeValueInvalid)) {
   31498                                             UnallocatedT32(instr);
   31499                                             return;
   31500                                           }
   31501                                           unsigned rd =
   31502                                               ExtractDRegister(instr, 22, 12);
   31503                                           DOperand imm =
   31504                                               ImmediateVmvn::DecodeImmediate(
   31505                                                   cmode,
   31506                                                   (instr & 0xf) |
   31507                                                       ((instr >> 12) & 0x70) |
   31508                                                       ((instr >> 21) & 0x80));
   31509                                           // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
   31510                                           vmvn(CurrentCond(),
   31511                                                dt,
   31512                                                DRegister(rd),
   31513                                                imm);
   31514                                           break;
   31515                                         }
   31516                                         default: {
   31517                                           if (((instr & 0x920) == 0x100) ||
   31518                                               ((instr & 0x520) == 0x100) ||
   31519                                               ((instr & 0x820) == 0x20) ||
   31520                                               ((instr & 0x420) == 0x20) ||
   31521                                               ((instr & 0x220) == 0x20) ||
   31522                                               ((instr & 0x120) == 0x120)) {
   31523                                             UnallocatedT32(instr);
   31524                                             return;
   31525                                           }
   31526                                           unsigned cmode =
   31527                                               ((instr >> 8) & 0xf) |
   31528                                               ((instr >> 1) & 0x10);
   31529                                           DataType dt =
   31530                                               ImmediateVmov::DecodeDt(cmode);
   31531                                           if (dt.Is(kDataTypeValueInvalid)) {
   31532                                             UnallocatedT32(instr);
   31533                                             return;
   31534                                           }
   31535                                           unsigned rd =
   31536                                               ExtractDRegister(instr, 22, 12);
   31537                                           DOperand imm =
   31538                                               ImmediateVmov::DecodeImmediate(
   31539                                                   cmode,
   31540                                                   (instr & 0xf) |
   31541                                                       ((instr >> 12) & 0x70) |
   31542                                                       ((instr >> 21) & 0x80));
   31543                                           // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
   31544                                           vmov(CurrentCond(),
   31545                                                dt,
   31546                                                DRegister(rd),
   31547                                                imm);
   31548                                           break;
   31549                                         }
   31550                                       }
   31551                                       break;
   31552                                     }
   31553                                   }
   31554                                   break;
   31555                                 }
   31556                                 case 0x00000100: {
   31557                                   // 0xef800110
   31558                                   switch (instr & 0x00000020) {
   31559                                     case 0x00000000: {
   31560                                       // 0xef800110
   31561                                       if (((instr & 0x100) == 0x0) ||
   31562                                           ((instr & 0xc00) == 0xc00)) {
   31563                                         UnallocatedT32(instr);
   31564                                         return;
   31565                                       }
   31566                                       unsigned cmode = (instr >> 8) & 0xf;
   31567                                       DataType dt =
   31568                                           ImmediateVorr::DecodeDt(cmode);
   31569                                       if (dt.Is(kDataTypeValueInvalid)) {
   31570                                         UnallocatedT32(instr);
   31571                                         return;
   31572                                       }
   31573                                       unsigned rd =
   31574                                           ExtractDRegister(instr, 22, 12);
   31575                                       DOperand imm =
   31576                                           ImmediateVorr::DecodeImmediate(
   31577                                               cmode,
   31578                                               (instr & 0xf) |
   31579                                                   ((instr >> 12) & 0x70) |
   31580                                                   ((instr >> 21) & 0x80));
   31581                                       // VORR{<c>}{<q>}.<dt> {<Ddn>}, <Ddn>, #<imm> ; T1 NOLINT(whitespace/line_length)
   31582                                       vorr(CurrentCond(),
   31583                                            dt,
   31584                                            DRegister(rd),
   31585                                            DRegister(rd),
   31586                                            imm);
   31587                                       break;
   31588                                     }
   31589                                     case 0x00000020: {
   31590                                       // 0xef800130
   31591                                       if (((instr & 0x100) == 0x0) ||
   31592                                           ((instr & 0xc00) == 0xc00)) {
   31593                                         UnallocatedT32(instr);
   31594                                         return;
   31595                                       }
   31596                                       unsigned cmode = (instr >> 8) & 0xf;
   31597                                       DataType dt =
   31598                                           ImmediateVbic::DecodeDt(cmode);
   31599                                       if (dt.Is(kDataTypeValueInvalid)) {
   31600                                         UnallocatedT32(instr);
   31601                                         return;
   31602                                       }
   31603                                       unsigned rd =
   31604                                           ExtractDRegister(instr, 22, 12);
   31605                                       DOperand imm =
   31606                                           ImmediateVbic::DecodeImmediate(
   31607                                               cmode,
   31608                                               (instr & 0xf) |
   31609                                                   ((instr >> 12) & 0x70) |
   31610                                                   ((instr >> 21) & 0x80));
   31611                                       // VBIC{<c>}{<q>}.<dt> {<Ddn>}, <Ddn>, #<imm> ; T1 NOLINT(whitespace/line_length)
   31612                                       vbic(CurrentCond(),
   31613                                            dt,
   31614                                            DRegister(rd),
   31615                                            DRegister(rd),
   31616                                            imm);
   31617                                       break;
   31618                                     }
   31619                                   }
   31620                                   break;
   31621                                 }
   31622                               }
   31623                               break;
   31624                             }
   31625                             default: {
   31626                               switch (instr & 0x00000300) {
   31627                                 case 0x00000000: {
   31628                                   // 0xef800010
   31629                                   if (((instr & 0x380080) == 0x0)) {
   31630                                     UnallocatedT32(instr);
   31631                                     return;
   31632                                   }
   31633                                   DataType dt =
   31634                                       Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
   31635                                                              ((instr >> 4) &
   31636                                                               0x8),
   31637                                                          (instr >> 28) & 0x1);
   31638                                   if (dt.Is(kDataTypeValueInvalid)) {
   31639                                     UnallocatedT32(instr);
   31640                                     return;
   31641                                   }
   31642                                   unsigned rd = ExtractDRegister(instr, 22, 12);
   31643                                   unsigned rm = ExtractDRegister(instr, 5, 0);
   31644                                   uint32_t imm6 = (instr >> 16) & 0x3f;
   31645                                   uint32_t imm =
   31646                                       (dt.IsSize(64) ? 64
   31647                                                      : (dt.GetSize() * 2)) -
   31648                                       imm6;
   31649                                   // VSHR{<c>}{<q>}.<type><size> {<Dd>}, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   31650                                   vshr(CurrentCond(),
   31651                                        dt,
   31652                                        DRegister(rd),
   31653                                        DRegister(rm),
   31654                                        imm);
   31655                                   break;
   31656                                 }
   31657                                 case 0x00000100: {
   31658                                   // 0xef800110
   31659                                   if (((instr & 0x380080) == 0x0)) {
   31660                                     UnallocatedT32(instr);
   31661                                     return;
   31662                                   }
   31663                                   DataType dt =
   31664                                       Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
   31665                                                              ((instr >> 4) &
   31666                                                               0x8),
   31667                                                          (instr >> 28) & 0x1);
   31668                                   if (dt.Is(kDataTypeValueInvalid)) {
   31669                                     UnallocatedT32(instr);
   31670                                     return;
   31671                                   }
   31672                                   unsigned rd = ExtractDRegister(instr, 22, 12);
   31673                                   unsigned rm = ExtractDRegister(instr, 5, 0);
   31674                                   uint32_t imm6 = (instr >> 16) & 0x3f;
   31675                                   uint32_t imm =
   31676                                       (dt.IsSize(64) ? 64
   31677                                                      : (dt.GetSize() * 2)) -
   31678                                       imm6;
   31679                                   // VSRA{<c>}{<q>}.<type><size> {<Dd>}, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   31680                                   vsra(CurrentCond(),
   31681                                        dt,
   31682                                        DRegister(rd),
   31683                                        DRegister(rm),
   31684                                        imm);
   31685                                   break;
   31686                                 }
   31687                                 case 0x00000200: {
   31688                                   // 0xef800210
   31689                                   if (((instr & 0x380080) == 0x0)) {
   31690                                     UnallocatedT32(instr);
   31691                                     return;
   31692                                   }
   31693                                   DataType dt =
   31694                                       Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
   31695                                                              ((instr >> 4) &
   31696                                                               0x8),
   31697                                                          (instr >> 28) & 0x1);
   31698                                   if (dt.Is(kDataTypeValueInvalid)) {
   31699                                     UnallocatedT32(instr);
   31700                                     return;
   31701                                   }
   31702                                   unsigned rd = ExtractDRegister(instr, 22, 12);
   31703                                   unsigned rm = ExtractDRegister(instr, 5, 0);
   31704                                   uint32_t imm6 = (instr >> 16) & 0x3f;
   31705                                   uint32_t imm =
   31706                                       (dt.IsSize(64) ? 64
   31707                                                      : (dt.GetSize() * 2)) -
   31708                                       imm6;
   31709                                   // VRSHR{<c>}{<q>}.<type><size> {<Dd>}, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   31710                                   vrshr(CurrentCond(),
   31711                                         dt,
   31712                                         DRegister(rd),
   31713                                         DRegister(rm),
   31714                                         imm);
   31715                                   break;
   31716                                 }
   31717                                 case 0x00000300: {
   31718                                   // 0xef800310
   31719                                   if (((instr & 0x380080) == 0x0)) {
   31720                                     UnallocatedT32(instr);
   31721                                     return;
   31722                                   }
   31723                                   DataType dt =
   31724                                       Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
   31725                                                              ((instr >> 4) &
   31726                                                               0x8),
   31727                                                          (instr >> 28) & 0x1);
   31728                                   if (dt.Is(kDataTypeValueInvalid)) {
   31729                                     UnallocatedT32(instr);
   31730                                     return;
   31731                                   }
   31732                                   unsigned rd = ExtractDRegister(instr, 22, 12);
   31733                                   unsigned rm = ExtractDRegister(instr, 5, 0);
   31734                                   uint32_t imm6 = (instr >> 16) & 0x3f;
   31735                                   uint32_t imm =
   31736                                       (dt.IsSize(64) ? 64
   31737                                                      : (dt.GetSize() * 2)) -
   31738                                       imm6;
   31739                                   // VRSRA{<c>}{<q>}.<type><size> {<Dd>}, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   31740                                   vrsra(CurrentCond(),
   31741                                         dt,
   31742                                         DRegister(rd),
   31743                                         DRegister(rm),
   31744                                         imm);
   31745                                   break;
   31746                                 }
   31747                               }
   31748                               break;
   31749                             }
   31750                           }
   31751                           break;
   31752                         }
   31753                         case 0x00000400: {
   31754                           // 0xef800410
   31755                           switch (instr & 0x00380080) {
   31756                             case 0x00000000: {
   31757                               // 0xef800410
   31758                               switch (instr & 0x00000100) {
   31759                                 case 0x00000000: {
   31760                                   // 0xef800410
   31761                                   switch (instr & 0x00000200) {
   31762                                     default: {
   31763                                       switch (instr & 0x00000020) {
   31764                                         case 0x00000020: {
   31765                                           // 0xef800430
   31766                                           if (((instr & 0xd00) == 0x100) ||
   31767                                               ((instr & 0xd00) == 0x500) ||
   31768                                               ((instr & 0xd00) == 0x900) ||
   31769                                               ((instr & 0xe00) == 0xe00)) {
   31770                                             UnallocatedT32(instr);
   31771                                             return;
   31772                                           }
   31773                                           unsigned cmode = (instr >> 8) & 0xf;
   31774                                           DataType dt =
   31775                                               ImmediateVmvn::DecodeDt(cmode);
   31776                                           if (dt.Is(kDataTypeValueInvalid)) {
   31777                                             UnallocatedT32(instr);
   31778                                             return;
   31779                                           }
   31780                                           unsigned rd =
   31781                                               ExtractDRegister(instr, 22, 12);
   31782                                           DOperand imm =
   31783                                               ImmediateVmvn::DecodeImmediate(
   31784                                                   cmode,
   31785                                                   (instr & 0xf) |
   31786                                                       ((instr >> 12) & 0x70) |
   31787                                                       ((instr >> 21) & 0x80));
   31788                                           // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
   31789                                           vmvn(CurrentCond(),
   31790                                                dt,
   31791                                                DRegister(rd),
   31792                                                imm);
   31793                                           break;
   31794                                         }
   31795                                         default: {
   31796                                           if (((instr & 0x920) == 0x100) ||
   31797                                               ((instr & 0x520) == 0x100) ||
   31798                                               ((instr & 0x820) == 0x20) ||
   31799                                               ((instr & 0x420) == 0x20) ||
   31800                                               ((instr & 0x220) == 0x20) ||
   31801                                               ((instr & 0x120) == 0x120)) {
   31802                                             UnallocatedT32(instr);
   31803                                             return;
   31804                                           }
   31805                                           unsigned cmode =
   31806                                               ((instr >> 8) & 0xf) |
   31807                                               ((instr >> 1) & 0x10);
   31808                                           DataType dt =
   31809                                               ImmediateVmov::DecodeDt(cmode);
   31810                                           if (dt.Is(kDataTypeValueInvalid)) {
   31811                                             UnallocatedT32(instr);
   31812                                             return;
   31813                                           }
   31814                                           unsigned rd =
   31815                                               ExtractDRegister(instr, 22, 12);
   31816                                           DOperand imm =
   31817                                               ImmediateVmov::DecodeImmediate(
   31818                                                   cmode,
   31819                                                   (instr & 0xf) |
   31820                                                       ((instr >> 12) & 0x70) |
   31821                                                       ((instr >> 21) & 0x80));
   31822                                           // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
   31823                                           vmov(CurrentCond(),
   31824                                                dt,
   31825                                                DRegister(rd),
   31826                                                imm);
   31827                                           break;
   31828                                         }
   31829                                       }
   31830                                       break;
   31831                                     }
   31832                                   }
   31833                                   break;
   31834                                 }
   31835                                 case 0x00000100: {
   31836                                   // 0xef800510
   31837                                   switch (instr & 0x00000020) {
   31838                                     case 0x00000000: {
   31839                                       // 0xef800510
   31840                                       if (((instr & 0x100) == 0x0) ||
   31841                                           ((instr & 0xc00) == 0xc00)) {
   31842                                         UnallocatedT32(instr);
   31843                                         return;
   31844                                       }
   31845                                       unsigned cmode = (instr >> 8) & 0xf;
   31846                                       DataType dt =
   31847                                           ImmediateVorr::DecodeDt(cmode);
   31848                                       if (dt.Is(kDataTypeValueInvalid)) {
   31849                                         UnallocatedT32(instr);
   31850                                         return;
   31851                                       }
   31852                                       unsigned rd =
   31853                                           ExtractDRegister(instr, 22, 12);
   31854                                       DOperand imm =
   31855                                           ImmediateVorr::DecodeImmediate(
   31856                                               cmode,
   31857                                               (instr & 0xf) |
   31858                                                   ((instr >> 12) & 0x70) |
   31859                                                   ((instr >> 21) & 0x80));
   31860                                       // VORR{<c>}{<q>}.<dt> {<Ddn>}, <Ddn>, #<imm> ; T1 NOLINT(whitespace/line_length)
   31861                                       vorr(CurrentCond(),
   31862                                            dt,
   31863                                            DRegister(rd),
   31864                                            DRegister(rd),
   31865                                            imm);
   31866                                       break;
   31867                                     }
   31868                                     case 0x00000020: {
   31869                                       // 0xef800530
   31870                                       if (((instr & 0x100) == 0x0) ||
   31871                                           ((instr & 0xc00) == 0xc00)) {
   31872                                         UnallocatedT32(instr);
   31873                                         return;
   31874                                       }
   31875                                       unsigned cmode = (instr >> 8) & 0xf;
   31876                                       DataType dt =
   31877                                           ImmediateVbic::DecodeDt(cmode);
   31878                                       if (dt.Is(kDataTypeValueInvalid)) {
   31879                                         UnallocatedT32(instr);
   31880                                         return;
   31881                                       }
   31882                                       unsigned rd =
   31883                                           ExtractDRegister(instr, 22, 12);
   31884                                       DOperand imm =
   31885                                           ImmediateVbic::DecodeImmediate(
   31886                                               cmode,
   31887                                               (instr & 0xf) |
   31888                                                   ((instr >> 12) & 0x70) |
   31889                                                   ((instr >> 21) & 0x80));
   31890                                       // VBIC{<c>}{<q>}.<dt> {<Ddn>}, <Ddn>, #<imm> ; T1 NOLINT(whitespace/line_length)
   31891                                       vbic(CurrentCond(),
   31892                                            dt,
   31893                                            DRegister(rd),
   31894                                            DRegister(rd),
   31895                                            imm);
   31896                                       break;
   31897                                     }
   31898                                   }
   31899                                   break;
   31900                                 }
   31901                               }
   31902                               break;
   31903                             }
   31904                             default: {
   31905                               switch (instr & 0x00000300) {
   31906                                 case 0x00000000: {
   31907                                   // 0xef800410
   31908                                   if ((instr & 0x10000000) == 0x10000000) {
   31909                                     if (((instr & 0x380080) == 0x0)) {
   31910                                       UnallocatedT32(instr);
   31911                                       return;
   31912                                     }
   31913                                     DataType dt = Dt_L_imm6_4_Decode(
   31914                                         ((instr >> 19) & 0x7) |
   31915                                         ((instr >> 4) & 0x8));
   31916                                     if (dt.Is(kDataTypeValueInvalid)) {
   31917                                       UnallocatedT32(instr);
   31918                                       return;
   31919                                     }
   31920                                     unsigned rd =
   31921                                         ExtractDRegister(instr, 22, 12);
   31922                                     unsigned rm = ExtractDRegister(instr, 5, 0);
   31923                                     uint32_t imm6 = (instr >> 16) & 0x3f;
   31924                                     uint32_t imm =
   31925                                         (dt.IsSize(64) ? 64
   31926                                                        : (dt.GetSize() * 2)) -
   31927                                         imm6;
   31928                                     // VSRI{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   31929                                     vsri(CurrentCond(),
   31930                                          dt,
   31931                                          DRegister(rd),
   31932                                          DRegister(rm),
   31933                                          imm);
   31934                                   } else {
   31935                                     UnallocatedT32(instr);
   31936                                   }
   31937                                   break;
   31938                                 }
   31939                                 case 0x00000100: {
   31940                                   // 0xef800510
   31941                                   switch (instr & 0x10000000) {
   31942                                     case 0x00000000: {
   31943                                       // 0xef800510
   31944                                       if (((instr & 0x380080) == 0x0)) {
   31945                                         UnallocatedT32(instr);
   31946                                         return;
   31947                                       }
   31948                                       DataType dt = Dt_L_imm6_3_Decode(
   31949                                           ((instr >> 19) & 0x7) |
   31950                                           ((instr >> 4) & 0x8));
   31951                                       if (dt.Is(kDataTypeValueInvalid)) {
   31952                                         UnallocatedT32(instr);
   31953                                         return;
   31954                                       }
   31955                                       unsigned rd =
   31956                                           ExtractDRegister(instr, 22, 12);
   31957                                       unsigned rm =
   31958                                           ExtractDRegister(instr, 5, 0);
   31959                                       uint32_t imm6 = (instr >> 16) & 0x3f;
   31960                                       uint32_t imm =
   31961                                           imm6 -
   31962                                           (dt.IsSize(64) ? 0 : dt.GetSize());
   31963                                       // VSHL{<c>}{<q>}.I<size> {<Dd>}, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   31964                                       vshl(CurrentCond(),
   31965                                            dt,
   31966                                            DRegister(rd),
   31967                                            DRegister(rm),
   31968                                            imm);
   31969                                       break;
   31970                                     }
   31971                                     case 0x10000000: {
   31972                                       // 0xff800510
   31973                                       if (((instr & 0x380080) == 0x0)) {
   31974                                         UnallocatedT32(instr);
   31975                                         return;
   31976                                       }
   31977                                       DataType dt = Dt_L_imm6_4_Decode(
   31978                                           ((instr >> 19) & 0x7) |
   31979                                           ((instr >> 4) & 0x8));
   31980                                       if (dt.Is(kDataTypeValueInvalid)) {
   31981                                         UnallocatedT32(instr);
   31982                                         return;
   31983                                       }
   31984                                       unsigned rd =
   31985                                           ExtractDRegister(instr, 22, 12);
   31986                                       unsigned rm =
   31987                                           ExtractDRegister(instr, 5, 0);
   31988                                       uint32_t imm6 = (instr >> 16) & 0x3f;
   31989                                       uint32_t imm =
   31990                                           imm6 -
   31991                                           (dt.IsSize(64) ? 0 : dt.GetSize());
   31992                                       // VSLI{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   31993                                       vsli(CurrentCond(),
   31994                                            dt,
   31995                                            DRegister(rd),
   31996                                            DRegister(rm),
   31997                                            imm);
   31998                                       break;
   31999                                     }
   32000                                   }
   32001                                   break;
   32002                                 }
   32003                                 case 0x00000200: {
   32004                                   // 0xef800610
   32005                                   if (((instr & 0x380080) == 0x0)) {
   32006                                     UnallocatedT32(instr);
   32007                                     return;
   32008                                   }
   32009                                   DataType dt =
   32010                                       Dt_L_imm6_2_Decode(((instr >> 19) & 0x7) |
   32011                                                              ((instr >> 4) &
   32012                                                               0x8),
   32013                                                          (instr >> 28) & 0x1);
   32014                                   if (dt.Is(kDataTypeValueInvalid)) {
   32015                                     UnallocatedT32(instr);
   32016                                     return;
   32017                                   }
   32018                                   unsigned rd = ExtractDRegister(instr, 22, 12);
   32019                                   unsigned rm = ExtractDRegister(instr, 5, 0);
   32020                                   uint32_t imm6 = (instr >> 16) & 0x3f;
   32021                                   uint32_t imm =
   32022                                       imm6 - (dt.IsSize(64) ? 0 : dt.GetSize());
   32023                                   // VQSHLU{<c>}{<q>}.<type><size> {<Dd>}, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   32024                                   vqshlu(CurrentCond(),
   32025                                          dt,
   32026                                          DRegister(rd),
   32027                                          DRegister(rm),
   32028                                          imm);
   32029                                   break;
   32030                                 }
   32031                                 case 0x00000300: {
   32032                                   // 0xef800710
   32033                                   if (((instr & 0x380080) == 0x0)) {
   32034                                     UnallocatedT32(instr);
   32035                                     return;
   32036                                   }
   32037                                   DataType dt =
   32038                                       Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
   32039                                                              ((instr >> 4) &
   32040                                                               0x8),
   32041                                                          (instr >> 28) & 0x1);
   32042                                   if (dt.Is(kDataTypeValueInvalid)) {
   32043                                     UnallocatedT32(instr);
   32044                                     return;
   32045                                   }
   32046                                   unsigned rd = ExtractDRegister(instr, 22, 12);
   32047                                   unsigned rm = ExtractDRegister(instr, 5, 0);
   32048                                   uint32_t imm6 = (instr >> 16) & 0x3f;
   32049                                   uint32_t imm =
   32050                                       imm6 - (dt.IsSize(64) ? 0 : dt.GetSize());
   32051                                   // VQSHL{<c>}{<q>}.<type><size> {<Dd>}, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   32052                                   vqshl(CurrentCond(),
   32053                                         dt,
   32054                                         DRegister(rd),
   32055                                         DRegister(rm),
   32056                                         imm);
   32057                                   break;
   32058                                 }
   32059                               }
   32060                               break;
   32061                             }
   32062                           }
   32063                           break;
   32064                         }
   32065                         case 0x00000800: {
   32066                           // 0xef800810
   32067                           switch (instr & 0x00000080) {
   32068                             case 0x00000000: {
   32069                               // 0xef800810
   32070                               switch (instr & 0x00380000) {
   32071                                 case 0x00000000: {
   32072                                   // 0xef800810
   32073                                   switch (instr & 0x00000100) {
   32074                                     case 0x00000000: {
   32075                                       // 0xef800810
   32076                                       switch (instr & 0x00000200) {
   32077                                         default: {
   32078                                           switch (instr & 0x00000020) {
   32079                                             case 0x00000020: {
   32080                                               // 0xef800830
   32081                                               if (((instr & 0xd00) == 0x100) ||
   32082                                                   ((instr & 0xd00) == 0x500) ||
   32083                                                   ((instr & 0xd00) == 0x900) ||
   32084                                                   ((instr & 0xe00) == 0xe00)) {
   32085                                                 UnallocatedT32(instr);
   32086                                                 return;
   32087                                               }
   32088                                               unsigned cmode =
   32089                                                   (instr >> 8) & 0xf;
   32090                                               DataType dt =
   32091                                                   ImmediateVmvn::DecodeDt(
   32092                                                       cmode);
   32093                                               if (dt.Is(
   32094                                                       kDataTypeValueInvalid)) {
   32095                                                 UnallocatedT32(instr);
   32096                                                 return;
   32097                                               }
   32098                                               unsigned rd =
   32099                                                   ExtractDRegister(instr,
   32100                                                                    22,
   32101                                                                    12);
   32102                                               DOperand imm = ImmediateVmvn::
   32103                                                   DecodeImmediate(cmode,
   32104                                                                   (instr &
   32105                                                                    0xf) |
   32106                                                                       ((instr >>
   32107                                                                         12) &
   32108                                                                        0x70) |
   32109                                                                       ((instr >>
   32110                                                                         21) &
   32111                                                                        0x80));
   32112                                               // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
   32113                                               vmvn(CurrentCond(),
   32114                                                    dt,
   32115                                                    DRegister(rd),
   32116                                                    imm);
   32117                                               break;
   32118                                             }
   32119                                             default: {
   32120                                               if (((instr & 0x920) == 0x100) ||
   32121                                                   ((instr & 0x520) == 0x100) ||
   32122                                                   ((instr & 0x820) == 0x20) ||
   32123                                                   ((instr & 0x420) == 0x20) ||
   32124                                                   ((instr & 0x220) == 0x20) ||
   32125                                                   ((instr & 0x120) == 0x120)) {
   32126                                                 UnallocatedT32(instr);
   32127                                                 return;
   32128                                               }
   32129                                               unsigned cmode =
   32130                                                   ((instr >> 8) & 0xf) |
   32131                                                   ((instr >> 1) & 0x10);
   32132                                               DataType dt =
   32133                                                   ImmediateVmov::DecodeDt(
   32134                                                       cmode);
   32135                                               if (dt.Is(
   32136                                                       kDataTypeValueInvalid)) {
   32137                                                 UnallocatedT32(instr);
   32138                                                 return;
   32139                                               }
   32140                                               unsigned rd =
   32141                                                   ExtractDRegister(instr,
   32142                                                                    22,
   32143                                                                    12);
   32144                                               DOperand imm = ImmediateVmov::
   32145                                                   DecodeImmediate(cmode,
   32146                                                                   (instr &
   32147                                                                    0xf) |
   32148                                                                       ((instr >>
   32149                                                                         12) &
   32150                                                                        0x70) |
   32151                                                                       ((instr >>
   32152                                                                         21) &
   32153                                                                        0x80));
   32154                                               // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
   32155                                               vmov(CurrentCond(),
   32156                                                    dt,
   32157                                                    DRegister(rd),
   32158                                                    imm);
   32159                                               break;
   32160                                             }
   32161                                           }
   32162                                           break;
   32163                                         }
   32164                                       }
   32165                                       break;
   32166                                     }
   32167                                     case 0x00000100: {
   32168                                       // 0xef800910
   32169                                       switch (instr & 0x00000020) {
   32170                                         case 0x00000000: {
   32171                                           // 0xef800910
   32172                                           if (((instr & 0x100) == 0x0) ||
   32173                                               ((instr & 0xc00) == 0xc00)) {
   32174                                             UnallocatedT32(instr);
   32175                                             return;
   32176                                           }
   32177                                           unsigned cmode = (instr >> 8) & 0xf;
   32178                                           DataType dt =
   32179                                               ImmediateVorr::DecodeDt(cmode);
   32180                                           if (dt.Is(kDataTypeValueInvalid)) {
   32181                                             UnallocatedT32(instr);
   32182                                             return;
   32183                                           }
   32184                                           unsigned rd =
   32185                                               ExtractDRegister(instr, 22, 12);
   32186                                           DOperand imm =
   32187                                               ImmediateVorr::DecodeImmediate(
   32188                                                   cmode,
   32189                                                   (instr & 0xf) |
   32190                                                       ((instr >> 12) & 0x70) |
   32191                                                       ((instr >> 21) & 0x80));
   32192                                           // VORR{<c>}{<q>}.<dt> {<Ddn>}, <Ddn>, #<imm> ; T1 NOLINT(whitespace/line_length)
   32193                                           vorr(CurrentCond(),
   32194                                                dt,
   32195                                                DRegister(rd),
   32196                                                DRegister(rd),
   32197                                                imm);
   32198                                           break;
   32199                                         }
   32200                                         case 0x00000020: {
   32201                                           // 0xef800930
   32202                                           if (((instr & 0x100) == 0x0) ||
   32203                                               ((instr & 0xc00) == 0xc00)) {
   32204                                             UnallocatedT32(instr);
   32205                                             return;
   32206                                           }
   32207                                           unsigned cmode = (instr >> 8) & 0xf;
   32208                                           DataType dt =
   32209                                               ImmediateVbic::DecodeDt(cmode);
   32210                                           if (dt.Is(kDataTypeValueInvalid)) {
   32211                                             UnallocatedT32(instr);
   32212                                             return;
   32213                                           }
   32214                                           unsigned rd =
   32215                                               ExtractDRegister(instr, 22, 12);
   32216                                           DOperand imm =
   32217                                               ImmediateVbic::DecodeImmediate(
   32218                                                   cmode,
   32219                                                   (instr & 0xf) |
   32220                                                       ((instr >> 12) & 0x70) |
   32221                                                       ((instr >> 21) & 0x80));
   32222                                           // VBIC{<c>}{<q>}.<dt> {<Ddn>}, <Ddn>, #<imm> ; T1 NOLINT(whitespace/line_length)
   32223                                           vbic(CurrentCond(),
   32224                                                dt,
   32225                                                DRegister(rd),
   32226                                                DRegister(rd),
   32227                                                imm);
   32228                                           break;
   32229                                         }
   32230                                       }
   32231                                       break;
   32232                                     }
   32233                                   }
   32234                                   break;
   32235                                 }
   32236                                 case 0x00180000: {
   32237                                   // 0xef980810
   32238                                   switch (instr & 0x00000300) {
   32239                                     case 0x00000000: {
   32240                                       // 0xef980810
   32241                                       switch (instr & 0x10000000) {
   32242                                         case 0x00000000: {
   32243                                           // 0xef980810
   32244                                           if (((instr & 0x380000) == 0x0)) {
   32245                                             UnallocatedT32(instr);
   32246                                             return;
   32247                                           }
   32248                                           DataType dt = Dt_imm6_3_Decode(
   32249                                               (instr >> 19) & 0x7);
   32250                                           if (dt.Is(kDataTypeValueInvalid)) {
   32251                                             UnallocatedT32(instr);
   32252                                             return;
   32253                                           }
   32254                                           unsigned rd =
   32255                                               ExtractDRegister(instr, 22, 12);
   32256                                           if ((instr & 1) != 0) {
   32257                                             UnallocatedT32(instr);
   32258                                             return;
   32259                                           }
   32260                                           unsigned rm =
   32261                                               ExtractQRegister(instr, 5, 0);
   32262                                           uint32_t imm6 = (instr >> 16) & 0x3f;
   32263                                           uint32_t imm = dt.GetSize() - imm6;
   32264                                           // VSHRN{<c>}{<q>}.I<size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   32265                                           vshrn(CurrentCond(),
   32266                                                 dt,
   32267                                                 DRegister(rd),
   32268                                                 QRegister(rm),
   32269                                                 imm);
   32270                                           break;
   32271                                         }
   32272                                         case 0x10000000: {
   32273                                           // 0xff980810
   32274                                           if (((instr & 0x380000) == 0x0)) {
   32275                                             UnallocatedT32(instr);
   32276                                             return;
   32277                                           }
   32278                                           DataType dt =
   32279                                               Dt_imm6_2_Decode((instr >> 19) &
   32280                                                                    0x7,
   32281                                                                (instr >> 28) &
   32282                                                                    0x1);
   32283                                           if (dt.Is(kDataTypeValueInvalid)) {
   32284                                             UnallocatedT32(instr);
   32285                                             return;
   32286                                           }
   32287                                           unsigned rd =
   32288                                               ExtractDRegister(instr, 22, 12);
   32289                                           if ((instr & 1) != 0) {
   32290                                             UnallocatedT32(instr);
   32291                                             return;
   32292                                           }
   32293                                           unsigned rm =
   32294                                               ExtractQRegister(instr, 5, 0);
   32295                                           uint32_t imm6 = (instr >> 16) & 0x3f;
   32296                                           uint32_t imm = dt.GetSize() - imm6;
   32297                                           // VQSHRUN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   32298                                           vqshrun(CurrentCond(),
   32299                                                   dt,
   32300                                                   DRegister(rd),
   32301                                                   QRegister(rm),
   32302                                                   imm);
   32303                                           break;
   32304                                         }
   32305                                       }
   32306                                       break;
   32307                                     }
   32308                                     case 0x00000100: {
   32309                                       // 0xef980910
   32310                                       if (((instr & 0x380000) == 0x0)) {
   32311                                         UnallocatedT32(instr);
   32312                                         return;
   32313                                       }
   32314                                       DataType dt =
   32315                                           Dt_imm6_1_Decode((instr >> 19) & 0x7,
   32316                                                            (instr >> 28) & 0x1);
   32317                                       if (dt.Is(kDataTypeValueInvalid)) {
   32318                                         UnallocatedT32(instr);
   32319                                         return;
   32320                                       }
   32321                                       unsigned rd =
   32322                                           ExtractDRegister(instr, 22, 12);
   32323                                       if ((instr & 1) != 0) {
   32324                                         UnallocatedT32(instr);
   32325                                         return;
   32326                                       }
   32327                                       unsigned rm =
   32328                                           ExtractQRegister(instr, 5, 0);
   32329                                       uint32_t imm6 = (instr >> 16) & 0x3f;
   32330                                       uint32_t imm = dt.GetSize() - imm6;
   32331                                       // VQSHRN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   32332                                       vqshrn(CurrentCond(),
   32333                                              dt,
   32334                                              DRegister(rd),
   32335                                              QRegister(rm),
   32336                                              imm);
   32337                                       break;
   32338                                     }
   32339                                     case 0x00000200: {
   32340                                       // 0xef980a10
   32341                                       if (((instr & 0x380000) == 0x0) ||
   32342                                           ((instr & 0x3f0000) == 0x80000) ||
   32343                                           ((instr & 0x3f0000) == 0x100000) ||
   32344                                           ((instr & 0x3f0000) == 0x200000)) {
   32345                                         UnallocatedT32(instr);
   32346                                         return;
   32347                                       }
   32348                                       DataType dt =
   32349                                           Dt_imm6_4_Decode((instr >> 19) & 0x7,
   32350                                                            (instr >> 28) & 0x1);
   32351                                       if (dt.Is(kDataTypeValueInvalid)) {
   32352                                         UnallocatedT32(instr);
   32353                                         return;
   32354                                       }
   32355                                       if (((instr >> 12) & 1) != 0) {
   32356                                         UnallocatedT32(instr);
   32357                                         return;
   32358                                       }
   32359                                       unsigned rd =
   32360                                           ExtractQRegister(instr, 22, 12);
   32361                                       unsigned rm =
   32362                                           ExtractDRegister(instr, 5, 0);
   32363                                       uint32_t imm6 = (instr >> 16) & 0x3f;
   32364                                       uint32_t imm = imm6 - dt.GetSize();
   32365                                       // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   32366                                       vshll(CurrentCond(),
   32367                                             dt,
   32368                                             QRegister(rd),
   32369                                             DRegister(rm),
   32370                                             imm);
   32371                                       break;
   32372                                     }
   32373                                     default:
   32374                                       UnallocatedT32(instr);
   32375                                       break;
   32376                                   }
   32377                                   break;
   32378                                 }
   32379                                 case 0x00280000: {
   32380                                   // 0xefa80810
   32381                                   switch (instr & 0x00000300) {
   32382                                     case 0x00000000: {
   32383                                       // 0xefa80810
   32384                                       switch (instr & 0x10000000) {
   32385                                         case 0x00000000: {
   32386                                           // 0xefa80810
   32387                                           if (((instr & 0x380000) == 0x0)) {
   32388                                             UnallocatedT32(instr);
   32389                                             return;
   32390                                           }
   32391                                           DataType dt = Dt_imm6_3_Decode(
   32392                                               (instr >> 19) & 0x7);
   32393                                           if (dt.Is(kDataTypeValueInvalid)) {
   32394                                             UnallocatedT32(instr);
   32395                                             return;
   32396                                           }
   32397                                           unsigned rd =
   32398                                               ExtractDRegister(instr, 22, 12);
   32399                                           if ((instr & 1) != 0) {
   32400                                             UnallocatedT32(instr);
   32401                                             return;
   32402                                           }
   32403                                           unsigned rm =
   32404                                               ExtractQRegister(instr, 5, 0);
   32405                                           uint32_t imm6 = (instr >> 16) & 0x3f;
   32406                                           uint32_t imm = dt.GetSize() - imm6;
   32407                                           // VSHRN{<c>}{<q>}.I<size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   32408                                           vshrn(CurrentCond(),
   32409                                                 dt,
   32410                                                 DRegister(rd),
   32411                                                 QRegister(rm),
   32412                                                 imm);
   32413                                           break;
   32414                                         }
   32415                                         case 0x10000000: {
   32416                                           // 0xffa80810
   32417                                           if (((instr & 0x380000) == 0x0)) {
   32418                                             UnallocatedT32(instr);
   32419                                             return;
   32420                                           }
   32421                                           DataType dt =
   32422                                               Dt_imm6_2_Decode((instr >> 19) &
   32423                                                                    0x7,
   32424                                                                (instr >> 28) &
   32425                                                                    0x1);
   32426                                           if (dt.Is(kDataTypeValueInvalid)) {
   32427                                             UnallocatedT32(instr);
   32428                                             return;
   32429                                           }
   32430                                           unsigned rd =
   32431                                               ExtractDRegister(instr, 22, 12);
   32432                                           if ((instr & 1) != 0) {
   32433                                             UnallocatedT32(instr);
   32434                                             return;
   32435                                           }
   32436                                           unsigned rm =
   32437                                               ExtractQRegister(instr, 5, 0);
   32438                                           uint32_t imm6 = (instr >> 16) & 0x3f;
   32439                                           uint32_t imm = dt.GetSize() - imm6;
   32440                                           // VQSHRUN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   32441                                           vqshrun(CurrentCond(),
   32442                                                   dt,
   32443                                                   DRegister(rd),
   32444                                                   QRegister(rm),
   32445                                                   imm);
   32446                                           break;
   32447                                         }
   32448                                       }
   32449                                       break;
   32450                                     }
   32451                                     case 0x00000100: {
   32452                                       // 0xefa80910
   32453                                       if (((instr & 0x380000) == 0x0)) {
   32454                                         UnallocatedT32(instr);
   32455                                         return;
   32456                                       }
   32457                                       DataType dt =
   32458                                           Dt_imm6_1_Decode((instr >> 19) & 0x7,
   32459                                                            (instr >> 28) & 0x1);
   32460                                       if (dt.Is(kDataTypeValueInvalid)) {
   32461                                         UnallocatedT32(instr);
   32462                                         return;
   32463                                       }
   32464                                       unsigned rd =
   32465                                           ExtractDRegister(instr, 22, 12);
   32466                                       if ((instr & 1) != 0) {
   32467                                         UnallocatedT32(instr);
   32468                                         return;
   32469                                       }
   32470                                       unsigned rm =
   32471                                           ExtractQRegister(instr, 5, 0);
   32472                                       uint32_t imm6 = (instr >> 16) & 0x3f;
   32473                                       uint32_t imm = dt.GetSize() - imm6;
   32474                                       // VQSHRN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   32475                                       vqshrn(CurrentCond(),
   32476                                              dt,
   32477                                              DRegister(rd),
   32478                                              QRegister(rm),
   32479                                              imm);
   32480                                       break;
   32481                                     }
   32482                                     case 0x00000200: {
   32483                                       // 0xefa80a10
   32484                                       if (((instr & 0x380000) == 0x0) ||
   32485                                           ((instr & 0x3f0000) == 0x80000) ||
   32486                                           ((instr & 0x3f0000) == 0x100000) ||
   32487                                           ((instr & 0x3f0000) == 0x200000)) {
   32488                                         UnallocatedT32(instr);
   32489                                         return;
   32490                                       }
   32491                                       DataType dt =
   32492                                           Dt_imm6_4_Decode((instr >> 19) & 0x7,
   32493                                                            (instr >> 28) & 0x1);
   32494                                       if (dt.Is(kDataTypeValueInvalid)) {
   32495                                         UnallocatedT32(instr);
   32496                                         return;
   32497                                       }
   32498                                       if (((instr >> 12) & 1) != 0) {
   32499                                         UnallocatedT32(instr);
   32500                                         return;
   32501                                       }
   32502                                       unsigned rd =
   32503                                           ExtractQRegister(instr, 22, 12);
   32504                                       unsigned rm =
   32505                                           ExtractDRegister(instr, 5, 0);
   32506                                       uint32_t imm6 = (instr >> 16) & 0x3f;
   32507                                       uint32_t imm = imm6 - dt.GetSize();
   32508                                       // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   32509                                       vshll(CurrentCond(),
   32510                                             dt,
   32511                                             QRegister(rd),
   32512                                             DRegister(rm),
   32513                                             imm);
   32514                                       break;
   32515                                     }
   32516                                     default:
   32517                                       UnallocatedT32(instr);
   32518                                       break;
   32519                                   }
   32520                                   break;
   32521                                 }
   32522                                 case 0x00300000: {
   32523                                   // 0xefb00810
   32524                                   switch (instr & 0x00000300) {
   32525                                     case 0x00000000: {
   32526                                       // 0xefb00810
   32527                                       switch (instr & 0x10000000) {
   32528                                         case 0x00000000: {
   32529                                           // 0xefb00810
   32530                                           if (((instr & 0x380000) == 0x0)) {
   32531                                             UnallocatedT32(instr);
   32532                                             return;
   32533                                           }
   32534                                           DataType dt = Dt_imm6_3_Decode(
   32535                                               (instr >> 19) & 0x7);
   32536                                           if (dt.Is(kDataTypeValueInvalid)) {
   32537                                             UnallocatedT32(instr);
   32538                                             return;
   32539                                           }
   32540                                           unsigned rd =
   32541                                               ExtractDRegister(instr, 22, 12);
   32542                                           if ((instr & 1) != 0) {
   32543                                             UnallocatedT32(instr);
   32544                                             return;
   32545                                           }
   32546                                           unsigned rm =
   32547                                               ExtractQRegister(instr, 5, 0);
   32548                                           uint32_t imm6 = (instr >> 16) & 0x3f;
   32549                                           uint32_t imm = dt.GetSize() - imm6;
   32550                                           // VSHRN{<c>}{<q>}.I<size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   32551                                           vshrn(CurrentCond(),
   32552                                                 dt,
   32553                                                 DRegister(rd),
   32554                                                 QRegister(rm),
   32555                                                 imm);
   32556                                           break;
   32557                                         }
   32558                                         case 0x10000000: {
   32559                                           // 0xffb00810
   32560                                           if (((instr & 0x380000) == 0x0)) {
   32561                                             UnallocatedT32(instr);
   32562                                             return;
   32563                                           }
   32564                                           DataType dt =
   32565                                               Dt_imm6_2_Decode((instr >> 19) &
   32566                                                                    0x7,
   32567                                                                (instr >> 28) &
   32568                                                                    0x1);
   32569                                           if (dt.Is(kDataTypeValueInvalid)) {
   32570                                             UnallocatedT32(instr);
   32571                                             return;
   32572                                           }
   32573                                           unsigned rd =
   32574                                               ExtractDRegister(instr, 22, 12);
   32575                                           if ((instr & 1) != 0) {
   32576                                             UnallocatedT32(instr);
   32577                                             return;
   32578                                           }
   32579                                           unsigned rm =
   32580                                               ExtractQRegister(instr, 5, 0);
   32581                                           uint32_t imm6 = (instr >> 16) & 0x3f;
   32582                                           uint32_t imm = dt.GetSize() - imm6;
   32583                                           // VQSHRUN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   32584                                           vqshrun(CurrentCond(),
   32585                                                   dt,
   32586                                                   DRegister(rd),
   32587                                                   QRegister(rm),
   32588                                                   imm);
   32589                                           break;
   32590                                         }
   32591                                       }
   32592                                       break;
   32593                                     }
   32594                                     case 0x00000100: {
   32595                                       // 0xefb00910
   32596                                       if (((instr & 0x380000) == 0x0)) {
   32597                                         UnallocatedT32(instr);
   32598                                         return;
   32599                                       }
   32600                                       DataType dt =
   32601                                           Dt_imm6_1_Decode((instr >> 19) & 0x7,
   32602                                                            (instr >> 28) & 0x1);
   32603                                       if (dt.Is(kDataTypeValueInvalid)) {
   32604                                         UnallocatedT32(instr);
   32605                                         return;
   32606                                       }
   32607                                       unsigned rd =
   32608                                           ExtractDRegister(instr, 22, 12);
   32609                                       if ((instr & 1) != 0) {
   32610                                         UnallocatedT32(instr);
   32611                                         return;
   32612                                       }
   32613                                       unsigned rm =
   32614                                           ExtractQRegister(instr, 5, 0);
   32615                                       uint32_t imm6 = (instr >> 16) & 0x3f;
   32616                                       uint32_t imm = dt.GetSize() - imm6;
   32617                                       // VQSHRN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   32618                                       vqshrn(CurrentCond(),
   32619                                              dt,
   32620                                              DRegister(rd),
   32621                                              QRegister(rm),
   32622                                              imm);
   32623                                       break;
   32624                                     }
   32625                                     case 0x00000200: {
   32626                                       // 0xefb00a10
   32627                                       if (((instr & 0x380000) == 0x0) ||
   32628                                           ((instr & 0x3f0000) == 0x80000) ||
   32629                                           ((instr & 0x3f0000) == 0x100000) ||
   32630                                           ((instr & 0x3f0000) == 0x200000)) {
   32631                                         UnallocatedT32(instr);
   32632                                         return;
   32633                                       }
   32634                                       DataType dt =
   32635                                           Dt_imm6_4_Decode((instr >> 19) & 0x7,
   32636                                                            (instr >> 28) & 0x1);
   32637                                       if (dt.Is(kDataTypeValueInvalid)) {
   32638                                         UnallocatedT32(instr);
   32639                                         return;
   32640                                       }
   32641                                       if (((instr >> 12) & 1) != 0) {
   32642                                         UnallocatedT32(instr);
   32643                                         return;
   32644                                       }
   32645                                       unsigned rd =
   32646                                           ExtractQRegister(instr, 22, 12);
   32647                                       unsigned rm =
   32648                                           ExtractDRegister(instr, 5, 0);
   32649                                       uint32_t imm6 = (instr >> 16) & 0x3f;
   32650                                       uint32_t imm = imm6 - dt.GetSize();
   32651                                       // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   32652                                       vshll(CurrentCond(),
   32653                                             dt,
   32654                                             QRegister(rd),
   32655                                             DRegister(rm),
   32656                                             imm);
   32657                                       break;
   32658                                     }
   32659                                     default:
   32660                                       UnallocatedT32(instr);
   32661                                       break;
   32662                                   }
   32663                                   break;
   32664                                 }
   32665                                 case 0x00380000: {
   32666                                   // 0xefb80810
   32667                                   switch (instr & 0x00000300) {
   32668                                     case 0x00000000: {
   32669                                       // 0xefb80810
   32670                                       switch (instr & 0x10000000) {
   32671                                         case 0x00000000: {
   32672                                           // 0xefb80810
   32673                                           if (((instr & 0x380000) == 0x0)) {
   32674                                             UnallocatedT32(instr);
   32675                                             return;
   32676                                           }
   32677                                           DataType dt = Dt_imm6_3_Decode(
   32678                                               (instr >> 19) & 0x7);
   32679                                           if (dt.Is(kDataTypeValueInvalid)) {
   32680                                             UnallocatedT32(instr);
   32681                                             return;
   32682                                           }
   32683                                           unsigned rd =
   32684                                               ExtractDRegister(instr, 22, 12);
   32685                                           if ((instr & 1) != 0) {
   32686                                             UnallocatedT32(instr);
   32687                                             return;
   32688                                           }
   32689                                           unsigned rm =
   32690                                               ExtractQRegister(instr, 5, 0);
   32691                                           uint32_t imm6 = (instr >> 16) & 0x3f;
   32692                                           uint32_t imm = dt.GetSize() - imm6;
   32693                                           // VSHRN{<c>}{<q>}.I<size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   32694                                           vshrn(CurrentCond(),
   32695                                                 dt,
   32696                                                 DRegister(rd),
   32697                                                 QRegister(rm),
   32698                                                 imm);
   32699                                           break;
   32700                                         }
   32701                                         case 0x10000000: {
   32702                                           // 0xffb80810
   32703                                           if (((instr & 0x380000) == 0x0)) {
   32704                                             UnallocatedT32(instr);
   32705                                             return;
   32706                                           }
   32707                                           DataType dt =
   32708                                               Dt_imm6_2_Decode((instr >> 19) &
   32709                                                                    0x7,
   32710                                                                (instr >> 28) &
   32711                                                                    0x1);
   32712                                           if (dt.Is(kDataTypeValueInvalid)) {
   32713                                             UnallocatedT32(instr);
   32714                                             return;
   32715                                           }
   32716                                           unsigned rd =
   32717                                               ExtractDRegister(instr, 22, 12);
   32718                                           if ((instr & 1) != 0) {
   32719                                             UnallocatedT32(instr);
   32720                                             return;
   32721                                           }
   32722                                           unsigned rm =
   32723                                               ExtractQRegister(instr, 5, 0);
   32724                                           uint32_t imm6 = (instr >> 16) & 0x3f;
   32725                                           uint32_t imm = dt.GetSize() - imm6;
   32726                                           // VQSHRUN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   32727                                           vqshrun(CurrentCond(),
   32728                                                   dt,
   32729                                                   DRegister(rd),
   32730                                                   QRegister(rm),
   32731                                                   imm);
   32732                                           break;
   32733                                         }
   32734                                       }
   32735                                       break;
   32736                                     }
   32737                                     case 0x00000100: {
   32738                                       // 0xefb80910
   32739                                       if (((instr & 0x380000) == 0x0)) {
   32740                                         UnallocatedT32(instr);
   32741                                         return;
   32742                                       }
   32743                                       DataType dt =
   32744                                           Dt_imm6_1_Decode((instr >> 19) & 0x7,
   32745                                                            (instr >> 28) & 0x1);
   32746                                       if (dt.Is(kDataTypeValueInvalid)) {
   32747                                         UnallocatedT32(instr);
   32748                                         return;
   32749                                       }
   32750                                       unsigned rd =
   32751                                           ExtractDRegister(instr, 22, 12);
   32752                                       if ((instr & 1) != 0) {
   32753                                         UnallocatedT32(instr);
   32754                                         return;
   32755                                       }
   32756                                       unsigned rm =
   32757                                           ExtractQRegister(instr, 5, 0);
   32758                                       uint32_t imm6 = (instr >> 16) & 0x3f;
   32759                                       uint32_t imm = dt.GetSize() - imm6;
   32760                                       // VQSHRN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   32761                                       vqshrn(CurrentCond(),
   32762                                              dt,
   32763                                              DRegister(rd),
   32764                                              QRegister(rm),
   32765                                              imm);
   32766                                       break;
   32767                                     }
   32768                                     case 0x00000200: {
   32769                                       // 0xefb80a10
   32770                                       if (((instr & 0x380000) == 0x0) ||
   32771                                           ((instr & 0x3f0000) == 0x80000) ||
   32772                                           ((instr & 0x3f0000) == 0x100000) ||
   32773                                           ((instr & 0x3f0000) == 0x200000)) {
   32774                                         UnallocatedT32(instr);
   32775                                         return;
   32776                                       }
   32777                                       DataType dt =
   32778                                           Dt_imm6_4_Decode((instr >> 19) & 0x7,
   32779                                                            (instr >> 28) & 0x1);
   32780                                       if (dt.Is(kDataTypeValueInvalid)) {
   32781                                         UnallocatedT32(instr);
   32782                                         return;
   32783                                       }
   32784                                       if (((instr >> 12) & 1) != 0) {
   32785                                         UnallocatedT32(instr);
   32786                                         return;
   32787                                       }
   32788                                       unsigned rd =
   32789                                           ExtractQRegister(instr, 22, 12);
   32790                                       unsigned rm =
   32791                                           ExtractDRegister(instr, 5, 0);
   32792                                       uint32_t imm6 = (instr >> 16) & 0x3f;
   32793                                       uint32_t imm = imm6 - dt.GetSize();
   32794                                       // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   32795                                       vshll(CurrentCond(),
   32796                                             dt,
   32797                                             QRegister(rd),
   32798                                             DRegister(rm),
   32799                                             imm);
   32800                                       break;
   32801                                     }
   32802                                     default:
   32803                                       UnallocatedT32(instr);
   32804                                       break;
   32805                                   }
   32806                                   break;
   32807                                 }
   32808                                 default: {
   32809                                   switch (instr & 0x00000300) {
   32810                                     case 0x00000000: {
   32811                                       // 0xef800810
   32812                                       switch (instr & 0x10000000) {
   32813                                         case 0x00000000: {
   32814                                           // 0xef800810
   32815                                           if (((instr & 0x380000) == 0x0)) {
   32816                                             UnallocatedT32(instr);
   32817                                             return;
   32818                                           }
   32819                                           DataType dt = Dt_imm6_3_Decode(
   32820                                               (instr >> 19) & 0x7);
   32821                                           if (dt.Is(kDataTypeValueInvalid)) {
   32822                                             UnallocatedT32(instr);
   32823                                             return;
   32824                                           }
   32825                                           unsigned rd =
   32826                                               ExtractDRegister(instr, 22, 12);
   32827                                           if ((instr & 1) != 0) {
   32828                                             UnallocatedT32(instr);
   32829                                             return;
   32830                                           }
   32831                                           unsigned rm =
   32832                                               ExtractQRegister(instr, 5, 0);
   32833                                           uint32_t imm6 = (instr >> 16) & 0x3f;
   32834                                           uint32_t imm = dt.GetSize() - imm6;
   32835                                           // VSHRN{<c>}{<q>}.I<size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   32836                                           vshrn(CurrentCond(),
   32837                                                 dt,
   32838                                                 DRegister(rd),
   32839                                                 QRegister(rm),
   32840                                                 imm);
   32841                                           break;
   32842                                         }
   32843                                         case 0x10000000: {
   32844                                           // 0xff800810
   32845                                           if (((instr & 0x380000) == 0x0)) {
   32846                                             UnallocatedT32(instr);
   32847                                             return;
   32848                                           }
   32849                                           DataType dt =
   32850                                               Dt_imm6_2_Decode((instr >> 19) &
   32851                                                                    0x7,
   32852                                                                (instr >> 28) &
   32853                                                                    0x1);
   32854                                           if (dt.Is(kDataTypeValueInvalid)) {
   32855                                             UnallocatedT32(instr);
   32856                                             return;
   32857                                           }
   32858                                           unsigned rd =
   32859                                               ExtractDRegister(instr, 22, 12);
   32860                                           if ((instr & 1) != 0) {
   32861                                             UnallocatedT32(instr);
   32862                                             return;
   32863                                           }
   32864                                           unsigned rm =
   32865                                               ExtractQRegister(instr, 5, 0);
   32866                                           uint32_t imm6 = (instr >> 16) & 0x3f;
   32867                                           uint32_t imm = dt.GetSize() - imm6;
   32868                                           // VQSHRUN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   32869                                           vqshrun(CurrentCond(),
   32870                                                   dt,
   32871                                                   DRegister(rd),
   32872                                                   QRegister(rm),
   32873                                                   imm);
   32874                                           break;
   32875                                         }
   32876                                       }
   32877                                       break;
   32878                                     }
   32879                                     case 0x00000100: {
   32880                                       // 0xef800910
   32881                                       if (((instr & 0x380000) == 0x0)) {
   32882                                         UnallocatedT32(instr);
   32883                                         return;
   32884                                       }
   32885                                       DataType dt =
   32886                                           Dt_imm6_1_Decode((instr >> 19) & 0x7,
   32887                                                            (instr >> 28) & 0x1);
   32888                                       if (dt.Is(kDataTypeValueInvalid)) {
   32889                                         UnallocatedT32(instr);
   32890                                         return;
   32891                                       }
   32892                                       unsigned rd =
   32893                                           ExtractDRegister(instr, 22, 12);
   32894                                       if ((instr & 1) != 0) {
   32895                                         UnallocatedT32(instr);
   32896                                         return;
   32897                                       }
   32898                                       unsigned rm =
   32899                                           ExtractQRegister(instr, 5, 0);
   32900                                       uint32_t imm6 = (instr >> 16) & 0x3f;
   32901                                       uint32_t imm = dt.GetSize() - imm6;
   32902                                       // VQSHRN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   32903                                       vqshrn(CurrentCond(),
   32904                                              dt,
   32905                                              DRegister(rd),
   32906                                              QRegister(rm),
   32907                                              imm);
   32908                                       break;
   32909                                     }
   32910                                     case 0x00000200: {
   32911                                       // 0xef800a10
   32912                                       switch (instr & 0x00070000) {
   32913                                         case 0x00000000: {
   32914                                           // 0xef800a10
   32915                                           switch (instr & 0x003f0000) {
   32916                                             case 0x00080000: {
   32917                                               // 0xef880a10
   32918                                               if (((instr & 0x380000) == 0x0) ||
   32919                                                   ((instr & 0x380000) ==
   32920                                                    0x180000) ||
   32921                                                   ((instr & 0x380000) ==
   32922                                                    0x280000) ||
   32923                                                   ((instr & 0x380000) ==
   32924                                                    0x300000) ||
   32925                                                   ((instr & 0x380000) ==
   32926                                                    0x380000)) {
   32927                                                 UnallocatedT32(instr);
   32928                                                 return;
   32929                                               }
   32930                                               DataType dt = Dt_U_imm3H_1_Decode(
   32931                                                   ((instr >> 19) & 0x7) |
   32932                                                   ((instr >> 25) & 0x8));
   32933                                               if (dt.Is(
   32934                                                       kDataTypeValueInvalid)) {
   32935                                                 UnallocatedT32(instr);
   32936                                                 return;
   32937                                               }
   32938                                               if (((instr >> 12) & 1) != 0) {
   32939                                                 UnallocatedT32(instr);
   32940                                                 return;
   32941                                               }
   32942                                               unsigned rd =
   32943                                                   ExtractQRegister(instr,
   32944                                                                    22,
   32945                                                                    12);
   32946                                               unsigned rm =
   32947                                                   ExtractDRegister(instr, 5, 0);
   32948                                               // VMOVL{<c>}{<q>}.<dt> <Qd>, <Dm> ; T1 NOLINT(whitespace/line_length)
   32949                                               vmovl(CurrentCond(),
   32950                                                     dt,
   32951                                                     QRegister(rd),
   32952                                                     DRegister(rm));
   32953                                               break;
   32954                                             }
   32955                                             case 0x00090000: {
   32956                                               // 0xef890a10
   32957                                               if (((instr & 0x380000) == 0x0) ||
   32958                                                   ((instr & 0x3f0000) ==
   32959                                                    0x80000) ||
   32960                                                   ((instr & 0x3f0000) ==
   32961                                                    0x100000) ||
   32962                                                   ((instr & 0x3f0000) ==
   32963                                                    0x200000)) {
   32964                                                 UnallocatedT32(instr);
   32965                                                 return;
   32966                                               }
   32967                                               DataType dt =
   32968                                                   Dt_imm6_4_Decode((instr >>
   32969                                                                     19) &
   32970                                                                        0x7,
   32971                                                                    (instr >>
   32972                                                                     28) &
   32973                                                                        0x1);
   32974                                               if (dt.Is(
   32975                                                       kDataTypeValueInvalid)) {
   32976                                                 UnallocatedT32(instr);
   32977                                                 return;
   32978                                               }
   32979                                               if (((instr >> 12) & 1) != 0) {
   32980                                                 UnallocatedT32(instr);
   32981                                                 return;
   32982                                               }
   32983                                               unsigned rd =
   32984                                                   ExtractQRegister(instr,
   32985                                                                    22,
   32986                                                                    12);
   32987                                               unsigned rm =
   32988                                                   ExtractDRegister(instr, 5, 0);
   32989                                               uint32_t imm6 =
   32990                                                   (instr >> 16) & 0x3f;
   32991                                               uint32_t imm =
   32992                                                   imm6 - dt.GetSize();
   32993                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   32994                                               vshll(CurrentCond(),
   32995                                                     dt,
   32996                                                     QRegister(rd),
   32997                                                     DRegister(rm),
   32998                                                     imm);
   32999                                               break;
   33000                                             }
   33001                                             case 0x000a0000: {
   33002                                               // 0xef8a0a10
   33003                                               if (((instr & 0x380000) == 0x0) ||
   33004                                                   ((instr & 0x3f0000) ==
   33005                                                    0x80000) ||
   33006                                                   ((instr & 0x3f0000) ==
   33007                                                    0x100000) ||
   33008                                                   ((instr & 0x3f0000) ==
   33009                                                    0x200000)) {
   33010                                                 UnallocatedT32(instr);
   33011                                                 return;
   33012                                               }
   33013                                               DataType dt =
   33014                                                   Dt_imm6_4_Decode((instr >>
   33015                                                                     19) &
   33016                                                                        0x7,
   33017                                                                    (instr >>
   33018                                                                     28) &
   33019                                                                        0x1);
   33020                                               if (dt.Is(
   33021                                                       kDataTypeValueInvalid)) {
   33022                                                 UnallocatedT32(instr);
   33023                                                 return;
   33024                                               }
   33025                                               if (((instr >> 12) & 1) != 0) {
   33026                                                 UnallocatedT32(instr);
   33027                                                 return;
   33028                                               }
   33029                                               unsigned rd =
   33030                                                   ExtractQRegister(instr,
   33031                                                                    22,
   33032                                                                    12);
   33033                                               unsigned rm =
   33034                                                   ExtractDRegister(instr, 5, 0);
   33035                                               uint32_t imm6 =
   33036                                                   (instr >> 16) & 0x3f;
   33037                                               uint32_t imm =
   33038                                                   imm6 - dt.GetSize();
   33039                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   33040                                               vshll(CurrentCond(),
   33041                                                     dt,
   33042                                                     QRegister(rd),
   33043                                                     DRegister(rm),
   33044                                                     imm);
   33045                                               break;
   33046                                             }
   33047                                             case 0x000b0000: {
   33048                                               // 0xef8b0a10
   33049                                               if (((instr & 0x380000) == 0x0) ||
   33050                                                   ((instr & 0x3f0000) ==
   33051                                                    0x80000) ||
   33052                                                   ((instr & 0x3f0000) ==
   33053                                                    0x100000) ||
   33054                                                   ((instr & 0x3f0000) ==
   33055                                                    0x200000)) {
   33056                                                 UnallocatedT32(instr);
   33057                                                 return;
   33058                                               }
   33059                                               DataType dt =
   33060                                                   Dt_imm6_4_Decode((instr >>
   33061                                                                     19) &
   33062                                                                        0x7,
   33063                                                                    (instr >>
   33064                                                                     28) &
   33065                                                                        0x1);
   33066                                               if (dt.Is(
   33067                                                       kDataTypeValueInvalid)) {
   33068                                                 UnallocatedT32(instr);
   33069                                                 return;
   33070                                               }
   33071                                               if (((instr >> 12) & 1) != 0) {
   33072                                                 UnallocatedT32(instr);
   33073                                                 return;
   33074                                               }
   33075                                               unsigned rd =
   33076                                                   ExtractQRegister(instr,
   33077                                                                    22,
   33078                                                                    12);
   33079                                               unsigned rm =
   33080                                                   ExtractDRegister(instr, 5, 0);
   33081                                               uint32_t imm6 =
   33082                                                   (instr >> 16) & 0x3f;
   33083                                               uint32_t imm =
   33084                                                   imm6 - dt.GetSize();
   33085                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   33086                                               vshll(CurrentCond(),
   33087                                                     dt,
   33088                                                     QRegister(rd),
   33089                                                     DRegister(rm),
   33090                                                     imm);
   33091                                               break;
   33092                                             }
   33093                                             case 0x000c0000: {
   33094                                               // 0xef8c0a10
   33095                                               if (((instr & 0x380000) == 0x0) ||
   33096                                                   ((instr & 0x3f0000) ==
   33097                                                    0x80000) ||
   33098                                                   ((instr & 0x3f0000) ==
   33099                                                    0x100000) ||
   33100                                                   ((instr & 0x3f0000) ==
   33101                                                    0x200000)) {
   33102                                                 UnallocatedT32(instr);
   33103                                                 return;
   33104                                               }
   33105                                               DataType dt =
   33106                                                   Dt_imm6_4_Decode((instr >>
   33107                                                                     19) &
   33108                                                                        0x7,
   33109                                                                    (instr >>
   33110                                                                     28) &
   33111                                                                        0x1);
   33112                                               if (dt.Is(
   33113                                                       kDataTypeValueInvalid)) {
   33114                                                 UnallocatedT32(instr);
   33115                                                 return;
   33116                                               }
   33117                                               if (((instr >> 12) & 1) != 0) {
   33118                                                 UnallocatedT32(instr);
   33119                                                 return;
   33120                                               }
   33121                                               unsigned rd =
   33122                                                   ExtractQRegister(instr,
   33123                                                                    22,
   33124                                                                    12);
   33125                                               unsigned rm =
   33126                                                   ExtractDRegister(instr, 5, 0);
   33127                                               uint32_t imm6 =
   33128                                                   (instr >> 16) & 0x3f;
   33129                                               uint32_t imm =
   33130                                                   imm6 - dt.GetSize();
   33131                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   33132                                               vshll(CurrentCond(),
   33133                                                     dt,
   33134                                                     QRegister(rd),
   33135                                                     DRegister(rm),
   33136                                                     imm);
   33137                                               break;
   33138                                             }
   33139                                             case 0x000d0000: {
   33140                                               // 0xef8d0a10
   33141                                               if (((instr & 0x380000) == 0x0) ||
   33142                                                   ((instr & 0x3f0000) ==
   33143                                                    0x80000) ||
   33144                                                   ((instr & 0x3f0000) ==
   33145                                                    0x100000) ||
   33146                                                   ((instr & 0x3f0000) ==
   33147                                                    0x200000)) {
   33148                                                 UnallocatedT32(instr);
   33149                                                 return;
   33150                                               }
   33151                                               DataType dt =
   33152                                                   Dt_imm6_4_Decode((instr >>
   33153                                                                     19) &
   33154                                                                        0x7,
   33155                                                                    (instr >>
   33156                                                                     28) &
   33157                                                                        0x1);
   33158                                               if (dt.Is(
   33159                                                       kDataTypeValueInvalid)) {
   33160                                                 UnallocatedT32(instr);
   33161                                                 return;
   33162                                               }
   33163                                               if (((instr >> 12) & 1) != 0) {
   33164                                                 UnallocatedT32(instr);
   33165                                                 return;
   33166                                               }
   33167                                               unsigned rd =
   33168                                                   ExtractQRegister(instr,
   33169                                                                    22,
   33170                                                                    12);
   33171                                               unsigned rm =
   33172                                                   ExtractDRegister(instr, 5, 0);
   33173                                               uint32_t imm6 =
   33174                                                   (instr >> 16) & 0x3f;
   33175                                               uint32_t imm =
   33176                                                   imm6 - dt.GetSize();
   33177                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   33178                                               vshll(CurrentCond(),
   33179                                                     dt,
   33180                                                     QRegister(rd),
   33181                                                     DRegister(rm),
   33182                                                     imm);
   33183                                               break;
   33184                                             }
   33185                                             case 0x000e0000: {
   33186                                               // 0xef8e0a10
   33187                                               if (((instr & 0x380000) == 0x0) ||
   33188                                                   ((instr & 0x3f0000) ==
   33189                                                    0x80000) ||
   33190                                                   ((instr & 0x3f0000) ==
   33191                                                    0x100000) ||
   33192                                                   ((instr & 0x3f0000) ==
   33193                                                    0x200000)) {
   33194                                                 UnallocatedT32(instr);
   33195                                                 return;
   33196                                               }
   33197                                               DataType dt =
   33198                                                   Dt_imm6_4_Decode((instr >>
   33199                                                                     19) &
   33200                                                                        0x7,
   33201                                                                    (instr >>
   33202                                                                     28) &
   33203                                                                        0x1);
   33204                                               if (dt.Is(
   33205                                                       kDataTypeValueInvalid)) {
   33206                                                 UnallocatedT32(instr);
   33207                                                 return;
   33208                                               }
   33209                                               if (((instr >> 12) & 1) != 0) {
   33210                                                 UnallocatedT32(instr);
   33211                                                 return;
   33212                                               }
   33213                                               unsigned rd =
   33214                                                   ExtractQRegister(instr,
   33215                                                                    22,
   33216                                                                    12);
   33217                                               unsigned rm =
   33218                                                   ExtractDRegister(instr, 5, 0);
   33219                                               uint32_t imm6 =
   33220                                                   (instr >> 16) & 0x3f;
   33221                                               uint32_t imm =
   33222                                                   imm6 - dt.GetSize();
   33223                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   33224                                               vshll(CurrentCond(),
   33225                                                     dt,
   33226                                                     QRegister(rd),
   33227                                                     DRegister(rm),
   33228                                                     imm);
   33229                                               break;
   33230                                             }
   33231                                             case 0x000f0000: {
   33232                                               // 0xef8f0a10
   33233                                               if (((instr & 0x380000) == 0x0) ||
   33234                                                   ((instr & 0x3f0000) ==
   33235                                                    0x80000) ||
   33236                                                   ((instr & 0x3f0000) ==
   33237                                                    0x100000) ||
   33238                                                   ((instr & 0x3f0000) ==
   33239                                                    0x200000)) {
   33240                                                 UnallocatedT32(instr);
   33241                                                 return;
   33242                                               }
   33243                                               DataType dt =
   33244                                                   Dt_imm6_4_Decode((instr >>
   33245                                                                     19) &
   33246                                                                        0x7,
   33247                                                                    (instr >>
   33248                                                                     28) &
   33249                                                                        0x1);
   33250                                               if (dt.Is(
   33251                                                       kDataTypeValueInvalid)) {
   33252                                                 UnallocatedT32(instr);
   33253                                                 return;
   33254                                               }
   33255                                               if (((instr >> 12) & 1) != 0) {
   33256                                                 UnallocatedT32(instr);
   33257                                                 return;
   33258                                               }
   33259                                               unsigned rd =
   33260                                                   ExtractQRegister(instr,
   33261                                                                    22,
   33262                                                                    12);
   33263                                               unsigned rm =
   33264                                                   ExtractDRegister(instr, 5, 0);
   33265                                               uint32_t imm6 =
   33266                                                   (instr >> 16) & 0x3f;
   33267                                               uint32_t imm =
   33268                                                   imm6 - dt.GetSize();
   33269                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   33270                                               vshll(CurrentCond(),
   33271                                                     dt,
   33272                                                     QRegister(rd),
   33273                                                     DRegister(rm),
   33274                                                     imm);
   33275                                               break;
   33276                                             }
   33277                                             case 0x00100000: {
   33278                                               // 0xef900a10
   33279                                               if (((instr & 0x380000) == 0x0) ||
   33280                                                   ((instr & 0x380000) ==
   33281                                                    0x180000) ||
   33282                                                   ((instr & 0x380000) ==
   33283                                                    0x280000) ||
   33284                                                   ((instr & 0x380000) ==
   33285                                                    0x300000) ||
   33286                                                   ((instr & 0x380000) ==
   33287                                                    0x380000)) {
   33288                                                 UnallocatedT32(instr);
   33289                                                 return;
   33290                                               }
   33291                                               DataType dt = Dt_U_imm3H_1_Decode(
   33292                                                   ((instr >> 19) & 0x7) |
   33293                                                   ((instr >> 25) & 0x8));
   33294                                               if (dt.Is(
   33295                                                       kDataTypeValueInvalid)) {
   33296                                                 UnallocatedT32(instr);
   33297                                                 return;
   33298                                               }
   33299                                               if (((instr >> 12) & 1) != 0) {
   33300                                                 UnallocatedT32(instr);
   33301                                                 return;
   33302                                               }
   33303                                               unsigned rd =
   33304                                                   ExtractQRegister(instr,
   33305                                                                    22,
   33306                                                                    12);
   33307                                               unsigned rm =
   33308                                                   ExtractDRegister(instr, 5, 0);
   33309                                               // VMOVL{<c>}{<q>}.<dt> <Qd>, <Dm> ; T1 NOLINT(whitespace/line_length)
   33310                                               vmovl(CurrentCond(),
   33311                                                     dt,
   33312                                                     QRegister(rd),
   33313                                                     DRegister(rm));
   33314                                               break;
   33315                                             }
   33316                                             case 0x00110000: {
   33317                                               // 0xef910a10
   33318                                               if (((instr & 0x380000) == 0x0) ||
   33319                                                   ((instr & 0x3f0000) ==
   33320                                                    0x80000) ||
   33321                                                   ((instr & 0x3f0000) ==
   33322                                                    0x100000) ||
   33323                                                   ((instr & 0x3f0000) ==
   33324                                                    0x200000)) {
   33325                                                 UnallocatedT32(instr);
   33326                                                 return;
   33327                                               }
   33328                                               DataType dt =
   33329                                                   Dt_imm6_4_Decode((instr >>
   33330                                                                     19) &
   33331                                                                        0x7,
   33332                                                                    (instr >>
   33333                                                                     28) &
   33334                                                                        0x1);
   33335                                               if (dt.Is(
   33336                                                       kDataTypeValueInvalid)) {
   33337                                                 UnallocatedT32(instr);
   33338                                                 return;
   33339                                               }
   33340                                               if (((instr >> 12) & 1) != 0) {
   33341                                                 UnallocatedT32(instr);
   33342                                                 return;
   33343                                               }
   33344                                               unsigned rd =
   33345                                                   ExtractQRegister(instr,
   33346                                                                    22,
   33347                                                                    12);
   33348                                               unsigned rm =
   33349                                                   ExtractDRegister(instr, 5, 0);
   33350                                               uint32_t imm6 =
   33351                                                   (instr >> 16) & 0x3f;
   33352                                               uint32_t imm =
   33353                                                   imm6 - dt.GetSize();
   33354                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   33355                                               vshll(CurrentCond(),
   33356                                                     dt,
   33357                                                     QRegister(rd),
   33358                                                     DRegister(rm),
   33359                                                     imm);
   33360                                               break;
   33361                                             }
   33362                                             case 0x00120000: {
   33363                                               // 0xef920a10
   33364                                               if (((instr & 0x380000) == 0x0) ||
   33365                                                   ((instr & 0x3f0000) ==
   33366                                                    0x80000) ||
   33367                                                   ((instr & 0x3f0000) ==
   33368                                                    0x100000) ||
   33369                                                   ((instr & 0x3f0000) ==
   33370                                                    0x200000)) {
   33371                                                 UnallocatedT32(instr);
   33372                                                 return;
   33373                                               }
   33374                                               DataType dt =
   33375                                                   Dt_imm6_4_Decode((instr >>
   33376                                                                     19) &
   33377                                                                        0x7,
   33378                                                                    (instr >>
   33379                                                                     28) &
   33380                                                                        0x1);
   33381                                               if (dt.Is(
   33382                                                       kDataTypeValueInvalid)) {
   33383                                                 UnallocatedT32(instr);
   33384                                                 return;
   33385                                               }
   33386                                               if (((instr >> 12) & 1) != 0) {
   33387                                                 UnallocatedT32(instr);
   33388                                                 return;
   33389                                               }
   33390                                               unsigned rd =
   33391                                                   ExtractQRegister(instr,
   33392                                                                    22,
   33393                                                                    12);
   33394                                               unsigned rm =
   33395                                                   ExtractDRegister(instr, 5, 0);
   33396                                               uint32_t imm6 =
   33397                                                   (instr >> 16) & 0x3f;
   33398                                               uint32_t imm =
   33399                                                   imm6 - dt.GetSize();
   33400                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   33401                                               vshll(CurrentCond(),
   33402                                                     dt,
   33403                                                     QRegister(rd),
   33404                                                     DRegister(rm),
   33405                                                     imm);
   33406                                               break;
   33407                                             }
   33408                                             case 0x00130000: {
   33409                                               // 0xef930a10
   33410                                               if (((instr & 0x380000) == 0x0) ||
   33411                                                   ((instr & 0x3f0000) ==
   33412                                                    0x80000) ||
   33413                                                   ((instr & 0x3f0000) ==
   33414                                                    0x100000) ||
   33415                                                   ((instr & 0x3f0000) ==
   33416                                                    0x200000)) {
   33417                                                 UnallocatedT32(instr);
   33418                                                 return;
   33419                                               }
   33420                                               DataType dt =
   33421                                                   Dt_imm6_4_Decode((instr >>
   33422                                                                     19) &
   33423                                                                        0x7,
   33424                                                                    (instr >>
   33425                                                                     28) &
   33426                                                                        0x1);
   33427                                               if (dt.Is(
   33428                                                       kDataTypeValueInvalid)) {
   33429                                                 UnallocatedT32(instr);
   33430                                                 return;
   33431                                               }
   33432                                               if (((instr >> 12) & 1) != 0) {
   33433                                                 UnallocatedT32(instr);
   33434                                                 return;
   33435                                               }
   33436                                               unsigned rd =
   33437                                                   ExtractQRegister(instr,
   33438                                                                    22,
   33439                                                                    12);
   33440                                               unsigned rm =
   33441                                                   ExtractDRegister(instr, 5, 0);
   33442                                               uint32_t imm6 =
   33443                                                   (instr >> 16) & 0x3f;
   33444                                               uint32_t imm =
   33445                                                   imm6 - dt.GetSize();
   33446                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   33447                                               vshll(CurrentCond(),
   33448                                                     dt,
   33449                                                     QRegister(rd),
   33450                                                     DRegister(rm),
   33451                                                     imm);
   33452                                               break;
   33453                                             }
   33454                                             case 0x00140000: {
   33455                                               // 0xef940a10
   33456                                               if (((instr & 0x380000) == 0x0) ||
   33457                                                   ((instr & 0x3f0000) ==
   33458                                                    0x80000) ||
   33459                                                   ((instr & 0x3f0000) ==
   33460                                                    0x100000) ||
   33461                                                   ((instr & 0x3f0000) ==
   33462                                                    0x200000)) {
   33463                                                 UnallocatedT32(instr);
   33464                                                 return;
   33465                                               }
   33466                                               DataType dt =
   33467                                                   Dt_imm6_4_Decode((instr >>
   33468                                                                     19) &
   33469                                                                        0x7,
   33470                                                                    (instr >>
   33471                                                                     28) &
   33472                                                                        0x1);
   33473                                               if (dt.Is(
   33474                                                       kDataTypeValueInvalid)) {
   33475                                                 UnallocatedT32(instr);
   33476                                                 return;
   33477                                               }
   33478                                               if (((instr >> 12) & 1) != 0) {
   33479                                                 UnallocatedT32(instr);
   33480                                                 return;
   33481                                               }
   33482                                               unsigned rd =
   33483                                                   ExtractQRegister(instr,
   33484                                                                    22,
   33485                                                                    12);
   33486                                               unsigned rm =
   33487                                                   ExtractDRegister(instr, 5, 0);
   33488                                               uint32_t imm6 =
   33489                                                   (instr >> 16) & 0x3f;
   33490                                               uint32_t imm =
   33491                                                   imm6 - dt.GetSize();
   33492                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   33493                                               vshll(CurrentCond(),
   33494                                                     dt,
   33495                                                     QRegister(rd),
   33496                                                     DRegister(rm),
   33497                                                     imm);
   33498                                               break;
   33499                                             }
   33500                                             case 0x00150000: {
   33501                                               // 0xef950a10
   33502                                               if (((instr & 0x380000) == 0x0) ||
   33503                                                   ((instr & 0x3f0000) ==
   33504                                                    0x80000) ||
   33505                                                   ((instr & 0x3f0000) ==
   33506                                                    0x100000) ||
   33507                                                   ((instr & 0x3f0000) ==
   33508                                                    0x200000)) {
   33509                                                 UnallocatedT32(instr);
   33510                                                 return;
   33511                                               }
   33512                                               DataType dt =
   33513                                                   Dt_imm6_4_Decode((instr >>
   33514                                                                     19) &
   33515                                                                        0x7,
   33516                                                                    (instr >>
   33517                                                                     28) &
   33518                                                                        0x1);
   33519                                               if (dt.Is(
   33520                                                       kDataTypeValueInvalid)) {
   33521                                                 UnallocatedT32(instr);
   33522                                                 return;
   33523                                               }
   33524                                               if (((instr >> 12) & 1) != 0) {
   33525                                                 UnallocatedT32(instr);
   33526                                                 return;
   33527                                               }
   33528                                               unsigned rd =
   33529                                                   ExtractQRegister(instr,
   33530                                                                    22,
   33531                                                                    12);
   33532                                               unsigned rm =
   33533                                                   ExtractDRegister(instr, 5, 0);
   33534                                               uint32_t imm6 =
   33535                                                   (instr >> 16) & 0x3f;
   33536                                               uint32_t imm =
   33537                                                   imm6 - dt.GetSize();
   33538                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   33539                                               vshll(CurrentCond(),
   33540                                                     dt,
   33541                                                     QRegister(rd),
   33542                                                     DRegister(rm),
   33543                                                     imm);
   33544                                               break;
   33545                                             }
   33546                                             case 0x00160000: {
   33547                                               // 0xef960a10
   33548                                               if (((instr & 0x380000) == 0x0) ||
   33549                                                   ((instr & 0x3f0000) ==
   33550                                                    0x80000) ||
   33551                                                   ((instr & 0x3f0000) ==
   33552                                                    0x100000) ||
   33553                                                   ((instr & 0x3f0000) ==
   33554                                                    0x200000)) {
   33555                                                 UnallocatedT32(instr);
   33556                                                 return;
   33557                                               }
   33558                                               DataType dt =
   33559                                                   Dt_imm6_4_Decode((instr >>
   33560                                                                     19) &
   33561                                                                        0x7,
   33562                                                                    (instr >>
   33563                                                                     28) &
   33564                                                                        0x1);
   33565                                               if (dt.Is(
   33566                                                       kDataTypeValueInvalid)) {
   33567                                                 UnallocatedT32(instr);
   33568                                                 return;
   33569                                               }
   33570                                               if (((instr >> 12) & 1) != 0) {
   33571                                                 UnallocatedT32(instr);
   33572                                                 return;
   33573                                               }
   33574                                               unsigned rd =
   33575                                                   ExtractQRegister(instr,
   33576                                                                    22,
   33577                                                                    12);
   33578                                               unsigned rm =
   33579                                                   ExtractDRegister(instr, 5, 0);
   33580                                               uint32_t imm6 =
   33581                                                   (instr >> 16) & 0x3f;
   33582                                               uint32_t imm =
   33583                                                   imm6 - dt.GetSize();
   33584                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   33585                                               vshll(CurrentCond(),
   33586                                                     dt,
   33587                                                     QRegister(rd),
   33588                                                     DRegister(rm),
   33589                                                     imm);
   33590                                               break;
   33591                                             }
   33592                                             case 0x00170000: {
   33593                                               // 0xef970a10
   33594                                               if (((instr & 0x380000) == 0x0) ||
   33595                                                   ((instr & 0x3f0000) ==
   33596                                                    0x80000) ||
   33597                                                   ((instr & 0x3f0000) ==
   33598                                                    0x100000) ||
   33599                                                   ((instr & 0x3f0000) ==
   33600                                                    0x200000)) {
   33601                                                 UnallocatedT32(instr);
   33602                                                 return;
   33603                                               }
   33604                                               DataType dt =
   33605                                                   Dt_imm6_4_Decode((instr >>
   33606                                                                     19) &
   33607                                                                        0x7,
   33608                                                                    (instr >>
   33609                                                                     28) &
   33610                                                                        0x1);
   33611                                               if (dt.Is(
   33612                                                       kDataTypeValueInvalid)) {
   33613                                                 UnallocatedT32(instr);
   33614                                                 return;
   33615                                               }
   33616                                               if (((instr >> 12) & 1) != 0) {
   33617                                                 UnallocatedT32(instr);
   33618                                                 return;
   33619                                               }
   33620                                               unsigned rd =
   33621                                                   ExtractQRegister(instr,
   33622                                                                    22,
   33623                                                                    12);
   33624                                               unsigned rm =
   33625                                                   ExtractDRegister(instr, 5, 0);
   33626                                               uint32_t imm6 =
   33627                                                   (instr >> 16) & 0x3f;
   33628                                               uint32_t imm =
   33629                                                   imm6 - dt.GetSize();
   33630                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   33631                                               vshll(CurrentCond(),
   33632                                                     dt,
   33633                                                     QRegister(rd),
   33634                                                     DRegister(rm),
   33635                                                     imm);
   33636                                               break;
   33637                                             }
   33638                                             case 0x00180000: {
   33639                                               // 0xef980a10
   33640                                               if (((instr & 0x380000) == 0x0) ||
   33641                                                   ((instr & 0x3f0000) ==
   33642                                                    0x80000) ||
   33643                                                   ((instr & 0x3f0000) ==
   33644                                                    0x100000) ||
   33645                                                   ((instr & 0x3f0000) ==
   33646                                                    0x200000)) {
   33647                                                 UnallocatedT32(instr);
   33648                                                 return;
   33649                                               }
   33650                                               DataType dt =
   33651                                                   Dt_imm6_4_Decode((instr >>
   33652                                                                     19) &
   33653                                                                        0x7,
   33654                                                                    (instr >>
   33655                                                                     28) &
   33656                                                                        0x1);
   33657                                               if (dt.Is(
   33658                                                       kDataTypeValueInvalid)) {
   33659                                                 UnallocatedT32(instr);
   33660                                                 return;
   33661                                               }
   33662                                               if (((instr >> 12) & 1) != 0) {
   33663                                                 UnallocatedT32(instr);
   33664                                                 return;
   33665                                               }
   33666                                               unsigned rd =
   33667                                                   ExtractQRegister(instr,
   33668                                                                    22,
   33669                                                                    12);
   33670                                               unsigned rm =
   33671                                                   ExtractDRegister(instr, 5, 0);
   33672                                               uint32_t imm6 =
   33673                                                   (instr >> 16) & 0x3f;
   33674                                               uint32_t imm =
   33675                                                   imm6 - dt.GetSize();
   33676                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   33677                                               vshll(CurrentCond(),
   33678                                                     dt,
   33679                                                     QRegister(rd),
   33680                                                     DRegister(rm),
   33681                                                     imm);
   33682                                               break;
   33683                                             }
   33684                                             case 0x00190000: {
   33685                                               // 0xef990a10
   33686                                               if (((instr & 0x380000) == 0x0) ||
   33687                                                   ((instr & 0x3f0000) ==
   33688                                                    0x80000) ||
   33689                                                   ((instr & 0x3f0000) ==
   33690                                                    0x100000) ||
   33691                                                   ((instr & 0x3f0000) ==
   33692                                                    0x200000)) {
   33693                                                 UnallocatedT32(instr);
   33694                                                 return;
   33695                                               }
   33696                                               DataType dt =
   33697                                                   Dt_imm6_4_Decode((instr >>
   33698                                                                     19) &
   33699                                                                        0x7,
   33700                                                                    (instr >>
   33701                                                                     28) &
   33702                                                                        0x1);
   33703                                               if (dt.Is(
   33704                                                       kDataTypeValueInvalid)) {
   33705                                                 UnallocatedT32(instr);
   33706                                                 return;
   33707                                               }
   33708                                               if (((instr >> 12) & 1) != 0) {
   33709                                                 UnallocatedT32(instr);
   33710                                                 return;
   33711                                               }
   33712                                               unsigned rd =
   33713                                                   ExtractQRegister(instr,
   33714                                                                    22,
   33715                                                                    12);
   33716                                               unsigned rm =
   33717                                                   ExtractDRegister(instr, 5, 0);
   33718                                               uint32_t imm6 =
   33719                                                   (instr >> 16) & 0x3f;
   33720                                               uint32_t imm =
   33721                                                   imm6 - dt.GetSize();
   33722                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   33723                                               vshll(CurrentCond(),
   33724                                                     dt,
   33725                                                     QRegister(rd),
   33726                                                     DRegister(rm),
   33727                                                     imm);
   33728                                               break;
   33729                                             }
   33730                                             case 0x001a0000: {
   33731                                               // 0xef9a0a10
   33732                                               if (((instr & 0x380000) == 0x0) ||
   33733                                                   ((instr & 0x3f0000) ==
   33734                                                    0x80000) ||
   33735                                                   ((instr & 0x3f0000) ==
   33736                                                    0x100000) ||
   33737                                                   ((instr & 0x3f0000) ==
   33738                                                    0x200000)) {
   33739                                                 UnallocatedT32(instr);
   33740                                                 return;
   33741                                               }
   33742                                               DataType dt =
   33743                                                   Dt_imm6_4_Decode((instr >>
   33744                                                                     19) &
   33745                                                                        0x7,
   33746                                                                    (instr >>
   33747                                                                     28) &
   33748                                                                        0x1);
   33749                                               if (dt.Is(
   33750                                                       kDataTypeValueInvalid)) {
   33751                                                 UnallocatedT32(instr);
   33752                                                 return;
   33753                                               }
   33754                                               if (((instr >> 12) & 1) != 0) {
   33755                                                 UnallocatedT32(instr);
   33756                                                 return;
   33757                                               }
   33758                                               unsigned rd =
   33759                                                   ExtractQRegister(instr,
   33760                                                                    22,
   33761                                                                    12);
   33762                                               unsigned rm =
   33763                                                   ExtractDRegister(instr, 5, 0);
   33764                                               uint32_t imm6 =
   33765                                                   (instr >> 16) & 0x3f;
   33766                                               uint32_t imm =
   33767                                                   imm6 - dt.GetSize();
   33768                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   33769                                               vshll(CurrentCond(),
   33770                                                     dt,
   33771                                                     QRegister(rd),
   33772                                                     DRegister(rm),
   33773                                                     imm);
   33774                                               break;
   33775                                             }
   33776                                             case 0x001b0000: {
   33777                                               // 0xef9b0a10
   33778                                               if (((instr & 0x380000) == 0x0) ||
   33779                                                   ((instr & 0x3f0000) ==
   33780                                                    0x80000) ||
   33781                                                   ((instr & 0x3f0000) ==
   33782                                                    0x100000) ||
   33783                                                   ((instr & 0x3f0000) ==
   33784                                                    0x200000)) {
   33785                                                 UnallocatedT32(instr);
   33786                                                 return;
   33787                                               }
   33788                                               DataType dt =
   33789                                                   Dt_imm6_4_Decode((instr >>
   33790                                                                     19) &
   33791                                                                        0x7,
   33792                                                                    (instr >>
   33793                                                                     28) &
   33794                                                                        0x1);
   33795                                               if (dt.Is(
   33796                                                       kDataTypeValueInvalid)) {
   33797                                                 UnallocatedT32(instr);
   33798                                                 return;
   33799                                               }
   33800                                               if (((instr >> 12) & 1) != 0) {
   33801                                                 UnallocatedT32(instr);
   33802                                                 return;
   33803                                               }
   33804                                               unsigned rd =
   33805                                                   ExtractQRegister(instr,
   33806                                                                    22,
   33807                                                                    12);
   33808                                               unsigned rm =
   33809                                                   ExtractDRegister(instr, 5, 0);
   33810                                               uint32_t imm6 =
   33811                                                   (instr >> 16) & 0x3f;
   33812                                               uint32_t imm =
   33813                                                   imm6 - dt.GetSize();
   33814                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   33815                                               vshll(CurrentCond(),
   33816                                                     dt,
   33817                                                     QRegister(rd),
   33818                                                     DRegister(rm),
   33819                                                     imm);
   33820                                               break;
   33821                                             }
   33822                                             case 0x001c0000: {
   33823                                               // 0xef9c0a10
   33824                                               if (((instr & 0x380000) == 0x0) ||
   33825                                                   ((instr & 0x3f0000) ==
   33826                                                    0x80000) ||
   33827                                                   ((instr & 0x3f0000) ==
   33828                                                    0x100000) ||
   33829                                                   ((instr & 0x3f0000) ==
   33830                                                    0x200000)) {
   33831                                                 UnallocatedT32(instr);
   33832                                                 return;
   33833                                               }
   33834                                               DataType dt =
   33835                                                   Dt_imm6_4_Decode((instr >>
   33836                                                                     19) &
   33837                                                                        0x7,
   33838                                                                    (instr >>
   33839                                                                     28) &
   33840                                                                        0x1);
   33841                                               if (dt.Is(
   33842                                                       kDataTypeValueInvalid)) {
   33843                                                 UnallocatedT32(instr);
   33844                                                 return;
   33845                                               }
   33846                                               if (((instr >> 12) & 1) != 0) {
   33847                                                 UnallocatedT32(instr);
   33848                                                 return;
   33849                                               }
   33850                                               unsigned rd =
   33851                                                   ExtractQRegister(instr,
   33852                                                                    22,
   33853                                                                    12);
   33854                                               unsigned rm =
   33855                                                   ExtractDRegister(instr, 5, 0);
   33856                                               uint32_t imm6 =
   33857                                                   (instr >> 16) & 0x3f;
   33858                                               uint32_t imm =
   33859                                                   imm6 - dt.GetSize();
   33860                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   33861                                               vshll(CurrentCond(),
   33862                                                     dt,
   33863                                                     QRegister(rd),
   33864                                                     DRegister(rm),
   33865                                                     imm);
   33866                                               break;
   33867                                             }
   33868                                             case 0x001d0000: {
   33869                                               // 0xef9d0a10
   33870                                               if (((instr & 0x380000) == 0x0) ||
   33871                                                   ((instr & 0x3f0000) ==
   33872                                                    0x80000) ||
   33873                                                   ((instr & 0x3f0000) ==
   33874                                                    0x100000) ||
   33875                                                   ((instr & 0x3f0000) ==
   33876                                                    0x200000)) {
   33877                                                 UnallocatedT32(instr);
   33878                                                 return;
   33879                                               }
   33880                                               DataType dt =
   33881                                                   Dt_imm6_4_Decode((instr >>
   33882                                                                     19) &
   33883                                                                        0x7,
   33884                                                                    (instr >>
   33885                                                                     28) &
   33886                                                                        0x1);
   33887                                               if (dt.Is(
   33888                                                       kDataTypeValueInvalid)) {
   33889                                                 UnallocatedT32(instr);
   33890                                                 return;
   33891                                               }
   33892                                               if (((instr >> 12) & 1) != 0) {
   33893                                                 UnallocatedT32(instr);
   33894                                                 return;
   33895                                               }
   33896                                               unsigned rd =
   33897                                                   ExtractQRegister(instr,
   33898                                                                    22,
   33899                                                                    12);
   33900                                               unsigned rm =
   33901                                                   ExtractDRegister(instr, 5, 0);
   33902                                               uint32_t imm6 =
   33903                                                   (instr >> 16) & 0x3f;
   33904                                               uint32_t imm =
   33905                                                   imm6 - dt.GetSize();
   33906                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   33907                                               vshll(CurrentCond(),
   33908                                                     dt,
   33909                                                     QRegister(rd),
   33910                                                     DRegister(rm),
   33911                                                     imm);
   33912                                               break;
   33913                                             }
   33914                                             case 0x001e0000: {
   33915                                               // 0xef9e0a10
   33916                                               if (((instr & 0x380000) == 0x0) ||
   33917                                                   ((instr & 0x3f0000) ==
   33918                                                    0x80000) ||
   33919                                                   ((instr & 0x3f0000) ==
   33920                                                    0x100000) ||
   33921                                                   ((instr & 0x3f0000) ==
   33922                                                    0x200000)) {
   33923                                                 UnallocatedT32(instr);
   33924                                                 return;
   33925                                               }
   33926                                               DataType dt =
   33927                                                   Dt_imm6_4_Decode((instr >>
   33928                                                                     19) &
   33929                                                                        0x7,
   33930                                                                    (instr >>
   33931                                                                     28) &
   33932                                                                        0x1);
   33933                                               if (dt.Is(
   33934                                                       kDataTypeValueInvalid)) {
   33935                                                 UnallocatedT32(instr);
   33936                                                 return;
   33937                                               }
   33938                                               if (((instr >> 12) & 1) != 0) {
   33939                                                 UnallocatedT32(instr);
   33940                                                 return;
   33941                                               }
   33942                                               unsigned rd =
   33943                                                   ExtractQRegister(instr,
   33944                                                                    22,
   33945                                                                    12);
   33946                                               unsigned rm =
   33947                                                   ExtractDRegister(instr, 5, 0);
   33948                                               uint32_t imm6 =
   33949                                                   (instr >> 16) & 0x3f;
   33950                                               uint32_t imm =
   33951                                                   imm6 - dt.GetSize();
   33952                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   33953                                               vshll(CurrentCond(),
   33954                                                     dt,
   33955                                                     QRegister(rd),
   33956                                                     DRegister(rm),
   33957                                                     imm);
   33958                                               break;
   33959                                             }
   33960                                             case 0x001f0000: {
   33961                                               // 0xef9f0a10
   33962                                               if (((instr & 0x380000) == 0x0) ||
   33963                                                   ((instr & 0x3f0000) ==
   33964                                                    0x80000) ||
   33965                                                   ((instr & 0x3f0000) ==
   33966                                                    0x100000) ||
   33967                                                   ((instr & 0x3f0000) ==
   33968                                                    0x200000)) {
   33969                                                 UnallocatedT32(instr);
   33970                                                 return;
   33971                                               }
   33972                                               DataType dt =
   33973                                                   Dt_imm6_4_Decode((instr >>
   33974                                                                     19) &
   33975                                                                        0x7,
   33976                                                                    (instr >>
   33977                                                                     28) &
   33978                                                                        0x1);
   33979                                               if (dt.Is(
   33980                                                       kDataTypeValueInvalid)) {
   33981                                                 UnallocatedT32(instr);
   33982                                                 return;
   33983                                               }
   33984                                               if (((instr >> 12) & 1) != 0) {
   33985                                                 UnallocatedT32(instr);
   33986                                                 return;
   33987                                               }
   33988                                               unsigned rd =
   33989                                                   ExtractQRegister(instr,
   33990                                                                    22,
   33991                                                                    12);
   33992                                               unsigned rm =
   33993                                                   ExtractDRegister(instr, 5, 0);
   33994                                               uint32_t imm6 =
   33995                                                   (instr >> 16) & 0x3f;
   33996                                               uint32_t imm =
   33997                                                   imm6 - dt.GetSize();
   33998                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   33999                                               vshll(CurrentCond(),
   34000                                                     dt,
   34001                                                     QRegister(rd),
   34002                                                     DRegister(rm),
   34003                                                     imm);
   34004                                               break;
   34005                                             }
   34006                                             case 0x00200000: {
   34007                                               // 0xefa00a10
   34008                                               if (((instr & 0x380000) == 0x0) ||
   34009                                                   ((instr & 0x380000) ==
   34010                                                    0x180000) ||
   34011                                                   ((instr & 0x380000) ==
   34012                                                    0x280000) ||
   34013                                                   ((instr & 0x380000) ==
   34014                                                    0x300000) ||
   34015                                                   ((instr & 0x380000) ==
   34016                                                    0x380000)) {
   34017                                                 UnallocatedT32(instr);
   34018                                                 return;
   34019                                               }
   34020                                               DataType dt = Dt_U_imm3H_1_Decode(
   34021                                                   ((instr >> 19) & 0x7) |
   34022                                                   ((instr >> 25) & 0x8));
   34023                                               if (dt.Is(
   34024                                                       kDataTypeValueInvalid)) {
   34025                                                 UnallocatedT32(instr);
   34026                                                 return;
   34027                                               }
   34028                                               if (((instr >> 12) & 1) != 0) {
   34029                                                 UnallocatedT32(instr);
   34030                                                 return;
   34031                                               }
   34032                                               unsigned rd =
   34033                                                   ExtractQRegister(instr,
   34034                                                                    22,
   34035                                                                    12);
   34036                                               unsigned rm =
   34037                                                   ExtractDRegister(instr, 5, 0);
   34038                                               // VMOVL{<c>}{<q>}.<dt> <Qd>, <Dm> ; T1 NOLINT(whitespace/line_length)
   34039                                               vmovl(CurrentCond(),
   34040                                                     dt,
   34041                                                     QRegister(rd),
   34042                                                     DRegister(rm));
   34043                                               break;
   34044                                             }
   34045                                             case 0x00210000: {
   34046                                               // 0xefa10a10
   34047                                               if (((instr & 0x380000) == 0x0) ||
   34048                                                   ((instr & 0x3f0000) ==
   34049                                                    0x80000) ||
   34050                                                   ((instr & 0x3f0000) ==
   34051                                                    0x100000) ||
   34052                                                   ((instr & 0x3f0000) ==
   34053                                                    0x200000)) {
   34054                                                 UnallocatedT32(instr);
   34055                                                 return;
   34056                                               }
   34057                                               DataType dt =
   34058                                                   Dt_imm6_4_Decode((instr >>
   34059                                                                     19) &
   34060                                                                        0x7,
   34061                                                                    (instr >>
   34062                                                                     28) &
   34063                                                                        0x1);
   34064                                               if (dt.Is(
   34065                                                       kDataTypeValueInvalid)) {
   34066                                                 UnallocatedT32(instr);
   34067                                                 return;
   34068                                               }
   34069                                               if (((instr >> 12) & 1) != 0) {
   34070                                                 UnallocatedT32(instr);
   34071                                                 return;
   34072                                               }
   34073                                               unsigned rd =
   34074                                                   ExtractQRegister(instr,
   34075                                                                    22,
   34076                                                                    12);
   34077                                               unsigned rm =
   34078                                                   ExtractDRegister(instr, 5, 0);
   34079                                               uint32_t imm6 =
   34080                                                   (instr >> 16) & 0x3f;
   34081                                               uint32_t imm =
   34082                                                   imm6 - dt.GetSize();
   34083                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   34084                                               vshll(CurrentCond(),
   34085                                                     dt,
   34086                                                     QRegister(rd),
   34087                                                     DRegister(rm),
   34088                                                     imm);
   34089                                               break;
   34090                                             }
   34091                                             case 0x00220000: {
   34092                                               // 0xefa20a10
   34093                                               if (((instr & 0x380000) == 0x0) ||
   34094                                                   ((instr & 0x3f0000) ==
   34095                                                    0x80000) ||
   34096                                                   ((instr & 0x3f0000) ==
   34097                                                    0x100000) ||
   34098                                                   ((instr & 0x3f0000) ==
   34099                                                    0x200000)) {
   34100                                                 UnallocatedT32(instr);
   34101                                                 return;
   34102                                               }
   34103                                               DataType dt =
   34104                                                   Dt_imm6_4_Decode((instr >>
   34105                                                                     19) &
   34106                                                                        0x7,
   34107                                                                    (instr >>
   34108                                                                     28) &
   34109                                                                        0x1);
   34110                                               if (dt.Is(
   34111                                                       kDataTypeValueInvalid)) {
   34112                                                 UnallocatedT32(instr);
   34113                                                 return;
   34114                                               }
   34115                                               if (((instr >> 12) & 1) != 0) {
   34116                                                 UnallocatedT32(instr);
   34117                                                 return;
   34118                                               }
   34119                                               unsigned rd =
   34120                                                   ExtractQRegister(instr,
   34121                                                                    22,
   34122                                                                    12);
   34123                                               unsigned rm =
   34124                                                   ExtractDRegister(instr, 5, 0);
   34125                                               uint32_t imm6 =
   34126                                                   (instr >> 16) & 0x3f;
   34127                                               uint32_t imm =
   34128                                                   imm6 - dt.GetSize();
   34129                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   34130                                               vshll(CurrentCond(),
   34131                                                     dt,
   34132                                                     QRegister(rd),
   34133                                                     DRegister(rm),
   34134                                                     imm);
   34135                                               break;
   34136                                             }
   34137                                             case 0x00230000: {
   34138                                               // 0xefa30a10
   34139                                               if (((instr & 0x380000) == 0x0) ||
   34140                                                   ((instr & 0x3f0000) ==
   34141                                                    0x80000) ||
   34142                                                   ((instr & 0x3f0000) ==
   34143                                                    0x100000) ||
   34144                                                   ((instr & 0x3f0000) ==
   34145                                                    0x200000)) {
   34146                                                 UnallocatedT32(instr);
   34147                                                 return;
   34148                                               }
   34149                                               DataType dt =
   34150                                                   Dt_imm6_4_Decode((instr >>
   34151                                                                     19) &
   34152                                                                        0x7,
   34153                                                                    (instr >>
   34154                                                                     28) &
   34155                                                                        0x1);
   34156                                               if (dt.Is(
   34157                                                       kDataTypeValueInvalid)) {
   34158                                                 UnallocatedT32(instr);
   34159                                                 return;
   34160                                               }
   34161                                               if (((instr >> 12) & 1) != 0) {
   34162                                                 UnallocatedT32(instr);
   34163                                                 return;
   34164                                               }
   34165                                               unsigned rd =
   34166                                                   ExtractQRegister(instr,
   34167                                                                    22,
   34168                                                                    12);
   34169                                               unsigned rm =
   34170                                                   ExtractDRegister(instr, 5, 0);
   34171                                               uint32_t imm6 =
   34172                                                   (instr >> 16) & 0x3f;
   34173                                               uint32_t imm =
   34174                                                   imm6 - dt.GetSize();
   34175                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   34176                                               vshll(CurrentCond(),
   34177                                                     dt,
   34178                                                     QRegister(rd),
   34179                                                     DRegister(rm),
   34180                                                     imm);
   34181                                               break;
   34182                                             }
   34183                                             case 0x00240000: {
   34184                                               // 0xefa40a10
   34185                                               if (((instr & 0x380000) == 0x0) ||
   34186                                                   ((instr & 0x3f0000) ==
   34187                                                    0x80000) ||
   34188                                                   ((instr & 0x3f0000) ==
   34189                                                    0x100000) ||
   34190                                                   ((instr & 0x3f0000) ==
   34191                                                    0x200000)) {
   34192                                                 UnallocatedT32(instr);
   34193                                                 return;
   34194                                               }
   34195                                               DataType dt =
   34196                                                   Dt_imm6_4_Decode((instr >>
   34197                                                                     19) &
   34198                                                                        0x7,
   34199                                                                    (instr >>
   34200                                                                     28) &
   34201                                                                        0x1);
   34202                                               if (dt.Is(
   34203                                                       kDataTypeValueInvalid)) {
   34204                                                 UnallocatedT32(instr);
   34205                                                 return;
   34206                                               }
   34207                                               if (((instr >> 12) & 1) != 0) {
   34208                                                 UnallocatedT32(instr);
   34209                                                 return;
   34210                                               }
   34211                                               unsigned rd =
   34212                                                   ExtractQRegister(instr,
   34213                                                                    22,
   34214                                                                    12);
   34215                                               unsigned rm =
   34216                                                   ExtractDRegister(instr, 5, 0);
   34217                                               uint32_t imm6 =
   34218                                                   (instr >> 16) & 0x3f;
   34219                                               uint32_t imm =
   34220                                                   imm6 - dt.GetSize();
   34221                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   34222                                               vshll(CurrentCond(),
   34223                                                     dt,
   34224                                                     QRegister(rd),
   34225                                                     DRegister(rm),
   34226                                                     imm);
   34227                                               break;
   34228                                             }
   34229                                             case 0x00250000: {
   34230                                               // 0xefa50a10
   34231                                               if (((instr & 0x380000) == 0x0) ||
   34232                                                   ((instr & 0x3f0000) ==
   34233                                                    0x80000) ||
   34234                                                   ((instr & 0x3f0000) ==
   34235                                                    0x100000) ||
   34236                                                   ((instr & 0x3f0000) ==
   34237                                                    0x200000)) {
   34238                                                 UnallocatedT32(instr);
   34239                                                 return;
   34240                                               }
   34241                                               DataType dt =
   34242                                                   Dt_imm6_4_Decode((instr >>
   34243                                                                     19) &
   34244                                                                        0x7,
   34245                                                                    (instr >>
   34246                                                                     28) &
   34247                                                                        0x1);
   34248                                               if (dt.Is(
   34249                                                       kDataTypeValueInvalid)) {
   34250                                                 UnallocatedT32(instr);
   34251                                                 return;
   34252                                               }
   34253                                               if (((instr >> 12) & 1) != 0) {
   34254                                                 UnallocatedT32(instr);
   34255                                                 return;
   34256                                               }
   34257                                               unsigned rd =
   34258                                                   ExtractQRegister(instr,
   34259                                                                    22,
   34260                                                                    12);
   34261                                               unsigned rm =
   34262                                                   ExtractDRegister(instr, 5, 0);
   34263                                               uint32_t imm6 =
   34264                                                   (instr >> 16) & 0x3f;
   34265                                               uint32_t imm =
   34266                                                   imm6 - dt.GetSize();
   34267                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   34268                                               vshll(CurrentCond(),
   34269                                                     dt,
   34270                                                     QRegister(rd),
   34271                                                     DRegister(rm),
   34272                                                     imm);
   34273                                               break;
   34274                                             }
   34275                                             case 0x00260000: {
   34276                                               // 0xefa60a10
   34277                                               if (((instr & 0x380000) == 0x0) ||
   34278                                                   ((instr & 0x3f0000) ==
   34279                                                    0x80000) ||
   34280                                                   ((instr & 0x3f0000) ==
   34281                                                    0x100000) ||
   34282                                                   ((instr & 0x3f0000) ==
   34283                                                    0x200000)) {
   34284                                                 UnallocatedT32(instr);
   34285                                                 return;
   34286                                               }
   34287                                               DataType dt =
   34288                                                   Dt_imm6_4_Decode((instr >>
   34289                                                                     19) &
   34290                                                                        0x7,
   34291                                                                    (instr >>
   34292                                                                     28) &
   34293                                                                        0x1);
   34294                                               if (dt.Is(
   34295                                                       kDataTypeValueInvalid)) {
   34296                                                 UnallocatedT32(instr);
   34297                                                 return;
   34298                                               }
   34299                                               if (((instr >> 12) & 1) != 0) {
   34300                                                 UnallocatedT32(instr);
   34301                                                 return;
   34302                                               }
   34303                                               unsigned rd =
   34304                                                   ExtractQRegister(instr,
   34305                                                                    22,
   34306                                                                    12);
   34307                                               unsigned rm =
   34308                                                   ExtractDRegister(instr, 5, 0);
   34309                                               uint32_t imm6 =
   34310                                                   (instr >> 16) & 0x3f;
   34311                                               uint32_t imm =
   34312                                                   imm6 - dt.GetSize();
   34313                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   34314                                               vshll(CurrentCond(),
   34315                                                     dt,
   34316                                                     QRegister(rd),
   34317                                                     DRegister(rm),
   34318                                                     imm);
   34319                                               break;
   34320                                             }
   34321                                             case 0x00270000: {
   34322                                               // 0xefa70a10
   34323                                               if (((instr & 0x380000) == 0x0) ||
   34324                                                   ((instr & 0x3f0000) ==
   34325                                                    0x80000) ||
   34326                                                   ((instr & 0x3f0000) ==
   34327                                                    0x100000) ||
   34328                                                   ((instr & 0x3f0000) ==
   34329                                                    0x200000)) {
   34330                                                 UnallocatedT32(instr);
   34331                                                 return;
   34332                                               }
   34333                                               DataType dt =
   34334                                                   Dt_imm6_4_Decode((instr >>
   34335                                                                     19) &
   34336                                                                        0x7,
   34337                                                                    (instr >>
   34338                                                                     28) &
   34339                                                                        0x1);
   34340                                               if (dt.Is(
   34341                                                       kDataTypeValueInvalid)) {
   34342                                                 UnallocatedT32(instr);
   34343                                                 return;
   34344                                               }
   34345                                               if (((instr >> 12) & 1) != 0) {
   34346                                                 UnallocatedT32(instr);
   34347                                                 return;
   34348                                               }
   34349                                               unsigned rd =
   34350                                                   ExtractQRegister(instr,
   34351                                                                    22,
   34352                                                                    12);
   34353                                               unsigned rm =
   34354                                                   ExtractDRegister(instr, 5, 0);
   34355                                               uint32_t imm6 =
   34356                                                   (instr >> 16) & 0x3f;
   34357                                               uint32_t imm =
   34358                                                   imm6 - dt.GetSize();
   34359                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   34360                                               vshll(CurrentCond(),
   34361                                                     dt,
   34362                                                     QRegister(rd),
   34363                                                     DRegister(rm),
   34364                                                     imm);
   34365                                               break;
   34366                                             }
   34367                                             case 0x00280000: {
   34368                                               // 0xefa80a10
   34369                                               if (((instr & 0x380000) == 0x0) ||
   34370                                                   ((instr & 0x3f0000) ==
   34371                                                    0x80000) ||
   34372                                                   ((instr & 0x3f0000) ==
   34373                                                    0x100000) ||
   34374                                                   ((instr & 0x3f0000) ==
   34375                                                    0x200000)) {
   34376                                                 UnallocatedT32(instr);
   34377                                                 return;
   34378                                               }
   34379                                               DataType dt =
   34380                                                   Dt_imm6_4_Decode((instr >>
   34381                                                                     19) &
   34382                                                                        0x7,
   34383                                                                    (instr >>
   34384                                                                     28) &
   34385                                                                        0x1);
   34386                                               if (dt.Is(
   34387                                                       kDataTypeValueInvalid)) {
   34388                                                 UnallocatedT32(instr);
   34389                                                 return;
   34390                                               }
   34391                                               if (((instr >> 12) & 1) != 0) {
   34392                                                 UnallocatedT32(instr);
   34393                                                 return;
   34394                                               }
   34395                                               unsigned rd =
   34396                                                   ExtractQRegister(instr,
   34397                                                                    22,
   34398                                                                    12);
   34399                                               unsigned rm =
   34400                                                   ExtractDRegister(instr, 5, 0);
   34401                                               uint32_t imm6 =
   34402                                                   (instr >> 16) & 0x3f;
   34403                                               uint32_t imm =
   34404                                                   imm6 - dt.GetSize();
   34405                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   34406                                               vshll(CurrentCond(),
   34407                                                     dt,
   34408                                                     QRegister(rd),
   34409                                                     DRegister(rm),
   34410                                                     imm);
   34411                                               break;
   34412                                             }
   34413                                             case 0x00290000: {
   34414                                               // 0xefa90a10
   34415                                               if (((instr & 0x380000) == 0x0) ||
   34416                                                   ((instr & 0x3f0000) ==
   34417                                                    0x80000) ||
   34418                                                   ((instr & 0x3f0000) ==
   34419                                                    0x100000) ||
   34420                                                   ((instr & 0x3f0000) ==
   34421                                                    0x200000)) {
   34422                                                 UnallocatedT32(instr);
   34423                                                 return;
   34424                                               }
   34425                                               DataType dt =
   34426                                                   Dt_imm6_4_Decode((instr >>
   34427                                                                     19) &
   34428                                                                        0x7,
   34429                                                                    (instr >>
   34430                                                                     28) &
   34431                                                                        0x1);
   34432                                               if (dt.Is(
   34433                                                       kDataTypeValueInvalid)) {
   34434                                                 UnallocatedT32(instr);
   34435                                                 return;
   34436                                               }
   34437                                               if (((instr >> 12) & 1) != 0) {
   34438                                                 UnallocatedT32(instr);
   34439                                                 return;
   34440                                               }
   34441                                               unsigned rd =
   34442                                                   ExtractQRegister(instr,
   34443                                                                    22,
   34444                                                                    12);
   34445                                               unsigned rm =
   34446                                                   ExtractDRegister(instr, 5, 0);
   34447                                               uint32_t imm6 =
   34448                                                   (instr >> 16) & 0x3f;
   34449                                               uint32_t imm =
   34450                                                   imm6 - dt.GetSize();
   34451                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   34452                                               vshll(CurrentCond(),
   34453                                                     dt,
   34454                                                     QRegister(rd),
   34455                                                     DRegister(rm),
   34456                                                     imm);
   34457                                               break;
   34458                                             }
   34459                                             case 0x002a0000: {
   34460                                               // 0xefaa0a10
   34461                                               if (((instr & 0x380000) == 0x0) ||
   34462                                                   ((instr & 0x3f0000) ==
   34463                                                    0x80000) ||
   34464                                                   ((instr & 0x3f0000) ==
   34465                                                    0x100000) ||
   34466                                                   ((instr & 0x3f0000) ==
   34467                                                    0x200000)) {
   34468                                                 UnallocatedT32(instr);
   34469                                                 return;
   34470                                               }
   34471                                               DataType dt =
   34472                                                   Dt_imm6_4_Decode((instr >>
   34473                                                                     19) &
   34474                                                                        0x7,
   34475                                                                    (instr >>
   34476                                                                     28) &
   34477                                                                        0x1);
   34478                                               if (dt.Is(
   34479                                                       kDataTypeValueInvalid)) {
   34480                                                 UnallocatedT32(instr);
   34481                                                 return;
   34482                                               }
   34483                                               if (((instr >> 12) & 1) != 0) {
   34484                                                 UnallocatedT32(instr);
   34485                                                 return;
   34486                                               }
   34487                                               unsigned rd =
   34488                                                   ExtractQRegister(instr,
   34489                                                                    22,
   34490                                                                    12);
   34491                                               unsigned rm =
   34492                                                   ExtractDRegister(instr, 5, 0);
   34493                                               uint32_t imm6 =
   34494                                                   (instr >> 16) & 0x3f;
   34495                                               uint32_t imm =
   34496                                                   imm6 - dt.GetSize();
   34497                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   34498                                               vshll(CurrentCond(),
   34499                                                     dt,
   34500                                                     QRegister(rd),
   34501                                                     DRegister(rm),
   34502                                                     imm);
   34503                                               break;
   34504                                             }
   34505                                             case 0x002b0000: {
   34506                                               // 0xefab0a10
   34507                                               if (((instr & 0x380000) == 0x0) ||
   34508                                                   ((instr & 0x3f0000) ==
   34509                                                    0x80000) ||
   34510                                                   ((instr & 0x3f0000) ==
   34511                                                    0x100000) ||
   34512                                                   ((instr & 0x3f0000) ==
   34513                                                    0x200000)) {
   34514                                                 UnallocatedT32(instr);
   34515                                                 return;
   34516                                               }
   34517                                               DataType dt =
   34518                                                   Dt_imm6_4_Decode((instr >>
   34519                                                                     19) &
   34520                                                                        0x7,
   34521                                                                    (instr >>
   34522                                                                     28) &
   34523                                                                        0x1);
   34524                                               if (dt.Is(
   34525                                                       kDataTypeValueInvalid)) {
   34526                                                 UnallocatedT32(instr);
   34527                                                 return;
   34528                                               }
   34529                                               if (((instr >> 12) & 1) != 0) {
   34530                                                 UnallocatedT32(instr);
   34531                                                 return;
   34532                                               }
   34533                                               unsigned rd =
   34534                                                   ExtractQRegister(instr,
   34535                                                                    22,
   34536                                                                    12);
   34537                                               unsigned rm =
   34538                                                   ExtractDRegister(instr, 5, 0);
   34539                                               uint32_t imm6 =
   34540                                                   (instr >> 16) & 0x3f;
   34541                                               uint32_t imm =
   34542                                                   imm6 - dt.GetSize();
   34543                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   34544                                               vshll(CurrentCond(),
   34545                                                     dt,
   34546                                                     QRegister(rd),
   34547                                                     DRegister(rm),
   34548                                                     imm);
   34549                                               break;
   34550                                             }
   34551                                             case 0x002c0000: {
   34552                                               // 0xefac0a10
   34553                                               if (((instr & 0x380000) == 0x0) ||
   34554                                                   ((instr & 0x3f0000) ==
   34555                                                    0x80000) ||
   34556                                                   ((instr & 0x3f0000) ==
   34557                                                    0x100000) ||
   34558                                                   ((instr & 0x3f0000) ==
   34559                                                    0x200000)) {
   34560                                                 UnallocatedT32(instr);
   34561                                                 return;
   34562                                               }
   34563                                               DataType dt =
   34564                                                   Dt_imm6_4_Decode((instr >>
   34565                                                                     19) &
   34566                                                                        0x7,
   34567                                                                    (instr >>
   34568                                                                     28) &
   34569                                                                        0x1);
   34570                                               if (dt.Is(
   34571                                                       kDataTypeValueInvalid)) {
   34572                                                 UnallocatedT32(instr);
   34573                                                 return;
   34574                                               }
   34575                                               if (((instr >> 12) & 1) != 0) {
   34576                                                 UnallocatedT32(instr);
   34577                                                 return;
   34578                                               }
   34579                                               unsigned rd =
   34580                                                   ExtractQRegister(instr,
   34581                                                                    22,
   34582                                                                    12);
   34583                                               unsigned rm =
   34584                                                   ExtractDRegister(instr, 5, 0);
   34585                                               uint32_t imm6 =
   34586                                                   (instr >> 16) & 0x3f;
   34587                                               uint32_t imm =
   34588                                                   imm6 - dt.GetSize();
   34589                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   34590                                               vshll(CurrentCond(),
   34591                                                     dt,
   34592                                                     QRegister(rd),
   34593                                                     DRegister(rm),
   34594                                                     imm);
   34595                                               break;
   34596                                             }
   34597                                             case 0x002d0000: {
   34598                                               // 0xefad0a10
   34599                                               if (((instr & 0x380000) == 0x0) ||
   34600                                                   ((instr & 0x3f0000) ==
   34601                                                    0x80000) ||
   34602                                                   ((instr & 0x3f0000) ==
   34603                                                    0x100000) ||
   34604                                                   ((instr & 0x3f0000) ==
   34605                                                    0x200000)) {
   34606                                                 UnallocatedT32(instr);
   34607                                                 return;
   34608                                               }
   34609                                               DataType dt =
   34610                                                   Dt_imm6_4_Decode((instr >>
   34611                                                                     19) &
   34612                                                                        0x7,
   34613                                                                    (instr >>
   34614                                                                     28) &
   34615                                                                        0x1);
   34616                                               if (dt.Is(
   34617                                                       kDataTypeValueInvalid)) {
   34618                                                 UnallocatedT32(instr);
   34619                                                 return;
   34620                                               }
   34621                                               if (((instr >> 12) & 1) != 0) {
   34622                                                 UnallocatedT32(instr);
   34623                                                 return;
   34624                                               }
   34625                                               unsigned rd =
   34626                                                   ExtractQRegister(instr,
   34627                                                                    22,
   34628                                                                    12);
   34629                                               unsigned rm =
   34630                                                   ExtractDRegister(instr, 5, 0);
   34631                                               uint32_t imm6 =
   34632                                                   (instr >> 16) & 0x3f;
   34633                                               uint32_t imm =
   34634                                                   imm6 - dt.GetSize();
   34635                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   34636                                               vshll(CurrentCond(),
   34637                                                     dt,
   34638                                                     QRegister(rd),
   34639                                                     DRegister(rm),
   34640                                                     imm);
   34641                                               break;
   34642                                             }
   34643                                             case 0x002e0000: {
   34644                                               // 0xefae0a10
   34645                                               if (((instr & 0x380000) == 0x0) ||
   34646                                                   ((instr & 0x3f0000) ==
   34647                                                    0x80000) ||
   34648                                                   ((instr & 0x3f0000) ==
   34649                                                    0x100000) ||
   34650                                                   ((instr & 0x3f0000) ==
   34651                                                    0x200000)) {
   34652                                                 UnallocatedT32(instr);
   34653                                                 return;
   34654                                               }
   34655                                               DataType dt =
   34656                                                   Dt_imm6_4_Decode((instr >>
   34657                                                                     19) &
   34658                                                                        0x7,
   34659                                                                    (instr >>
   34660                                                                     28) &
   34661                                                                        0x1);
   34662                                               if (dt.Is(
   34663                                                       kDataTypeValueInvalid)) {
   34664                                                 UnallocatedT32(instr);
   34665                                                 return;
   34666                                               }
   34667                                               if (((instr >> 12) & 1) != 0) {
   34668                                                 UnallocatedT32(instr);
   34669                                                 return;
   34670                                               }
   34671                                               unsigned rd =
   34672                                                   ExtractQRegister(instr,
   34673                                                                    22,
   34674                                                                    12);
   34675                                               unsigned rm =
   34676                                                   ExtractDRegister(instr, 5, 0);
   34677                                               uint32_t imm6 =
   34678                                                   (instr >> 16) & 0x3f;
   34679                                               uint32_t imm =
   34680                                                   imm6 - dt.GetSize();
   34681                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   34682                                               vshll(CurrentCond(),
   34683                                                     dt,
   34684                                                     QRegister(rd),
   34685                                                     DRegister(rm),
   34686                                                     imm);
   34687                                               break;
   34688                                             }
   34689                                             case 0x002f0000: {
   34690                                               // 0xefaf0a10
   34691                                               if (((instr & 0x380000) == 0x0) ||
   34692                                                   ((instr & 0x3f0000) ==
   34693                                                    0x80000) ||
   34694                                                   ((instr & 0x3f0000) ==
   34695                                                    0x100000) ||
   34696                                                   ((instr & 0x3f0000) ==
   34697                                                    0x200000)) {
   34698                                                 UnallocatedT32(instr);
   34699                                                 return;
   34700                                               }
   34701                                               DataType dt =
   34702                                                   Dt_imm6_4_Decode((instr >>
   34703                                                                     19) &
   34704                                                                        0x7,
   34705                                                                    (instr >>
   34706                                                                     28) &
   34707                                                                        0x1);
   34708                                               if (dt.Is(
   34709                                                       kDataTypeValueInvalid)) {
   34710                                                 UnallocatedT32(instr);
   34711                                                 return;
   34712                                               }
   34713                                               if (((instr >> 12) & 1) != 0) {
   34714                                                 UnallocatedT32(instr);
   34715                                                 return;
   34716                                               }
   34717                                               unsigned rd =
   34718                                                   ExtractQRegister(instr,
   34719                                                                    22,
   34720                                                                    12);
   34721                                               unsigned rm =
   34722                                                   ExtractDRegister(instr, 5, 0);
   34723                                               uint32_t imm6 =
   34724                                                   (instr >> 16) & 0x3f;
   34725                                               uint32_t imm =
   34726                                                   imm6 - dt.GetSize();
   34727                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   34728                                               vshll(CurrentCond(),
   34729                                                     dt,
   34730                                                     QRegister(rd),
   34731                                                     DRegister(rm),
   34732                                                     imm);
   34733                                               break;
   34734                                             }
   34735                                             case 0x00300000: {
   34736                                               // 0xefb00a10
   34737                                               if (((instr & 0x380000) == 0x0) ||
   34738                                                   ((instr & 0x3f0000) ==
   34739                                                    0x80000) ||
   34740                                                   ((instr & 0x3f0000) ==
   34741                                                    0x100000) ||
   34742                                                   ((instr & 0x3f0000) ==
   34743                                                    0x200000)) {
   34744                                                 UnallocatedT32(instr);
   34745                                                 return;
   34746                                               }
   34747                                               DataType dt =
   34748                                                   Dt_imm6_4_Decode((instr >>
   34749                                                                     19) &
   34750                                                                        0x7,
   34751                                                                    (instr >>
   34752                                                                     28) &
   34753                                                                        0x1);
   34754                                               if (dt.Is(
   34755                                                       kDataTypeValueInvalid)) {
   34756                                                 UnallocatedT32(instr);
   34757                                                 return;
   34758                                               }
   34759                                               if (((instr >> 12) & 1) != 0) {
   34760                                                 UnallocatedT32(instr);
   34761                                                 return;
   34762                                               }
   34763                                               unsigned rd =
   34764                                                   ExtractQRegister(instr,
   34765                                                                    22,
   34766                                                                    12);
   34767                                               unsigned rm =
   34768                                                   ExtractDRegister(instr, 5, 0);
   34769                                               uint32_t imm6 =
   34770                                                   (instr >> 16) & 0x3f;
   34771                                               uint32_t imm =
   34772                                                   imm6 - dt.GetSize();
   34773                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   34774                                               vshll(CurrentCond(),
   34775                                                     dt,
   34776                                                     QRegister(rd),
   34777                                                     DRegister(rm),
   34778                                                     imm);
   34779                                               break;
   34780                                             }
   34781                                             case 0x00310000: {
   34782                                               // 0xefb10a10
   34783                                               if (((instr & 0x380000) == 0x0) ||
   34784                                                   ((instr & 0x3f0000) ==
   34785                                                    0x80000) ||
   34786                                                   ((instr & 0x3f0000) ==
   34787                                                    0x100000) ||
   34788                                                   ((instr & 0x3f0000) ==
   34789                                                    0x200000)) {
   34790                                                 UnallocatedT32(instr);
   34791                                                 return;
   34792                                               }
   34793                                               DataType dt =
   34794                                                   Dt_imm6_4_Decode((instr >>
   34795                                                                     19) &
   34796                                                                        0x7,
   34797                                                                    (instr >>
   34798                                                                     28) &
   34799                                                                        0x1);
   34800                                               if (dt.Is(
   34801                                                       kDataTypeValueInvalid)) {
   34802                                                 UnallocatedT32(instr);
   34803                                                 return;
   34804                                               }
   34805                                               if (((instr >> 12) & 1) != 0) {
   34806                                                 UnallocatedT32(instr);
   34807                                                 return;
   34808                                               }
   34809                                               unsigned rd =
   34810                                                   ExtractQRegister(instr,
   34811                                                                    22,
   34812                                                                    12);
   34813                                               unsigned rm =
   34814                                                   ExtractDRegister(instr, 5, 0);
   34815                                               uint32_t imm6 =
   34816                                                   (instr >> 16) & 0x3f;
   34817                                               uint32_t imm =
   34818                                                   imm6 - dt.GetSize();
   34819                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   34820                                               vshll(CurrentCond(),
   34821                                                     dt,
   34822                                                     QRegister(rd),
   34823                                                     DRegister(rm),
   34824                                                     imm);
   34825                                               break;
   34826                                             }
   34827                                             case 0x00320000: {
   34828                                               // 0xefb20a10
   34829                                               if (((instr & 0x380000) == 0x0) ||
   34830                                                   ((instr & 0x3f0000) ==
   34831                                                    0x80000) ||
   34832                                                   ((instr & 0x3f0000) ==
   34833                                                    0x100000) ||
   34834                                                   ((instr & 0x3f0000) ==
   34835                                                    0x200000)) {
   34836                                                 UnallocatedT32(instr);
   34837                                                 return;
   34838                                               }
   34839                                               DataType dt =
   34840                                                   Dt_imm6_4_Decode((instr >>
   34841                                                                     19) &
   34842                                                                        0x7,
   34843                                                                    (instr >>
   34844                                                                     28) &
   34845                                                                        0x1);
   34846                                               if (dt.Is(
   34847                                                       kDataTypeValueInvalid)) {
   34848                                                 UnallocatedT32(instr);
   34849                                                 return;
   34850                                               }
   34851                                               if (((instr >> 12) & 1) != 0) {
   34852                                                 UnallocatedT32(instr);
   34853                                                 return;
   34854                                               }
   34855                                               unsigned rd =
   34856                                                   ExtractQRegister(instr,
   34857                                                                    22,
   34858                                                                    12);
   34859                                               unsigned rm =
   34860                                                   ExtractDRegister(instr, 5, 0);
   34861                                               uint32_t imm6 =
   34862                                                   (instr >> 16) & 0x3f;
   34863                                               uint32_t imm =
   34864                                                   imm6 - dt.GetSize();
   34865                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   34866                                               vshll(CurrentCond(),
   34867                                                     dt,
   34868                                                     QRegister(rd),
   34869                                                     DRegister(rm),
   34870                                                     imm);
   34871                                               break;
   34872                                             }
   34873                                             case 0x00330000: {
   34874                                               // 0xefb30a10
   34875                                               if (((instr & 0x380000) == 0x0) ||
   34876                                                   ((instr & 0x3f0000) ==
   34877                                                    0x80000) ||
   34878                                                   ((instr & 0x3f0000) ==
   34879                                                    0x100000) ||
   34880                                                   ((instr & 0x3f0000) ==
   34881                                                    0x200000)) {
   34882                                                 UnallocatedT32(instr);
   34883                                                 return;
   34884                                               }
   34885                                               DataType dt =
   34886                                                   Dt_imm6_4_Decode((instr >>
   34887                                                                     19) &
   34888                                                                        0x7,
   34889                                                                    (instr >>
   34890                                                                     28) &
   34891                                                                        0x1);
   34892                                               if (dt.Is(
   34893                                                       kDataTypeValueInvalid)) {
   34894                                                 UnallocatedT32(instr);
   34895                                                 return;
   34896                                               }
   34897                                               if (((instr >> 12) & 1) != 0) {
   34898                                                 UnallocatedT32(instr);
   34899                                                 return;
   34900                                               }
   34901                                               unsigned rd =
   34902                                                   ExtractQRegister(instr,
   34903                                                                    22,
   34904                                                                    12);
   34905                                               unsigned rm =
   34906                                                   ExtractDRegister(instr, 5, 0);
   34907                                               uint32_t imm6 =
   34908                                                   (instr >> 16) & 0x3f;
   34909                                               uint32_t imm =
   34910                                                   imm6 - dt.GetSize();
   34911                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   34912                                               vshll(CurrentCond(),
   34913                                                     dt,
   34914                                                     QRegister(rd),
   34915                                                     DRegister(rm),
   34916                                                     imm);
   34917                                               break;
   34918                                             }
   34919                                             case 0x00340000: {
   34920                                               // 0xefb40a10
   34921                                               if (((instr & 0x380000) == 0x0) ||
   34922                                                   ((instr & 0x3f0000) ==
   34923                                                    0x80000) ||
   34924                                                   ((instr & 0x3f0000) ==
   34925                                                    0x100000) ||
   34926                                                   ((instr & 0x3f0000) ==
   34927                                                    0x200000)) {
   34928                                                 UnallocatedT32(instr);
   34929                                                 return;
   34930                                               }
   34931                                               DataType dt =
   34932                                                   Dt_imm6_4_Decode((instr >>
   34933                                                                     19) &
   34934                                                                        0x7,
   34935                                                                    (instr >>
   34936                                                                     28) &
   34937                                                                        0x1);
   34938                                               if (dt.Is(
   34939                                                       kDataTypeValueInvalid)) {
   34940                                                 UnallocatedT32(instr);
   34941                                                 return;
   34942                                               }
   34943                                               if (((instr >> 12) & 1) != 0) {
   34944                                                 UnallocatedT32(instr);
   34945                                                 return;
   34946                                               }
   34947                                               unsigned rd =
   34948                                                   ExtractQRegister(instr,
   34949                                                                    22,
   34950                                                                    12);
   34951                                               unsigned rm =
   34952                                                   ExtractDRegister(instr, 5, 0);
   34953                                               uint32_t imm6 =
   34954                                                   (instr >> 16) & 0x3f;
   34955                                               uint32_t imm =
   34956                                                   imm6 - dt.GetSize();
   34957                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   34958                                               vshll(CurrentCond(),
   34959                                                     dt,
   34960                                                     QRegister(rd),
   34961                                                     DRegister(rm),
   34962                                                     imm);
   34963                                               break;
   34964                                             }
   34965                                             case 0x00350000: {
   34966                                               // 0xefb50a10
   34967                                               if (((instr & 0x380000) == 0x0) ||
   34968                                                   ((instr & 0x3f0000) ==
   34969                                                    0x80000) ||
   34970                                                   ((instr & 0x3f0000) ==
   34971                                                    0x100000) ||
   34972                                                   ((instr & 0x3f0000) ==
   34973                                                    0x200000)) {
   34974                                                 UnallocatedT32(instr);
   34975                                                 return;
   34976                                               }
   34977                                               DataType dt =
   34978                                                   Dt_imm6_4_Decode((instr >>
   34979                                                                     19) &
   34980                                                                        0x7,
   34981                                                                    (instr >>
   34982                                                                     28) &
   34983                                                                        0x1);
   34984                                               if (dt.Is(
   34985                                                       kDataTypeValueInvalid)) {
   34986                                                 UnallocatedT32(instr);
   34987                                                 return;
   34988                                               }
   34989                                               if (((instr >> 12) & 1) != 0) {
   34990                                                 UnallocatedT32(instr);
   34991                                                 return;
   34992                                               }
   34993                                               unsigned rd =
   34994                                                   ExtractQRegister(instr,
   34995                                                                    22,
   34996                                                                    12);
   34997                                               unsigned rm =
   34998                                                   ExtractDRegister(instr, 5, 0);
   34999                                               uint32_t imm6 =
   35000                                                   (instr >> 16) & 0x3f;
   35001                                               uint32_t imm =
   35002                                                   imm6 - dt.GetSize();
   35003                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   35004                                               vshll(CurrentCond(),
   35005                                                     dt,
   35006                                                     QRegister(rd),
   35007                                                     DRegister(rm),
   35008                                                     imm);
   35009                                               break;
   35010                                             }
   35011                                             case 0x00360000: {
   35012                                               // 0xefb60a10
   35013                                               if (((instr & 0x380000) == 0x0) ||
   35014                                                   ((instr & 0x3f0000) ==
   35015                                                    0x80000) ||
   35016                                                   ((instr & 0x3f0000) ==
   35017                                                    0x100000) ||
   35018                                                   ((instr & 0x3f0000) ==
   35019                                                    0x200000)) {
   35020                                                 UnallocatedT32(instr);
   35021                                                 return;
   35022                                               }
   35023                                               DataType dt =
   35024                                                   Dt_imm6_4_Decode((instr >>
   35025                                                                     19) &
   35026                                                                        0x7,
   35027                                                                    (instr >>
   35028                                                                     28) &
   35029                                                                        0x1);
   35030                                               if (dt.Is(
   35031                                                       kDataTypeValueInvalid)) {
   35032                                                 UnallocatedT32(instr);
   35033                                                 return;
   35034                                               }
   35035                                               if (((instr >> 12) & 1) != 0) {
   35036                                                 UnallocatedT32(instr);
   35037                                                 return;
   35038                                               }
   35039                                               unsigned rd =
   35040                                                   ExtractQRegister(instr,
   35041                                                                    22,
   35042                                                                    12);
   35043                                               unsigned rm =
   35044                                                   ExtractDRegister(instr, 5, 0);
   35045                                               uint32_t imm6 =
   35046                                                   (instr >> 16) & 0x3f;
   35047                                               uint32_t imm =
   35048                                                   imm6 - dt.GetSize();
   35049                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   35050                                               vshll(CurrentCond(),
   35051                                                     dt,
   35052                                                     QRegister(rd),
   35053                                                     DRegister(rm),
   35054                                                     imm);
   35055                                               break;
   35056                                             }
   35057                                             case 0x00370000: {
   35058                                               // 0xefb70a10
   35059                                               if (((instr & 0x380000) == 0x0) ||
   35060                                                   ((instr & 0x3f0000) ==
   35061                                                    0x80000) ||
   35062                                                   ((instr & 0x3f0000) ==
   35063                                                    0x100000) ||
   35064                                                   ((instr & 0x3f0000) ==
   35065                                                    0x200000)) {
   35066                                                 UnallocatedT32(instr);
   35067                                                 return;
   35068                                               }
   35069                                               DataType dt =
   35070                                                   Dt_imm6_4_Decode((instr >>
   35071                                                                     19) &
   35072                                                                        0x7,
   35073                                                                    (instr >>
   35074                                                                     28) &
   35075                                                                        0x1);
   35076                                               if (dt.Is(
   35077                                                       kDataTypeValueInvalid)) {
   35078                                                 UnallocatedT32(instr);
   35079                                                 return;
   35080                                               }
   35081                                               if (((instr >> 12) & 1) != 0) {
   35082                                                 UnallocatedT32(instr);
   35083                                                 return;
   35084                                               }
   35085                                               unsigned rd =
   35086                                                   ExtractQRegister(instr,
   35087                                                                    22,
   35088                                                                    12);
   35089                                               unsigned rm =
   35090                                                   ExtractDRegister(instr, 5, 0);
   35091                                               uint32_t imm6 =
   35092                                                   (instr >> 16) & 0x3f;
   35093                                               uint32_t imm =
   35094                                                   imm6 - dt.GetSize();
   35095                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   35096                                               vshll(CurrentCond(),
   35097                                                     dt,
   35098                                                     QRegister(rd),
   35099                                                     DRegister(rm),
   35100                                                     imm);
   35101                                               break;
   35102                                             }
   35103                                             case 0x00380000: {
   35104                                               // 0xefb80a10
   35105                                               if (((instr & 0x380000) == 0x0) ||
   35106                                                   ((instr & 0x3f0000) ==
   35107                                                    0x80000) ||
   35108                                                   ((instr & 0x3f0000) ==
   35109                                                    0x100000) ||
   35110                                                   ((instr & 0x3f0000) ==
   35111                                                    0x200000)) {
   35112                                                 UnallocatedT32(instr);
   35113                                                 return;
   35114                                               }
   35115                                               DataType dt =
   35116                                                   Dt_imm6_4_Decode((instr >>
   35117                                                                     19) &
   35118                                                                        0x7,
   35119                                                                    (instr >>
   35120                                                                     28) &
   35121                                                                        0x1);
   35122                                               if (dt.Is(
   35123                                                       kDataTypeValueInvalid)) {
   35124                                                 UnallocatedT32(instr);
   35125                                                 return;
   35126                                               }
   35127                                               if (((instr >> 12) & 1) != 0) {
   35128                                                 UnallocatedT32(instr);
   35129                                                 return;
   35130                                               }
   35131                                               unsigned rd =
   35132                                                   ExtractQRegister(instr,
   35133                                                                    22,
   35134                                                                    12);
   35135                                               unsigned rm =
   35136                                                   ExtractDRegister(instr, 5, 0);
   35137                                               uint32_t imm6 =
   35138                                                   (instr >> 16) & 0x3f;
   35139                                               uint32_t imm =
   35140                                                   imm6 - dt.GetSize();
   35141                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   35142                                               vshll(CurrentCond(),
   35143                                                     dt,
   35144                                                     QRegister(rd),
   35145                                                     DRegister(rm),
   35146                                                     imm);
   35147                                               break;
   35148                                             }
   35149                                             case 0x00390000: {
   35150                                               // 0xefb90a10
   35151                                               if (((instr & 0x380000) == 0x0) ||
   35152                                                   ((instr & 0x3f0000) ==
   35153                                                    0x80000) ||
   35154                                                   ((instr & 0x3f0000) ==
   35155                                                    0x100000) ||
   35156                                                   ((instr & 0x3f0000) ==
   35157                                                    0x200000)) {
   35158                                                 UnallocatedT32(instr);
   35159                                                 return;
   35160                                               }
   35161                                               DataType dt =
   35162                                                   Dt_imm6_4_Decode((instr >>
   35163                                                                     19) &
   35164                                                                        0x7,
   35165                                                                    (instr >>
   35166                                                                     28) &
   35167                                                                        0x1);
   35168                                               if (dt.Is(
   35169                                                       kDataTypeValueInvalid)) {
   35170                                                 UnallocatedT32(instr);
   35171                                                 return;
   35172                                               }
   35173                                               if (((instr >> 12) & 1) != 0) {
   35174                                                 UnallocatedT32(instr);
   35175                                                 return;
   35176                                               }
   35177                                               unsigned rd =
   35178                                                   ExtractQRegister(instr,
   35179                                                                    22,
   35180                                                                    12);
   35181                                               unsigned rm =
   35182                                                   ExtractDRegister(instr, 5, 0);
   35183                                               uint32_t imm6 =
   35184                                                   (instr >> 16) & 0x3f;
   35185                                               uint32_t imm =
   35186                                                   imm6 - dt.GetSize();
   35187                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   35188                                               vshll(CurrentCond(),
   35189                                                     dt,
   35190                                                     QRegister(rd),
   35191                                                     DRegister(rm),
   35192                                                     imm);
   35193                                               break;
   35194                                             }
   35195                                             case 0x003a0000: {
   35196                                               // 0xefba0a10
   35197                                               if (((instr & 0x380000) == 0x0) ||
   35198                                                   ((instr & 0x3f0000) ==
   35199                                                    0x80000) ||
   35200                                                   ((instr & 0x3f0000) ==
   35201                                                    0x100000) ||
   35202                                                   ((instr & 0x3f0000) ==
   35203                                                    0x200000)) {
   35204                                                 UnallocatedT32(instr);
   35205                                                 return;
   35206                                               }
   35207                                               DataType dt =
   35208                                                   Dt_imm6_4_Decode((instr >>
   35209                                                                     19) &
   35210                                                                        0x7,
   35211                                                                    (instr >>
   35212                                                                     28) &
   35213                                                                        0x1);
   35214                                               if (dt.Is(
   35215                                                       kDataTypeValueInvalid)) {
   35216                                                 UnallocatedT32(instr);
   35217                                                 return;
   35218                                               }
   35219                                               if (((instr >> 12) & 1) != 0) {
   35220                                                 UnallocatedT32(instr);
   35221                                                 return;
   35222                                               }
   35223                                               unsigned rd =
   35224                                                   ExtractQRegister(instr,
   35225                                                                    22,
   35226                                                                    12);
   35227                                               unsigned rm =
   35228                                                   ExtractDRegister(instr, 5, 0);
   35229                                               uint32_t imm6 =
   35230                                                   (instr >> 16) & 0x3f;
   35231                                               uint32_t imm =
   35232                                                   imm6 - dt.GetSize();
   35233                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   35234                                               vshll(CurrentCond(),
   35235                                                     dt,
   35236                                                     QRegister(rd),
   35237                                                     DRegister(rm),
   35238                                                     imm);
   35239                                               break;
   35240                                             }
   35241                                             case 0x003b0000: {
   35242                                               // 0xefbb0a10
   35243                                               if (((instr & 0x380000) == 0x0) ||
   35244                                                   ((instr & 0x3f0000) ==
   35245                                                    0x80000) ||
   35246                                                   ((instr & 0x3f0000) ==
   35247                                                    0x100000) ||
   35248                                                   ((instr & 0x3f0000) ==
   35249                                                    0x200000)) {
   35250                                                 UnallocatedT32(instr);
   35251                                                 return;
   35252                                               }
   35253                                               DataType dt =
   35254                                                   Dt_imm6_4_Decode((instr >>
   35255                                                                     19) &
   35256                                                                        0x7,
   35257                                                                    (instr >>
   35258                                                                     28) &
   35259                                                                        0x1);
   35260                                               if (dt.Is(
   35261                                                       kDataTypeValueInvalid)) {
   35262                                                 UnallocatedT32(instr);
   35263                                                 return;
   35264                                               }
   35265                                               if (((instr >> 12) & 1) != 0) {
   35266                                                 UnallocatedT32(instr);
   35267                                                 return;
   35268                                               }
   35269                                               unsigned rd =
   35270                                                   ExtractQRegister(instr,
   35271                                                                    22,
   35272                                                                    12);
   35273                                               unsigned rm =
   35274                                                   ExtractDRegister(instr, 5, 0);
   35275                                               uint32_t imm6 =
   35276                                                   (instr >> 16) & 0x3f;
   35277                                               uint32_t imm =
   35278                                                   imm6 - dt.GetSize();
   35279                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   35280                                               vshll(CurrentCond(),
   35281                                                     dt,
   35282                                                     QRegister(rd),
   35283                                                     DRegister(rm),
   35284                                                     imm);
   35285                                               break;
   35286                                             }
   35287                                             case 0x003c0000: {
   35288                                               // 0xefbc0a10
   35289                                               if (((instr & 0x380000) == 0x0) ||
   35290                                                   ((instr & 0x3f0000) ==
   35291                                                    0x80000) ||
   35292                                                   ((instr & 0x3f0000) ==
   35293                                                    0x100000) ||
   35294                                                   ((instr & 0x3f0000) ==
   35295                                                    0x200000)) {
   35296                                                 UnallocatedT32(instr);
   35297                                                 return;
   35298                                               }
   35299                                               DataType dt =
   35300                                                   Dt_imm6_4_Decode((instr >>
   35301                                                                     19) &
   35302                                                                        0x7,
   35303                                                                    (instr >>
   35304                                                                     28) &
   35305                                                                        0x1);
   35306                                               if (dt.Is(
   35307                                                       kDataTypeValueInvalid)) {
   35308                                                 UnallocatedT32(instr);
   35309                                                 return;
   35310                                               }
   35311                                               if (((instr >> 12) & 1) != 0) {
   35312                                                 UnallocatedT32(instr);
   35313                                                 return;
   35314                                               }
   35315                                               unsigned rd =
   35316                                                   ExtractQRegister(instr,
   35317                                                                    22,
   35318                                                                    12);
   35319                                               unsigned rm =
   35320                                                   ExtractDRegister(instr, 5, 0);
   35321                                               uint32_t imm6 =
   35322                                                   (instr >> 16) & 0x3f;
   35323                                               uint32_t imm =
   35324                                                   imm6 - dt.GetSize();
   35325                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   35326                                               vshll(CurrentCond(),
   35327                                                     dt,
   35328                                                     QRegister(rd),
   35329                                                     DRegister(rm),
   35330                                                     imm);
   35331                                               break;
   35332                                             }
   35333                                             case 0x003d0000: {
   35334                                               // 0xefbd0a10
   35335                                               if (((instr & 0x380000) == 0x0) ||
   35336                                                   ((instr & 0x3f0000) ==
   35337                                                    0x80000) ||
   35338                                                   ((instr & 0x3f0000) ==
   35339                                                    0x100000) ||
   35340                                                   ((instr & 0x3f0000) ==
   35341                                                    0x200000)) {
   35342                                                 UnallocatedT32(instr);
   35343                                                 return;
   35344                                               }
   35345                                               DataType dt =
   35346                                                   Dt_imm6_4_Decode((instr >>
   35347                                                                     19) &
   35348                                                                        0x7,
   35349                                                                    (instr >>
   35350                                                                     28) &
   35351                                                                        0x1);
   35352                                               if (dt.Is(
   35353                                                       kDataTypeValueInvalid)) {
   35354                                                 UnallocatedT32(instr);
   35355                                                 return;
   35356                                               }
   35357                                               if (((instr >> 12) & 1) != 0) {
   35358                                                 UnallocatedT32(instr);
   35359                                                 return;
   35360                                               }
   35361                                               unsigned rd =
   35362                                                   ExtractQRegister(instr,
   35363                                                                    22,
   35364                                                                    12);
   35365                                               unsigned rm =
   35366                                                   ExtractDRegister(instr, 5, 0);
   35367                                               uint32_t imm6 =
   35368                                                   (instr >> 16) & 0x3f;
   35369                                               uint32_t imm =
   35370                                                   imm6 - dt.GetSize();
   35371                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   35372                                               vshll(CurrentCond(),
   35373                                                     dt,
   35374                                                     QRegister(rd),
   35375                                                     DRegister(rm),
   35376                                                     imm);
   35377                                               break;
   35378                                             }
   35379                                             case 0x003e0000: {
   35380                                               // 0xefbe0a10
   35381                                               if (((instr & 0x380000) == 0x0) ||
   35382                                                   ((instr & 0x3f0000) ==
   35383                                                    0x80000) ||
   35384                                                   ((instr & 0x3f0000) ==
   35385                                                    0x100000) ||
   35386                                                   ((instr & 0x3f0000) ==
   35387                                                    0x200000)) {
   35388                                                 UnallocatedT32(instr);
   35389                                                 return;
   35390                                               }
   35391                                               DataType dt =
   35392                                                   Dt_imm6_4_Decode((instr >>
   35393                                                                     19) &
   35394                                                                        0x7,
   35395                                                                    (instr >>
   35396                                                                     28) &
   35397                                                                        0x1);
   35398                                               if (dt.Is(
   35399                                                       kDataTypeValueInvalid)) {
   35400                                                 UnallocatedT32(instr);
   35401                                                 return;
   35402                                               }
   35403                                               if (((instr >> 12) & 1) != 0) {
   35404                                                 UnallocatedT32(instr);
   35405                                                 return;
   35406                                               }
   35407                                               unsigned rd =
   35408                                                   ExtractQRegister(instr,
   35409                                                                    22,
   35410                                                                    12);
   35411                                               unsigned rm =
   35412                                                   ExtractDRegister(instr, 5, 0);
   35413                                               uint32_t imm6 =
   35414                                                   (instr >> 16) & 0x3f;
   35415                                               uint32_t imm =
   35416                                                   imm6 - dt.GetSize();
   35417                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   35418                                               vshll(CurrentCond(),
   35419                                                     dt,
   35420                                                     QRegister(rd),
   35421                                                     DRegister(rm),
   35422                                                     imm);
   35423                                               break;
   35424                                             }
   35425                                             case 0x003f0000: {
   35426                                               // 0xefbf0a10
   35427                                               if (((instr & 0x380000) == 0x0) ||
   35428                                                   ((instr & 0x3f0000) ==
   35429                                                    0x80000) ||
   35430                                                   ((instr & 0x3f0000) ==
   35431                                                    0x100000) ||
   35432                                                   ((instr & 0x3f0000) ==
   35433                                                    0x200000)) {
   35434                                                 UnallocatedT32(instr);
   35435                                                 return;
   35436                                               }
   35437                                               DataType dt =
   35438                                                   Dt_imm6_4_Decode((instr >>
   35439                                                                     19) &
   35440                                                                        0x7,
   35441                                                                    (instr >>
   35442                                                                     28) &
   35443                                                                        0x1);
   35444                                               if (dt.Is(
   35445                                                       kDataTypeValueInvalid)) {
   35446                                                 UnallocatedT32(instr);
   35447                                                 return;
   35448                                               }
   35449                                               if (((instr >> 12) & 1) != 0) {
   35450                                                 UnallocatedT32(instr);
   35451                                                 return;
   35452                                               }
   35453                                               unsigned rd =
   35454                                                   ExtractQRegister(instr,
   35455                                                                    22,
   35456                                                                    12);
   35457                                               unsigned rm =
   35458                                                   ExtractDRegister(instr, 5, 0);
   35459                                               uint32_t imm6 =
   35460                                                   (instr >> 16) & 0x3f;
   35461                                               uint32_t imm =
   35462                                                   imm6 - dt.GetSize();
   35463                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   35464                                               vshll(CurrentCond(),
   35465                                                     dt,
   35466                                                     QRegister(rd),
   35467                                                     DRegister(rm),
   35468                                                     imm);
   35469                                               break;
   35470                                             }
   35471                                             default:
   35472                                               UnallocatedT32(instr);
   35473                                               break;
   35474                                           }
   35475                                           break;
   35476                                         }
   35477                                         default: {
   35478                                           if (((instr & 0x380000) == 0x0) ||
   35479                                               ((instr & 0x3f0000) == 0x80000) ||
   35480                                               ((instr & 0x3f0000) ==
   35481                                                0x100000) ||
   35482                                               ((instr & 0x3f0000) ==
   35483                                                0x200000)) {
   35484                                             UnallocatedT32(instr);
   35485                                             return;
   35486                                           }
   35487                                           DataType dt =
   35488                                               Dt_imm6_4_Decode((instr >> 19) &
   35489                                                                    0x7,
   35490                                                                (instr >> 28) &
   35491                                                                    0x1);
   35492                                           if (dt.Is(kDataTypeValueInvalid)) {
   35493                                             UnallocatedT32(instr);
   35494                                             return;
   35495                                           }
   35496                                           if (((instr >> 12) & 1) != 0) {
   35497                                             UnallocatedT32(instr);
   35498                                             return;
   35499                                           }
   35500                                           unsigned rd =
   35501                                               ExtractQRegister(instr, 22, 12);
   35502                                           unsigned rm =
   35503                                               ExtractDRegister(instr, 5, 0);
   35504                                           uint32_t imm6 = (instr >> 16) & 0x3f;
   35505                                           uint32_t imm = imm6 - dt.GetSize();
   35506                                           // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   35507                                           vshll(CurrentCond(),
   35508                                                 dt,
   35509                                                 QRegister(rd),
   35510                                                 DRegister(rm),
   35511                                                 imm);
   35512                                           break;
   35513                                         }
   35514                                       }
   35515                                       break;
   35516                                     }
   35517                                     default:
   35518                                       UnallocatedT32(instr);
   35519                                       break;
   35520                                   }
   35521                                   break;
   35522                                 }
   35523                               }
   35524                               break;
   35525                             }
   35526                             default:
   35527                               UnallocatedT32(instr);
   35528                               break;
   35529                           }
   35530                           break;
   35531                         }
   35532                         case 0x00000c00: {
   35533                           // 0xef800c10
   35534                           switch (instr & 0x00000080) {
   35535                             case 0x00000000: {
   35536                               // 0xef800c10
   35537                               switch (instr & 0x00200000) {
   35538                                 case 0x00000000: {
   35539                                   // 0xef800c10
   35540                                   switch (instr & 0x00180000) {
   35541                                     case 0x00000000: {
   35542                                       // 0xef800c10
   35543                                       switch (instr & 0x00000300) {
   35544                                         case 0x00000200: {
   35545                                           // 0xef800e10
   35546                                           if (((instr & 0x920) == 0x100) ||
   35547                                               ((instr & 0x520) == 0x100) ||
   35548                                               ((instr & 0x820) == 0x20) ||
   35549                                               ((instr & 0x420) == 0x20) ||
   35550                                               ((instr & 0x220) == 0x20) ||
   35551                                               ((instr & 0x120) == 0x120)) {
   35552                                             UnallocatedT32(instr);
   35553                                             return;
   35554                                           }
   35555                                           unsigned cmode =
   35556                                               ((instr >> 8) & 0xf) |
   35557                                               ((instr >> 1) & 0x10);
   35558                                           DataType dt =
   35559                                               ImmediateVmov::DecodeDt(cmode);
   35560                                           if (dt.Is(kDataTypeValueInvalid)) {
   35561                                             UnallocatedT32(instr);
   35562                                             return;
   35563                                           }
   35564                                           unsigned rd =
   35565                                               ExtractDRegister(instr, 22, 12);
   35566                                           DOperand imm =
   35567                                               ImmediateVmov::DecodeImmediate(
   35568                                                   cmode,
   35569                                                   (instr & 0xf) |
   35570                                                       ((instr >> 12) & 0x70) |
   35571                                                       ((instr >> 21) & 0x80));
   35572                                           // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
   35573                                           vmov(CurrentCond(),
   35574                                                dt,
   35575                                                DRegister(rd),
   35576                                                imm);
   35577                                           break;
   35578                                         }
   35579                                         case 0x00000300: {
   35580                                           // 0xef800f10
   35581                                           if (((instr & 0x920) == 0x100) ||
   35582                                               ((instr & 0x520) == 0x100) ||
   35583                                               ((instr & 0x820) == 0x20) ||
   35584                                               ((instr & 0x420) == 0x20) ||
   35585                                               ((instr & 0x220) == 0x20) ||
   35586                                               ((instr & 0x120) == 0x120)) {
   35587                                             UnallocatedT32(instr);
   35588                                             return;
   35589                                           }
   35590                                           unsigned cmode =
   35591                                               ((instr >> 8) & 0xf) |
   35592                                               ((instr >> 1) & 0x10);
   35593                                           DataType dt =
   35594                                               ImmediateVmov::DecodeDt(cmode);
   35595                                           if (dt.Is(kDataTypeValueInvalid)) {
   35596                                             UnallocatedT32(instr);
   35597                                             return;
   35598                                           }
   35599                                           unsigned rd =
   35600                                               ExtractDRegister(instr, 22, 12);
   35601                                           DOperand imm =
   35602                                               ImmediateVmov::DecodeImmediate(
   35603                                                   cmode,
   35604                                                   (instr & 0xf) |
   35605                                                       ((instr >> 12) & 0x70) |
   35606                                                       ((instr >> 21) & 0x80));
   35607                                           // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
   35608                                           vmov(CurrentCond(),
   35609                                                dt,
   35610                                                DRegister(rd),
   35611                                                imm);
   35612                                           break;
   35613                                         }
   35614                                         default: {
   35615                                           switch (instr & 0x00000020) {
   35616                                             case 0x00000020: {
   35617                                               // 0xef800c30
   35618                                               switch (instr & 0x00000f20) {
   35619                                                 case 0x00000000: {
   35620                                                   // 0xef800c10
   35621                                                   if (((instr & 0x920) ==
   35622                                                        0x100) ||
   35623                                                       ((instr & 0x520) ==
   35624                                                        0x100) ||
   35625                                                       ((instr & 0x820) ==
   35626                                                        0x20) ||
   35627                                                       ((instr & 0x420) ==
   35628                                                        0x20) ||
   35629                                                       ((instr & 0x220) ==
   35630                                                        0x20) ||
   35631                                                       ((instr & 0x120) ==
   35632                                                        0x120)) {
   35633                                                     UnallocatedT32(instr);
   35634                                                     return;
   35635                                                   }
   35636                                                   unsigned cmode =
   35637                                                       ((instr >> 8) & 0xf) |
   35638                                                       ((instr >> 1) & 0x10);
   35639                                                   DataType dt =
   35640                                                       ImmediateVmov::DecodeDt(
   35641                                                           cmode);
   35642                                                   if (dt.Is(
   35643                                                           kDataTypeValueInvalid)) {
   35644                                                     UnallocatedT32(instr);
   35645                                                     return;
   35646                                                   }
   35647                                                   unsigned rd =
   35648                                                       ExtractDRegister(instr,
   35649                                                                        22,
   35650                                                                        12);
   35651                                                   DOperand imm = ImmediateVmov::
   35652                                                       DecodeImmediate(
   35653                                                           cmode,
   35654                                                           (instr & 0xf) |
   35655                                                               ((instr >> 12) &
   35656                                                                0x70) |
   35657                                                               ((instr >> 21) &
   35658                                                                0x80));
   35659                                                   // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
   35660                                                   vmov(CurrentCond(),
   35661                                                        dt,
   35662                                                        DRegister(rd),
   35663                                                        imm);
   35664                                                   break;
   35665                                                 }
   35666                                                 case 0x00000020: {
   35667                                                   // 0xef800c30
   35668                                                   if (((instr & 0xd00) ==
   35669                                                        0x100) ||
   35670                                                       ((instr & 0xd00) ==
   35671                                                        0x500) ||
   35672                                                       ((instr & 0xd00) ==
   35673                                                        0x900) ||
   35674                                                       ((instr & 0xe00) ==
   35675                                                        0xe00)) {
   35676                                                     UnallocatedT32(instr);
   35677                                                     return;
   35678                                                   }
   35679                                                   unsigned cmode =
   35680                                                       (instr >> 8) & 0xf;
   35681                                                   DataType dt =
   35682                                                       ImmediateVmvn::DecodeDt(
   35683                                                           cmode);
   35684                                                   if (dt.Is(
   35685                                                           kDataTypeValueInvalid)) {
   35686                                                     UnallocatedT32(instr);
   35687                                                     return;
   35688                                                   }
   35689                                                   unsigned rd =
   35690                                                       ExtractDRegister(instr,
   35691                                                                        22,
   35692                                                                        12);
   35693                                                   DOperand imm = ImmediateVmvn::
   35694                                                       DecodeImmediate(
   35695                                                           cmode,
   35696                                                           (instr & 0xf) |
   35697                                                               ((instr >> 12) &
   35698                                                                0x70) |
   35699                                                               ((instr >> 21) &
   35700                                                                0x80));
   35701                                                   // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
   35702                                                   vmvn(CurrentCond(),
   35703                                                        dt,
   35704                                                        DRegister(rd),
   35705                                                        imm);
   35706                                                   break;
   35707                                                 }
   35708                                                 case 0x00000200: {
   35709                                                   // 0xef800e10
   35710                                                   if (((instr & 0x920) ==
   35711                                                        0x100) ||
   35712                                                       ((instr & 0x520) ==
   35713                                                        0x100) ||
   35714                                                       ((instr & 0x820) ==
   35715                                                        0x20) ||
   35716                                                       ((instr & 0x420) ==
   35717                                                        0x20) ||
   35718                                                       ((instr & 0x220) ==
   35719                                                        0x20) ||
   35720                                                       ((instr & 0x120) ==
   35721                                                        0x120)) {
   35722                                                     UnallocatedT32(instr);
   35723                                                     return;
   35724                                                   }
   35725                                                   unsigned cmode =
   35726                                                       ((instr >> 8) & 0xf) |
   35727                                                       ((instr >> 1) & 0x10);
   35728                                                   DataType dt =
   35729                                                       ImmediateVmov::DecodeDt(
   35730                                                           cmode);
   35731                                                   if (dt.Is(
   35732                                                           kDataTypeValueInvalid)) {
   35733                                                     UnallocatedT32(instr);
   35734                                                     return;
   35735                                                   }
   35736                                                   unsigned rd =
   35737                                                       ExtractDRegister(instr,
   35738                                                                        22,
   35739                                                                        12);
   35740                                                   DOperand imm = ImmediateVmov::
   35741                                                       DecodeImmediate(
   35742                                                           cmode,
   35743                                                           (instr & 0xf) |
   35744                                                               ((instr >> 12) &
   35745                                                                0x70) |
   35746                                                               ((instr >> 21) &
   35747                                                                0x80));
   35748                                                   // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
   35749                                                   vmov(CurrentCond(),
   35750                                                        dt,
   35751                                                        DRegister(rd),
   35752                                                        imm);
   35753                                                   break;
   35754                                                 }
   35755                                                 case 0x00000220: {
   35756                                                   // 0xef800e30
   35757                                                   if (((instr & 0xd00) ==
   35758                                                        0x100) ||
   35759                                                       ((instr & 0xd00) ==
   35760                                                        0x500) ||
   35761                                                       ((instr & 0xd00) ==
   35762                                                        0x900) ||
   35763                                                       ((instr & 0xe00) ==
   35764                                                        0xe00)) {
   35765                                                     UnallocatedT32(instr);
   35766                                                     return;
   35767                                                   }
   35768                                                   unsigned cmode =
   35769                                                       (instr >> 8) & 0xf;
   35770                                                   DataType dt =
   35771                                                       ImmediateVmvn::DecodeDt(
   35772                                                           cmode);
   35773                                                   if (dt.Is(
   35774                                                           kDataTypeValueInvalid)) {
   35775                                                     UnallocatedT32(instr);
   35776                                                     return;
   35777                                                   }
   35778                                                   unsigned rd =
   35779                                                       ExtractDRegister(instr,
   35780                                                                        22,
   35781                                                                        12);
   35782                                                   DOperand imm = ImmediateVmvn::
   35783                                                       DecodeImmediate(
   35784                                                           cmode,
   35785                                                           (instr & 0xf) |
   35786                                                               ((instr >> 12) &
   35787                                                                0x70) |
   35788                                                               ((instr >> 21) &
   35789                                                                0x80));
   35790                                                   // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
   35791                                                   vmvn(CurrentCond(),
   35792                                                        dt,
   35793                                                        DRegister(rd),
   35794                                                        imm);
   35795                                                   break;
   35796                                                 }
   35797                                                 case 0x00000400: {
   35798                                                   // 0xef800c10
   35799                                                   if (((instr & 0x920) ==
   35800                                                        0x100) ||
   35801                                                       ((instr & 0x520) ==
   35802                                                        0x100) ||
   35803                                                       ((instr & 0x820) ==
   35804                                                        0x20) ||
   35805                                                       ((instr & 0x420) ==
   35806                                                        0x20) ||
   35807                                                       ((instr & 0x220) ==
   35808                                                        0x20) ||
   35809                                                       ((instr & 0x120) ==
   35810                                                        0x120)) {
   35811                                                     UnallocatedT32(instr);
   35812                                                     return;
   35813                                                   }
   35814                                                   unsigned cmode =
   35815                                                       ((instr >> 8) & 0xf) |
   35816                                                       ((instr >> 1) & 0x10);
   35817                                                   DataType dt =
   35818                                                       ImmediateVmov::DecodeDt(
   35819                                                           cmode);
   35820                                                   if (dt.Is(
   35821                                                           kDataTypeValueInvalid)) {
   35822                                                     UnallocatedT32(instr);
   35823                                                     return;
   35824                                                   }
   35825                                                   unsigned rd =
   35826                                                       ExtractDRegister(instr,
   35827                                                                        22,
   35828                                                                        12);
   35829                                                   DOperand imm = ImmediateVmov::
   35830                                                       DecodeImmediate(
   35831                                                           cmode,
   35832                                                           (instr & 0xf) |
   35833                                                               ((instr >> 12) &
   35834                                                                0x70) |
   35835                                                               ((instr >> 21) &
   35836                                                                0x80));
   35837                                                   // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
   35838                                                   vmov(CurrentCond(),
   35839                                                        dt,
   35840                                                        DRegister(rd),
   35841                                                        imm);
   35842                                                   break;
   35843                                                 }
   35844                                                 case 0x00000420: {
   35845                                                   // 0xef800c30
   35846                                                   if (((instr & 0xd00) ==
   35847                                                        0x100) ||
   35848                                                       ((instr & 0xd00) ==
   35849                                                        0x500) ||
   35850                                                       ((instr & 0xd00) ==
   35851                                                        0x900) ||
   35852                                                       ((instr & 0xe00) ==
   35853                                                        0xe00)) {
   35854                                                     UnallocatedT32(instr);
   35855                                                     return;
   35856                                                   }
   35857                                                   unsigned cmode =
   35858                                                       (instr >> 8) & 0xf;
   35859                                                   DataType dt =
   35860                                                       ImmediateVmvn::DecodeDt(
   35861                                                           cmode);
   35862                                                   if (dt.Is(
   35863                                                           kDataTypeValueInvalid)) {
   35864                                                     UnallocatedT32(instr);
   35865                                                     return;
   35866                                                   }
   35867                                                   unsigned rd =
   35868                                                       ExtractDRegister(instr,
   35869                                                                        22,
   35870                                                                        12);
   35871                                                   DOperand imm = ImmediateVmvn::
   35872                                                       DecodeImmediate(
   35873                                                           cmode,
   35874                                                           (instr & 0xf) |
   35875                                                               ((instr >> 12) &
   35876                                                                0x70) |
   35877                                                               ((instr >> 21) &
   35878                                                                0x80));
   35879                                                   // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
   35880                                                   vmvn(CurrentCond(),
   35881                                                        dt,
   35882                                                        DRegister(rd),
   35883                                                        imm);
   35884                                                   break;
   35885                                                 }
   35886                                                 case 0x00000600: {
   35887                                                   // 0xef800e10
   35888                                                   if (((instr & 0x920) ==
   35889                                                        0x100) ||
   35890                                                       ((instr & 0x520) ==
   35891                                                        0x100) ||
   35892                                                       ((instr & 0x820) ==
   35893                                                        0x20) ||
   35894                                                       ((instr & 0x420) ==
   35895                                                        0x20) ||
   35896                                                       ((instr & 0x220) ==
   35897                                                        0x20) ||
   35898                                                       ((instr & 0x120) ==
   35899                                                        0x120)) {
   35900                                                     UnallocatedT32(instr);
   35901                                                     return;
   35902                                                   }
   35903                                                   unsigned cmode =
   35904                                                       ((instr >> 8) & 0xf) |
   35905                                                       ((instr >> 1) & 0x10);
   35906                                                   DataType dt =
   35907                                                       ImmediateVmov::DecodeDt(
   35908                                                           cmode);
   35909                                                   if (dt.Is(
   35910                                                           kDataTypeValueInvalid)) {
   35911                                                     UnallocatedT32(instr);
   35912                                                     return;
   35913                                                   }
   35914                                                   unsigned rd =
   35915                                                       ExtractDRegister(instr,
   35916                                                                        22,
   35917                                                                        12);
   35918                                                   DOperand imm = ImmediateVmov::
   35919                                                       DecodeImmediate(
   35920                                                           cmode,
   35921                                                           (instr & 0xf) |
   35922                                                               ((instr >> 12) &
   35923                                                                0x70) |
   35924                                                               ((instr >> 21) &
   35925                                                                0x80));
   35926                                                   // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
   35927                                                   vmov(CurrentCond(),
   35928                                                        dt,
   35929                                                        DRegister(rd),
   35930                                                        imm);
   35931                                                   break;
   35932                                                 }
   35933                                                 case 0x00000620: {
   35934                                                   // 0xef800e30
   35935                                                   if (((instr & 0xd00) ==
   35936                                                        0x100) ||
   35937                                                       ((instr & 0xd00) ==
   35938                                                        0x500) ||
   35939                                                       ((instr & 0xd00) ==
   35940                                                        0x900) ||
   35941                                                       ((instr & 0xe00) ==
   35942                                                        0xe00)) {
   35943                                                     UnallocatedT32(instr);
   35944                                                     return;
   35945                                                   }
   35946                                                   unsigned cmode =
   35947                                                       (instr >> 8) & 0xf;
   35948                                                   DataType dt =
   35949                                                       ImmediateVmvn::DecodeDt(
   35950                                                           cmode);
   35951                                                   if (dt.Is(
   35952                                                           kDataTypeValueInvalid)) {
   35953                                                     UnallocatedT32(instr);
   35954                                                     return;
   35955                                                   }
   35956                                                   unsigned rd =
   35957                                                       ExtractDRegister(instr,
   35958                                                                        22,
   35959                                                                        12);
   35960                                                   DOperand imm = ImmediateVmvn::
   35961                                                       DecodeImmediate(
   35962                                                           cmode,
   35963                                                           (instr & 0xf) |
   35964                                                               ((instr >> 12) &
   35965                                                                0x70) |
   35966                                                               ((instr >> 21) &
   35967                                                                0x80));
   35968                                                   // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
   35969                                                   vmvn(CurrentCond(),
   35970                                                        dt,
   35971                                                        DRegister(rd),
   35972                                                        imm);
   35973                                                   break;
   35974                                                 }
   35975                                                 case 0x00000800: {
   35976                                                   // 0xef800c10
   35977                                                   if (((instr & 0x920) ==
   35978                                                        0x100) ||
   35979                                                       ((instr & 0x520) ==
   35980                                                        0x100) ||
   35981                                                       ((instr & 0x820) ==
   35982                                                        0x20) ||
   35983                                                       ((instr & 0x420) ==
   35984                                                        0x20) ||
   35985                                                       ((instr & 0x220) ==
   35986                                                        0x20) ||
   35987                                                       ((instr & 0x120) ==
   35988                                                        0x120)) {
   35989                                                     UnallocatedT32(instr);
   35990                                                     return;
   35991                                                   }
   35992                                                   unsigned cmode =
   35993                                                       ((instr >> 8) & 0xf) |
   35994                                                       ((instr >> 1) & 0x10);
   35995                                                   DataType dt =
   35996                                                       ImmediateVmov::DecodeDt(
   35997                                                           cmode);
   35998                                                   if (dt.Is(
   35999                                                           kDataTypeValueInvalid)) {
   36000                                                     UnallocatedT32(instr);
   36001                                                     return;
   36002                                                   }
   36003                                                   unsigned rd =
   36004                                                       ExtractDRegister(instr,
   36005                                                                        22,
   36006                                                                        12);
   36007                                                   DOperand imm = ImmediateVmov::
   36008                                                       DecodeImmediate(
   36009                                                           cmode,
   36010                                                           (instr & 0xf) |
   36011                                                               ((instr >> 12) &
   36012                                                                0x70) |
   36013                                                               ((instr >> 21) &
   36014                                                                0x80));
   36015                                                   // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
   36016                                                   vmov(CurrentCond(),
   36017                                                        dt,
   36018                                                        DRegister(rd),
   36019                                                        imm);
   36020                                                   break;
   36021                                                 }
   36022                                                 case 0x00000820: {
   36023                                                   // 0xef800c30
   36024                                                   if (((instr & 0xd00) ==
   36025                                                        0x100) ||
   36026                                                       ((instr & 0xd00) ==
   36027                                                        0x500) ||
   36028                                                       ((instr & 0xd00) ==
   36029                                                        0x900) ||
   36030                                                       ((instr & 0xe00) ==
   36031                                                        0xe00)) {
   36032                                                     UnallocatedT32(instr);
   36033                                                     return;
   36034                                                   }
   36035                                                   unsigned cmode =
   36036                                                       (instr >> 8) & 0xf;
   36037                                                   DataType dt =
   36038                                                       ImmediateVmvn::DecodeDt(
   36039                                                           cmode);
   36040                                                   if (dt.Is(
   36041                                                           kDataTypeValueInvalid)) {
   36042                                                     UnallocatedT32(instr);
   36043                                                     return;
   36044                                                   }
   36045                                                   unsigned rd =
   36046                                                       ExtractDRegister(instr,
   36047                                                                        22,
   36048                                                                        12);
   36049                                                   DOperand imm = ImmediateVmvn::
   36050                                                       DecodeImmediate(
   36051                                                           cmode,
   36052                                                           (instr & 0xf) |
   36053                                                               ((instr >> 12) &
   36054                                                                0x70) |
   36055                                                               ((instr >> 21) &
   36056                                                                0x80));
   36057                                                   // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
   36058                                                   vmvn(CurrentCond(),
   36059                                                        dt,
   36060                                                        DRegister(rd),
   36061                                                        imm);
   36062                                                   break;
   36063                                                 }
   36064                                                 case 0x00000a00: {
   36065                                                   // 0xef800e10
   36066                                                   if (((instr & 0x920) ==
   36067                                                        0x100) ||
   36068                                                       ((instr & 0x520) ==
   36069                                                        0x100) ||
   36070                                                       ((instr & 0x820) ==
   36071                                                        0x20) ||
   36072                                                       ((instr & 0x420) ==
   36073                                                        0x20) ||
   36074                                                       ((instr & 0x220) ==
   36075                                                        0x20) ||
   36076                                                       ((instr & 0x120) ==
   36077                                                        0x120)) {
   36078                                                     UnallocatedT32(instr);
   36079                                                     return;
   36080                                                   }
   36081                                                   unsigned cmode =
   36082                                                       ((instr >> 8) & 0xf) |
   36083                                                       ((instr >> 1) & 0x10);
   36084                                                   DataType dt =
   36085                                                       ImmediateVmov::DecodeDt(
   36086                                                           cmode);
   36087                                                   if (dt.Is(
   36088                                                           kDataTypeValueInvalid)) {
   36089                                                     UnallocatedT32(instr);
   36090                                                     return;
   36091                                                   }
   36092                                                   unsigned rd =
   36093                                                       ExtractDRegister(instr,
   36094                                                                        22,
   36095                                                                        12);
   36096                                                   DOperand imm = ImmediateVmov::
   36097                                                       DecodeImmediate(
   36098                                                           cmode,
   36099                                                           (instr & 0xf) |
   36100                                                               ((instr >> 12) &
   36101                                                                0x70) |
   36102                                                               ((instr >> 21) &
   36103                                                                0x80));
   36104                                                   // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
   36105                                                   vmov(CurrentCond(),
   36106                                                        dt,
   36107                                                        DRegister(rd),
   36108                                                        imm);
   36109                                                   break;
   36110                                                 }
   36111                                                 case 0x00000a20: {
   36112                                                   // 0xef800e30
   36113                                                   if (((instr & 0xd00) ==
   36114                                                        0x100) ||
   36115                                                       ((instr & 0xd00) ==
   36116                                                        0x500) ||
   36117                                                       ((instr & 0xd00) ==
   36118                                                        0x900) ||
   36119                                                       ((instr & 0xe00) ==
   36120                                                        0xe00)) {
   36121                                                     UnallocatedT32(instr);
   36122                                                     return;
   36123                                                   }
   36124                                                   unsigned cmode =
   36125                                                       (instr >> 8) & 0xf;
   36126                                                   DataType dt =
   36127                                                       ImmediateVmvn::DecodeDt(
   36128                                                           cmode);
   36129                                                   if (dt.Is(
   36130                                                           kDataTypeValueInvalid)) {
   36131                                                     UnallocatedT32(instr);
   36132                                                     return;
   36133                                                   }
   36134                                                   unsigned rd =
   36135                                                       ExtractDRegister(instr,
   36136                                                                        22,
   36137                                                                        12);
   36138                                                   DOperand imm = ImmediateVmvn::
   36139                                                       DecodeImmediate(
   36140                                                           cmode,
   36141                                                           (instr & 0xf) |
   36142                                                               ((instr >> 12) &
   36143                                                                0x70) |
   36144                                                               ((instr >> 21) &
   36145                                                                0x80));
   36146                                                   // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
   36147                                                   vmvn(CurrentCond(),
   36148                                                        dt,
   36149                                                        DRegister(rd),
   36150                                                        imm);
   36151                                                   break;
   36152                                                 }
   36153                                                 case 0x00000c00: {
   36154                                                   // 0xef800c10
   36155                                                   if (((instr & 0x920) ==
   36156                                                        0x100) ||
   36157                                                       ((instr & 0x520) ==
   36158                                                        0x100) ||
   36159                                                       ((instr & 0x820) ==
   36160                                                        0x20) ||
   36161                                                       ((instr & 0x420) ==
   36162                                                        0x20) ||
   36163                                                       ((instr & 0x220) ==
   36164                                                        0x20) ||
   36165                                                       ((instr & 0x120) ==
   36166                                                        0x120)) {
   36167                                                     UnallocatedT32(instr);
   36168                                                     return;
   36169                                                   }
   36170                                                   unsigned cmode =
   36171                                                       ((instr >> 8) & 0xf) |
   36172                                                       ((instr >> 1) & 0x10);
   36173                                                   DataType dt =
   36174                                                       ImmediateVmov::DecodeDt(
   36175                                                           cmode);
   36176                                                   if (dt.Is(
   36177                                                           kDataTypeValueInvalid)) {
   36178                                                     UnallocatedT32(instr);
   36179                                                     return;
   36180                                                   }
   36181                                                   unsigned rd =
   36182                                                       ExtractDRegister(instr,
   36183                                                                        22,
   36184                                                                        12);
   36185                                                   DOperand imm = ImmediateVmov::
   36186                                                       DecodeImmediate(
   36187                                                           cmode,
   36188                                                           (instr & 0xf) |
   36189                                                               ((instr >> 12) &
   36190                                                                0x70) |
   36191                                                               ((instr >> 21) &
   36192                                                                0x80));
   36193                                                   // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
   36194                                                   vmov(CurrentCond(),
   36195                                                        dt,
   36196                                                        DRegister(rd),
   36197                                                        imm);
   36198                                                   break;
   36199                                                 }
   36200                                                 case 0x00000c20: {
   36201                                                   // 0xef800c30
   36202                                                   if (((instr & 0xd00) ==
   36203                                                        0x100) ||
   36204                                                       ((instr & 0xd00) ==
   36205                                                        0x500) ||
   36206                                                       ((instr & 0xd00) ==
   36207                                                        0x900) ||
   36208                                                       ((instr & 0xe00) ==
   36209                                                        0xe00)) {
   36210                                                     UnallocatedT32(instr);
   36211                                                     return;
   36212                                                   }
   36213                                                   unsigned cmode =
   36214                                                       (instr >> 8) & 0xf;
   36215                                                   DataType dt =
   36216                                                       ImmediateVmvn::DecodeDt(
   36217                                                           cmode);
   36218                                                   if (dt.Is(
   36219                                                           kDataTypeValueInvalid)) {
   36220                                                     UnallocatedT32(instr);
   36221                                                     return;
   36222                                                   }
   36223                                                   unsigned rd =
   36224                                                       ExtractDRegister(instr,
   36225                                                                        22,
   36226                                                                        12);
   36227                                                   DOperand imm = ImmediateVmvn::
   36228                                                       DecodeImmediate(
   36229                                                           cmode,
   36230                                                           (instr & 0xf) |
   36231                                                               ((instr >> 12) &
   36232                                                                0x70) |
   36233                                                               ((instr >> 21) &
   36234                                                                0x80));
   36235                                                   // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
   36236                                                   vmvn(CurrentCond(),
   36237                                                        dt,
   36238                                                        DRegister(rd),
   36239                                                        imm);
   36240                                                   break;
   36241                                                 }
   36242                                                 case 0x00000d00: {
   36243                                                   // 0xef800d10
   36244                                                   if (((instr & 0x920) ==
   36245                                                        0x100) ||
   36246                                                       ((instr & 0x520) ==
   36247                                                        0x100) ||
   36248                                                       ((instr & 0x820) ==
   36249                                                        0x20) ||
   36250                                                       ((instr & 0x420) ==
   36251                                                        0x20) ||
   36252                                                       ((instr & 0x220) ==
   36253                                                        0x20) ||
   36254                                                       ((instr & 0x120) ==
   36255                                                        0x120)) {
   36256                                                     UnallocatedT32(instr);
   36257                                                     return;
   36258                                                   }
   36259                                                   unsigned cmode =
   36260                                                       ((instr >> 8) & 0xf) |
   36261                                                       ((instr >> 1) & 0x10);
   36262                                                   DataType dt =
   36263                                                       ImmediateVmov::DecodeDt(
   36264                                                           cmode);
   36265                                                   if (dt.Is(
   36266                                                           kDataTypeValueInvalid)) {
   36267                                                     UnallocatedT32(instr);
   36268                                                     return;
   36269                                                   }
   36270                                                   unsigned rd =
   36271                                                       ExtractDRegister(instr,
   36272                                                                        22,
   36273                                                                        12);
   36274                                                   DOperand imm = ImmediateVmov::
   36275                                                       DecodeImmediate(
   36276                                                           cmode,
   36277                                                           (instr & 0xf) |
   36278                                                               ((instr >> 12) &
   36279                                                                0x70) |
   36280                                                               ((instr >> 21) &
   36281                                                                0x80));
   36282                                                   // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
   36283                                                   vmov(CurrentCond(),
   36284                                                        dt,
   36285                                                        DRegister(rd),
   36286                                                        imm);
   36287                                                   break;
   36288                                                 }
   36289                                                 case 0x00000d20: {
   36290                                                   // 0xef800d30
   36291                                                   if (((instr & 0xd00) ==
   36292                                                        0x100) ||
   36293                                                       ((instr & 0xd00) ==
   36294                                                        0x500) ||
   36295                                                       ((instr & 0xd00) ==
   36296                                                        0x900) ||
   36297                                                       ((instr & 0xe00) ==
   36298                                                        0xe00)) {
   36299                                                     UnallocatedT32(instr);
   36300                                                     return;
   36301                                                   }
   36302                                                   unsigned cmode =
   36303                                                       (instr >> 8) & 0xf;
   36304                                                   DataType dt =
   36305                                                       ImmediateVmvn::DecodeDt(
   36306                                                           cmode);
   36307                                                   if (dt.Is(
   36308                                                           kDataTypeValueInvalid)) {
   36309                                                     UnallocatedT32(instr);
   36310                                                     return;
   36311                                                   }
   36312                                                   unsigned rd =
   36313                                                       ExtractDRegister(instr,
   36314                                                                        22,
   36315                                                                        12);
   36316                                                   DOperand imm = ImmediateVmvn::
   36317                                                       DecodeImmediate(
   36318                                                           cmode,
   36319                                                           (instr & 0xf) |
   36320                                                               ((instr >> 12) &
   36321                                                                0x70) |
   36322                                                               ((instr >> 21) &
   36323                                                                0x80));
   36324                                                   // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
   36325                                                   vmvn(CurrentCond(),
   36326                                                        dt,
   36327                                                        DRegister(rd),
   36328                                                        imm);
   36329                                                   break;
   36330                                                 }
   36331                                                 case 0x00000e00: {
   36332                                                   // 0xef800e10
   36333                                                   if (((instr & 0x920) ==
   36334                                                        0x100) ||
   36335                                                       ((instr & 0x520) ==
   36336                                                        0x100) ||
   36337                                                       ((instr & 0x820) ==
   36338                                                        0x20) ||
   36339                                                       ((instr & 0x420) ==
   36340                                                        0x20) ||
   36341                                                       ((instr & 0x220) ==
   36342                                                        0x20) ||
   36343                                                       ((instr & 0x120) ==
   36344                                                        0x120)) {
   36345                                                     UnallocatedT32(instr);
   36346                                                     return;
   36347                                                   }
   36348                                                   unsigned cmode =
   36349                                                       ((instr >> 8) & 0xf) |
   36350                                                       ((instr >> 1) & 0x10);
   36351                                                   DataType dt =
   36352                                                       ImmediateVmov::DecodeDt(
   36353                                                           cmode);
   36354                                                   if (dt.Is(
   36355                                                           kDataTypeValueInvalid)) {
   36356                                                     UnallocatedT32(instr);
   36357                                                     return;
   36358                                                   }
   36359                                                   unsigned rd =
   36360                                                       ExtractDRegister(instr,
   36361                                                                        22,
   36362                                                                        12);
   36363                                                   DOperand imm = ImmediateVmov::
   36364                                                       DecodeImmediate(
   36365                                                           cmode,
   36366                                                           (instr & 0xf) |
   36367                                                               ((instr >> 12) &
   36368                                                                0x70) |
   36369                                                               ((instr >> 21) &
   36370                                                                0x80));
   36371                                                   // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
   36372                                                   vmov(CurrentCond(),
   36373                                                        dt,
   36374                                                        DRegister(rd),
   36375                                                        imm);
   36376                                                   break;
   36377                                                 }
   36378                                                 case 0x00000e20: {
   36379                                                   // 0xef800e30
   36380                                                   if (((instr & 0x920) ==
   36381                                                        0x100) ||
   36382                                                       ((instr & 0x520) ==
   36383                                                        0x100) ||
   36384                                                       ((instr & 0x820) ==
   36385                                                        0x20) ||
   36386                                                       ((instr & 0x420) ==
   36387                                                        0x20) ||
   36388                                                       ((instr & 0x220) ==
   36389                                                        0x20) ||
   36390                                                       ((instr & 0x120) ==
   36391                                                        0x120)) {
   36392                                                     UnallocatedT32(instr);
   36393                                                     return;
   36394                                                   }
   36395                                                   unsigned cmode =
   36396                                                       ((instr >> 8) & 0xf) |
   36397                                                       ((instr >> 1) & 0x10);
   36398                                                   DataType dt =
   36399                                                       ImmediateVmov::DecodeDt(
   36400                                                           cmode);
   36401                                                   if (dt.Is(
   36402                                                           kDataTypeValueInvalid)) {
   36403                                                     UnallocatedT32(instr);
   36404                                                     return;
   36405                                                   }
   36406                                                   unsigned rd =
   36407                                                       ExtractDRegister(instr,
   36408                                                                        22,
   36409                                                                        12);
   36410                                                   DOperand imm = ImmediateVmov::
   36411                                                       DecodeImmediate(
   36412                                                           cmode,
   36413                                                           (instr & 0xf) |
   36414                                                               ((instr >> 12) &
   36415                                                                0x70) |
   36416                                                               ((instr >> 21) &
   36417                                                                0x80));
   36418                                                   // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
   36419                                                   vmov(CurrentCond(),
   36420                                                        dt,
   36421                                                        DRegister(rd),
   36422                                                        imm);
   36423                                                   break;
   36424                                                 }
   36425                                                 case 0x00000f00: {
   36426                                                   // 0xef800f10
   36427                                                   if (((instr & 0x920) ==
   36428                                                        0x100) ||
   36429                                                       ((instr & 0x520) ==
   36430                                                        0x100) ||
   36431                                                       ((instr & 0x820) ==
   36432                                                        0x20) ||
   36433                                                       ((instr & 0x420) ==
   36434                                                        0x20) ||
   36435                                                       ((instr & 0x220) ==
   36436                                                        0x20) ||
   36437                                                       ((instr & 0x120) ==
   36438                                                        0x120)) {
   36439                                                     UnallocatedT32(instr);
   36440                                                     return;
   36441                                                   }
   36442                                                   unsigned cmode =
   36443                                                       ((instr >> 8) & 0xf) |
   36444                                                       ((instr >> 1) & 0x10);
   36445                                                   DataType dt =
   36446                                                       ImmediateVmov::DecodeDt(
   36447                                                           cmode);
   36448                                                   if (dt.Is(
   36449                                                           kDataTypeValueInvalid)) {
   36450                                                     UnallocatedT32(instr);
   36451                                                     return;
   36452                                                   }
   36453                                                   unsigned rd =
   36454                                                       ExtractDRegister(instr,
   36455                                                                        22,
   36456                                                                        12);
   36457                                                   DOperand imm = ImmediateVmov::
   36458                                                       DecodeImmediate(
   36459                                                           cmode,
   36460                                                           (instr & 0xf) |
   36461                                                               ((instr >> 12) &
   36462                                                                0x70) |
   36463                                                               ((instr >> 21) &
   36464                                                                0x80));
   36465                                                   // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
   36466                                                   vmov(CurrentCond(),
   36467                                                        dt,
   36468                                                        DRegister(rd),
   36469                                                        imm);
   36470                                                   break;
   36471                                                 }
   36472                                                 default:
   36473                                                   UnallocatedT32(instr);
   36474                                                   break;
   36475                                               }
   36476                                               break;
   36477                                             }
   36478                                             default: {
   36479                                               if (((instr & 0x920) == 0x100) ||
   36480                                                   ((instr & 0x520) == 0x100) ||
   36481                                                   ((instr & 0x820) == 0x20) ||
   36482                                                   ((instr & 0x420) == 0x20) ||
   36483                                                   ((instr & 0x220) == 0x20) ||
   36484                                                   ((instr & 0x120) == 0x120)) {
   36485                                                 UnallocatedT32(instr);
   36486                                                 return;
   36487                                               }
   36488                                               unsigned cmode =
   36489                                                   ((instr >> 8) & 0xf) |
   36490                                                   ((instr >> 1) & 0x10);
   36491                                               DataType dt =
   36492                                                   ImmediateVmov::DecodeDt(
   36493                                                       cmode);
   36494                                               if (dt.Is(
   36495                                                       kDataTypeValueInvalid)) {
   36496                                                 UnallocatedT32(instr);
   36497                                                 return;
   36498                                               }
   36499                                               unsigned rd =
   36500                                                   ExtractDRegister(instr,
   36501                                                                    22,
   36502                                                                    12);
   36503                                               DOperand imm = ImmediateVmov::
   36504                                                   DecodeImmediate(cmode,
   36505                                                                   (instr &
   36506                                                                    0xf) |
   36507                                                                       ((instr >>
   36508                                                                         12) &
   36509                                                                        0x70) |
   36510                                                                       ((instr >>
   36511                                                                         21) &
   36512                                                                        0x80));
   36513                                               // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
   36514                                               vmov(CurrentCond(),
   36515                                                    dt,
   36516                                                    DRegister(rd),
   36517                                                    imm);
   36518                                               break;
   36519                                             }
   36520                                           }
   36521                                           break;
   36522                                         }
   36523                                       }
   36524                                       break;
   36525                                     }
   36526                                     default:
   36527                                       UnallocatedT32(instr);
   36528                                       break;
   36529                                   }
   36530                                   break;
   36531                                 }
   36532                                 default: {
   36533                                   if ((instr & 0x00000200) == 0x00000200) {
   36534                                     if (((instr & 0x200000) == 0x0)) {
   36535                                       UnallocatedT32(instr);
   36536                                       return;
   36537                                     }
   36538                                     DataType dt1 = Dt_op_U_1_Decode1(
   36539                                         ((instr >> 28) & 0x1) |
   36540                                         ((instr >> 7) & 0x2));
   36541                                     if (dt1.Is(kDataTypeValueInvalid)) {
   36542                                       UnallocatedT32(instr);
   36543                                       return;
   36544                                     }
   36545                                     DataType dt2 = Dt_op_U_1_Decode2(
   36546                                         ((instr >> 28) & 0x1) |
   36547                                         ((instr >> 7) & 0x2));
   36548                                     if (dt2.Is(kDataTypeValueInvalid)) {
   36549                                       UnallocatedT32(instr);
   36550                                       return;
   36551                                     }
   36552                                     unsigned rd =
   36553                                         ExtractDRegister(instr, 22, 12);
   36554                                     unsigned rm = ExtractDRegister(instr, 5, 0);
   36555                                     uint32_t fbits =
   36556                                         64 - ((instr >> 16) & 0x3f);
   36557                                     // VCVT{<c>}{<q>}.<dt>.<dt> <Dd>, <Dm>, #<fbits> ; T1 NOLINT(whitespace/line_length)
   36558                                     vcvt(CurrentCond(),
   36559                                          dt1,
   36560                                          dt2,
   36561                                          DRegister(rd),
   36562                                          DRegister(rm),
   36563                                          fbits);
   36564                                   } else {
   36565                                     UnallocatedT32(instr);
   36566                                   }
   36567                                   break;
   36568                                 }
   36569                               }
   36570                               break;
   36571                             }
   36572                             default:
   36573                               UnallocatedT32(instr);
   36574                               break;
   36575                           }
   36576                           break;
   36577                         }
   36578                       }
   36579                       break;
   36580                     }
   36581                     case 0x00800040: {
   36582                       // 0xef800050
   36583                       switch (instr & 0x00000c00) {
   36584                         case 0x00000000: {
   36585                           // 0xef800050
   36586                           switch (instr & 0x00380080) {
   36587                             case 0x00000000: {
   36588                               // 0xef800050
   36589                               switch (instr & 0x00000100) {
   36590                                 case 0x00000000: {
   36591                                   // 0xef800050
   36592                                   switch (instr & 0x00000200) {
   36593                                     default: {
   36594                                       switch (instr & 0x00000020) {
   36595                                         case 0x00000020: {
   36596                                           // 0xef800070
   36597                                           if (((instr & 0xd00) == 0x100) ||
   36598                                               ((instr & 0xd00) == 0x500) ||
   36599                                               ((instr & 0xd00) == 0x900) ||
   36600                                               ((instr & 0xe00) == 0xe00)) {
   36601                                             UnallocatedT32(instr);
   36602                                             return;
   36603                                           }
   36604                                           unsigned cmode = (instr >> 8) & 0xf;
   36605                                           DataType dt =
   36606                                               ImmediateVmvn::DecodeDt(cmode);
   36607                                           if (dt.Is(kDataTypeValueInvalid)) {
   36608                                             UnallocatedT32(instr);
   36609                                             return;
   36610                                           }
   36611                                           if (((instr >> 12) & 1) != 0) {
   36612                                             UnallocatedT32(instr);
   36613                                             return;
   36614                                           }
   36615                                           unsigned rd =
   36616                                               ExtractQRegister(instr, 22, 12);
   36617                                           QOperand imm =
   36618                                               ImmediateVmvn::DecodeImmediate(
   36619                                                   cmode,
   36620                                                   (instr & 0xf) |
   36621                                                       ((instr >> 12) & 0x70) |
   36622                                                       ((instr >> 21) & 0x80));
   36623                                           // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
   36624                                           vmvn(CurrentCond(),
   36625                                                dt,
   36626                                                QRegister(rd),
   36627                                                imm);
   36628                                           break;
   36629                                         }
   36630                                         default: {
   36631                                           if (((instr & 0x920) == 0x100) ||
   36632                                               ((instr & 0x520) == 0x100) ||
   36633                                               ((instr & 0x820) == 0x20) ||
   36634                                               ((instr & 0x420) == 0x20) ||
   36635                                               ((instr & 0x220) == 0x20) ||
   36636                                               ((instr & 0x120) == 0x120)) {
   36637                                             UnallocatedT32(instr);
   36638                                             return;
   36639                                           }
   36640                                           unsigned cmode =
   36641                                               ((instr >> 8) & 0xf) |
   36642                                               ((instr >> 1) & 0x10);
   36643                                           DataType dt =
   36644                                               ImmediateVmov::DecodeDt(cmode);
   36645                                           if (dt.Is(kDataTypeValueInvalid)) {
   36646                                             UnallocatedT32(instr);
   36647                                             return;
   36648                                           }
   36649                                           if (((instr >> 12) & 1) != 0) {
   36650                                             UnallocatedT32(instr);
   36651                                             return;
   36652                                           }
   36653                                           unsigned rd =
   36654                                               ExtractQRegister(instr, 22, 12);
   36655                                           QOperand imm =
   36656                                               ImmediateVmov::DecodeImmediate(
   36657                                                   cmode,
   36658                                                   (instr & 0xf) |
   36659                                                       ((instr >> 12) & 0x70) |
   36660                                                       ((instr >> 21) & 0x80));
   36661                                           // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
   36662                                           vmov(CurrentCond(),
   36663                                                dt,
   36664                                                QRegister(rd),
   36665                                                imm);
   36666                                           break;
   36667                                         }
   36668                                       }
   36669                                       break;
   36670                                     }
   36671                                   }
   36672                                   break;
   36673                                 }
   36674                                 case 0x00000100: {
   36675                                   // 0xef800150
   36676                                   switch (instr & 0x00000020) {
   36677                                     case 0x00000000: {
   36678                                       // 0xef800150
   36679                                       if (((instr & 0x100) == 0x0) ||
   36680                                           ((instr & 0xc00) == 0xc00)) {
   36681                                         UnallocatedT32(instr);
   36682                                         return;
   36683                                       }
   36684                                       unsigned cmode = (instr >> 8) & 0xf;
   36685                                       DataType dt =
   36686                                           ImmediateVorr::DecodeDt(cmode);
   36687                                       if (dt.Is(kDataTypeValueInvalid)) {
   36688                                         UnallocatedT32(instr);
   36689                                         return;
   36690                                       }
   36691                                       if (((instr >> 12) & 1) != 0) {
   36692                                         UnallocatedT32(instr);
   36693                                         return;
   36694                                       }
   36695                                       unsigned rd =
   36696                                           ExtractQRegister(instr, 22, 12);
   36697                                       QOperand imm =
   36698                                           ImmediateVorr::DecodeImmediate(
   36699                                               cmode,
   36700                                               (instr & 0xf) |
   36701                                                   ((instr >> 12) & 0x70) |
   36702                                                   ((instr >> 21) & 0x80));
   36703                                       // VORR{<c>}{<q>}.<dt> {<Qdn>}, <Qdn>, #<imm> ; T1 NOLINT(whitespace/line_length)
   36704                                       vorr(CurrentCond(),
   36705                                            dt,
   36706                                            QRegister(rd),
   36707                                            QRegister(rd),
   36708                                            imm);
   36709                                       break;
   36710                                     }
   36711                                     case 0x00000020: {
   36712                                       // 0xef800170
   36713                                       if (((instr & 0x100) == 0x0) ||
   36714                                           ((instr & 0xc00) == 0xc00)) {
   36715                                         UnallocatedT32(instr);
   36716                                         return;
   36717                                       }
   36718                                       unsigned cmode = (instr >> 8) & 0xf;
   36719                                       DataType dt =
   36720                                           ImmediateVbic::DecodeDt(cmode);
   36721                                       if (dt.Is(kDataTypeValueInvalid)) {
   36722                                         UnallocatedT32(instr);
   36723                                         return;
   36724                                       }
   36725                                       if (((instr >> 12) & 1) != 0) {
   36726                                         UnallocatedT32(instr);
   36727                                         return;
   36728                                       }
   36729                                       unsigned rd =
   36730                                           ExtractQRegister(instr, 22, 12);
   36731                                       QOperand imm =
   36732                                           ImmediateVbic::DecodeImmediate(
   36733                                               cmode,
   36734                                               (instr & 0xf) |
   36735                                                   ((instr >> 12) & 0x70) |
   36736                                                   ((instr >> 21) & 0x80));
   36737                                       // VBIC{<c>}{<q>}.<dt> {<Qdn>}, <Qdn>, #<imm> ; T1 NOLINT(whitespace/line_length)
   36738                                       vbic(CurrentCond(),
   36739                                            dt,
   36740                                            QRegister(rd),
   36741                                            QRegister(rd),
   36742                                            imm);
   36743                                       break;
   36744                                     }
   36745                                   }
   36746                                   break;
   36747                                 }
   36748                               }
   36749                               break;
   36750                             }
   36751                             default: {
   36752                               switch (instr & 0x00000300) {
   36753                                 case 0x00000000: {
   36754                                   // 0xef800050
   36755                                   if (((instr & 0x380080) == 0x0)) {
   36756                                     UnallocatedT32(instr);
   36757                                     return;
   36758                                   }
   36759                                   DataType dt =
   36760                                       Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
   36761                                                              ((instr >> 4) &
   36762                                                               0x8),
   36763                                                          (instr >> 28) & 0x1);
   36764                                   if (dt.Is(kDataTypeValueInvalid)) {
   36765                                     UnallocatedT32(instr);
   36766                                     return;
   36767                                   }
   36768                                   if (((instr >> 12) & 1) != 0) {
   36769                                     UnallocatedT32(instr);
   36770                                     return;
   36771                                   }
   36772                                   unsigned rd = ExtractQRegister(instr, 22, 12);
   36773                                   if ((instr & 1) != 0) {
   36774                                     UnallocatedT32(instr);
   36775                                     return;
   36776                                   }
   36777                                   unsigned rm = ExtractQRegister(instr, 5, 0);
   36778                                   uint32_t imm6 = (instr >> 16) & 0x3f;
   36779                                   uint32_t imm =
   36780                                       (dt.IsSize(64) ? 64
   36781                                                      : (dt.GetSize() * 2)) -
   36782                                       imm6;
   36783                                   // VSHR{<c>}{<q>}.<type><size> {<Qd>}, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   36784                                   vshr(CurrentCond(),
   36785                                        dt,
   36786                                        QRegister(rd),
   36787                                        QRegister(rm),
   36788                                        imm);
   36789                                   break;
   36790                                 }
   36791                                 case 0x00000100: {
   36792                                   // 0xef800150
   36793                                   if (((instr & 0x380080) == 0x0)) {
   36794                                     UnallocatedT32(instr);
   36795                                     return;
   36796                                   }
   36797                                   DataType dt =
   36798                                       Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
   36799                                                              ((instr >> 4) &
   36800                                                               0x8),
   36801                                                          (instr >> 28) & 0x1);
   36802                                   if (dt.Is(kDataTypeValueInvalid)) {
   36803                                     UnallocatedT32(instr);
   36804                                     return;
   36805                                   }
   36806                                   if (((instr >> 12) & 1) != 0) {
   36807                                     UnallocatedT32(instr);
   36808                                     return;
   36809                                   }
   36810                                   unsigned rd = ExtractQRegister(instr, 22, 12);
   36811                                   if ((instr & 1) != 0) {
   36812                                     UnallocatedT32(instr);
   36813                                     return;
   36814                                   }
   36815                                   unsigned rm = ExtractQRegister(instr, 5, 0);
   36816                                   uint32_t imm6 = (instr >> 16) & 0x3f;
   36817                                   uint32_t imm =
   36818                                       (dt.IsSize(64) ? 64
   36819                                                      : (dt.GetSize() * 2)) -
   36820                                       imm6;
   36821                                   // VSRA{<c>}{<q>}.<type><size> {<Qd>}, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   36822                                   vsra(CurrentCond(),
   36823                                        dt,
   36824                                        QRegister(rd),
   36825                                        QRegister(rm),
   36826                                        imm);
   36827                                   break;
   36828                                 }
   36829                                 case 0x00000200: {
   36830                                   // 0xef800250
   36831                                   if (((instr & 0x380080) == 0x0)) {
   36832                                     UnallocatedT32(instr);
   36833                                     return;
   36834                                   }
   36835                                   DataType dt =
   36836                                       Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
   36837                                                              ((instr >> 4) &
   36838                                                               0x8),
   36839                                                          (instr >> 28) & 0x1);
   36840                                   if (dt.Is(kDataTypeValueInvalid)) {
   36841                                     UnallocatedT32(instr);
   36842                                     return;
   36843                                   }
   36844                                   if (((instr >> 12) & 1) != 0) {
   36845                                     UnallocatedT32(instr);
   36846                                     return;
   36847                                   }
   36848                                   unsigned rd = ExtractQRegister(instr, 22, 12);
   36849                                   if ((instr & 1) != 0) {
   36850                                     UnallocatedT32(instr);
   36851                                     return;
   36852                                   }
   36853                                   unsigned rm = ExtractQRegister(instr, 5, 0);
   36854                                   uint32_t imm6 = (instr >> 16) & 0x3f;
   36855                                   uint32_t imm =
   36856                                       (dt.IsSize(64) ? 64
   36857                                                      : (dt.GetSize() * 2)) -
   36858                                       imm6;
   36859                                   // VRSHR{<c>}{<q>}.<type><size> {<Qd>}, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   36860                                   vrshr(CurrentCond(),
   36861                                         dt,
   36862                                         QRegister(rd),
   36863                                         QRegister(rm),
   36864                                         imm);
   36865                                   break;
   36866                                 }
   36867                                 case 0x00000300: {
   36868                                   // 0xef800350
   36869                                   if (((instr & 0x380080) == 0x0)) {
   36870                                     UnallocatedT32(instr);
   36871                                     return;
   36872                                   }
   36873                                   DataType dt =
   36874                                       Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
   36875                                                              ((instr >> 4) &
   36876                                                               0x8),
   36877                                                          (instr >> 28) & 0x1);
   36878                                   if (dt.Is(kDataTypeValueInvalid)) {
   36879                                     UnallocatedT32(instr);
   36880                                     return;
   36881                                   }
   36882                                   if (((instr >> 12) & 1) != 0) {
   36883                                     UnallocatedT32(instr);
   36884                                     return;
   36885                                   }
   36886                                   unsigned rd = ExtractQRegister(instr, 22, 12);
   36887                                   if ((instr & 1) != 0) {
   36888                                     UnallocatedT32(instr);
   36889                                     return;
   36890                                   }
   36891                                   unsigned rm = ExtractQRegister(instr, 5, 0);
   36892                                   uint32_t imm6 = (instr >> 16) & 0x3f;
   36893                                   uint32_t imm =
   36894                                       (dt.IsSize(64) ? 64
   36895                                                      : (dt.GetSize() * 2)) -
   36896                                       imm6;
   36897                                   // VRSRA{<c>}{<q>}.<type><size> {<Qd>}, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   36898                                   vrsra(CurrentCond(),
   36899                                         dt,
   36900                                         QRegister(rd),
   36901                                         QRegister(rm),
   36902                                         imm);
   36903                                   break;
   36904                                 }
   36905                               }
   36906                               break;
   36907                             }
   36908                           }
   36909                           break;
   36910                         }
   36911                         case 0x00000400: {
   36912                           // 0xef800450
   36913                           switch (instr & 0x00380080) {
   36914                             case 0x00000000: {
   36915                               // 0xef800450
   36916                               switch (instr & 0x00000100) {
   36917                                 case 0x00000000: {
   36918                                   // 0xef800450
   36919                                   switch (instr & 0x00000200) {
   36920                                     default: {
   36921                                       switch (instr & 0x00000020) {
   36922                                         case 0x00000020: {
   36923                                           // 0xef800470
   36924                                           if (((instr & 0xd00) == 0x100) ||
   36925                                               ((instr & 0xd00) == 0x500) ||
   36926                                               ((instr & 0xd00) == 0x900) ||
   36927                                               ((instr & 0xe00) == 0xe00)) {
   36928                                             UnallocatedT32(instr);
   36929                                             return;
   36930                                           }
   36931                                           unsigned cmode = (instr >> 8) & 0xf;
   36932                                           DataType dt =
   36933                                               ImmediateVmvn::DecodeDt(cmode);
   36934                                           if (dt.Is(kDataTypeValueInvalid)) {
   36935                                             UnallocatedT32(instr);
   36936                                             return;
   36937                                           }
   36938                                           if (((instr >> 12) & 1) != 0) {
   36939                                             UnallocatedT32(instr);
   36940                                             return;
   36941                                           }
   36942                                           unsigned rd =
   36943                                               ExtractQRegister(instr, 22, 12);
   36944                                           QOperand imm =
   36945                                               ImmediateVmvn::DecodeImmediate(
   36946                                                   cmode,
   36947                                                   (instr & 0xf) |
   36948                                                       ((instr >> 12) & 0x70) |
   36949                                                       ((instr >> 21) & 0x80));
   36950                                           // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
   36951                                           vmvn(CurrentCond(),
   36952                                                dt,
   36953                                                QRegister(rd),
   36954                                                imm);
   36955                                           break;
   36956                                         }
   36957                                         default: {
   36958                                           if (((instr & 0x920) == 0x100) ||
   36959                                               ((instr & 0x520) == 0x100) ||
   36960                                               ((instr & 0x820) == 0x20) ||
   36961                                               ((instr & 0x420) == 0x20) ||
   36962                                               ((instr & 0x220) == 0x20) ||
   36963                                               ((instr & 0x120) == 0x120)) {
   36964                                             UnallocatedT32(instr);
   36965                                             return;
   36966                                           }
   36967                                           unsigned cmode =
   36968                                               ((instr >> 8) & 0xf) |
   36969                                               ((instr >> 1) & 0x10);
   36970                                           DataType dt =
   36971                                               ImmediateVmov::DecodeDt(cmode);
   36972                                           if (dt.Is(kDataTypeValueInvalid)) {
   36973                                             UnallocatedT32(instr);
   36974                                             return;
   36975                                           }
   36976                                           if (((instr >> 12) & 1) != 0) {
   36977                                             UnallocatedT32(instr);
   36978                                             return;
   36979                                           }
   36980                                           unsigned rd =
   36981                                               ExtractQRegister(instr, 22, 12);
   36982                                           QOperand imm =
   36983                                               ImmediateVmov::DecodeImmediate(
   36984                                                   cmode,
   36985                                                   (instr & 0xf) |
   36986                                                       ((instr >> 12) & 0x70) |
   36987                                                       ((instr >> 21) & 0x80));
   36988                                           // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
   36989                                           vmov(CurrentCond(),
   36990                                                dt,
   36991                                                QRegister(rd),
   36992                                                imm);
   36993                                           break;
   36994                                         }
   36995                                       }
   36996                                       break;
   36997                                     }
   36998                                   }
   36999                                   break;
   37000                                 }
   37001                                 case 0x00000100: {
   37002                                   // 0xef800550
   37003                                   switch (instr & 0x00000020) {
   37004                                     case 0x00000000: {
   37005                                       // 0xef800550
   37006                                       if (((instr & 0x100) == 0x0) ||
   37007                                           ((instr & 0xc00) == 0xc00)) {
   37008                                         UnallocatedT32(instr);
   37009                                         return;
   37010                                       }
   37011                                       unsigned cmode = (instr >> 8) & 0xf;
   37012                                       DataType dt =
   37013                                           ImmediateVorr::DecodeDt(cmode);
   37014                                       if (dt.Is(kDataTypeValueInvalid)) {
   37015                                         UnallocatedT32(instr);
   37016                                         return;
   37017                                       }
   37018                                       if (((instr >> 12) & 1) != 0) {
   37019                                         UnallocatedT32(instr);
   37020                                         return;
   37021                                       }
   37022                                       unsigned rd =
   37023                                           ExtractQRegister(instr, 22, 12);
   37024                                       QOperand imm =
   37025                                           ImmediateVorr::DecodeImmediate(
   37026                                               cmode,
   37027                                               (instr & 0xf) |
   37028                                                   ((instr >> 12) & 0x70) |
   37029                                                   ((instr >> 21) & 0x80));
   37030                                       // VORR{<c>}{<q>}.<dt> {<Qdn>}, <Qdn>, #<imm> ; T1 NOLINT(whitespace/line_length)
   37031                                       vorr(CurrentCond(),
   37032                                            dt,
   37033                                            QRegister(rd),
   37034                                            QRegister(rd),
   37035                                            imm);
   37036                                       break;
   37037                                     }
   37038                                     case 0x00000020: {
   37039                                       // 0xef800570
   37040                                       if (((instr & 0x100) == 0x0) ||
   37041                                           ((instr & 0xc00) == 0xc00)) {
   37042                                         UnallocatedT32(instr);
   37043                                         return;
   37044                                       }
   37045                                       unsigned cmode = (instr >> 8) & 0xf;
   37046                                       DataType dt =
   37047                                           ImmediateVbic::DecodeDt(cmode);
   37048                                       if (dt.Is(kDataTypeValueInvalid)) {
   37049                                         UnallocatedT32(instr);
   37050                                         return;
   37051                                       }
   37052                                       if (((instr >> 12) & 1) != 0) {
   37053                                         UnallocatedT32(instr);
   37054                                         return;
   37055                                       }
   37056                                       unsigned rd =
   37057                                           ExtractQRegister(instr, 22, 12);
   37058                                       QOperand imm =
   37059                                           ImmediateVbic::DecodeImmediate(
   37060                                               cmode,
   37061                                               (instr & 0xf) |
   37062                                                   ((instr >> 12) & 0x70) |
   37063                                                   ((instr >> 21) & 0x80));
   37064                                       // VBIC{<c>}{<q>}.<dt> {<Qdn>}, <Qdn>, #<imm> ; T1 NOLINT(whitespace/line_length)
   37065                                       vbic(CurrentCond(),
   37066                                            dt,
   37067                                            QRegister(rd),
   37068                                            QRegister(rd),
   37069                                            imm);
   37070                                       break;
   37071                                     }
   37072                                   }
   37073                                   break;
   37074                                 }
   37075                               }
   37076                               break;
   37077                             }
   37078                             default: {
   37079                               switch (instr & 0x00000300) {
   37080                                 case 0x00000000: {
   37081                                   // 0xef800450
   37082                                   if ((instr & 0x10000000) == 0x10000000) {
   37083                                     if (((instr & 0x380080) == 0x0)) {
   37084                                       UnallocatedT32(instr);
   37085                                       return;
   37086                                     }
   37087                                     DataType dt = Dt_L_imm6_4_Decode(
   37088                                         ((instr >> 19) & 0x7) |
   37089                                         ((instr >> 4) & 0x8));
   37090                                     if (dt.Is(kDataTypeValueInvalid)) {
   37091                                       UnallocatedT32(instr);
   37092                                       return;
   37093                                     }
   37094                                     if (((instr >> 12) & 1) != 0) {
   37095                                       UnallocatedT32(instr);
   37096                                       return;
   37097                                     }
   37098                                     unsigned rd =
   37099                                         ExtractQRegister(instr, 22, 12);
   37100                                     if ((instr & 1) != 0) {
   37101                                       UnallocatedT32(instr);
   37102                                       return;
   37103                                     }
   37104                                     unsigned rm = ExtractQRegister(instr, 5, 0);
   37105                                     uint32_t imm6 = (instr >> 16) & 0x3f;
   37106                                     uint32_t imm =
   37107                                         (dt.IsSize(64) ? 64
   37108                                                        : (dt.GetSize() * 2)) -
   37109                                         imm6;
   37110                                     // VSRI{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   37111                                     vsri(CurrentCond(),
   37112                                          dt,
   37113                                          QRegister(rd),
   37114                                          QRegister(rm),
   37115                                          imm);
   37116                                   } else {
   37117                                     UnallocatedT32(instr);
   37118                                   }
   37119                                   break;
   37120                                 }
   37121                                 case 0x00000100: {
   37122                                   // 0xef800550
   37123                                   switch (instr & 0x10000000) {
   37124                                     case 0x00000000: {
   37125                                       // 0xef800550
   37126                                       if (((instr & 0x380080) == 0x0)) {
   37127                                         UnallocatedT32(instr);
   37128                                         return;
   37129                                       }
   37130                                       DataType dt = Dt_L_imm6_3_Decode(
   37131                                           ((instr >> 19) & 0x7) |
   37132                                           ((instr >> 4) & 0x8));
   37133                                       if (dt.Is(kDataTypeValueInvalid)) {
   37134                                         UnallocatedT32(instr);
   37135                                         return;
   37136                                       }
   37137                                       if (((instr >> 12) & 1) != 0) {
   37138                                         UnallocatedT32(instr);
   37139                                         return;
   37140                                       }
   37141                                       unsigned rd =
   37142                                           ExtractQRegister(instr, 22, 12);
   37143                                       if ((instr & 1) != 0) {
   37144                                         UnallocatedT32(instr);
   37145                                         return;
   37146                                       }
   37147                                       unsigned rm =
   37148                                           ExtractQRegister(instr, 5, 0);
   37149                                       uint32_t imm6 = (instr >> 16) & 0x3f;
   37150                                       uint32_t imm =
   37151                                           imm6 -
   37152                                           (dt.IsSize(64) ? 0 : dt.GetSize());
   37153                                       // VSHL{<c>}{<q>}.I<size> {<Qd>}, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   37154                                       vshl(CurrentCond(),
   37155                                            dt,
   37156                                            QRegister(rd),
   37157                                            QRegister(rm),
   37158                                            imm);
   37159                                       break;
   37160                                     }
   37161                                     case 0x10000000: {
   37162                                       // 0xff800550
   37163                                       if (((instr & 0x380080) == 0x0)) {
   37164                                         UnallocatedT32(instr);
   37165                                         return;
   37166                                       }
   37167                                       DataType dt = Dt_L_imm6_4_Decode(
   37168                                           ((instr >> 19) & 0x7) |
   37169                                           ((instr >> 4) & 0x8));
   37170                                       if (dt.Is(kDataTypeValueInvalid)) {
   37171                                         UnallocatedT32(instr);
   37172                                         return;
   37173                                       }
   37174                                       if (((instr >> 12) & 1) != 0) {
   37175                                         UnallocatedT32(instr);
   37176                                         return;
   37177                                       }
   37178                                       unsigned rd =
   37179                                           ExtractQRegister(instr, 22, 12);
   37180                                       if ((instr & 1) != 0) {
   37181                                         UnallocatedT32(instr);
   37182                                         return;
   37183                                       }
   37184                                       unsigned rm =
   37185                                           ExtractQRegister(instr, 5, 0);
   37186                                       uint32_t imm6 = (instr >> 16) & 0x3f;
   37187                                       uint32_t imm =
   37188                                           imm6 -
   37189                                           (dt.IsSize(64) ? 0 : dt.GetSize());
   37190                                       // VSLI{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   37191                                       vsli(CurrentCond(),
   37192                                            dt,
   37193                                            QRegister(rd),
   37194                                            QRegister(rm),
   37195                                            imm);
   37196                                       break;
   37197                                     }
   37198                                   }
   37199                                   break;
   37200                                 }
   37201                                 case 0x00000200: {
   37202                                   // 0xef800650
   37203                                   if (((instr & 0x380080) == 0x0)) {
   37204                                     UnallocatedT32(instr);
   37205                                     return;
   37206                                   }
   37207                                   DataType dt =
   37208                                       Dt_L_imm6_2_Decode(((instr >> 19) & 0x7) |
   37209                                                              ((instr >> 4) &
   37210                                                               0x8),
   37211                                                          (instr >> 28) & 0x1);
   37212                                   if (dt.Is(kDataTypeValueInvalid)) {
   37213                                     UnallocatedT32(instr);
   37214                                     return;
   37215                                   }
   37216                                   if (((instr >> 12) & 1) != 0) {
   37217                                     UnallocatedT32(instr);
   37218                                     return;
   37219                                   }
   37220                                   unsigned rd = ExtractQRegister(instr, 22, 12);
   37221                                   if ((instr & 1) != 0) {
   37222                                     UnallocatedT32(instr);
   37223                                     return;
   37224                                   }
   37225                                   unsigned rm = ExtractQRegister(instr, 5, 0);
   37226                                   uint32_t imm6 = (instr >> 16) & 0x3f;
   37227                                   uint32_t imm =
   37228                                       imm6 - (dt.IsSize(64) ? 0 : dt.GetSize());
   37229                                   // VQSHLU{<c>}{<q>}.<type><size> {<Qd>}, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   37230                                   vqshlu(CurrentCond(),
   37231                                          dt,
   37232                                          QRegister(rd),
   37233                                          QRegister(rm),
   37234                                          imm);
   37235                                   break;
   37236                                 }
   37237                                 case 0x00000300: {
   37238                                   // 0xef800750
   37239                                   if (((instr & 0x380080) == 0x0)) {
   37240                                     UnallocatedT32(instr);
   37241                                     return;
   37242                                   }
   37243                                   DataType dt =
   37244                                       Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
   37245                                                              ((instr >> 4) &
   37246                                                               0x8),
   37247                                                          (instr >> 28) & 0x1);
   37248                                   if (dt.Is(kDataTypeValueInvalid)) {
   37249                                     UnallocatedT32(instr);
   37250                                     return;
   37251                                   }
   37252                                   if (((instr >> 12) & 1) != 0) {
   37253                                     UnallocatedT32(instr);
   37254                                     return;
   37255                                   }
   37256                                   unsigned rd = ExtractQRegister(instr, 22, 12);
   37257                                   if ((instr & 1) != 0) {
   37258                                     UnallocatedT32(instr);
   37259                                     return;
   37260                                   }
   37261                                   unsigned rm = ExtractQRegister(instr, 5, 0);
   37262                                   uint32_t imm6 = (instr >> 16) & 0x3f;
   37263                                   uint32_t imm =
   37264                                       imm6 - (dt.IsSize(64) ? 0 : dt.GetSize());
   37265                                   // VQSHL{<c>}{<q>}.<type><size> {<Qd>}, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   37266                                   vqshl(CurrentCond(),
   37267                                         dt,
   37268                                         QRegister(rd),
   37269                                         QRegister(rm),
   37270                                         imm);
   37271                                   break;
   37272                                 }
   37273                               }
   37274                               break;
   37275                             }
   37276                           }
   37277                           break;
   37278                         }
   37279                         case 0x00000800: {
   37280                           // 0xef800850
   37281                           switch (instr & 0x00000080) {
   37282                             case 0x00000000: {
   37283                               // 0xef800850
   37284                               switch (instr & 0x00380000) {
   37285                                 case 0x00000000: {
   37286                                   // 0xef800850
   37287                                   switch (instr & 0x00000100) {
   37288                                     case 0x00000000: {
   37289                                       // 0xef800850
   37290                                       switch (instr & 0x00000200) {
   37291                                         default: {
   37292                                           switch (instr & 0x00000020) {
   37293                                             case 0x00000020: {
   37294                                               // 0xef800870
   37295                                               if (((instr & 0xd00) == 0x100) ||
   37296                                                   ((instr & 0xd00) == 0x500) ||
   37297                                                   ((instr & 0xd00) == 0x900) ||
   37298                                                   ((instr & 0xe00) == 0xe00)) {
   37299                                                 UnallocatedT32(instr);
   37300                                                 return;
   37301                                               }
   37302                                               unsigned cmode =
   37303                                                   (instr >> 8) & 0xf;
   37304                                               DataType dt =
   37305                                                   ImmediateVmvn::DecodeDt(
   37306                                                       cmode);
   37307                                               if (dt.Is(
   37308                                                       kDataTypeValueInvalid)) {
   37309                                                 UnallocatedT32(instr);
   37310                                                 return;
   37311                                               }
   37312                                               if (((instr >> 12) & 1) != 0) {
   37313                                                 UnallocatedT32(instr);
   37314                                                 return;
   37315                                               }
   37316                                               unsigned rd =
   37317                                                   ExtractQRegister(instr,
   37318                                                                    22,
   37319                                                                    12);
   37320                                               QOperand imm = ImmediateVmvn::
   37321                                                   DecodeImmediate(cmode,
   37322                                                                   (instr &
   37323                                                                    0xf) |
   37324                                                                       ((instr >>
   37325                                                                         12) &
   37326                                                                        0x70) |
   37327                                                                       ((instr >>
   37328                                                                         21) &
   37329                                                                        0x80));
   37330                                               // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
   37331                                               vmvn(CurrentCond(),
   37332                                                    dt,
   37333                                                    QRegister(rd),
   37334                                                    imm);
   37335                                               break;
   37336                                             }
   37337                                             default: {
   37338                                               if (((instr & 0x920) == 0x100) ||
   37339                                                   ((instr & 0x520) == 0x100) ||
   37340                                                   ((instr & 0x820) == 0x20) ||
   37341                                                   ((instr & 0x420) == 0x20) ||
   37342                                                   ((instr & 0x220) == 0x20) ||
   37343                                                   ((instr & 0x120) == 0x120)) {
   37344                                                 UnallocatedT32(instr);
   37345                                                 return;
   37346                                               }
   37347                                               unsigned cmode =
   37348                                                   ((instr >> 8) & 0xf) |
   37349                                                   ((instr >> 1) & 0x10);
   37350                                               DataType dt =
   37351                                                   ImmediateVmov::DecodeDt(
   37352                                                       cmode);
   37353                                               if (dt.Is(
   37354                                                       kDataTypeValueInvalid)) {
   37355                                                 UnallocatedT32(instr);
   37356                                                 return;
   37357                                               }
   37358                                               if (((instr >> 12) & 1) != 0) {
   37359                                                 UnallocatedT32(instr);
   37360                                                 return;
   37361                                               }
   37362                                               unsigned rd =
   37363                                                   ExtractQRegister(instr,
   37364                                                                    22,
   37365                                                                    12);
   37366                                               QOperand imm = ImmediateVmov::
   37367                                                   DecodeImmediate(cmode,
   37368                                                                   (instr &
   37369                                                                    0xf) |
   37370                                                                       ((instr >>
   37371                                                                         12) &
   37372                                                                        0x70) |
   37373                                                                       ((instr >>
   37374                                                                         21) &
   37375                                                                        0x80));
   37376                                               // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
   37377                                               vmov(CurrentCond(),
   37378                                                    dt,
   37379                                                    QRegister(rd),
   37380                                                    imm);
   37381                                               break;
   37382                                             }
   37383                                           }
   37384                                           break;
   37385                                         }
   37386                                       }
   37387                                       break;
   37388                                     }
   37389                                     case 0x00000100: {
   37390                                       // 0xef800950
   37391                                       switch (instr & 0x00000020) {
   37392                                         case 0x00000000: {
   37393                                           // 0xef800950
   37394                                           if (((instr & 0x100) == 0x0) ||
   37395                                               ((instr & 0xc00) == 0xc00)) {
   37396                                             UnallocatedT32(instr);
   37397                                             return;
   37398                                           }
   37399                                           unsigned cmode = (instr >> 8) & 0xf;
   37400                                           DataType dt =
   37401                                               ImmediateVorr::DecodeDt(cmode);
   37402                                           if (dt.Is(kDataTypeValueInvalid)) {
   37403                                             UnallocatedT32(instr);
   37404                                             return;
   37405                                           }
   37406                                           if (((instr >> 12) & 1) != 0) {
   37407                                             UnallocatedT32(instr);
   37408                                             return;
   37409                                           }
   37410                                           unsigned rd =
   37411                                               ExtractQRegister(instr, 22, 12);
   37412                                           QOperand imm =
   37413                                               ImmediateVorr::DecodeImmediate(
   37414                                                   cmode,
   37415                                                   (instr & 0xf) |
   37416                                                       ((instr >> 12) & 0x70) |
   37417                                                       ((instr >> 21) & 0x80));
   37418                                           // VORR{<c>}{<q>}.<dt> {<Qdn>}, <Qdn>, #<imm> ; T1 NOLINT(whitespace/line_length)
   37419                                           vorr(CurrentCond(),
   37420                                                dt,
   37421                                                QRegister(rd),
   37422                                                QRegister(rd),
   37423                                                imm);
   37424                                           break;
   37425                                         }
   37426                                         case 0x00000020: {
   37427                                           // 0xef800970
   37428                                           if (((instr & 0x100) == 0x0) ||
   37429                                               ((instr & 0xc00) == 0xc00)) {
   37430                                             UnallocatedT32(instr);
   37431                                             return;
   37432                                           }
   37433                                           unsigned cmode = (instr >> 8) & 0xf;
   37434                                           DataType dt =
   37435                                               ImmediateVbic::DecodeDt(cmode);
   37436                                           if (dt.Is(kDataTypeValueInvalid)) {
   37437                                             UnallocatedT32(instr);
   37438                                             return;
   37439                                           }
   37440                                           if (((instr >> 12) & 1) != 0) {
   37441                                             UnallocatedT32(instr);
   37442                                             return;
   37443                                           }
   37444                                           unsigned rd =
   37445                                               ExtractQRegister(instr, 22, 12);
   37446                                           QOperand imm =
   37447                                               ImmediateVbic::DecodeImmediate(
   37448                                                   cmode,
   37449                                                   (instr & 0xf) |
   37450                                                       ((instr >> 12) & 0x70) |
   37451                                                       ((instr >> 21) & 0x80));
   37452                                           // VBIC{<c>}{<q>}.<dt> {<Qdn>}, <Qdn>, #<imm> ; T1 NOLINT(whitespace/line_length)
   37453                                           vbic(CurrentCond(),
   37454                                                dt,
   37455                                                QRegister(rd),
   37456                                                QRegister(rd),
   37457                                                imm);
   37458                                           break;
   37459                                         }
   37460                                       }
   37461                                       break;
   37462                                     }
   37463                                   }
   37464                                   break;
   37465                                 }
   37466                                 default: {
   37467                                   switch (instr & 0x00000300) {
   37468                                     case 0x00000000: {
   37469                                       // 0xef800850
   37470                                       switch (instr & 0x10000000) {
   37471                                         case 0x00000000: {
   37472                                           // 0xef800850
   37473                                           if (((instr & 0x380000) == 0x0)) {
   37474                                             UnallocatedT32(instr);
   37475                                             return;
   37476                                           }
   37477                                           DataType dt = Dt_imm6_3_Decode(
   37478                                               (instr >> 19) & 0x7);
   37479                                           if (dt.Is(kDataTypeValueInvalid)) {
   37480                                             UnallocatedT32(instr);
   37481                                             return;
   37482                                           }
   37483                                           unsigned rd =
   37484                                               ExtractDRegister(instr, 22, 12);
   37485                                           if ((instr & 1) != 0) {
   37486                                             UnallocatedT32(instr);
   37487                                             return;
   37488                                           }
   37489                                           unsigned rm =
   37490                                               ExtractQRegister(instr, 5, 0);
   37491                                           uint32_t imm6 = (instr >> 16) & 0x3f;
   37492                                           uint32_t imm = dt.GetSize() - imm6;
   37493                                           // VRSHRN{<c>}{<q>}.I<size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   37494                                           vrshrn(CurrentCond(),
   37495                                                  dt,
   37496                                                  DRegister(rd),
   37497                                                  QRegister(rm),
   37498                                                  imm);
   37499                                           break;
   37500                                         }
   37501                                         case 0x10000000: {
   37502                                           // 0xff800850
   37503                                           if (((instr & 0x380000) == 0x0)) {
   37504                                             UnallocatedT32(instr);
   37505                                             return;
   37506                                           }
   37507                                           DataType dt =
   37508                                               Dt_imm6_2_Decode((instr >> 19) &
   37509                                                                    0x7,
   37510                                                                (instr >> 28) &
   37511                                                                    0x1);
   37512                                           if (dt.Is(kDataTypeValueInvalid)) {
   37513                                             UnallocatedT32(instr);
   37514                                             return;
   37515                                           }
   37516                                           unsigned rd =
   37517                                               ExtractDRegister(instr, 22, 12);
   37518                                           if ((instr & 1) != 0) {
   37519                                             UnallocatedT32(instr);
   37520                                             return;
   37521                                           }
   37522                                           unsigned rm =
   37523                                               ExtractQRegister(instr, 5, 0);
   37524                                           uint32_t imm6 = (instr >> 16) & 0x3f;
   37525                                           uint32_t imm = dt.GetSize() - imm6;
   37526                                           // VQRSHRUN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   37527                                           vqrshrun(CurrentCond(),
   37528                                                    dt,
   37529                                                    DRegister(rd),
   37530                                                    QRegister(rm),
   37531                                                    imm);
   37532                                           break;
   37533                                         }
   37534                                       }
   37535                                       break;
   37536                                     }
   37537                                     case 0x00000100: {
   37538                                       // 0xef800950
   37539                                       if (((instr & 0x380000) == 0x0)) {
   37540                                         UnallocatedT32(instr);
   37541                                         return;
   37542                                       }
   37543                                       DataType dt =
   37544                                           Dt_imm6_1_Decode((instr >> 19) & 0x7,
   37545                                                            (instr >> 28) & 0x1);
   37546                                       if (dt.Is(kDataTypeValueInvalid)) {
   37547                                         UnallocatedT32(instr);
   37548                                         return;
   37549                                       }
   37550                                       unsigned rd =
   37551                                           ExtractDRegister(instr, 22, 12);
   37552                                       if ((instr & 1) != 0) {
   37553                                         UnallocatedT32(instr);
   37554                                         return;
   37555                                       }
   37556                                       unsigned rm =
   37557                                           ExtractQRegister(instr, 5, 0);
   37558                                       uint32_t imm6 = (instr >> 16) & 0x3f;
   37559                                       uint32_t imm = dt.GetSize() - imm6;
   37560                                       // VQRSHRN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   37561                                       vqrshrn(CurrentCond(),
   37562                                               dt,
   37563                                               DRegister(rd),
   37564                                               QRegister(rm),
   37565                                               imm);
   37566                                       break;
   37567                                     }
   37568                                     default:
   37569                                       UnallocatedT32(instr);
   37570                                       break;
   37571                                   }
   37572                                   break;
   37573                                 }
   37574                               }
   37575                               break;
   37576                             }
   37577                             default:
   37578                               UnallocatedT32(instr);
   37579                               break;
   37580                           }
   37581                           break;
   37582                         }
   37583                         case 0x00000c00: {
   37584                           // 0xef800c50
   37585                           switch (instr & 0x00000080) {
   37586                             case 0x00000000: {
   37587                               // 0xef800c50
   37588                               switch (instr & 0x00200000) {
   37589                                 case 0x00000000: {
   37590                                   // 0xef800c50
   37591                                   switch (instr & 0x00180000) {
   37592                                     case 0x00000000: {
   37593                                       // 0xef800c50
   37594                                       switch (instr & 0x00000300) {
   37595                                         case 0x00000200: {
   37596                                           // 0xef800e50
   37597                                           if (((instr & 0x920) == 0x100) ||
   37598                                               ((instr & 0x520) == 0x100) ||
   37599                                               ((instr & 0x820) == 0x20) ||
   37600                                               ((instr & 0x420) == 0x20) ||
   37601                                               ((instr & 0x220) == 0x20) ||
   37602                                               ((instr & 0x120) == 0x120)) {
   37603                                             UnallocatedT32(instr);
   37604                                             return;
   37605                                           }
   37606                                           unsigned cmode =
   37607                                               ((instr >> 8) & 0xf) |
   37608                                               ((instr >> 1) & 0x10);
   37609                                           DataType dt =
   37610                                               ImmediateVmov::DecodeDt(cmode);
   37611                                           if (dt.Is(kDataTypeValueInvalid)) {
   37612                                             UnallocatedT32(instr);
   37613                                             return;
   37614                                           }
   37615                                           if (((instr >> 12) & 1) != 0) {
   37616                                             UnallocatedT32(instr);
   37617                                             return;
   37618                                           }
   37619                                           unsigned rd =
   37620                                               ExtractQRegister(instr, 22, 12);
   37621                                           QOperand imm =
   37622                                               ImmediateVmov::DecodeImmediate(
   37623                                                   cmode,
   37624                                                   (instr & 0xf) |
   37625                                                       ((instr >> 12) & 0x70) |
   37626                                                       ((instr >> 21) & 0x80));
   37627                                           // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
   37628                                           vmov(CurrentCond(),
   37629                                                dt,
   37630                                                QRegister(rd),
   37631                                                imm);
   37632                                           break;
   37633                                         }
   37634                                         case 0x00000300: {
   37635                                           // 0xef800f50
   37636                                           if (((instr & 0x920) == 0x100) ||
   37637                                               ((instr & 0x520) == 0x100) ||
   37638                                               ((instr & 0x820) == 0x20) ||
   37639                                               ((instr & 0x420) == 0x20) ||
   37640                                               ((instr & 0x220) == 0x20) ||
   37641                                               ((instr & 0x120) == 0x120)) {
   37642                                             UnallocatedT32(instr);
   37643                                             return;
   37644                                           }
   37645                                           unsigned cmode =
   37646                                               ((instr >> 8) & 0xf) |
   37647                                               ((instr >> 1) & 0x10);
   37648                                           DataType dt =
   37649                                               ImmediateVmov::DecodeDt(cmode);
   37650                                           if (dt.Is(kDataTypeValueInvalid)) {
   37651                                             UnallocatedT32(instr);
   37652                                             return;
   37653                                           }
   37654                                           if (((instr >> 12) & 1) != 0) {
   37655                                             UnallocatedT32(instr);
   37656                                             return;
   37657                                           }
   37658                                           unsigned rd =
   37659                                               ExtractQRegister(instr, 22, 12);
   37660                                           QOperand imm =
   37661                                               ImmediateVmov::DecodeImmediate(
   37662                                                   cmode,
   37663                                                   (instr & 0xf) |
   37664                                                       ((instr >> 12) & 0x70) |
   37665                                                       ((instr >> 21) & 0x80));
   37666                                           // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
   37667                                           vmov(CurrentCond(),
   37668                                                dt,
   37669                                                QRegister(rd),
   37670                                                imm);
   37671                                           break;
   37672                                         }
   37673                                         default: {
   37674                                           switch (instr & 0x00000020) {
   37675                                             case 0x00000020: {
   37676                                               // 0xef800c70
   37677                                               switch (instr & 0x00000f20) {
   37678                                                 case 0x00000000: {
   37679                                                   // 0xef800c50
   37680                                                   if (((instr & 0x920) ==
   37681                                                        0x100) ||
   37682                                                       ((instr & 0x520) ==
   37683                                                        0x100) ||
   37684                                                       ((instr & 0x820) ==
   37685                                                        0x20) ||
   37686                                                       ((instr & 0x420) ==
   37687                                                        0x20) ||
   37688                                                       ((instr & 0x220) ==
   37689                                                        0x20) ||
   37690                                                       ((instr & 0x120) ==
   37691                                                        0x120)) {
   37692                                                     UnallocatedT32(instr);
   37693                                                     return;
   37694                                                   }
   37695                                                   unsigned cmode =
   37696                                                       ((instr >> 8) & 0xf) |
   37697                                                       ((instr >> 1) & 0x10);
   37698                                                   DataType dt =
   37699                                                       ImmediateVmov::DecodeDt(
   37700                                                           cmode);
   37701                                                   if (dt.Is(
   37702                                                           kDataTypeValueInvalid)) {
   37703                                                     UnallocatedT32(instr);
   37704                                                     return;
   37705                                                   }
   37706                                                   if (((instr >> 12) & 1) !=
   37707                                                       0) {
   37708                                                     UnallocatedT32(instr);
   37709                                                     return;
   37710                                                   }
   37711                                                   unsigned rd =
   37712                                                       ExtractQRegister(instr,
   37713                                                                        22,
   37714                                                                        12);
   37715                                                   QOperand imm = ImmediateVmov::
   37716                                                       DecodeImmediate(
   37717                                                           cmode,
   37718                                                           (instr & 0xf) |
   37719                                                               ((instr >> 12) &
   37720                                                                0x70) |
   37721                                                               ((instr >> 21) &
   37722                                                                0x80));
   37723                                                   // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
   37724                                                   vmov(CurrentCond(),
   37725                                                        dt,
   37726                                                        QRegister(rd),
   37727                                                        imm);
   37728                                                   break;
   37729                                                 }
   37730                                                 case 0x00000020: {
   37731                                                   // 0xef800c70
   37732                                                   if (((instr & 0xd00) ==
   37733                                                        0x100) ||
   37734                                                       ((instr & 0xd00) ==
   37735                                                        0x500) ||
   37736                                                       ((instr & 0xd00) ==
   37737                                                        0x900) ||
   37738                                                       ((instr & 0xe00) ==
   37739                                                        0xe00)) {
   37740                                                     UnallocatedT32(instr);
   37741                                                     return;
   37742                                                   }
   37743                                                   unsigned cmode =
   37744                                                       (instr >> 8) & 0xf;
   37745                                                   DataType dt =
   37746                                                       ImmediateVmvn::DecodeDt(
   37747                                                           cmode);
   37748                                                   if (dt.Is(
   37749                                                           kDataTypeValueInvalid)) {
   37750                                                     UnallocatedT32(instr);
   37751                                                     return;
   37752                                                   }
   37753                                                   if (((instr >> 12) & 1) !=
   37754                                                       0) {
   37755                                                     UnallocatedT32(instr);
   37756                                                     return;
   37757                                                   }
   37758                                                   unsigned rd =
   37759                                                       ExtractQRegister(instr,
   37760                                                                        22,
   37761                                                                        12);
   37762                                                   QOperand imm = ImmediateVmvn::
   37763                                                       DecodeImmediate(
   37764                                                           cmode,
   37765                                                           (instr & 0xf) |
   37766                                                               ((instr >> 12) &
   37767                                                                0x70) |
   37768                                                               ((instr >> 21) &
   37769                                                                0x80));
   37770                                                   // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
   37771                                                   vmvn(CurrentCond(),
   37772                                                        dt,
   37773                                                        QRegister(rd),
   37774                                                        imm);
   37775                                                   break;
   37776                                                 }
   37777                                                 case 0x00000200: {
   37778                                                   // 0xef800e50
   37779                                                   if (((instr & 0x920) ==
   37780                                                        0x100) ||
   37781                                                       ((instr & 0x520) ==
   37782                                                        0x100) ||
   37783                                                       ((instr & 0x820) ==
   37784                                                        0x20) ||
   37785                                                       ((instr & 0x420) ==
   37786                                                        0x20) ||
   37787                                                       ((instr & 0x220) ==
   37788                                                        0x20) ||
   37789                                                       ((instr & 0x120) ==
   37790                                                        0x120)) {
   37791                                                     UnallocatedT32(instr);
   37792                                                     return;
   37793                                                   }
   37794                                                   unsigned cmode =
   37795                                                       ((instr >> 8) & 0xf) |
   37796                                                       ((instr >> 1) & 0x10);
   37797                                                   DataType dt =
   37798                                                       ImmediateVmov::DecodeDt(
   37799                                                           cmode);
   37800                                                   if (dt.Is(
   37801                                                           kDataTypeValueInvalid)) {
   37802                                                     UnallocatedT32(instr);
   37803                                                     return;
   37804                                                   }
   37805                                                   if (((instr >> 12) & 1) !=
   37806                                                       0) {
   37807                                                     UnallocatedT32(instr);
   37808                                                     return;
   37809                                                   }
   37810                                                   unsigned rd =
   37811                                                       ExtractQRegister(instr,
   37812                                                                        22,
   37813                                                                        12);
   37814                                                   QOperand imm = ImmediateVmov::
   37815                                                       DecodeImmediate(
   37816                                                           cmode,
   37817                                                           (instr & 0xf) |
   37818                                                               ((instr >> 12) &
   37819                                                                0x70) |
   37820                                                               ((instr >> 21) &
   37821                                                                0x80));
   37822                                                   // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
   37823                                                   vmov(CurrentCond(),
   37824                                                        dt,
   37825                                                        QRegister(rd),
   37826                                                        imm);
   37827                                                   break;
   37828                                                 }
   37829                                                 case 0x00000220: {
   37830                                                   // 0xef800e70
   37831                                                   if (((instr & 0xd00) ==
   37832                                                        0x100) ||
   37833                                                       ((instr & 0xd00) ==
   37834                                                        0x500) ||
   37835                                                       ((instr & 0xd00) ==
   37836                                                        0x900) ||
   37837                                                       ((instr & 0xe00) ==
   37838                                                        0xe00)) {
   37839                                                     UnallocatedT32(instr);
   37840                                                     return;
   37841                                                   }
   37842                                                   unsigned cmode =
   37843                                                       (instr >> 8) & 0xf;
   37844                                                   DataType dt =
   37845                                                       ImmediateVmvn::DecodeDt(
   37846                                                           cmode);
   37847                                                   if (dt.Is(
   37848                                                           kDataTypeValueInvalid)) {
   37849                                                     UnallocatedT32(instr);
   37850                                                     return;
   37851                                                   }
   37852                                                   if (((instr >> 12) & 1) !=
   37853                                                       0) {
   37854                                                     UnallocatedT32(instr);
   37855                                                     return;
   37856                                                   }
   37857                                                   unsigned rd =
   37858                                                       ExtractQRegister(instr,
   37859                                                                        22,
   37860                                                                        12);
   37861                                                   QOperand imm = ImmediateVmvn::
   37862                                                       DecodeImmediate(
   37863                                                           cmode,
   37864                                                           (instr & 0xf) |
   37865                                                               ((instr >> 12) &
   37866                                                                0x70) |
   37867                                                               ((instr >> 21) &
   37868                                                                0x80));
   37869                                                   // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
   37870                                                   vmvn(CurrentCond(),
   37871                                                        dt,
   37872                                                        QRegister(rd),
   37873                                                        imm);
   37874                                                   break;
   37875                                                 }
   37876                                                 case 0x00000400: {
   37877                                                   // 0xef800c50
   37878                                                   if (((instr & 0x920) ==
   37879                                                        0x100) ||
   37880                                                       ((instr & 0x520) ==
   37881                                                        0x100) ||
   37882                                                       ((instr & 0x820) ==
   37883                                                        0x20) ||
   37884                                                       ((instr & 0x420) ==
   37885                                                        0x20) ||
   37886                                                       ((instr & 0x220) ==
   37887                                                        0x20) ||
   37888                                                       ((instr & 0x120) ==
   37889                                                        0x120)) {
   37890                                                     UnallocatedT32(instr);
   37891                                                     return;
   37892                                                   }
   37893                                                   unsigned cmode =
   37894                                                       ((instr >> 8) & 0xf) |
   37895                                                       ((instr >> 1) & 0x10);
   37896                                                   DataType dt =
   37897                                                       ImmediateVmov::DecodeDt(
   37898                                                           cmode);
   37899                                                   if (dt.Is(
   37900                                                           kDataTypeValueInvalid)) {
   37901                                                     UnallocatedT32(instr);
   37902                                                     return;
   37903                                                   }
   37904                                                   if (((instr >> 12) & 1) !=
   37905                                                       0) {
   37906                                                     UnallocatedT32(instr);
   37907                                                     return;
   37908                                                   }
   37909                                                   unsigned rd =
   37910                                                       ExtractQRegister(instr,
   37911                                                                        22,
   37912                                                                        12);
   37913                                                   QOperand imm = ImmediateVmov::
   37914                                                       DecodeImmediate(
   37915                                                           cmode,
   37916                                                           (instr & 0xf) |
   37917                                                               ((instr >> 12) &
   37918                                                                0x70) |
   37919                                                               ((instr >> 21) &
   37920                                                                0x80));
   37921                                                   // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
   37922                                                   vmov(CurrentCond(),
   37923                                                        dt,
   37924                                                        QRegister(rd),
   37925                                                        imm);
   37926                                                   break;
   37927                                                 }
   37928                                                 case 0x00000420: {
   37929                                                   // 0xef800c70
   37930                                                   if (((instr & 0xd00) ==
   37931                                                        0x100) ||
   37932                                                       ((instr & 0xd00) ==
   37933                                                        0x500) ||
   37934                                                       ((instr & 0xd00) ==
   37935                                                        0x900) ||
   37936                                                       ((instr & 0xe00) ==
   37937                                                        0xe00)) {
   37938                                                     UnallocatedT32(instr);
   37939                                                     return;
   37940                                                   }
   37941                                                   unsigned cmode =
   37942                                                       (instr >> 8) & 0xf;
   37943                                                   DataType dt =
   37944                                                       ImmediateVmvn::DecodeDt(
   37945                                                           cmode);
   37946                                                   if (dt.Is(
   37947                                                           kDataTypeValueInvalid)) {
   37948                                                     UnallocatedT32(instr);
   37949                                                     return;
   37950                                                   }
   37951                                                   if (((instr >> 12) & 1) !=
   37952                                                       0) {
   37953                                                     UnallocatedT32(instr);
   37954                                                     return;
   37955                                                   }
   37956                                                   unsigned rd =
   37957                                                       ExtractQRegister(instr,
   37958                                                                        22,
   37959                                                                        12);
   37960                                                   QOperand imm = ImmediateVmvn::
   37961                                                       DecodeImmediate(
   37962                                                           cmode,
   37963                                                           (instr & 0xf) |
   37964                                                               ((instr >> 12) &
   37965                                                                0x70) |
   37966                                                               ((instr >> 21) &
   37967                                                                0x80));
   37968                                                   // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
   37969                                                   vmvn(CurrentCond(),
   37970                                                        dt,
   37971                                                        QRegister(rd),
   37972                                                        imm);
   37973                                                   break;
   37974                                                 }
   37975                                                 case 0x00000600: {
   37976                                                   // 0xef800e50
   37977                                                   if (((instr & 0x920) ==
   37978                                                        0x100) ||
   37979                                                       ((instr & 0x520) ==
   37980                                                        0x100) ||
   37981                                                       ((instr & 0x820) ==
   37982                                                        0x20) ||
   37983                                                       ((instr & 0x420) ==
   37984                                                        0x20) ||
   37985                                                       ((instr & 0x220) ==
   37986                                                        0x20) ||
   37987                                                       ((instr & 0x120) ==
   37988                                                        0x120)) {
   37989                                                     UnallocatedT32(instr);
   37990                                                     return;
   37991                                                   }
   37992                                                   unsigned cmode =
   37993                                                       ((instr >> 8) & 0xf) |
   37994                                                       ((instr >> 1) & 0x10);
   37995                                                   DataType dt =
   37996                                                       ImmediateVmov::DecodeDt(
   37997                                                           cmode);
   37998                                                   if (dt.Is(
   37999                                                           kDataTypeValueInvalid)) {
   38000                                                     UnallocatedT32(instr);
   38001                                                     return;
   38002                                                   }
   38003                                                   if (((instr >> 12) & 1) !=
   38004                                                       0) {
   38005                                                     UnallocatedT32(instr);
   38006                                                     return;
   38007                                                   }
   38008                                                   unsigned rd =
   38009                                                       ExtractQRegister(instr,
   38010                                                                        22,
   38011                                                                        12);
   38012                                                   QOperand imm = ImmediateVmov::
   38013                                                       DecodeImmediate(
   38014                                                           cmode,
   38015                                                           (instr & 0xf) |
   38016                                                               ((instr >> 12) &
   38017                                                                0x70) |
   38018                                                               ((instr >> 21) &
   38019                                                                0x80));
   38020                                                   // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
   38021                                                   vmov(CurrentCond(),
   38022                                                        dt,
   38023                                                        QRegister(rd),
   38024                                                        imm);
   38025                                                   break;
   38026                                                 }
   38027                                                 case 0x00000620: {
   38028                                                   // 0xef800e70
   38029                                                   if (((instr & 0xd00) ==
   38030                                                        0x100) ||
   38031                                                       ((instr & 0xd00) ==
   38032                                                        0x500) ||
   38033                                                       ((instr & 0xd00) ==
   38034                                                        0x900) ||
   38035                                                       ((instr & 0xe00) ==
   38036                                                        0xe00)) {
   38037                                                     UnallocatedT32(instr);
   38038                                                     return;
   38039                                                   }
   38040                                                   unsigned cmode =
   38041                                                       (instr >> 8) & 0xf;
   38042                                                   DataType dt =
   38043                                                       ImmediateVmvn::DecodeDt(
   38044                                                           cmode);
   38045                                                   if (dt.Is(
   38046                                                           kDataTypeValueInvalid)) {
   38047                                                     UnallocatedT32(instr);
   38048                                                     return;
   38049                                                   }
   38050                                                   if (((instr >> 12) & 1) !=
   38051                                                       0) {
   38052                                                     UnallocatedT32(instr);
   38053                                                     return;
   38054                                                   }
   38055                                                   unsigned rd =
   38056                                                       ExtractQRegister(instr,
   38057                                                                        22,
   38058                                                                        12);
   38059                                                   QOperand imm = ImmediateVmvn::
   38060                                                       DecodeImmediate(
   38061                                                           cmode,
   38062                                                           (instr & 0xf) |
   38063                                                               ((instr >> 12) &
   38064                                                                0x70) |
   38065                                                               ((instr >> 21) &
   38066                                                                0x80));
   38067                                                   // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
   38068                                                   vmvn(CurrentCond(),
   38069                                                        dt,
   38070                                                        QRegister(rd),
   38071                                                        imm);
   38072                                                   break;
   38073                                                 }
   38074                                                 case 0x00000800: {
   38075                                                   // 0xef800c50
   38076                                                   if (((instr & 0x920) ==
   38077                                                        0x100) ||
   38078                                                       ((instr & 0x520) ==
   38079                                                        0x100) ||
   38080                                                       ((instr & 0x820) ==
   38081                                                        0x20) ||
   38082                                                       ((instr & 0x420) ==
   38083                                                        0x20) ||
   38084                                                       ((instr & 0x220) ==
   38085                                                        0x20) ||
   38086                                                       ((instr & 0x120) ==
   38087                                                        0x120)) {
   38088                                                     UnallocatedT32(instr);
   38089                                                     return;
   38090                                                   }
   38091                                                   unsigned cmode =
   38092                                                       ((instr >> 8) & 0xf) |
   38093                                                       ((instr >> 1) & 0x10);
   38094                                                   DataType dt =
   38095                                                       ImmediateVmov::DecodeDt(
   38096                                                           cmode);
   38097                                                   if (dt.Is(
   38098                                                           kDataTypeValueInvalid)) {
   38099                                                     UnallocatedT32(instr);
   38100                                                     return;
   38101                                                   }
   38102                                                   if (((instr >> 12) & 1) !=
   38103                                                       0) {
   38104                                                     UnallocatedT32(instr);
   38105                                                     return;
   38106                                                   }
   38107                                                   unsigned rd =
   38108                                                       ExtractQRegister(instr,
   38109                                                                        22,
   38110                                                                        12);
   38111                                                   QOperand imm = ImmediateVmov::
   38112                                                       DecodeImmediate(
   38113                                                           cmode,
   38114                                                           (instr & 0xf) |
   38115                                                               ((instr >> 12) &
   38116                                                                0x70) |
   38117                                                               ((instr >> 21) &
   38118                                                                0x80));
   38119                                                   // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
   38120                                                   vmov(CurrentCond(),
   38121                                                        dt,
   38122                                                        QRegister(rd),
   38123                                                        imm);
   38124                                                   break;
   38125                                                 }
   38126                                                 case 0x00000820: {
   38127                                                   // 0xef800c70
   38128                                                   if (((instr & 0xd00) ==
   38129                                                        0x100) ||
   38130                                                       ((instr & 0xd00) ==
   38131                                                        0x500) ||
   38132                                                       ((instr & 0xd00) ==
   38133                                                        0x900) ||
   38134                                                       ((instr & 0xe00) ==
   38135                                                        0xe00)) {
   38136                                                     UnallocatedT32(instr);
   38137                                                     return;
   38138                                                   }
   38139                                                   unsigned cmode =
   38140                                                       (instr >> 8) & 0xf;
   38141                                                   DataType dt =
   38142                                                       ImmediateVmvn::DecodeDt(
   38143                                                           cmode);
   38144                                                   if (dt.Is(
   38145                                                           kDataTypeValueInvalid)) {
   38146                                                     UnallocatedT32(instr);
   38147                                                     return;
   38148                                                   }
   38149                                                   if (((instr >> 12) & 1) !=
   38150                                                       0) {
   38151                                                     UnallocatedT32(instr);
   38152                                                     return;
   38153                                                   }
   38154                                                   unsigned rd =
   38155                                                       ExtractQRegister(instr,
   38156                                                                        22,
   38157                                                                        12);
   38158                                                   QOperand imm = ImmediateVmvn::
   38159                                                       DecodeImmediate(
   38160                                                           cmode,
   38161                                                           (instr & 0xf) |
   38162                                                               ((instr >> 12) &
   38163                                                                0x70) |
   38164                                                               ((instr >> 21) &
   38165                                                                0x80));
   38166                                                   // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
   38167                                                   vmvn(CurrentCond(),
   38168                                                        dt,
   38169                                                        QRegister(rd),
   38170                                                        imm);
   38171                                                   break;
   38172                                                 }
   38173                                                 case 0x00000a00: {
   38174                                                   // 0xef800e50
   38175                                                   if (((instr & 0x920) ==
   38176                                                        0x100) ||
   38177                                                       ((instr & 0x520) ==
   38178                                                        0x100) ||
   38179                                                       ((instr & 0x820) ==
   38180                                                        0x20) ||
   38181                                                       ((instr & 0x420) ==
   38182                                                        0x20) ||
   38183                                                       ((instr & 0x220) ==
   38184                                                        0x20) ||
   38185                                                       ((instr & 0x120) ==
   38186                                                        0x120)) {
   38187                                                     UnallocatedT32(instr);
   38188                                                     return;
   38189                                                   }
   38190                                                   unsigned cmode =
   38191                                                       ((instr >> 8) & 0xf) |
   38192                                                       ((instr >> 1) & 0x10);
   38193                                                   DataType dt =
   38194                                                       ImmediateVmov::DecodeDt(
   38195                                                           cmode);
   38196                                                   if (dt.Is(
   38197                                                           kDataTypeValueInvalid)) {
   38198                                                     UnallocatedT32(instr);
   38199                                                     return;
   38200                                                   }
   38201                                                   if (((instr >> 12) & 1) !=
   38202                                                       0) {
   38203                                                     UnallocatedT32(instr);
   38204                                                     return;
   38205                                                   }
   38206                                                   unsigned rd =
   38207                                                       ExtractQRegister(instr,
   38208                                                                        22,
   38209                                                                        12);
   38210                                                   QOperand imm = ImmediateVmov::
   38211                                                       DecodeImmediate(
   38212                                                           cmode,
   38213                                                           (instr & 0xf) |
   38214                                                               ((instr >> 12) &
   38215                                                                0x70) |
   38216                                                               ((instr >> 21) &
   38217                                                                0x80));
   38218                                                   // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
   38219                                                   vmov(CurrentCond(),
   38220                                                        dt,
   38221                                                        QRegister(rd),
   38222                                                        imm);
   38223                                                   break;
   38224                                                 }
   38225                                                 case 0x00000a20: {
   38226                                                   // 0xef800e70
   38227                                                   if (((instr & 0xd00) ==
   38228                                                        0x100) ||
   38229                                                       ((instr & 0xd00) ==
   38230                                                        0x500) ||
   38231                                                       ((instr & 0xd00) ==
   38232                                                        0x900) ||
   38233                                                       ((instr & 0xe00) ==
   38234                                                        0xe00)) {
   38235                                                     UnallocatedT32(instr);
   38236                                                     return;
   38237                                                   }
   38238                                                   unsigned cmode =
   38239                                                       (instr >> 8) & 0xf;
   38240                                                   DataType dt =
   38241                                                       ImmediateVmvn::DecodeDt(
   38242                                                           cmode);
   38243                                                   if (dt.Is(
   38244                                                           kDataTypeValueInvalid)) {
   38245                                                     UnallocatedT32(instr);
   38246                                                     return;
   38247                                                   }
   38248                                                   if (((instr >> 12) & 1) !=
   38249                                                       0) {
   38250                                                     UnallocatedT32(instr);
   38251                                                     return;
   38252                                                   }
   38253                                                   unsigned rd =
   38254                                                       ExtractQRegister(instr,
   38255                                                                        22,
   38256                                                                        12);
   38257                                                   QOperand imm = ImmediateVmvn::
   38258                                                       DecodeImmediate(
   38259                                                           cmode,
   38260                                                           (instr & 0xf) |
   38261                                                               ((instr >> 12) &
   38262                                                                0x70) |
   38263                                                               ((instr >> 21) &
   38264                                                                0x80));
   38265                                                   // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
   38266                                                   vmvn(CurrentCond(),
   38267                                                        dt,
   38268                                                        QRegister(rd),
   38269                                                        imm);
   38270                                                   break;
   38271                                                 }
   38272                                                 case 0x00000c00: {
   38273                                                   // 0xef800c50
   38274                                                   if (((instr & 0x920) ==
   38275                                                        0x100) ||
   38276                                                       ((instr & 0x520) ==
   38277                                                        0x100) ||
   38278                                                       ((instr & 0x820) ==
   38279                                                        0x20) ||
   38280                                                       ((instr & 0x420) ==
   38281                                                        0x20) ||
   38282                                                       ((instr & 0x220) ==
   38283                                                        0x20) ||
   38284                                                       ((instr & 0x120) ==
   38285                                                        0x120)) {
   38286                                                     UnallocatedT32(instr);
   38287                                                     return;
   38288                                                   }
   38289                                                   unsigned cmode =
   38290                                                       ((instr >> 8) & 0xf) |
   38291                                                       ((instr >> 1) & 0x10);
   38292                                                   DataType dt =
   38293                                                       ImmediateVmov::DecodeDt(
   38294                                                           cmode);
   38295                                                   if (dt.Is(
   38296                                                           kDataTypeValueInvalid)) {
   38297                                                     UnallocatedT32(instr);
   38298                                                     return;
   38299                                                   }
   38300                                                   if (((instr >> 12) & 1) !=
   38301                                                       0) {
   38302                                                     UnallocatedT32(instr);
   38303                                                     return;
   38304                                                   }
   38305                                                   unsigned rd =
   38306                                                       ExtractQRegister(instr,
   38307                                                                        22,
   38308                                                                        12);
   38309                                                   QOperand imm = ImmediateVmov::
   38310                                                       DecodeImmediate(
   38311                                                           cmode,
   38312                                                           (instr & 0xf) |
   38313                                                               ((instr >> 12) &
   38314                                                                0x70) |
   38315                                                               ((instr >> 21) &
   38316                                                                0x80));
   38317                                                   // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
   38318                                                   vmov(CurrentCond(),
   38319                                                        dt,
   38320                                                        QRegister(rd),
   38321                                                        imm);
   38322                                                   break;
   38323                                                 }
   38324                                                 case 0x00000c20: {
   38325                                                   // 0xef800c70
   38326                                                   if (((instr & 0xd00) ==
   38327                                                        0x100) ||
   38328                                                       ((instr & 0xd00) ==
   38329                                                        0x500) ||
   38330                                                       ((instr & 0xd00) ==
   38331                                                        0x900) ||
   38332                                                       ((instr & 0xe00) ==
   38333                                                        0xe00)) {
   38334                                                     UnallocatedT32(instr);
   38335                                                     return;
   38336                                                   }
   38337                                                   unsigned cmode =
   38338                                                       (instr >> 8) & 0xf;
   38339                                                   DataType dt =
   38340                                                       ImmediateVmvn::DecodeDt(
   38341                                                           cmode);
   38342                                                   if (dt.Is(
   38343                                                           kDataTypeValueInvalid)) {
   38344                                                     UnallocatedT32(instr);
   38345                                                     return;
   38346                                                   }
   38347                                                   if (((instr >> 12) & 1) !=
   38348                                                       0) {
   38349                                                     UnallocatedT32(instr);
   38350                                                     return;
   38351                                                   }
   38352                                                   unsigned rd =
   38353                                                       ExtractQRegister(instr,
   38354                                                                        22,
   38355                                                                        12);
   38356                                                   QOperand imm = ImmediateVmvn::
   38357                                                       DecodeImmediate(
   38358                                                           cmode,
   38359                                                           (instr & 0xf) |
   38360                                                               ((instr >> 12) &
   38361                                                                0x70) |
   38362                                                               ((instr >> 21) &
   38363                                                                0x80));
   38364                                                   // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
   38365                                                   vmvn(CurrentCond(),
   38366                                                        dt,
   38367                                                        QRegister(rd),
   38368                                                        imm);
   38369                                                   break;
   38370                                                 }
   38371                                                 case 0x00000d00: {
   38372                                                   // 0xef800d50
   38373                                                   if (((instr & 0x920) ==
   38374                                                        0x100) ||
   38375                                                       ((instr & 0x520) ==
   38376                                                        0x100) ||
   38377                                                       ((instr & 0x820) ==
   38378                                                        0x20) ||
   38379                                                       ((instr & 0x420) ==
   38380                                                        0x20) ||
   38381                                                       ((instr & 0x220) ==
   38382                                                        0x20) ||
   38383                                                       ((instr & 0x120) ==
   38384                                                        0x120)) {
   38385                                                     UnallocatedT32(instr);
   38386                                                     return;
   38387                                                   }
   38388                                                   unsigned cmode =
   38389                                                       ((instr >> 8) & 0xf) |
   38390                                                       ((instr >> 1) & 0x10);
   38391                                                   DataType dt =
   38392                                                       ImmediateVmov::DecodeDt(
   38393                                                           cmode);
   38394                                                   if (dt.Is(
   38395                                                           kDataTypeValueInvalid)) {
   38396                                                     UnallocatedT32(instr);
   38397                                                     return;
   38398                                                   }
   38399                                                   if (((instr >> 12) & 1) !=
   38400                                                       0) {
   38401                                                     UnallocatedT32(instr);
   38402                                                     return;
   38403                                                   }
   38404                                                   unsigned rd =
   38405                                                       ExtractQRegister(instr,
   38406                                                                        22,
   38407                                                                        12);
   38408                                                   QOperand imm = ImmediateVmov::
   38409                                                       DecodeImmediate(
   38410                                                           cmode,
   38411                                                           (instr & 0xf) |
   38412                                                               ((instr >> 12) &
   38413                                                                0x70) |
   38414                                                               ((instr >> 21) &
   38415                                                                0x80));
   38416                                                   // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
   38417                                                   vmov(CurrentCond(),
   38418                                                        dt,
   38419                                                        QRegister(rd),
   38420                                                        imm);
   38421                                                   break;
   38422                                                 }
   38423                                                 case 0x00000d20: {
   38424                                                   // 0xef800d70
   38425                                                   if (((instr & 0xd00) ==
   38426                                                        0x100) ||
   38427                                                       ((instr & 0xd00) ==
   38428                                                        0x500) ||
   38429                                                       ((instr & 0xd00) ==
   38430                                                        0x900) ||
   38431                                                       ((instr & 0xe00) ==
   38432                                                        0xe00)) {
   38433                                                     UnallocatedT32(instr);
   38434                                                     return;
   38435                                                   }
   38436                                                   unsigned cmode =
   38437                                                       (instr >> 8) & 0xf;
   38438                                                   DataType dt =
   38439                                                       ImmediateVmvn::DecodeDt(
   38440                                                           cmode);
   38441                                                   if (dt.Is(
   38442                                                           kDataTypeValueInvalid)) {
   38443                                                     UnallocatedT32(instr);
   38444                                                     return;
   38445                                                   }
   38446                                                   if (((instr >> 12) & 1) !=
   38447                                                       0) {
   38448                                                     UnallocatedT32(instr);
   38449                                                     return;
   38450                                                   }
   38451                                                   unsigned rd =
   38452                                                       ExtractQRegister(instr,
   38453                                                                        22,
   38454                                                                        12);
   38455                                                   QOperand imm = ImmediateVmvn::
   38456                                                       DecodeImmediate(
   38457                                                           cmode,
   38458                                                           (instr & 0xf) |
   38459                                                               ((instr >> 12) &
   38460                                                                0x70) |
   38461                                                               ((instr >> 21) &
   38462                                                                0x80));
   38463                                                   // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
   38464                                                   vmvn(CurrentCond(),
   38465                                                        dt,
   38466                                                        QRegister(rd),
   38467                                                        imm);
   38468                                                   break;
   38469                                                 }
   38470                                                 case 0x00000e00: {
   38471                                                   // 0xef800e50
   38472                                                   if (((instr & 0x920) ==
   38473                                                        0x100) ||
   38474                                                       ((instr & 0x520) ==
   38475                                                        0x100) ||
   38476                                                       ((instr & 0x820) ==
   38477                                                        0x20) ||
   38478                                                       ((instr & 0x420) ==
   38479                                                        0x20) ||
   38480                                                       ((instr & 0x220) ==
   38481                                                        0x20) ||
   38482                                                       ((instr & 0x120) ==
   38483                                                        0x120)) {
   38484                                                     UnallocatedT32(instr);
   38485                                                     return;
   38486                                                   }
   38487                                                   unsigned cmode =
   38488                                                       ((instr >> 8) & 0xf) |
   38489                                                       ((instr >> 1) & 0x10);
   38490                                                   DataType dt =
   38491                                                       ImmediateVmov::DecodeDt(
   38492                                                           cmode);
   38493                                                   if (dt.Is(
   38494                                                           kDataTypeValueInvalid)) {
   38495                                                     UnallocatedT32(instr);
   38496                                                     return;
   38497                                                   }
   38498                                                   if (((instr >> 12) & 1) !=
   38499                                                       0) {
   38500                                                     UnallocatedT32(instr);
   38501                                                     return;
   38502                                                   }
   38503                                                   unsigned rd =
   38504                                                       ExtractQRegister(instr,
   38505                                                                        22,
   38506                                                                        12);
   38507                                                   QOperand imm = ImmediateVmov::
   38508                                                       DecodeImmediate(
   38509                                                           cmode,
   38510                                                           (instr & 0xf) |
   38511                                                               ((instr >> 12) &
   38512                                                                0x70) |
   38513                                                               ((instr >> 21) &
   38514                                                                0x80));
   38515                                                   // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
   38516                                                   vmov(CurrentCond(),
   38517                                                        dt,
   38518                                                        QRegister(rd),
   38519                                                        imm);
   38520                                                   break;
   38521                                                 }
   38522                                                 case 0x00000e20: {
   38523                                                   // 0xef800e70
   38524                                                   if (((instr & 0x920) ==
   38525                                                        0x100) ||
   38526                                                       ((instr & 0x520) ==
   38527                                                        0x100) ||
   38528                                                       ((instr & 0x820) ==
   38529                                                        0x20) ||
   38530                                                       ((instr & 0x420) ==
   38531                                                        0x20) ||
   38532                                                       ((instr & 0x220) ==
   38533                                                        0x20) ||
   38534                                                       ((instr & 0x120) ==
   38535                                                        0x120)) {
   38536                                                     UnallocatedT32(instr);
   38537                                                     return;
   38538                                                   }
   38539                                                   unsigned cmode =
   38540                                                       ((instr >> 8) & 0xf) |
   38541                                                       ((instr >> 1) & 0x10);
   38542                                                   DataType dt =
   38543                                                       ImmediateVmov::DecodeDt(
   38544                                                           cmode);
   38545                                                   if (dt.Is(
   38546                                                           kDataTypeValueInvalid)) {
   38547                                                     UnallocatedT32(instr);
   38548                                                     return;
   38549                                                   }
   38550                                                   if (((instr >> 12) & 1) !=
   38551                                                       0) {
   38552                                                     UnallocatedT32(instr);
   38553                                                     return;
   38554                                                   }
   38555                                                   unsigned rd =
   38556                                                       ExtractQRegister(instr,
   38557                                                                        22,
   38558                                                                        12);
   38559                                                   QOperand imm = ImmediateVmov::
   38560                                                       DecodeImmediate(
   38561                                                           cmode,
   38562                                                           (instr & 0xf) |
   38563                                                               ((instr >> 12) &
   38564                                                                0x70) |
   38565                                                               ((instr >> 21) &
   38566                                                                0x80));
   38567                                                   // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
   38568                                                   vmov(CurrentCond(),
   38569                                                        dt,
   38570                                                        QRegister(rd),
   38571                                                        imm);
   38572                                                   break;
   38573                                                 }
   38574                                                 case 0x00000f00: {
   38575                                                   // 0xef800f50
   38576                                                   if (((instr & 0x920) ==
   38577                                                        0x100) ||
   38578                                                       ((instr & 0x520) ==
   38579                                                        0x100) ||
   38580                                                       ((instr & 0x820) ==
   38581                                                        0x20) ||
   38582                                                       ((instr & 0x420) ==
   38583                                                        0x20) ||
   38584                                                       ((instr & 0x220) ==
   38585                                                        0x20) ||
   38586                                                       ((instr & 0x120) ==
   38587                                                        0x120)) {
   38588                                                     UnallocatedT32(instr);
   38589                                                     return;
   38590                                                   }
   38591                                                   unsigned cmode =
   38592                                                       ((instr >> 8) & 0xf) |
   38593                                                       ((instr >> 1) & 0x10);
   38594                                                   DataType dt =
   38595                                                       ImmediateVmov::DecodeDt(
   38596                                                           cmode);
   38597                                                   if (dt.Is(
   38598                                                           kDataTypeValueInvalid)) {
   38599                                                     UnallocatedT32(instr);
   38600                                                     return;
   38601                                                   }
   38602                                                   if (((instr >> 12) & 1) !=
   38603                                                       0) {
   38604                                                     UnallocatedT32(instr);
   38605                                                     return;
   38606                                                   }
   38607                                                   unsigned rd =
   38608                                                       ExtractQRegister(instr,
   38609                                                                        22,
   38610                                                                        12);
   38611                                                   QOperand imm = ImmediateVmov::
   38612                                                       DecodeImmediate(
   38613                                                           cmode,
   38614                                                           (instr & 0xf) |
   38615                                                               ((instr >> 12) &
   38616                                                                0x70) |
   38617                                                               ((instr >> 21) &
   38618                                                                0x80));
   38619                                                   // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
   38620                                                   vmov(CurrentCond(),
   38621                                                        dt,
   38622                                                        QRegister(rd),
   38623                                                        imm);
   38624                                                   break;
   38625                                                 }
   38626                                                 default:
   38627                                                   UnallocatedT32(instr);
   38628                                                   break;
   38629                                               }
   38630                                               break;
   38631                                             }
   38632                                             default: {
   38633                                               if (((instr & 0x920) == 0x100) ||
   38634                                                   ((instr & 0x520) == 0x100) ||
   38635                                                   ((instr & 0x820) == 0x20) ||
   38636                                                   ((instr & 0x420) == 0x20) ||
   38637                                                   ((instr & 0x220) == 0x20) ||
   38638                                                   ((instr & 0x120) == 0x120)) {
   38639                                                 UnallocatedT32(instr);
   38640                                                 return;
   38641                                               }
   38642                                               unsigned cmode =
   38643                                                   ((instr >> 8) & 0xf) |
   38644                                                   ((instr >> 1) & 0x10);
   38645                                               DataType dt =
   38646                                                   ImmediateVmov::DecodeDt(
   38647                                                       cmode);
   38648                                               if (dt.Is(
   38649                                                       kDataTypeValueInvalid)) {
   38650                                                 UnallocatedT32(instr);
   38651                                                 return;
   38652                                               }
   38653                                               if (((instr >> 12) & 1) != 0) {
   38654                                                 UnallocatedT32(instr);
   38655                                                 return;
   38656                                               }
   38657                                               unsigned rd =
   38658                                                   ExtractQRegister(instr,
   38659                                                                    22,
   38660                                                                    12);
   38661                                               QOperand imm = ImmediateVmov::
   38662                                                   DecodeImmediate(cmode,
   38663                                                                   (instr &
   38664                                                                    0xf) |
   38665                                                                       ((instr >>
   38666                                                                         12) &
   38667                                                                        0x70) |
   38668                                                                       ((instr >>
   38669                                                                         21) &
   38670                                                                        0x80));
   38671                                               // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
   38672                                               vmov(CurrentCond(),
   38673                                                    dt,
   38674                                                    QRegister(rd),
   38675                                                    imm);
   38676                                               break;
   38677                                             }
   38678                                           }
   38679                                           break;
   38680                                         }
   38681                                       }
   38682                                       break;
   38683                                     }
   38684                                     default:
   38685                                       UnallocatedT32(instr);
   38686                                       break;
   38687                                   }
   38688                                   break;
   38689                                 }
   38690                                 default: {
   38691                                   if ((instr & 0x00000200) == 0x00000200) {
   38692                                     if (((instr & 0x200000) == 0x0)) {
   38693                                       UnallocatedT32(instr);
   38694                                       return;
   38695                                     }
   38696                                     DataType dt1 = Dt_op_U_1_Decode1(
   38697                                         ((instr >> 28) & 0x1) |
   38698                                         ((instr >> 7) & 0x2));
   38699                                     if (dt1.Is(kDataTypeValueInvalid)) {
   38700                                       UnallocatedT32(instr);
   38701                                       return;
   38702                                     }
   38703                                     DataType dt2 = Dt_op_U_1_Decode2(
   38704                                         ((instr >> 28) & 0x1) |
   38705                                         ((instr >> 7) & 0x2));
   38706                                     if (dt2.Is(kDataTypeValueInvalid)) {
   38707                                       UnallocatedT32(instr);
   38708                                       return;
   38709                                     }
   38710                                     if (((instr >> 12) & 1) != 0) {
   38711                                       UnallocatedT32(instr);
   38712                                       return;
   38713                                     }
   38714                                     unsigned rd =
   38715                                         ExtractQRegister(instr, 22, 12);
   38716                                     if ((instr & 1) != 0) {
   38717                                       UnallocatedT32(instr);
   38718                                       return;
   38719                                     }
   38720                                     unsigned rm = ExtractQRegister(instr, 5, 0);
   38721                                     uint32_t fbits =
   38722                                         64 - ((instr >> 16) & 0x3f);
   38723                                     // VCVT{<c>}{<q>}.<dt>.<dt> <Qd>, <Qm>, #<fbits> ; T1 NOLINT(whitespace/line_length)
   38724                                     vcvt(CurrentCond(),
   38725                                          dt1,
   38726                                          dt2,
   38727                                          QRegister(rd),
   38728                                          QRegister(rm),
   38729                                          fbits);
   38730                                   } else {
   38731                                     UnallocatedT32(instr);
   38732                                   }
   38733                                   break;
   38734                                 }
   38735                               }
   38736                               break;
   38737                             }
   38738                             default:
   38739                               UnallocatedT32(instr);
   38740                               break;
   38741                           }
   38742                           break;
   38743                         }
   38744                       }
   38745                       break;
   38746                     }
   38747                   }
   38748                   break;
   38749                 }
   38750               }
   38751               break;
   38752             }
   38753           }
   38754           break;
   38755         }
   38756       }
   38757       break;
   38758     }
   38759   }
   38760 }  // NOLINT(readability/fn_size)
   38761 
   38762 void Disassembler::DecodeA32(uint32_t instr) {
   38763   A32CodeAddressIncrementer incrementer(&code_address_);
   38764   if ((instr & 0xf0000000) == 0xf0000000) {
   38765     switch (instr & 0x0e000000) {
   38766       case 0x00000000: {
   38767         // 0xf0000000
   38768         switch (instr & 0x01f10020) {
   38769           case 0x01000000: {
   38770             // 0xf1000000
   38771             switch (instr & 0x000e0000) {
   38772               case 0x00020000: {
   38773                 // 0xf1020000
   38774                 if ((instr & 0x000001c0) == 0x00000000) {
   38775                   UnimplementedA32("CPS", instr);
   38776                 } else {
   38777                   UnallocatedA32(instr);
   38778                 }
   38779                 break;
   38780               }
   38781               case 0x00080000: {
   38782                 // 0xf1080000
   38783                 if ((instr & 0x0000001f) == 0x00000000) {
   38784                   UnimplementedA32("CPSIE", instr);
   38785                 } else {
   38786                   UnallocatedA32(instr);
   38787                 }
   38788                 break;
   38789               }
   38790               case 0x000a0000: {
   38791                 // 0xf10a0000
   38792                 UnimplementedA32("CPSIE", instr);
   38793                 break;
   38794               }
   38795               case 0x000c0000: {
   38796                 // 0xf10c0000
   38797                 if ((instr & 0x0000001f) == 0x00000000) {
   38798                   UnimplementedA32("CPSID", instr);
   38799                 } else {
   38800                   UnallocatedA32(instr);
   38801                 }
   38802                 break;
   38803               }
   38804               case 0x000e0000: {
   38805                 // 0xf10e0000
   38806                 UnimplementedA32("CPSID", instr);
   38807                 break;
   38808               }
   38809               default:
   38810                 UnallocatedA32(instr);
   38811                 break;
   38812             }
   38813             break;
   38814           }
   38815           case 0x01010000: {
   38816             // 0xf1010000
   38817             if ((instr & 0x000000d0) == 0x00000000) {
   38818               UnimplementedA32("SETEND", instr);
   38819             } else {
   38820               UnallocatedA32(instr);
   38821             }
   38822             break;
   38823           }
   38824           default:
   38825             UnallocatedA32(instr);
   38826             break;
   38827         }
   38828         break;
   38829       }
   38830       case 0x02000000: {
   38831         // 0xf2000000
   38832         switch (instr & 0x00800010) {
   38833           case 0x00000000: {
   38834             // 0xf2000000
   38835             switch (instr & 0x00000f40) {
   38836               case 0x00000000: {
   38837                 // 0xf2000000
   38838                 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
   38839                                                  ((instr >> 22) & 0x4));
   38840                 if (dt.Is(kDataTypeValueInvalid)) {
   38841                   UnallocatedA32(instr);
   38842                   return;
   38843                 }
   38844                 unsigned rd = ExtractDRegister(instr, 22, 12);
   38845                 unsigned rn = ExtractDRegister(instr, 7, 16);
   38846                 unsigned rm = ExtractDRegister(instr, 5, 0);
   38847                 // VHADD{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
   38848                 vhadd(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
   38849                 break;
   38850               }
   38851               case 0x00000040: {
   38852                 // 0xf2000040
   38853                 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
   38854                                                  ((instr >> 22) & 0x4));
   38855                 if (dt.Is(kDataTypeValueInvalid)) {
   38856                   UnallocatedA32(instr);
   38857                   return;
   38858                 }
   38859                 if (((instr >> 12) & 1) != 0) {
   38860                   UnallocatedA32(instr);
   38861                   return;
   38862                 }
   38863                 unsigned rd = ExtractQRegister(instr, 22, 12);
   38864                 if (((instr >> 16) & 1) != 0) {
   38865                   UnallocatedA32(instr);
   38866                   return;
   38867                 }
   38868                 unsigned rn = ExtractQRegister(instr, 7, 16);
   38869                 if ((instr & 1) != 0) {
   38870                   UnallocatedA32(instr);
   38871                   return;
   38872                 }
   38873                 unsigned rm = ExtractQRegister(instr, 5, 0);
   38874                 // VHADD{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
   38875                 vhadd(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
   38876                 break;
   38877               }
   38878               case 0x00000100: {
   38879                 // 0xf2000100
   38880                 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
   38881                                                  ((instr >> 22) & 0x4));
   38882                 if (dt.Is(kDataTypeValueInvalid)) {
   38883                   UnallocatedA32(instr);
   38884                   return;
   38885                 }
   38886                 unsigned rd = ExtractDRegister(instr, 22, 12);
   38887                 unsigned rn = ExtractDRegister(instr, 7, 16);
   38888                 unsigned rm = ExtractDRegister(instr, 5, 0);
   38889                 // VRHADD{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
   38890                 vrhadd(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
   38891                 break;
   38892               }
   38893               case 0x00000140: {
   38894                 // 0xf2000140
   38895                 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
   38896                                                  ((instr >> 22) & 0x4));
   38897                 if (dt.Is(kDataTypeValueInvalid)) {
   38898                   UnallocatedA32(instr);
   38899                   return;
   38900                 }
   38901                 if (((instr >> 12) & 1) != 0) {
   38902                   UnallocatedA32(instr);
   38903                   return;
   38904                 }
   38905                 unsigned rd = ExtractQRegister(instr, 22, 12);
   38906                 if (((instr >> 16) & 1) != 0) {
   38907                   UnallocatedA32(instr);
   38908                   return;
   38909                 }
   38910                 unsigned rn = ExtractQRegister(instr, 7, 16);
   38911                 if ((instr & 1) != 0) {
   38912                   UnallocatedA32(instr);
   38913                   return;
   38914                 }
   38915                 unsigned rm = ExtractQRegister(instr, 5, 0);
   38916                 // VRHADD{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
   38917                 vrhadd(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
   38918                 break;
   38919               }
   38920               case 0x00000200: {
   38921                 // 0xf2000200
   38922                 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
   38923                                                  ((instr >> 22) & 0x4));
   38924                 if (dt.Is(kDataTypeValueInvalid)) {
   38925                   UnallocatedA32(instr);
   38926                   return;
   38927                 }
   38928                 unsigned rd = ExtractDRegister(instr, 22, 12);
   38929                 unsigned rn = ExtractDRegister(instr, 7, 16);
   38930                 unsigned rm = ExtractDRegister(instr, 5, 0);
   38931                 // VHSUB{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
   38932                 vhsub(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
   38933                 break;
   38934               }
   38935               case 0x00000240: {
   38936                 // 0xf2000240
   38937                 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
   38938                                                  ((instr >> 22) & 0x4));
   38939                 if (dt.Is(kDataTypeValueInvalid)) {
   38940                   UnallocatedA32(instr);
   38941                   return;
   38942                 }
   38943                 if (((instr >> 12) & 1) != 0) {
   38944                   UnallocatedA32(instr);
   38945                   return;
   38946                 }
   38947                 unsigned rd = ExtractQRegister(instr, 22, 12);
   38948                 if (((instr >> 16) & 1) != 0) {
   38949                   UnallocatedA32(instr);
   38950                   return;
   38951                 }
   38952                 unsigned rn = ExtractQRegister(instr, 7, 16);
   38953                 if ((instr & 1) != 0) {
   38954                   UnallocatedA32(instr);
   38955                   return;
   38956                 }
   38957                 unsigned rm = ExtractQRegister(instr, 5, 0);
   38958                 // VHSUB{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
   38959                 vhsub(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
   38960                 break;
   38961               }
   38962               case 0x00000300: {
   38963                 // 0xf2000300
   38964                 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
   38965                                                  ((instr >> 22) & 0x4));
   38966                 if (dt.Is(kDataTypeValueInvalid)) {
   38967                   UnallocatedA32(instr);
   38968                   return;
   38969                 }
   38970                 unsigned rd = ExtractDRegister(instr, 22, 12);
   38971                 unsigned rn = ExtractDRegister(instr, 7, 16);
   38972                 unsigned rm = ExtractDRegister(instr, 5, 0);
   38973                 // VCGT{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
   38974                 vcgt(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
   38975                 break;
   38976               }
   38977               case 0x00000340: {
   38978                 // 0xf2000340
   38979                 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
   38980                                                  ((instr >> 22) & 0x4));
   38981                 if (dt.Is(kDataTypeValueInvalid)) {
   38982                   UnallocatedA32(instr);
   38983                   return;
   38984                 }
   38985                 if (((instr >> 12) & 1) != 0) {
   38986                   UnallocatedA32(instr);
   38987                   return;
   38988                 }
   38989                 unsigned rd = ExtractQRegister(instr, 22, 12);
   38990                 if (((instr >> 16) & 1) != 0) {
   38991                   UnallocatedA32(instr);
   38992                   return;
   38993                 }
   38994                 unsigned rn = ExtractQRegister(instr, 7, 16);
   38995                 if ((instr & 1) != 0) {
   38996                   UnallocatedA32(instr);
   38997                   return;
   38998                 }
   38999                 unsigned rm = ExtractQRegister(instr, 5, 0);
   39000                 // VCGT{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
   39001                 vcgt(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
   39002                 break;
   39003               }
   39004               case 0x00000400: {
   39005                 // 0xf2000400
   39006                 DataType dt = Dt_U_size_3_Decode(((instr >> 20) & 0x3) |
   39007                                                  ((instr >> 22) & 0x4));
   39008                 if (dt.Is(kDataTypeValueInvalid)) {
   39009                   UnallocatedA32(instr);
   39010                   return;
   39011                 }
   39012                 unsigned rd = ExtractDRegister(instr, 22, 12);
   39013                 unsigned rm = ExtractDRegister(instr, 5, 0);
   39014                 unsigned rn = ExtractDRegister(instr, 7, 16);
   39015                 // VSHL{<c>}{<q>}.<dt> {<Dd>}, <Dm>, <Dn> ; A1
   39016                 vshl(al, dt, DRegister(rd), DRegister(rm), DRegister(rn));
   39017                 break;
   39018               }
   39019               case 0x00000440: {
   39020                 // 0xf2000440
   39021                 DataType dt = Dt_U_size_3_Decode(((instr >> 20) & 0x3) |
   39022                                                  ((instr >> 22) & 0x4));
   39023                 if (dt.Is(kDataTypeValueInvalid)) {
   39024                   UnallocatedA32(instr);
   39025                   return;
   39026                 }
   39027                 if (((instr >> 12) & 1) != 0) {
   39028                   UnallocatedA32(instr);
   39029                   return;
   39030                 }
   39031                 unsigned rd = ExtractQRegister(instr, 22, 12);
   39032                 if ((instr & 1) != 0) {
   39033                   UnallocatedA32(instr);
   39034                   return;
   39035                 }
   39036                 unsigned rm = ExtractQRegister(instr, 5, 0);
   39037                 if (((instr >> 16) & 1) != 0) {
   39038                   UnallocatedA32(instr);
   39039                   return;
   39040                 }
   39041                 unsigned rn = ExtractQRegister(instr, 7, 16);
   39042                 // VSHL{<c>}{<q>}.<dt> {<Qd>}, <Qm>, <Qn> ; A1
   39043                 vshl(al, dt, QRegister(rd), QRegister(rm), QRegister(rn));
   39044                 break;
   39045               }
   39046               case 0x00000500: {
   39047                 // 0xf2000500
   39048                 DataType dt = Dt_U_size_3_Decode(((instr >> 20) & 0x3) |
   39049                                                  ((instr >> 22) & 0x4));
   39050                 if (dt.Is(kDataTypeValueInvalid)) {
   39051                   UnallocatedA32(instr);
   39052                   return;
   39053                 }
   39054                 unsigned rd = ExtractDRegister(instr, 22, 12);
   39055                 unsigned rm = ExtractDRegister(instr, 5, 0);
   39056                 unsigned rn = ExtractDRegister(instr, 7, 16);
   39057                 // VRSHL{<c>}{<q>}.<dt> {<Dd>}, <Dm>, <Dn> ; A1
   39058                 vrshl(al, dt, DRegister(rd), DRegister(rm), DRegister(rn));
   39059                 break;
   39060               }
   39061               case 0x00000540: {
   39062                 // 0xf2000540
   39063                 DataType dt = Dt_U_size_3_Decode(((instr >> 20) & 0x3) |
   39064                                                  ((instr >> 22) & 0x4));
   39065                 if (dt.Is(kDataTypeValueInvalid)) {
   39066                   UnallocatedA32(instr);
   39067                   return;
   39068                 }
   39069                 if (((instr >> 12) & 1) != 0) {
   39070                   UnallocatedA32(instr);
   39071                   return;
   39072                 }
   39073                 unsigned rd = ExtractQRegister(instr, 22, 12);
   39074                 if ((instr & 1) != 0) {
   39075                   UnallocatedA32(instr);
   39076                   return;
   39077                 }
   39078                 unsigned rm = ExtractQRegister(instr, 5, 0);
   39079                 if (((instr >> 16) & 1) != 0) {
   39080                   UnallocatedA32(instr);
   39081                   return;
   39082                 }
   39083                 unsigned rn = ExtractQRegister(instr, 7, 16);
   39084                 // VRSHL{<c>}{<q>}.<dt> {<Qd>}, <Qm>, <Qn> ; A1
   39085                 vrshl(al, dt, QRegister(rd), QRegister(rm), QRegister(rn));
   39086                 break;
   39087               }
   39088               case 0x00000600: {
   39089                 // 0xf2000600
   39090                 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
   39091                                                  ((instr >> 22) & 0x4));
   39092                 if (dt.Is(kDataTypeValueInvalid)) {
   39093                   UnallocatedA32(instr);
   39094                   return;
   39095                 }
   39096                 unsigned rd = ExtractDRegister(instr, 22, 12);
   39097                 unsigned rn = ExtractDRegister(instr, 7, 16);
   39098                 unsigned rm = ExtractDRegister(instr, 5, 0);
   39099                 // VMAX{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
   39100                 vmax(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
   39101                 break;
   39102               }
   39103               case 0x00000640: {
   39104                 // 0xf2000640
   39105                 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
   39106                                                  ((instr >> 22) & 0x4));
   39107                 if (dt.Is(kDataTypeValueInvalid)) {
   39108                   UnallocatedA32(instr);
   39109                   return;
   39110                 }
   39111                 if (((instr >> 12) & 1) != 0) {
   39112                   UnallocatedA32(instr);
   39113                   return;
   39114                 }
   39115                 unsigned rd = ExtractQRegister(instr, 22, 12);
   39116                 if (((instr >> 16) & 1) != 0) {
   39117                   UnallocatedA32(instr);
   39118                   return;
   39119                 }
   39120                 unsigned rn = ExtractQRegister(instr, 7, 16);
   39121                 if ((instr & 1) != 0) {
   39122                   UnallocatedA32(instr);
   39123                   return;
   39124                 }
   39125                 unsigned rm = ExtractQRegister(instr, 5, 0);
   39126                 // VMAX{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
   39127                 vmax(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
   39128                 break;
   39129               }
   39130               case 0x00000700: {
   39131                 // 0xf2000700
   39132                 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
   39133                                                  ((instr >> 22) & 0x4));
   39134                 if (dt.Is(kDataTypeValueInvalid)) {
   39135                   UnallocatedA32(instr);
   39136                   return;
   39137                 }
   39138                 unsigned rd = ExtractDRegister(instr, 22, 12);
   39139                 unsigned rn = ExtractDRegister(instr, 7, 16);
   39140                 unsigned rm = ExtractDRegister(instr, 5, 0);
   39141                 // VABD{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
   39142                 vabd(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
   39143                 break;
   39144               }
   39145               case 0x00000740: {
   39146                 // 0xf2000740
   39147                 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
   39148                                                  ((instr >> 22) & 0x4));
   39149                 if (dt.Is(kDataTypeValueInvalid)) {
   39150                   UnallocatedA32(instr);
   39151                   return;
   39152                 }
   39153                 if (((instr >> 12) & 1) != 0) {
   39154                   UnallocatedA32(instr);
   39155                   return;
   39156                 }
   39157                 unsigned rd = ExtractQRegister(instr, 22, 12);
   39158                 if (((instr >> 16) & 1) != 0) {
   39159                   UnallocatedA32(instr);
   39160                   return;
   39161                 }
   39162                 unsigned rn = ExtractQRegister(instr, 7, 16);
   39163                 if ((instr & 1) != 0) {
   39164                   UnallocatedA32(instr);
   39165                   return;
   39166                 }
   39167                 unsigned rm = ExtractQRegister(instr, 5, 0);
   39168                 // VABD{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
   39169                 vabd(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
   39170                 break;
   39171               }
   39172               case 0x00000800: {
   39173                 // 0xf2000800
   39174                 switch (instr & 0x01000000) {
   39175                   case 0x00000000: {
   39176                     // 0xf2000800
   39177                     DataType dt = Dt_size_2_Decode((instr >> 20) & 0x3);
   39178                     if (dt.Is(kDataTypeValueInvalid)) {
   39179                       UnallocatedA32(instr);
   39180                       return;
   39181                     }
   39182                     unsigned rd = ExtractDRegister(instr, 22, 12);
   39183                     unsigned rn = ExtractDRegister(instr, 7, 16);
   39184                     unsigned rm = ExtractDRegister(instr, 5, 0);
   39185                     // VADD{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
   39186                     vadd(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
   39187                     break;
   39188                   }
   39189                   case 0x01000000: {
   39190                     // 0xf3000800
   39191                     DataType dt = Dt_size_2_Decode((instr >> 20) & 0x3);
   39192                     if (dt.Is(kDataTypeValueInvalid)) {
   39193                       UnallocatedA32(instr);
   39194                       return;
   39195                     }
   39196                     unsigned rd = ExtractDRegister(instr, 22, 12);
   39197                     unsigned rn = ExtractDRegister(instr, 7, 16);
   39198                     unsigned rm = ExtractDRegister(instr, 5, 0);
   39199                     // VSUB{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
   39200                     vsub(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
   39201                     break;
   39202                   }
   39203                 }
   39204                 break;
   39205               }
   39206               case 0x00000840: {
   39207                 // 0xf2000840
   39208                 switch (instr & 0x01000000) {
   39209                   case 0x00000000: {
   39210                     // 0xf2000840
   39211                     DataType dt = Dt_size_2_Decode((instr >> 20) & 0x3);
   39212                     if (dt.Is(kDataTypeValueInvalid)) {
   39213                       UnallocatedA32(instr);
   39214                       return;
   39215                     }
   39216                     if (((instr >> 12) & 1) != 0) {
   39217                       UnallocatedA32(instr);
   39218                       return;
   39219                     }
   39220                     unsigned rd = ExtractQRegister(instr, 22, 12);
   39221                     if (((instr >> 16) & 1) != 0) {
   39222                       UnallocatedA32(instr);
   39223                       return;
   39224                     }
   39225                     unsigned rn = ExtractQRegister(instr, 7, 16);
   39226                     if ((instr & 1) != 0) {
   39227                       UnallocatedA32(instr);
   39228                       return;
   39229                     }
   39230                     unsigned rm = ExtractQRegister(instr, 5, 0);
   39231                     // VADD{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
   39232                     vadd(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
   39233                     break;
   39234                   }
   39235                   case 0x01000000: {
   39236                     // 0xf3000840
   39237                     DataType dt = Dt_size_2_Decode((instr >> 20) & 0x3);
   39238                     if (dt.Is(kDataTypeValueInvalid)) {
   39239                       UnallocatedA32(instr);
   39240                       return;
   39241                     }
   39242                     if (((instr >> 12) & 1) != 0) {
   39243                       UnallocatedA32(instr);
   39244                       return;
   39245                     }
   39246                     unsigned rd = ExtractQRegister(instr, 22, 12);
   39247                     if (((instr >> 16) & 1) != 0) {
   39248                       UnallocatedA32(instr);
   39249                       return;
   39250                     }
   39251                     unsigned rn = ExtractQRegister(instr, 7, 16);
   39252                     if ((instr & 1) != 0) {
   39253                       UnallocatedA32(instr);
   39254                       return;
   39255                     }
   39256                     unsigned rm = ExtractQRegister(instr, 5, 0);
   39257                     // VSUB{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
   39258                     vsub(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
   39259                     break;
   39260                   }
   39261                 }
   39262                 break;
   39263               }
   39264               case 0x00000900: {
   39265                 // 0xf2000900
   39266                 switch (instr & 0x01000000) {
   39267                   case 0x00000000: {
   39268                     // 0xf2000900
   39269                     DataType dt = Dt_size_10_Decode((instr >> 20) & 0x3);
   39270                     if (dt.Is(kDataTypeValueInvalid)) {
   39271                       UnallocatedA32(instr);
   39272                       return;
   39273                     }
   39274                     unsigned rd = ExtractDRegister(instr, 22, 12);
   39275                     unsigned rn = ExtractDRegister(instr, 7, 16);
   39276                     unsigned rm = ExtractDRegister(instr, 5, 0);
   39277                     // VMLA{<c>}{<q>}.<type><size> <Dd>, <Dn>, <Dm> ; A1
   39278                     vmla(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
   39279                     break;
   39280                   }
   39281                   case 0x01000000: {
   39282                     // 0xf3000900
   39283                     DataType dt = Dt_size_10_Decode((instr >> 20) & 0x3);
   39284                     if (dt.Is(kDataTypeValueInvalid)) {
   39285                       UnallocatedA32(instr);
   39286                       return;
   39287                     }
   39288                     unsigned rd = ExtractDRegister(instr, 22, 12);
   39289                     unsigned rn = ExtractDRegister(instr, 7, 16);
   39290                     unsigned rm = ExtractDRegister(instr, 5, 0);
   39291                     // VMLS{<c>}{<q>}.<type><size> <Dd>, <Dn>, <Dm> ; A1
   39292                     vmls(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
   39293                     break;
   39294                   }
   39295                 }
   39296                 break;
   39297               }
   39298               case 0x00000940: {
   39299                 // 0xf2000940
   39300                 switch (instr & 0x01000000) {
   39301                   case 0x00000000: {
   39302                     // 0xf2000940
   39303                     DataType dt = Dt_size_10_Decode((instr >> 20) & 0x3);
   39304                     if (dt.Is(kDataTypeValueInvalid)) {
   39305                       UnallocatedA32(instr);
   39306                       return;
   39307                     }
   39308                     if (((instr >> 12) & 1) != 0) {
   39309                       UnallocatedA32(instr);
   39310                       return;
   39311                     }
   39312                     unsigned rd = ExtractQRegister(instr, 22, 12);
   39313                     if (((instr >> 16) & 1) != 0) {
   39314                       UnallocatedA32(instr);
   39315                       return;
   39316                     }
   39317                     unsigned rn = ExtractQRegister(instr, 7, 16);
   39318                     if ((instr & 1) != 0) {
   39319                       UnallocatedA32(instr);
   39320                       return;
   39321                     }
   39322                     unsigned rm = ExtractQRegister(instr, 5, 0);
   39323                     // VMLA{<c>}{<q>}.<type><size> <Qd>, <Qn>, <Qm> ; A1
   39324                     vmla(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
   39325                     break;
   39326                   }
   39327                   case 0x01000000: {
   39328                     // 0xf3000940
   39329                     DataType dt = Dt_size_10_Decode((instr >> 20) & 0x3);
   39330                     if (dt.Is(kDataTypeValueInvalid)) {
   39331                       UnallocatedA32(instr);
   39332                       return;
   39333                     }
   39334                     if (((instr >> 12) & 1) != 0) {
   39335                       UnallocatedA32(instr);
   39336                       return;
   39337                     }
   39338                     unsigned rd = ExtractQRegister(instr, 22, 12);
   39339                     if (((instr >> 16) & 1) != 0) {
   39340                       UnallocatedA32(instr);
   39341                       return;
   39342                     }
   39343                     unsigned rn = ExtractQRegister(instr, 7, 16);
   39344                     if ((instr & 1) != 0) {
   39345                       UnallocatedA32(instr);
   39346                       return;
   39347                     }
   39348                     unsigned rm = ExtractQRegister(instr, 5, 0);
   39349                     // VMLS{<c>}{<q>}.<type><size> <Qd>, <Qn>, <Qm> ; A1
   39350                     vmls(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
   39351                     break;
   39352                   }
   39353                 }
   39354                 break;
   39355               }
   39356               case 0x00000a00: {
   39357                 // 0xf2000a00
   39358                 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
   39359                                                  ((instr >> 22) & 0x4));
   39360                 if (dt.Is(kDataTypeValueInvalid)) {
   39361                   UnallocatedA32(instr);
   39362                   return;
   39363                 }
   39364                 unsigned rd = ExtractDRegister(instr, 22, 12);
   39365                 unsigned rn = ExtractDRegister(instr, 7, 16);
   39366                 unsigned rm = ExtractDRegister(instr, 5, 0);
   39367                 // VPMAX{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
   39368                 vpmax(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
   39369                 break;
   39370               }
   39371               case 0x00000b00: {
   39372                 // 0xf2000b00
   39373                 switch (instr & 0x01000000) {
   39374                   case 0x00000000: {
   39375                     // 0xf2000b00
   39376                     DataType dt = Dt_size_13_Decode((instr >> 20) & 0x3);
   39377                     if (dt.Is(kDataTypeValueInvalid)) {
   39378                       UnallocatedA32(instr);
   39379                       return;
   39380                     }
   39381                     unsigned rd = ExtractDRegister(instr, 22, 12);
   39382                     unsigned rn = ExtractDRegister(instr, 7, 16);
   39383                     unsigned rm = ExtractDRegister(instr, 5, 0);
   39384                     // VQDMULH{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
   39385                     vqdmulh(al,
   39386                             dt,
   39387                             DRegister(rd),
   39388                             DRegister(rn),
   39389                             DRegister(rm));
   39390                     break;
   39391                   }
   39392                   case 0x01000000: {
   39393                     // 0xf3000b00
   39394                     DataType dt = Dt_size_13_Decode((instr >> 20) & 0x3);
   39395                     if (dt.Is(kDataTypeValueInvalid)) {
   39396                       UnallocatedA32(instr);
   39397                       return;
   39398                     }
   39399                     unsigned rd = ExtractDRegister(instr, 22, 12);
   39400                     unsigned rn = ExtractDRegister(instr, 7, 16);
   39401                     unsigned rm = ExtractDRegister(instr, 5, 0);
   39402                     // VQRDMULH{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
   39403                     vqrdmulh(al,
   39404                              dt,
   39405                              DRegister(rd),
   39406                              DRegister(rn),
   39407                              DRegister(rm));
   39408                     break;
   39409                   }
   39410                 }
   39411                 break;
   39412               }
   39413               case 0x00000b40: {
   39414                 // 0xf2000b40
   39415                 switch (instr & 0x01000000) {
   39416                   case 0x00000000: {
   39417                     // 0xf2000b40
   39418                     DataType dt = Dt_size_13_Decode((instr >> 20) & 0x3);
   39419                     if (dt.Is(kDataTypeValueInvalid)) {
   39420                       UnallocatedA32(instr);
   39421                       return;
   39422                     }
   39423                     if (((instr >> 12) & 1) != 0) {
   39424                       UnallocatedA32(instr);
   39425                       return;
   39426                     }
   39427                     unsigned rd = ExtractQRegister(instr, 22, 12);
   39428                     if (((instr >> 16) & 1) != 0) {
   39429                       UnallocatedA32(instr);
   39430                       return;
   39431                     }
   39432                     unsigned rn = ExtractQRegister(instr, 7, 16);
   39433                     if ((instr & 1) != 0) {
   39434                       UnallocatedA32(instr);
   39435                       return;
   39436                     }
   39437                     unsigned rm = ExtractQRegister(instr, 5, 0);
   39438                     // VQDMULH{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
   39439                     vqdmulh(al,
   39440                             dt,
   39441                             QRegister(rd),
   39442                             QRegister(rn),
   39443                             QRegister(rm));
   39444                     break;
   39445                   }
   39446                   case 0x01000000: {
   39447                     // 0xf3000b40
   39448                     DataType dt = Dt_size_13_Decode((instr >> 20) & 0x3);
   39449                     if (dt.Is(kDataTypeValueInvalid)) {
   39450                       UnallocatedA32(instr);
   39451                       return;
   39452                     }
   39453                     if (((instr >> 12) & 1) != 0) {
   39454                       UnallocatedA32(instr);
   39455                       return;
   39456                     }
   39457                     unsigned rd = ExtractQRegister(instr, 22, 12);
   39458                     if (((instr >> 16) & 1) != 0) {
   39459                       UnallocatedA32(instr);
   39460                       return;
   39461                     }
   39462                     unsigned rn = ExtractQRegister(instr, 7, 16);
   39463                     if ((instr & 1) != 0) {
   39464                       UnallocatedA32(instr);
   39465                       return;
   39466                     }
   39467                     unsigned rm = ExtractQRegister(instr, 5, 0);
   39468                     // VQRDMULH{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
   39469                     vqrdmulh(al,
   39470                              dt,
   39471                              QRegister(rd),
   39472                              QRegister(rn),
   39473                              QRegister(rm));
   39474                     break;
   39475                   }
   39476                 }
   39477                 break;
   39478               }
   39479               case 0x00000c40: {
   39480                 // 0xf2000c40
   39481                 switch (instr & 0x01300000) {
   39482                   case 0x00000000: {
   39483                     // 0xf2000c40
   39484                     UnimplementedA32("SHA1C", instr);
   39485                     break;
   39486                   }
   39487                   case 0x00100000: {
   39488                     // 0xf2100c40
   39489                     UnimplementedA32("SHA1P", instr);
   39490                     break;
   39491                   }
   39492                   case 0x00200000: {
   39493                     // 0xf2200c40
   39494                     UnimplementedA32("SHA1M", instr);
   39495                     break;
   39496                   }
   39497                   case 0x00300000: {
   39498                     // 0xf2300c40
   39499                     UnimplementedA32("SHA1SU0", instr);
   39500                     break;
   39501                   }
   39502                   case 0x01000000: {
   39503                     // 0xf3000c40
   39504                     UnimplementedA32("SHA256H", instr);
   39505                     break;
   39506                   }
   39507                   case 0x01100000: {
   39508                     // 0xf3100c40
   39509                     UnimplementedA32("SHA256H2", instr);
   39510                     break;
   39511                   }
   39512                   case 0x01200000: {
   39513                     // 0xf3200c40
   39514                     UnimplementedA32("SHA256SU1", instr);
   39515                     break;
   39516                   }
   39517                   default:
   39518                     UnallocatedA32(instr);
   39519                     break;
   39520                 }
   39521                 break;
   39522               }
   39523               case 0x00000d00: {
   39524                 // 0xf2000d00
   39525                 switch (instr & 0x01300000) {
   39526                   case 0x00000000: {
   39527                     // 0xf2000d00
   39528                     unsigned rd = ExtractDRegister(instr, 22, 12);
   39529                     unsigned rn = ExtractDRegister(instr, 7, 16);
   39530                     unsigned rm = ExtractDRegister(instr, 5, 0);
   39531                     // VADD{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A1
   39532                     vadd(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
   39533                     break;
   39534                   }
   39535                   case 0x00200000: {
   39536                     // 0xf2200d00
   39537                     unsigned rd = ExtractDRegister(instr, 22, 12);
   39538                     unsigned rn = ExtractDRegister(instr, 7, 16);
   39539                     unsigned rm = ExtractDRegister(instr, 5, 0);
   39540                     // VSUB{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A1
   39541                     vsub(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
   39542                     break;
   39543                   }
   39544                   case 0x01000000: {
   39545                     // 0xf3000d00
   39546                     unsigned rd = ExtractDRegister(instr, 22, 12);
   39547                     unsigned rn = ExtractDRegister(instr, 7, 16);
   39548                     unsigned rm = ExtractDRegister(instr, 5, 0);
   39549                     // VPADD{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A1
   39550                     vpadd(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
   39551                     break;
   39552                   }
   39553                   case 0x01200000: {
   39554                     // 0xf3200d00
   39555                     unsigned rd = ExtractDRegister(instr, 22, 12);
   39556                     unsigned rn = ExtractDRegister(instr, 7, 16);
   39557                     unsigned rm = ExtractDRegister(instr, 5, 0);
   39558                     // VABD{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A1
   39559                     vabd(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
   39560                     break;
   39561                   }
   39562                   default:
   39563                     UnallocatedA32(instr);
   39564                     break;
   39565                 }
   39566                 break;
   39567               }
   39568               case 0x00000d40: {
   39569                 // 0xf2000d40
   39570                 switch (instr & 0x01300000) {
   39571                   case 0x00000000: {
   39572                     // 0xf2000d40
   39573                     if (((instr >> 12) & 1) != 0) {
   39574                       UnallocatedA32(instr);
   39575                       return;
   39576                     }
   39577                     unsigned rd = ExtractQRegister(instr, 22, 12);
   39578                     if (((instr >> 16) & 1) != 0) {
   39579                       UnallocatedA32(instr);
   39580                       return;
   39581                     }
   39582                     unsigned rn = ExtractQRegister(instr, 7, 16);
   39583                     if ((instr & 1) != 0) {
   39584                       UnallocatedA32(instr);
   39585                       return;
   39586                     }
   39587                     unsigned rm = ExtractQRegister(instr, 5, 0);
   39588                     // VADD{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; A1
   39589                     vadd(al, F32, QRegister(rd), QRegister(rn), QRegister(rm));
   39590                     break;
   39591                   }
   39592                   case 0x00200000: {
   39593                     // 0xf2200d40
   39594                     if (((instr >> 12) & 1) != 0) {
   39595                       UnallocatedA32(instr);
   39596                       return;
   39597                     }
   39598                     unsigned rd = ExtractQRegister(instr, 22, 12);
   39599                     if (((instr >> 16) & 1) != 0) {
   39600                       UnallocatedA32(instr);
   39601                       return;
   39602                     }
   39603                     unsigned rn = ExtractQRegister(instr, 7, 16);
   39604                     if ((instr & 1) != 0) {
   39605                       UnallocatedA32(instr);
   39606                       return;
   39607                     }
   39608                     unsigned rm = ExtractQRegister(instr, 5, 0);
   39609                     // VSUB{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; A1
   39610                     vsub(al, F32, QRegister(rd), QRegister(rn), QRegister(rm));
   39611                     break;
   39612                   }
   39613                   case 0x01200000: {
   39614                     // 0xf3200d40
   39615                     if (((instr >> 12) & 1) != 0) {
   39616                       UnallocatedA32(instr);
   39617                       return;
   39618                     }
   39619                     unsigned rd = ExtractQRegister(instr, 22, 12);
   39620                     if (((instr >> 16) & 1) != 0) {
   39621                       UnallocatedA32(instr);
   39622                       return;
   39623                     }
   39624                     unsigned rn = ExtractQRegister(instr, 7, 16);
   39625                     if ((instr & 1) != 0) {
   39626                       UnallocatedA32(instr);
   39627                       return;
   39628                     }
   39629                     unsigned rm = ExtractQRegister(instr, 5, 0);
   39630                     // VABD{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; A1
   39631                     vabd(al, F32, QRegister(rd), QRegister(rn), QRegister(rm));
   39632                     break;
   39633                   }
   39634                   default:
   39635                     UnallocatedA32(instr);
   39636                     break;
   39637                 }
   39638                 break;
   39639               }
   39640               case 0x00000e00: {
   39641                 // 0xf2000e00
   39642                 switch (instr & 0x01200000) {
   39643                   case 0x00000000: {
   39644                     // 0xf2000e00
   39645                     DataType dt = Dt_sz_1_Decode((instr >> 20) & 0x1);
   39646                     if (dt.Is(kDataTypeValueInvalid)) {
   39647                       UnallocatedA32(instr);
   39648                       return;
   39649                     }
   39650                     unsigned rd = ExtractDRegister(instr, 22, 12);
   39651                     unsigned rn = ExtractDRegister(instr, 7, 16);
   39652                     unsigned rm = ExtractDRegister(instr, 5, 0);
   39653                     // VCEQ{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A2
   39654                     vceq(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
   39655                     break;
   39656                   }
   39657                   case 0x01000000: {
   39658                     // 0xf3000e00
   39659                     if ((instr & 0x00100000) == 0x00000000) {
   39660                       unsigned rd = ExtractDRegister(instr, 22, 12);
   39661                       unsigned rn = ExtractDRegister(instr, 7, 16);
   39662                       unsigned rm = ExtractDRegister(instr, 5, 0);
   39663                       // VCGE{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A2
   39664                       vcge(al,
   39665                            F32,
   39666                            DRegister(rd),
   39667                            DRegister(rn),
   39668                            DRegister(rm));
   39669                     } else {
   39670                       UnallocatedA32(instr);
   39671                     }
   39672                     break;
   39673                   }
   39674                   case 0x01200000: {
   39675                     // 0xf3200e00
   39676                     if ((instr & 0x00100000) == 0x00000000) {
   39677                       unsigned rd = ExtractDRegister(instr, 22, 12);
   39678                       unsigned rn = ExtractDRegister(instr, 7, 16);
   39679                       unsigned rm = ExtractDRegister(instr, 5, 0);
   39680                       // VCGT{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A2
   39681                       vcgt(al,
   39682                            F32,
   39683                            DRegister(rd),
   39684                            DRegister(rn),
   39685                            DRegister(rm));
   39686                     } else {
   39687                       UnallocatedA32(instr);
   39688                     }
   39689                     break;
   39690                   }
   39691                   default:
   39692                     UnallocatedA32(instr);
   39693                     break;
   39694                 }
   39695                 break;
   39696               }
   39697               case 0x00000e40: {
   39698                 // 0xf2000e40
   39699                 switch (instr & 0x01200000) {
   39700                   case 0x00000000: {
   39701                     // 0xf2000e40
   39702                     DataType dt = Dt_sz_1_Decode((instr >> 20) & 0x1);
   39703                     if (dt.Is(kDataTypeValueInvalid)) {
   39704                       UnallocatedA32(instr);
   39705                       return;
   39706                     }
   39707                     if (((instr >> 12) & 1) != 0) {
   39708                       UnallocatedA32(instr);
   39709                       return;
   39710                     }
   39711                     unsigned rd = ExtractQRegister(instr, 22, 12);
   39712                     if (((instr >> 16) & 1) != 0) {
   39713                       UnallocatedA32(instr);
   39714                       return;
   39715                     }
   39716                     unsigned rn = ExtractQRegister(instr, 7, 16);
   39717                     if ((instr & 1) != 0) {
   39718                       UnallocatedA32(instr);
   39719                       return;
   39720                     }
   39721                     unsigned rm = ExtractQRegister(instr, 5, 0);
   39722                     // VCEQ{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A2
   39723                     vceq(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
   39724                     break;
   39725                   }
   39726                   case 0x01000000: {
   39727                     // 0xf3000e40
   39728                     if ((instr & 0x00100000) == 0x00000000) {
   39729                       if (((instr >> 12) & 1) != 0) {
   39730                         UnallocatedA32(instr);
   39731                         return;
   39732                       }
   39733                       unsigned rd = ExtractQRegister(instr, 22, 12);
   39734                       if (((instr >> 16) & 1) != 0) {
   39735                         UnallocatedA32(instr);
   39736                         return;
   39737                       }
   39738                       unsigned rn = ExtractQRegister(instr, 7, 16);
   39739                       if ((instr & 1) != 0) {
   39740                         UnallocatedA32(instr);
   39741                         return;
   39742                       }
   39743                       unsigned rm = ExtractQRegister(instr, 5, 0);
   39744                       // VCGE{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; A2
   39745                       vcge(al,
   39746                            F32,
   39747                            QRegister(rd),
   39748                            QRegister(rn),
   39749                            QRegister(rm));
   39750                     } else {
   39751                       UnallocatedA32(instr);
   39752                     }
   39753                     break;
   39754                   }
   39755                   case 0x01200000: {
   39756                     // 0xf3200e40
   39757                     if ((instr & 0x00100000) == 0x00000000) {
   39758                       if (((instr >> 12) & 1) != 0) {
   39759                         UnallocatedA32(instr);
   39760                         return;
   39761                       }
   39762                       unsigned rd = ExtractQRegister(instr, 22, 12);
   39763                       if (((instr >> 16) & 1) != 0) {
   39764                         UnallocatedA32(instr);
   39765                         return;
   39766                       }
   39767                       unsigned rn = ExtractQRegister(instr, 7, 16);
   39768                       if ((instr & 1) != 0) {
   39769                         UnallocatedA32(instr);
   39770                         return;
   39771                       }
   39772                       unsigned rm = ExtractQRegister(instr, 5, 0);
   39773                       // VCGT{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; A2
   39774                       vcgt(al,
   39775                            F32,
   39776                            QRegister(rd),
   39777                            QRegister(rn),
   39778                            QRegister(rm));
   39779                     } else {
   39780                       UnallocatedA32(instr);
   39781                     }
   39782                     break;
   39783                   }
   39784                   default:
   39785                     UnallocatedA32(instr);
   39786                     break;
   39787                 }
   39788                 break;
   39789               }
   39790               case 0x00000f00: {
   39791                 // 0xf2000f00
   39792                 switch (instr & 0x01300000) {
   39793                   case 0x00000000: {
   39794                     // 0xf2000f00
   39795                     unsigned rd = ExtractDRegister(instr, 22, 12);
   39796                     unsigned rn = ExtractDRegister(instr, 7, 16);
   39797                     unsigned rm = ExtractDRegister(instr, 5, 0);
   39798                     // VMAX{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A1
   39799                     vmax(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
   39800                     break;
   39801                   }
   39802                   case 0x00200000: {
   39803                     // 0xf2200f00
   39804                     unsigned rd = ExtractDRegister(instr, 22, 12);
   39805                     unsigned rn = ExtractDRegister(instr, 7, 16);
   39806                     unsigned rm = ExtractDRegister(instr, 5, 0);
   39807                     // VMIN{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A1
   39808                     vmin(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
   39809                     break;
   39810                   }
   39811                   case 0x01000000: {
   39812                     // 0xf3000f00
   39813                     unsigned rd = ExtractDRegister(instr, 22, 12);
   39814                     unsigned rn = ExtractDRegister(instr, 7, 16);
   39815                     unsigned rm = ExtractDRegister(instr, 5, 0);
   39816                     // VPMAX{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A1
   39817                     vpmax(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
   39818                     break;
   39819                   }
   39820                   case 0x01200000: {
   39821                     // 0xf3200f00
   39822                     unsigned rd = ExtractDRegister(instr, 22, 12);
   39823                     unsigned rn = ExtractDRegister(instr, 7, 16);
   39824                     unsigned rm = ExtractDRegister(instr, 5, 0);
   39825                     // VPMIN{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A1
   39826                     vpmin(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
   39827                     break;
   39828                   }
   39829                   default:
   39830                     UnallocatedA32(instr);
   39831                     break;
   39832                 }
   39833                 break;
   39834               }
   39835               case 0x00000f40: {
   39836                 // 0xf2000f40
   39837                 switch (instr & 0x01300000) {
   39838                   case 0x00000000: {
   39839                     // 0xf2000f40
   39840                     if (((instr >> 12) & 1) != 0) {
   39841                       UnallocatedA32(instr);
   39842                       return;
   39843                     }
   39844                     unsigned rd = ExtractQRegister(instr, 22, 12);
   39845                     if (((instr >> 16) & 1) != 0) {
   39846                       UnallocatedA32(instr);
   39847                       return;
   39848                     }
   39849                     unsigned rn = ExtractQRegister(instr, 7, 16);
   39850                     if ((instr & 1) != 0) {
   39851                       UnallocatedA32(instr);
   39852                       return;
   39853                     }
   39854                     unsigned rm = ExtractQRegister(instr, 5, 0);
   39855                     // VMAX{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; A1
   39856                     vmax(al, F32, QRegister(rd), QRegister(rn), QRegister(rm));
   39857                     break;
   39858                   }
   39859                   case 0x00200000: {
   39860                     // 0xf2200f40
   39861                     if (((instr >> 12) & 1) != 0) {
   39862                       UnallocatedA32(instr);
   39863                       return;
   39864                     }
   39865                     unsigned rd = ExtractQRegister(instr, 22, 12);
   39866                     if (((instr >> 16) & 1) != 0) {
   39867                       UnallocatedA32(instr);
   39868                       return;
   39869                     }
   39870                     unsigned rn = ExtractQRegister(instr, 7, 16);
   39871                     if ((instr & 1) != 0) {
   39872                       UnallocatedA32(instr);
   39873                       return;
   39874                     }
   39875                     unsigned rm = ExtractQRegister(instr, 5, 0);
   39876                     // VMIN{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; A1
   39877                     vmin(al, F32, QRegister(rd), QRegister(rn), QRegister(rm));
   39878                     break;
   39879                   }
   39880                   default:
   39881                     UnallocatedA32(instr);
   39882                     break;
   39883                 }
   39884                 break;
   39885               }
   39886               default:
   39887                 UnallocatedA32(instr);
   39888                 break;
   39889             }
   39890             break;
   39891           }
   39892           case 0x00000010: {
   39893             // 0xf2000010
   39894             switch (instr & 0x00000f40) {
   39895               case 0x00000000: {
   39896                 // 0xf2000010
   39897                 DataType dt = Dt_U_size_3_Decode(((instr >> 20) & 0x3) |
   39898                                                  ((instr >> 22) & 0x4));
   39899                 if (dt.Is(kDataTypeValueInvalid)) {
   39900                   UnallocatedA32(instr);
   39901                   return;
   39902                 }
   39903                 unsigned rd = ExtractDRegister(instr, 22, 12);
   39904                 unsigned rn = ExtractDRegister(instr, 7, 16);
   39905                 unsigned rm = ExtractDRegister(instr, 5, 0);
   39906                 // VQADD{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
   39907                 vqadd(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
   39908                 break;
   39909               }
   39910               case 0x00000040: {
   39911                 // 0xf2000050
   39912                 DataType dt = Dt_U_size_3_Decode(((instr >> 20) & 0x3) |
   39913                                                  ((instr >> 22) & 0x4));
   39914                 if (dt.Is(kDataTypeValueInvalid)) {
   39915                   UnallocatedA32(instr);
   39916                   return;
   39917                 }
   39918                 if (((instr >> 12) & 1) != 0) {
   39919                   UnallocatedA32(instr);
   39920                   return;
   39921                 }
   39922                 unsigned rd = ExtractQRegister(instr, 22, 12);
   39923                 if (((instr >> 16) & 1) != 0) {
   39924                   UnallocatedA32(instr);
   39925                   return;
   39926                 }
   39927                 unsigned rn = ExtractQRegister(instr, 7, 16);
   39928                 if ((instr & 1) != 0) {
   39929                   UnallocatedA32(instr);
   39930                   return;
   39931                 }
   39932                 unsigned rm = ExtractQRegister(instr, 5, 0);
   39933                 // VQADD{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
   39934                 vqadd(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
   39935                 break;
   39936               }
   39937               case 0x00000100: {
   39938                 // 0xf2000110
   39939                 switch (instr & 0x01300000) {
   39940                   case 0x00000000: {
   39941                     // 0xf2000110
   39942                     unsigned rd = ExtractDRegister(instr, 22, 12);
   39943                     unsigned rn = ExtractDRegister(instr, 7, 16);
   39944                     unsigned rm = ExtractDRegister(instr, 5, 0);
   39945                     // VAND{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; A1
   39946                     vand(al,
   39947                          kDataTypeValueNone,
   39948                          DRegister(rd),
   39949                          DRegister(rn),
   39950                          DRegister(rm));
   39951                     break;
   39952                   }
   39953                   case 0x00100000: {
   39954                     // 0xf2100110
   39955                     unsigned rd = ExtractDRegister(instr, 22, 12);
   39956                     unsigned rn = ExtractDRegister(instr, 7, 16);
   39957                     unsigned rm = ExtractDRegister(instr, 5, 0);
   39958                     // VBIC{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; A1
   39959                     vbic(al,
   39960                          kDataTypeValueNone,
   39961                          DRegister(rd),
   39962                          DRegister(rn),
   39963                          DRegister(rm));
   39964                     break;
   39965                   }
   39966                   case 0x00200000: {
   39967                     // 0xf2200110
   39968                     if (((instr & 0x00000040) == 0x00000000) &&
   39969                         ((((Uint32((instr >> 7)) & Uint32(0x1)) << 4) |
   39970                           (Uint32((instr >> 16)) & Uint32(0xf))) ==
   39971                          (((Uint32((instr >> 5)) & Uint32(0x1)) << 4) |
   39972                           (Uint32(instr) & Uint32(0xf))))) {
   39973                       unsigned rd = ExtractDRegister(instr, 22, 12);
   39974                       unsigned rm = ExtractDRegister(instr, 7, 16);
   39975                       // VMOV{<c>}{<q>}{.<dt>} <Dd>, <Dm> ; A1
   39976                       vmov(al,
   39977                            kDataTypeValueNone,
   39978                            DRegister(rd),
   39979                            DRegister(rm));
   39980                       return;
   39981                     }
   39982                     unsigned rd = ExtractDRegister(instr, 22, 12);
   39983                     unsigned rn = ExtractDRegister(instr, 7, 16);
   39984                     unsigned rm = ExtractDRegister(instr, 5, 0);
   39985                     // VORR{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; A1
   39986                     vorr(al,
   39987                          kDataTypeValueNone,
   39988                          DRegister(rd),
   39989                          DRegister(rn),
   39990                          DRegister(rm));
   39991                     break;
   39992                   }
   39993                   case 0x00300000: {
   39994                     // 0xf2300110
   39995                     unsigned rd = ExtractDRegister(instr, 22, 12);
   39996                     unsigned rn = ExtractDRegister(instr, 7, 16);
   39997                     unsigned rm = ExtractDRegister(instr, 5, 0);
   39998                     // VORN{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; A1
   39999                     vorn(al,
   40000                          kDataTypeValueNone,
   40001                          DRegister(rd),
   40002                          DRegister(rn),
   40003                          DRegister(rm));
   40004                     break;
   40005                   }
   40006                   case 0x01000000: {
   40007                     // 0xf3000110
   40008                     unsigned rd = ExtractDRegister(instr, 22, 12);
   40009                     unsigned rn = ExtractDRegister(instr, 7, 16);
   40010                     unsigned rm = ExtractDRegister(instr, 5, 0);
   40011                     // VEOR{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; A1
   40012                     veor(al,
   40013                          kDataTypeValueNone,
   40014                          DRegister(rd),
   40015                          DRegister(rn),
   40016                          DRegister(rm));
   40017                     break;
   40018                   }
   40019                   case 0x01100000: {
   40020                     // 0xf3100110
   40021                     unsigned rd = ExtractDRegister(instr, 22, 12);
   40022                     unsigned rn = ExtractDRegister(instr, 7, 16);
   40023                     unsigned rm = ExtractDRegister(instr, 5, 0);
   40024                     // VBSL{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; A1
   40025                     vbsl(al,
   40026                          kDataTypeValueNone,
   40027                          DRegister(rd),
   40028                          DRegister(rn),
   40029                          DRegister(rm));
   40030                     break;
   40031                   }
   40032                   case 0x01200000: {
   40033                     // 0xf3200110
   40034                     unsigned rd = ExtractDRegister(instr, 22, 12);
   40035                     unsigned rn = ExtractDRegister(instr, 7, 16);
   40036                     unsigned rm = ExtractDRegister(instr, 5, 0);
   40037                     // VBIT{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; A1
   40038                     vbit(al,
   40039                          kDataTypeValueNone,
   40040                          DRegister(rd),
   40041                          DRegister(rn),
   40042                          DRegister(rm));
   40043                     break;
   40044                   }
   40045                   case 0x01300000: {
   40046                     // 0xf3300110
   40047                     unsigned rd = ExtractDRegister(instr, 22, 12);
   40048                     unsigned rn = ExtractDRegister(instr, 7, 16);
   40049                     unsigned rm = ExtractDRegister(instr, 5, 0);
   40050                     // VBIF{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; A1
   40051                     vbif(al,
   40052                          kDataTypeValueNone,
   40053                          DRegister(rd),
   40054                          DRegister(rn),
   40055                          DRegister(rm));
   40056                     break;
   40057                   }
   40058                 }
   40059                 break;
   40060               }
   40061               case 0x00000140: {
   40062                 // 0xf2000150
   40063                 switch (instr & 0x01300000) {
   40064                   case 0x00000000: {
   40065                     // 0xf2000150
   40066                     if (((instr >> 12) & 1) != 0) {
   40067                       UnallocatedA32(instr);
   40068                       return;
   40069                     }
   40070                     unsigned rd = ExtractQRegister(instr, 22, 12);
   40071                     if (((instr >> 16) & 1) != 0) {
   40072                       UnallocatedA32(instr);
   40073                       return;
   40074                     }
   40075                     unsigned rn = ExtractQRegister(instr, 7, 16);
   40076                     if ((instr & 1) != 0) {
   40077                       UnallocatedA32(instr);
   40078                       return;
   40079                     }
   40080                     unsigned rm = ExtractQRegister(instr, 5, 0);
   40081                     // VAND{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; A1
   40082                     vand(al,
   40083                          kDataTypeValueNone,
   40084                          QRegister(rd),
   40085                          QRegister(rn),
   40086                          QRegister(rm));
   40087                     break;
   40088                   }
   40089                   case 0x00100000: {
   40090                     // 0xf2100150
   40091                     if (((instr >> 12) & 1) != 0) {
   40092                       UnallocatedA32(instr);
   40093                       return;
   40094                     }
   40095                     unsigned rd = ExtractQRegister(instr, 22, 12);
   40096                     if (((instr >> 16) & 1) != 0) {
   40097                       UnallocatedA32(instr);
   40098                       return;
   40099                     }
   40100                     unsigned rn = ExtractQRegister(instr, 7, 16);
   40101                     if ((instr & 1) != 0) {
   40102                       UnallocatedA32(instr);
   40103                       return;
   40104                     }
   40105                     unsigned rm = ExtractQRegister(instr, 5, 0);
   40106                     // VBIC{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; A1
   40107                     vbic(al,
   40108                          kDataTypeValueNone,
   40109                          QRegister(rd),
   40110                          QRegister(rn),
   40111                          QRegister(rm));
   40112                     break;
   40113                   }
   40114                   case 0x00200000: {
   40115                     // 0xf2200150
   40116                     if (((instr & 0x00000040) == 0x00000040) &&
   40117                         ((((Uint32((instr >> 7)) & Uint32(0x1)) << 4) |
   40118                           (Uint32((instr >> 16)) & Uint32(0xf))) ==
   40119                          (((Uint32((instr >> 5)) & Uint32(0x1)) << 4) |
   40120                           (Uint32(instr) & Uint32(0xf))))) {
   40121                       if (((instr >> 12) & 1) != 0) {
   40122                         UnallocatedA32(instr);
   40123                         return;
   40124                       }
   40125                       unsigned rd = ExtractQRegister(instr, 22, 12);
   40126                       if (((instr >> 16) & 1) != 0) {
   40127                         UnallocatedA32(instr);
   40128                         return;
   40129                       }
   40130                       unsigned rm = ExtractQRegister(instr, 7, 16);
   40131                       // VMOV{<c>}{<q>}{.<dt>} <Qd>, <Qm> ; A1
   40132                       vmov(al,
   40133                            kDataTypeValueNone,
   40134                            QRegister(rd),
   40135                            QRegister(rm));
   40136                       return;
   40137                     }
   40138                     if (((instr >> 12) & 1) != 0) {
   40139                       UnallocatedA32(instr);
   40140                       return;
   40141                     }
   40142                     unsigned rd = ExtractQRegister(instr, 22, 12);
   40143                     if (((instr >> 16) & 1) != 0) {
   40144                       UnallocatedA32(instr);
   40145                       return;
   40146                     }
   40147                     unsigned rn = ExtractQRegister(instr, 7, 16);
   40148                     if ((instr & 1) != 0) {
   40149                       UnallocatedA32(instr);
   40150                       return;
   40151                     }
   40152                     unsigned rm = ExtractQRegister(instr, 5, 0);
   40153                     // VORR{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; A1
   40154                     vorr(al,
   40155                          kDataTypeValueNone,
   40156                          QRegister(rd),
   40157                          QRegister(rn),
   40158                          QRegister(rm));
   40159                     break;
   40160                   }
   40161                   case 0x00300000: {
   40162                     // 0xf2300150
   40163                     if (((instr >> 12) & 1) != 0) {
   40164                       UnallocatedA32(instr);
   40165                       return;
   40166                     }
   40167                     unsigned rd = ExtractQRegister(instr, 22, 12);
   40168                     if (((instr >> 16) & 1) != 0) {
   40169                       UnallocatedA32(instr);
   40170                       return;
   40171                     }
   40172                     unsigned rn = ExtractQRegister(instr, 7, 16);
   40173                     if ((instr & 1) != 0) {
   40174                       UnallocatedA32(instr);
   40175                       return;
   40176                     }
   40177                     unsigned rm = ExtractQRegister(instr, 5, 0);
   40178                     // VORN{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; A1
   40179                     vorn(al,
   40180                          kDataTypeValueNone,
   40181                          QRegister(rd),
   40182                          QRegister(rn),
   40183                          QRegister(rm));
   40184                     break;
   40185                   }
   40186                   case 0x01000000: {
   40187                     // 0xf3000150
   40188                     if (((instr >> 12) & 1) != 0) {
   40189                       UnallocatedA32(instr);
   40190                       return;
   40191                     }
   40192                     unsigned rd = ExtractQRegister(instr, 22, 12);
   40193                     if (((instr >> 16) & 1) != 0) {
   40194                       UnallocatedA32(instr);
   40195                       return;
   40196                     }
   40197                     unsigned rn = ExtractQRegister(instr, 7, 16);
   40198                     if ((instr & 1) != 0) {
   40199                       UnallocatedA32(instr);
   40200                       return;
   40201                     }
   40202                     unsigned rm = ExtractQRegister(instr, 5, 0);
   40203                     // VEOR{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; A1
   40204                     veor(al,
   40205                          kDataTypeValueNone,
   40206                          QRegister(rd),
   40207                          QRegister(rn),
   40208                          QRegister(rm));
   40209                     break;
   40210                   }
   40211                   case 0x01100000: {
   40212                     // 0xf3100150
   40213                     if (((instr >> 12) & 1) != 0) {
   40214                       UnallocatedA32(instr);
   40215                       return;
   40216                     }
   40217                     unsigned rd = ExtractQRegister(instr, 22, 12);
   40218                     if (((instr >> 16) & 1) != 0) {
   40219                       UnallocatedA32(instr);
   40220                       return;
   40221                     }
   40222                     unsigned rn = ExtractQRegister(instr, 7, 16);
   40223                     if ((instr & 1) != 0) {
   40224                       UnallocatedA32(instr);
   40225                       return;
   40226                     }
   40227                     unsigned rm = ExtractQRegister(instr, 5, 0);
   40228                     // VBSL{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; A1
   40229                     vbsl(al,
   40230                          kDataTypeValueNone,
   40231                          QRegister(rd),
   40232                          QRegister(rn),
   40233                          QRegister(rm));
   40234                     break;
   40235                   }
   40236                   case 0x01200000: {
   40237                     // 0xf3200150
   40238                     if (((instr >> 12) & 1) != 0) {
   40239                       UnallocatedA32(instr);
   40240                       return;
   40241                     }
   40242                     unsigned rd = ExtractQRegister(instr, 22, 12);
   40243                     if (((instr >> 16) & 1) != 0) {
   40244                       UnallocatedA32(instr);
   40245                       return;
   40246                     }
   40247                     unsigned rn = ExtractQRegister(instr, 7, 16);
   40248                     if ((instr & 1) != 0) {
   40249                       UnallocatedA32(instr);
   40250                       return;
   40251                     }
   40252                     unsigned rm = ExtractQRegister(instr, 5, 0);
   40253                     // VBIT{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; A1
   40254                     vbit(al,
   40255                          kDataTypeValueNone,
   40256                          QRegister(rd),
   40257                          QRegister(rn),
   40258                          QRegister(rm));
   40259                     break;
   40260                   }
   40261                   case 0x01300000: {
   40262                     // 0xf3300150
   40263                     if (((instr >> 12) & 1) != 0) {
   40264                       UnallocatedA32(instr);
   40265                       return;
   40266                     }
   40267                     unsigned rd = ExtractQRegister(instr, 22, 12);
   40268                     if (((instr >> 16) & 1) != 0) {
   40269                       UnallocatedA32(instr);
   40270                       return;
   40271                     }
   40272                     unsigned rn = ExtractQRegister(instr, 7, 16);
   40273                     if ((instr & 1) != 0) {
   40274                       UnallocatedA32(instr);
   40275                       return;
   40276                     }
   40277                     unsigned rm = ExtractQRegister(instr, 5, 0);
   40278                     // VBIF{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; A1
   40279                     vbif(al,
   40280                          kDataTypeValueNone,
   40281                          QRegister(rd),
   40282                          QRegister(rn),
   40283                          QRegister(rm));
   40284                     break;
   40285                   }
   40286                 }
   40287                 break;
   40288               }
   40289               case 0x00000200: {
   40290                 // 0xf2000210
   40291                 DataType dt = Dt_U_size_3_Decode(((instr >> 20) & 0x3) |
   40292                                                  ((instr >> 22) & 0x4));
   40293                 if (dt.Is(kDataTypeValueInvalid)) {
   40294                   UnallocatedA32(instr);
   40295                   return;
   40296                 }
   40297                 unsigned rd = ExtractDRegister(instr, 22, 12);
   40298                 unsigned rn = ExtractDRegister(instr, 7, 16);
   40299                 unsigned rm = ExtractDRegister(instr, 5, 0);
   40300                 // VQSUB{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
   40301                 vqsub(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
   40302                 break;
   40303               }
   40304               case 0x00000240: {
   40305                 // 0xf2000250
   40306                 DataType dt = Dt_U_size_3_Decode(((instr >> 20) & 0x3) |
   40307                                                  ((instr >> 22) & 0x4));
   40308                 if (dt.Is(kDataTypeValueInvalid)) {
   40309                   UnallocatedA32(instr);
   40310                   return;
   40311                 }
   40312                 if (((instr >> 12) & 1) != 0) {
   40313                   UnallocatedA32(instr);
   40314                   return;
   40315                 }
   40316                 unsigned rd = ExtractQRegister(instr, 22, 12);
   40317                 if (((instr >> 16) & 1) != 0) {
   40318                   UnallocatedA32(instr);
   40319                   return;
   40320                 }
   40321                 unsigned rn = ExtractQRegister(instr, 7, 16);
   40322                 if ((instr & 1) != 0) {
   40323                   UnallocatedA32(instr);
   40324                   return;
   40325                 }
   40326                 unsigned rm = ExtractQRegister(instr, 5, 0);
   40327                 // VQSUB{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
   40328                 vqsub(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
   40329                 break;
   40330               }
   40331               case 0x00000300: {
   40332                 // 0xf2000310
   40333                 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
   40334                                                  ((instr >> 22) & 0x4));
   40335                 if (dt.Is(kDataTypeValueInvalid)) {
   40336                   UnallocatedA32(instr);
   40337                   return;
   40338                 }
   40339                 unsigned rd = ExtractDRegister(instr, 22, 12);
   40340                 unsigned rn = ExtractDRegister(instr, 7, 16);
   40341                 unsigned rm = ExtractDRegister(instr, 5, 0);
   40342                 // VCGE{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
   40343                 vcge(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
   40344                 break;
   40345               }
   40346               case 0x00000340: {
   40347                 // 0xf2000350
   40348                 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
   40349                                                  ((instr >> 22) & 0x4));
   40350                 if (dt.Is(kDataTypeValueInvalid)) {
   40351                   UnallocatedA32(instr);
   40352                   return;
   40353                 }
   40354                 if (((instr >> 12) & 1) != 0) {
   40355                   UnallocatedA32(instr);
   40356                   return;
   40357                 }
   40358                 unsigned rd = ExtractQRegister(instr, 22, 12);
   40359                 if (((instr >> 16) & 1) != 0) {
   40360                   UnallocatedA32(instr);
   40361                   return;
   40362                 }
   40363                 unsigned rn = ExtractQRegister(instr, 7, 16);
   40364                 if ((instr & 1) != 0) {
   40365                   UnallocatedA32(instr);
   40366                   return;
   40367                 }
   40368                 unsigned rm = ExtractQRegister(instr, 5, 0);
   40369                 // VCGE{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
   40370                 vcge(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
   40371                 break;
   40372               }
   40373               case 0x00000400: {
   40374                 // 0xf2000410
   40375                 DataType dt = Dt_U_size_3_Decode(((instr >> 20) & 0x3) |
   40376                                                  ((instr >> 22) & 0x4));
   40377                 if (dt.Is(kDataTypeValueInvalid)) {
   40378                   UnallocatedA32(instr);
   40379                   return;
   40380                 }
   40381                 unsigned rd = ExtractDRegister(instr, 22, 12);
   40382                 unsigned rm = ExtractDRegister(instr, 5, 0);
   40383                 unsigned rn = ExtractDRegister(instr, 7, 16);
   40384                 // VQSHL{<c>}{<q>}.<dt> {<Dd>}, <Dm>, <Dn> ; A1
   40385                 vqshl(al, dt, DRegister(rd), DRegister(rm), DRegister(rn));
   40386                 break;
   40387               }
   40388               case 0x00000440: {
   40389                 // 0xf2000450
   40390                 DataType dt = Dt_U_size_3_Decode(((instr >> 20) & 0x3) |
   40391                                                  ((instr >> 22) & 0x4));
   40392                 if (dt.Is(kDataTypeValueInvalid)) {
   40393                   UnallocatedA32(instr);
   40394                   return;
   40395                 }
   40396                 if (((instr >> 12) & 1) != 0) {
   40397                   UnallocatedA32(instr);
   40398                   return;
   40399                 }
   40400                 unsigned rd = ExtractQRegister(instr, 22, 12);
   40401                 if ((instr & 1) != 0) {
   40402                   UnallocatedA32(instr);
   40403                   return;
   40404                 }
   40405                 unsigned rm = ExtractQRegister(instr, 5, 0);
   40406                 if (((instr >> 16) & 1) != 0) {
   40407                   UnallocatedA32(instr);
   40408                   return;
   40409                 }
   40410                 unsigned rn = ExtractQRegister(instr, 7, 16);
   40411                 // VQSHL{<c>}{<q>}.<dt> {<Qd>}, <Qm>, <Qn> ; A1
   40412                 vqshl(al, dt, QRegister(rd), QRegister(rm), QRegister(rn));
   40413                 break;
   40414               }
   40415               case 0x00000500: {
   40416                 // 0xf2000510
   40417                 DataType dt = Dt_U_size_3_Decode(((instr >> 20) & 0x3) |
   40418                                                  ((instr >> 22) & 0x4));
   40419                 if (dt.Is(kDataTypeValueInvalid)) {
   40420                   UnallocatedA32(instr);
   40421                   return;
   40422                 }
   40423                 unsigned rd = ExtractDRegister(instr, 22, 12);
   40424                 unsigned rm = ExtractDRegister(instr, 5, 0);
   40425                 unsigned rn = ExtractDRegister(instr, 7, 16);
   40426                 // VQRSHL{<c>}{<q>}.<dt> {<Dd>}, <Dm>, <Dn> ; A1
   40427                 vqrshl(al, dt, DRegister(rd), DRegister(rm), DRegister(rn));
   40428                 break;
   40429               }
   40430               case 0x00000540: {
   40431                 // 0xf2000550
   40432                 DataType dt = Dt_U_size_3_Decode(((instr >> 20) & 0x3) |
   40433                                                  ((instr >> 22) & 0x4));
   40434                 if (dt.Is(kDataTypeValueInvalid)) {
   40435                   UnallocatedA32(instr);
   40436                   return;
   40437                 }
   40438                 if (((instr >> 12) & 1) != 0) {
   40439                   UnallocatedA32(instr);
   40440                   return;
   40441                 }
   40442                 unsigned rd = ExtractQRegister(instr, 22, 12);
   40443                 if ((instr & 1) != 0) {
   40444                   UnallocatedA32(instr);
   40445                   return;
   40446                 }
   40447                 unsigned rm = ExtractQRegister(instr, 5, 0);
   40448                 if (((instr >> 16) & 1) != 0) {
   40449                   UnallocatedA32(instr);
   40450                   return;
   40451                 }
   40452                 unsigned rn = ExtractQRegister(instr, 7, 16);
   40453                 // VQRSHL{<c>}{<q>}.<dt> {<Qd>}, <Qm>, <Qn> ; A1
   40454                 vqrshl(al, dt, QRegister(rd), QRegister(rm), QRegister(rn));
   40455                 break;
   40456               }
   40457               case 0x00000600: {
   40458                 // 0xf2000610
   40459                 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
   40460                                                  ((instr >> 22) & 0x4));
   40461                 if (dt.Is(kDataTypeValueInvalid)) {
   40462                   UnallocatedA32(instr);
   40463                   return;
   40464                 }
   40465                 unsigned rd = ExtractDRegister(instr, 22, 12);
   40466                 unsigned rn = ExtractDRegister(instr, 7, 16);
   40467                 unsigned rm = ExtractDRegister(instr, 5, 0);
   40468                 // VMIN{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
   40469                 vmin(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
   40470                 break;
   40471               }
   40472               case 0x00000640: {
   40473                 // 0xf2000650
   40474                 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
   40475                                                  ((instr >> 22) & 0x4));
   40476                 if (dt.Is(kDataTypeValueInvalid)) {
   40477                   UnallocatedA32(instr);
   40478                   return;
   40479                 }
   40480                 if (((instr >> 12) & 1) != 0) {
   40481                   UnallocatedA32(instr);
   40482                   return;
   40483                 }
   40484                 unsigned rd = ExtractQRegister(instr, 22, 12);
   40485                 if (((instr >> 16) & 1) != 0) {
   40486                   UnallocatedA32(instr);
   40487                   return;
   40488                 }
   40489                 unsigned rn = ExtractQRegister(instr, 7, 16);
   40490                 if ((instr & 1) != 0) {
   40491                   UnallocatedA32(instr);
   40492                   return;
   40493                 }
   40494                 unsigned rm = ExtractQRegister(instr, 5, 0);
   40495                 // VMIN{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
   40496                 vmin(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
   40497                 break;
   40498               }
   40499               case 0x00000700: {
   40500                 // 0xf2000710
   40501                 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
   40502                                                  ((instr >> 22) & 0x4));
   40503                 if (dt.Is(kDataTypeValueInvalid)) {
   40504                   UnallocatedA32(instr);
   40505                   return;
   40506                 }
   40507                 unsigned rd = ExtractDRegister(instr, 22, 12);
   40508                 unsigned rn = ExtractDRegister(instr, 7, 16);
   40509                 unsigned rm = ExtractDRegister(instr, 5, 0);
   40510                 // VABA{<c>}{<q>}.<dt> <Dd>, <Dn>, <Dm> ; A1
   40511                 vaba(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
   40512                 break;
   40513               }
   40514               case 0x00000740: {
   40515                 // 0xf2000750
   40516                 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
   40517                                                  ((instr >> 22) & 0x4));
   40518                 if (dt.Is(kDataTypeValueInvalid)) {
   40519                   UnallocatedA32(instr);
   40520                   return;
   40521                 }
   40522                 if (((instr >> 12) & 1) != 0) {
   40523                   UnallocatedA32(instr);
   40524                   return;
   40525                 }
   40526                 unsigned rd = ExtractQRegister(instr, 22, 12);
   40527                 if (((instr >> 16) & 1) != 0) {
   40528                   UnallocatedA32(instr);
   40529                   return;
   40530                 }
   40531                 unsigned rn = ExtractQRegister(instr, 7, 16);
   40532                 if ((instr & 1) != 0) {
   40533                   UnallocatedA32(instr);
   40534                   return;
   40535                 }
   40536                 unsigned rm = ExtractQRegister(instr, 5, 0);
   40537                 // VABA{<c>}{<q>}.<dt> <Qd>, <Qn>, <Qm> ; A1
   40538                 vaba(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
   40539                 break;
   40540               }
   40541               case 0x00000800: {
   40542                 // 0xf2000810
   40543                 switch (instr & 0x01000000) {
   40544                   case 0x00000000: {
   40545                     // 0xf2000810
   40546                     DataType dt = Dt_size_7_Decode((instr >> 20) & 0x3);
   40547                     if (dt.Is(kDataTypeValueInvalid)) {
   40548                       UnallocatedA32(instr);
   40549                       return;
   40550                     }
   40551                     unsigned rd = ExtractDRegister(instr, 22, 12);
   40552                     unsigned rn = ExtractDRegister(instr, 7, 16);
   40553                     unsigned rm = ExtractDRegister(instr, 5, 0);
   40554                     // VTST{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
   40555                     vtst(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
   40556                     break;
   40557                   }
   40558                   case 0x01000000: {
   40559                     // 0xf3000810
   40560                     DataType dt = Dt_size_4_Decode((instr >> 20) & 0x3);
   40561                     if (dt.Is(kDataTypeValueInvalid)) {
   40562                       UnallocatedA32(instr);
   40563                       return;
   40564                     }
   40565                     unsigned rd = ExtractDRegister(instr, 22, 12);
   40566                     unsigned rn = ExtractDRegister(instr, 7, 16);
   40567                     unsigned rm = ExtractDRegister(instr, 5, 0);
   40568                     // VCEQ{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
   40569                     vceq(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
   40570                     break;
   40571                   }
   40572                 }
   40573                 break;
   40574               }
   40575               case 0x00000840: {
   40576                 // 0xf2000850
   40577                 switch (instr & 0x01000000) {
   40578                   case 0x00000000: {
   40579                     // 0xf2000850
   40580                     DataType dt = Dt_size_7_Decode((instr >> 20) & 0x3);
   40581                     if (dt.Is(kDataTypeValueInvalid)) {
   40582                       UnallocatedA32(instr);
   40583                       return;
   40584                     }
   40585                     if (((instr >> 12) & 1) != 0) {
   40586                       UnallocatedA32(instr);
   40587                       return;
   40588                     }
   40589                     unsigned rd = ExtractQRegister(instr, 22, 12);
   40590                     if (((instr >> 16) & 1) != 0) {
   40591                       UnallocatedA32(instr);
   40592                       return;
   40593                     }
   40594                     unsigned rn = ExtractQRegister(instr, 7, 16);
   40595                     if ((instr & 1) != 0) {
   40596                       UnallocatedA32(instr);
   40597                       return;
   40598                     }
   40599                     unsigned rm = ExtractQRegister(instr, 5, 0);
   40600                     // VTST{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
   40601                     vtst(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
   40602                     break;
   40603                   }
   40604                   case 0x01000000: {
   40605                     // 0xf3000850
   40606                     DataType dt = Dt_size_4_Decode((instr >> 20) & 0x3);
   40607                     if (dt.Is(kDataTypeValueInvalid)) {
   40608                       UnallocatedA32(instr);
   40609                       return;
   40610                     }
   40611                     if (((instr >> 12) & 1) != 0) {
   40612                       UnallocatedA32(instr);
   40613                       return;
   40614                     }
   40615                     unsigned rd = ExtractQRegister(instr, 22, 12);
   40616                     if (((instr >> 16) & 1) != 0) {
   40617                       UnallocatedA32(instr);
   40618                       return;
   40619                     }
   40620                     unsigned rn = ExtractQRegister(instr, 7, 16);
   40621                     if ((instr & 1) != 0) {
   40622                       UnallocatedA32(instr);
   40623                       return;
   40624                     }
   40625                     unsigned rm = ExtractQRegister(instr, 5, 0);
   40626                     // VCEQ{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
   40627                     vceq(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
   40628                     break;
   40629                   }
   40630                 }
   40631                 break;
   40632               }
   40633               case 0x00000900: {
   40634                 // 0xf2000910
   40635                 DataType dt = Dt_op_size_1_Decode(((instr >> 20) & 0x3) |
   40636                                                   ((instr >> 22) & 0x4));
   40637                 if (dt.Is(kDataTypeValueInvalid)) {
   40638                   UnallocatedA32(instr);
   40639                   return;
   40640                 }
   40641                 unsigned rd = ExtractDRegister(instr, 22, 12);
   40642                 unsigned rn = ExtractDRegister(instr, 7, 16);
   40643                 unsigned rm = ExtractDRegister(instr, 5, 0);
   40644                 // VMUL{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
   40645                 vmul(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
   40646                 break;
   40647               }
   40648               case 0x00000940: {
   40649                 // 0xf2000950
   40650                 DataType dt = Dt_op_size_1_Decode(((instr >> 20) & 0x3) |
   40651                                                   ((instr >> 22) & 0x4));
   40652                 if (dt.Is(kDataTypeValueInvalid)) {
   40653                   UnallocatedA32(instr);
   40654                   return;
   40655                 }
   40656                 if (((instr >> 12) & 1) != 0) {
   40657                   UnallocatedA32(instr);
   40658                   return;
   40659                 }
   40660                 unsigned rd = ExtractQRegister(instr, 22, 12);
   40661                 if (((instr >> 16) & 1) != 0) {
   40662                   UnallocatedA32(instr);
   40663                   return;
   40664                 }
   40665                 unsigned rn = ExtractQRegister(instr, 7, 16);
   40666                 if ((instr & 1) != 0) {
   40667                   UnallocatedA32(instr);
   40668                   return;
   40669                 }
   40670                 unsigned rm = ExtractQRegister(instr, 5, 0);
   40671                 // VMUL{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
   40672                 vmul(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
   40673                 break;
   40674               }
   40675               case 0x00000a00: {
   40676                 // 0xf2000a10
   40677                 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
   40678                                                  ((instr >> 22) & 0x4));
   40679                 if (dt.Is(kDataTypeValueInvalid)) {
   40680                   UnallocatedA32(instr);
   40681                   return;
   40682                 }
   40683                 unsigned rd = ExtractDRegister(instr, 22, 12);
   40684                 unsigned rn = ExtractDRegister(instr, 7, 16);
   40685                 unsigned rm = ExtractDRegister(instr, 5, 0);
   40686                 // VPMIN{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
   40687                 vpmin(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
   40688                 break;
   40689               }
   40690               case 0x00000b00: {
   40691                 // 0xf2000b10
   40692                 if ((instr & 0x01000000) == 0x00000000) {
   40693                   DataType dt = Dt_size_4_Decode((instr >> 20) & 0x3);
   40694                   if (dt.Is(kDataTypeValueInvalid)) {
   40695                     UnallocatedA32(instr);
   40696                     return;
   40697                   }
   40698                   unsigned rd = ExtractDRegister(instr, 22, 12);
   40699                   unsigned rn = ExtractDRegister(instr, 7, 16);
   40700                   unsigned rm = ExtractDRegister(instr, 5, 0);
   40701                   // VPADD{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
   40702                   vpadd(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
   40703                 } else {
   40704                   UnallocatedA32(instr);
   40705                 }
   40706                 break;
   40707               }
   40708               case 0x00000c00: {
   40709                 // 0xf2000c10
   40710                 switch (instr & 0x01300000) {
   40711                   case 0x00000000: {
   40712                     // 0xf2000c10
   40713                     unsigned rd = ExtractDRegister(instr, 22, 12);
   40714                     unsigned rn = ExtractDRegister(instr, 7, 16);
   40715                     unsigned rm = ExtractDRegister(instr, 5, 0);
   40716                     // VFMA{<c>}{<q>}.F32 <Dd>, <Dn>, <Dm> ; A1
   40717                     vfma(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
   40718                     break;
   40719                   }
   40720                   case 0x00200000: {
   40721                     // 0xf2200c10
   40722                     unsigned rd = ExtractDRegister(instr, 22, 12);
   40723                     unsigned rn = ExtractDRegister(instr, 7, 16);
   40724                     unsigned rm = ExtractDRegister(instr, 5, 0);
   40725                     // VFMS{<c>}{<q>}.F32 <Dd>, <Dn>, <Dm> ; A1
   40726                     vfms(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
   40727                     break;
   40728                   }
   40729                   default:
   40730                     UnallocatedA32(instr);
   40731                     break;
   40732                 }
   40733                 break;
   40734               }
   40735               case 0x00000c40: {
   40736                 // 0xf2000c50
   40737                 switch (instr & 0x01300000) {
   40738                   case 0x00000000: {
   40739                     // 0xf2000c50
   40740                     if (((instr >> 12) & 1) != 0) {
   40741                       UnallocatedA32(instr);
   40742                       return;
   40743                     }
   40744                     unsigned rd = ExtractQRegister(instr, 22, 12);
   40745                     if (((instr >> 16) & 1) != 0) {
   40746                       UnallocatedA32(instr);
   40747                       return;
   40748                     }
   40749                     unsigned rn = ExtractQRegister(instr, 7, 16);
   40750                     if ((instr & 1) != 0) {
   40751                       UnallocatedA32(instr);
   40752                       return;
   40753                     }
   40754                     unsigned rm = ExtractQRegister(instr, 5, 0);
   40755                     // VFMA{<c>}{<q>}.F32 <Qd>, <Qn>, <Qm> ; A1
   40756                     vfma(al, F32, QRegister(rd), QRegister(rn), QRegister(rm));
   40757                     break;
   40758                   }
   40759                   case 0x00200000: {
   40760                     // 0xf2200c50
   40761                     if (((instr >> 12) & 1) != 0) {
   40762                       UnallocatedA32(instr);
   40763                       return;
   40764                     }
   40765                     unsigned rd = ExtractQRegister(instr, 22, 12);
   40766                     if (((instr >> 16) & 1) != 0) {
   40767                       UnallocatedA32(instr);
   40768                       return;
   40769                     }
   40770                     unsigned rn = ExtractQRegister(instr, 7, 16);
   40771                     if ((instr & 1) != 0) {
   40772                       UnallocatedA32(instr);
   40773                       return;
   40774                     }
   40775                     unsigned rm = ExtractQRegister(instr, 5, 0);
   40776                     // VFMS{<c>}{<q>}.F32 <Qd>, <Qn>, <Qm> ; A1
   40777                     vfms(al, F32, QRegister(rd), QRegister(rn), QRegister(rm));
   40778                     break;
   40779                   }
   40780                   default:
   40781                     UnallocatedA32(instr);
   40782                     break;
   40783                 }
   40784                 break;
   40785               }
   40786               case 0x00000d00: {
   40787                 // 0xf2000d10
   40788                 switch (instr & 0x01300000) {
   40789                   case 0x00000000: {
   40790                     // 0xf2000d10
   40791                     unsigned rd = ExtractDRegister(instr, 22, 12);
   40792                     unsigned rn = ExtractDRegister(instr, 7, 16);
   40793                     unsigned rm = ExtractDRegister(instr, 5, 0);
   40794                     // VMLA{<c>}{<q>}.F32 <Dd>, <Dn>, <Dm> ; A1
   40795                     vmla(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
   40796                     break;
   40797                   }
   40798                   case 0x00200000: {
   40799                     // 0xf2200d10
   40800                     unsigned rd = ExtractDRegister(instr, 22, 12);
   40801                     unsigned rn = ExtractDRegister(instr, 7, 16);
   40802                     unsigned rm = ExtractDRegister(instr, 5, 0);
   40803                     // VMLS{<c>}{<q>}.F32 <Dd>, <Dn>, <Dm> ; A1
   40804                     vmls(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
   40805                     break;
   40806                   }
   40807                   case 0x01000000: {
   40808                     // 0xf3000d10
   40809                     unsigned rd = ExtractDRegister(instr, 22, 12);
   40810                     unsigned rn = ExtractDRegister(instr, 7, 16);
   40811                     unsigned rm = ExtractDRegister(instr, 5, 0);
   40812                     // VMUL{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A1
   40813                     vmul(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
   40814                     break;
   40815                   }
   40816                   default:
   40817                     UnallocatedA32(instr);
   40818                     break;
   40819                 }
   40820                 break;
   40821               }
   40822               case 0x00000d40: {
   40823                 // 0xf2000d50
   40824                 switch (instr & 0x01300000) {
   40825                   case 0x00000000: {
   40826                     // 0xf2000d50
   40827                     if (((instr >> 12) & 1) != 0) {
   40828                       UnallocatedA32(instr);
   40829                       return;
   40830                     }
   40831                     unsigned rd = ExtractQRegister(instr, 22, 12);
   40832                     if (((instr >> 16) & 1) != 0) {
   40833                       UnallocatedA32(instr);
   40834                       return;
   40835                     }
   40836                     unsigned rn = ExtractQRegister(instr, 7, 16);
   40837                     if ((instr & 1) != 0) {
   40838                       UnallocatedA32(instr);
   40839                       return;
   40840                     }
   40841                     unsigned rm = ExtractQRegister(instr, 5, 0);
   40842                     // VMLA{<c>}{<q>}.F32 <Qd>, <Qn>, <Qm> ; A1
   40843                     vmla(al, F32, QRegister(rd), QRegister(rn), QRegister(rm));
   40844                     break;
   40845                   }
   40846                   case 0x00200000: {
   40847                     // 0xf2200d50
   40848                     if (((instr >> 12) & 1) != 0) {
   40849                       UnallocatedA32(instr);
   40850                       return;
   40851                     }
   40852                     unsigned rd = ExtractQRegister(instr, 22, 12);
   40853                     if (((instr >> 16) & 1) != 0) {
   40854                       UnallocatedA32(instr);
   40855                       return;
   40856                     }
   40857                     unsigned rn = ExtractQRegister(instr, 7, 16);
   40858                     if ((instr & 1) != 0) {
   40859                       UnallocatedA32(instr);
   40860                       return;
   40861                     }
   40862                     unsigned rm = ExtractQRegister(instr, 5, 0);
   40863                     // VMLS{<c>}{<q>}.F32 <Qd>, <Qn>, <Qm> ; A1
   40864                     vmls(al, F32, QRegister(rd), QRegister(rn), QRegister(rm));
   40865                     break;
   40866                   }
   40867                   case 0x01000000: {
   40868                     // 0xf3000d50
   40869                     if (((instr >> 12) & 1) != 0) {
   40870                       UnallocatedA32(instr);
   40871                       return;
   40872                     }
   40873                     unsigned rd = ExtractQRegister(instr, 22, 12);
   40874                     if (((instr >> 16) & 1) != 0) {
   40875                       UnallocatedA32(instr);
   40876                       return;
   40877                     }
   40878                     unsigned rn = ExtractQRegister(instr, 7, 16);
   40879                     if ((instr & 1) != 0) {
   40880                       UnallocatedA32(instr);
   40881                       return;
   40882                     }
   40883                     unsigned rm = ExtractQRegister(instr, 5, 0);
   40884                     // VMUL{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; A1
   40885                     vmul(al, F32, QRegister(rd), QRegister(rn), QRegister(rm));
   40886                     break;
   40887                   }
   40888                   default:
   40889                     UnallocatedA32(instr);
   40890                     break;
   40891                 }
   40892                 break;
   40893               }
   40894               case 0x00000e00: {
   40895                 // 0xf2000e10
   40896                 switch (instr & 0x01300000) {
   40897                   case 0x01000000: {
   40898                     // 0xf3000e10
   40899                     unsigned rd = ExtractDRegister(instr, 22, 12);
   40900                     unsigned rn = ExtractDRegister(instr, 7, 16);
   40901                     unsigned rm = ExtractDRegister(instr, 5, 0);
   40902                     // VACGE{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A1
   40903                     vacge(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
   40904                     break;
   40905                   }
   40906                   case 0x01200000: {
   40907                     // 0xf3200e10
   40908                     unsigned rd = ExtractDRegister(instr, 22, 12);
   40909                     unsigned rn = ExtractDRegister(instr, 7, 16);
   40910                     unsigned rm = ExtractDRegister(instr, 5, 0);
   40911                     // VACGT{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A1
   40912                     vacgt(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
   40913                     break;
   40914                   }
   40915                   default:
   40916                     UnallocatedA32(instr);
   40917                     break;
   40918                 }
   40919                 break;
   40920               }
   40921               case 0x00000e40: {
   40922                 // 0xf2000e50
   40923                 switch (instr & 0x01300000) {
   40924                   case 0x01000000: {
   40925                     // 0xf3000e50
   40926                     if (((instr >> 12) & 1) != 0) {
   40927                       UnallocatedA32(instr);
   40928                       return;
   40929                     }
   40930                     unsigned rd = ExtractQRegister(instr, 22, 12);
   40931                     if (((instr >> 16) & 1) != 0) {
   40932                       UnallocatedA32(instr);
   40933                       return;
   40934                     }
   40935                     unsigned rn = ExtractQRegister(instr, 7, 16);
   40936                     if ((instr & 1) != 0) {
   40937                       UnallocatedA32(instr);
   40938                       return;
   40939                     }
   40940                     unsigned rm = ExtractQRegister(instr, 5, 0);
   40941                     // VACGE{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; A1
   40942                     vacge(al, F32, QRegister(rd), QRegister(rn), QRegister(rm));
   40943                     break;
   40944                   }
   40945                   case 0x01200000: {
   40946                     // 0xf3200e50
   40947                     if (((instr >> 12) & 1) != 0) {
   40948                       UnallocatedA32(instr);
   40949                       return;
   40950                     }
   40951                     unsigned rd = ExtractQRegister(instr, 22, 12);
   40952                     if (((instr >> 16) & 1) != 0) {
   40953                       UnallocatedA32(instr);
   40954                       return;
   40955                     }
   40956                     unsigned rn = ExtractQRegister(instr, 7, 16);
   40957                     if ((instr & 1) != 0) {
   40958                       UnallocatedA32(instr);
   40959                       return;
   40960                     }
   40961                     unsigned rm = ExtractQRegister(instr, 5, 0);
   40962                     // VACGT{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; A1
   40963                     vacgt(al, F32, QRegister(rd), QRegister(rn), QRegister(rm));
   40964                     break;
   40965                   }
   40966                   default:
   40967                     UnallocatedA32(instr);
   40968                     break;
   40969                 }
   40970                 break;
   40971               }
   40972               case 0x00000f00: {
   40973                 // 0xf2000f10
   40974                 switch (instr & 0x01300000) {
   40975                   case 0x00000000: {
   40976                     // 0xf2000f10
   40977                     unsigned rd = ExtractDRegister(instr, 22, 12);
   40978                     unsigned rn = ExtractDRegister(instr, 7, 16);
   40979                     unsigned rm = ExtractDRegister(instr, 5, 0);
   40980                     // VRECPS{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A1
   40981                     vrecps(al,
   40982                            F32,
   40983                            DRegister(rd),
   40984                            DRegister(rn),
   40985                            DRegister(rm));
   40986                     break;
   40987                   }
   40988                   case 0x00200000: {
   40989                     // 0xf2200f10
   40990                     unsigned rd = ExtractDRegister(instr, 22, 12);
   40991                     unsigned rn = ExtractDRegister(instr, 7, 16);
   40992                     unsigned rm = ExtractDRegister(instr, 5, 0);
   40993                     // VRSQRTS{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A1
   40994                     vrsqrts(al,
   40995                             F32,
   40996                             DRegister(rd),
   40997                             DRegister(rn),
   40998                             DRegister(rm));
   40999                     break;
   41000                   }
   41001                   case 0x01000000: {
   41002                     // 0xf3000f10
   41003                     unsigned rd = ExtractDRegister(instr, 22, 12);
   41004                     unsigned rn = ExtractDRegister(instr, 7, 16);
   41005                     unsigned rm = ExtractDRegister(instr, 5, 0);
   41006                     // VMAXNM{<q>}.F32 <Dd>, <Dn>, <Dm> ; A1
   41007                     vmaxnm(F32, DRegister(rd), DRegister(rn), DRegister(rm));
   41008                     break;
   41009                   }
   41010                   case 0x01200000: {
   41011                     // 0xf3200f10
   41012                     unsigned rd = ExtractDRegister(instr, 22, 12);
   41013                     unsigned rn = ExtractDRegister(instr, 7, 16);
   41014                     unsigned rm = ExtractDRegister(instr, 5, 0);
   41015                     // VMINNM{<q>}.F32 <Dd>, <Dn>, <Dm> ; A1
   41016                     vminnm(F32, DRegister(rd), DRegister(rn), DRegister(rm));
   41017                     break;
   41018                   }
   41019                   default:
   41020                     UnallocatedA32(instr);
   41021                     break;
   41022                 }
   41023                 break;
   41024               }
   41025               case 0x00000f40: {
   41026                 // 0xf2000f50
   41027                 switch (instr & 0x01300000) {
   41028                   case 0x00000000: {
   41029                     // 0xf2000f50
   41030                     if (((instr >> 12) & 1) != 0) {
   41031                       UnallocatedA32(instr);
   41032                       return;
   41033                     }
   41034                     unsigned rd = ExtractQRegister(instr, 22, 12);
   41035                     if (((instr >> 16) & 1) != 0) {
   41036                       UnallocatedA32(instr);
   41037                       return;
   41038                     }
   41039                     unsigned rn = ExtractQRegister(instr, 7, 16);
   41040                     if ((instr & 1) != 0) {
   41041                       UnallocatedA32(instr);
   41042                       return;
   41043                     }
   41044                     unsigned rm = ExtractQRegister(instr, 5, 0);
   41045                     // VRECPS{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; A1
   41046                     vrecps(al,
   41047                            F32,
   41048                            QRegister(rd),
   41049                            QRegister(rn),
   41050                            QRegister(rm));
   41051                     break;
   41052                   }
   41053                   case 0x00200000: {
   41054                     // 0xf2200f50
   41055                     if (((instr >> 12) & 1) != 0) {
   41056                       UnallocatedA32(instr);
   41057                       return;
   41058                     }
   41059                     unsigned rd = ExtractQRegister(instr, 22, 12);
   41060                     if (((instr >> 16) & 1) != 0) {
   41061                       UnallocatedA32(instr);
   41062                       return;
   41063                     }
   41064                     unsigned rn = ExtractQRegister(instr, 7, 16);
   41065                     if ((instr & 1) != 0) {
   41066                       UnallocatedA32(instr);
   41067                       return;
   41068                     }
   41069                     unsigned rm = ExtractQRegister(instr, 5, 0);
   41070                     // VRSQRTS{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; A1
   41071                     vrsqrts(al,
   41072                             F32,
   41073                             QRegister(rd),
   41074                             QRegister(rn),
   41075                             QRegister(rm));
   41076                     break;
   41077                   }
   41078                   case 0x01000000: {
   41079                     // 0xf3000f50
   41080                     if (((instr >> 12) & 1) != 0) {
   41081                       UnallocatedA32(instr);
   41082                       return;
   41083                     }
   41084                     unsigned rd = ExtractQRegister(instr, 22, 12);
   41085                     if (((instr >> 16) & 1) != 0) {
   41086                       UnallocatedA32(instr);
   41087                       return;
   41088                     }
   41089                     unsigned rn = ExtractQRegister(instr, 7, 16);
   41090                     if ((instr & 1) != 0) {
   41091                       UnallocatedA32(instr);
   41092                       return;
   41093                     }
   41094                     unsigned rm = ExtractQRegister(instr, 5, 0);
   41095                     // VMAXNM{<q>}.F32 <Qd>, <Qn>, <Qm> ; A1
   41096                     vmaxnm(F32, QRegister(rd), QRegister(rn), QRegister(rm));
   41097                     break;
   41098                   }
   41099                   case 0x01200000: {
   41100                     // 0xf3200f50
   41101                     if (((instr >> 12) & 1) != 0) {
   41102                       UnallocatedA32(instr);
   41103                       return;
   41104                     }
   41105                     unsigned rd = ExtractQRegister(instr, 22, 12);
   41106                     if (((instr >> 16) & 1) != 0) {
   41107                       UnallocatedA32(instr);
   41108                       return;
   41109                     }
   41110                     unsigned rn = ExtractQRegister(instr, 7, 16);
   41111                     if ((instr & 1) != 0) {
   41112                       UnallocatedA32(instr);
   41113                       return;
   41114                     }
   41115                     unsigned rm = ExtractQRegister(instr, 5, 0);
   41116                     // VMINNM{<q>}.F32 <Qd>, <Qn>, <Qm> ; A1
   41117                     vminnm(F32, QRegister(rd), QRegister(rn), QRegister(rm));
   41118                     break;
   41119                   }
   41120                   default:
   41121                     UnallocatedA32(instr);
   41122                     break;
   41123                 }
   41124                 break;
   41125               }
   41126               default:
   41127                 UnallocatedA32(instr);
   41128                 break;
   41129             }
   41130             break;
   41131           }
   41132           case 0x00800000: {
   41133             // 0xf2800000
   41134             switch (instr & 0x00300000) {
   41135               case 0x00300000: {
   41136                 // 0xf2b00000
   41137                 switch (instr & 0x01000000) {
   41138                   case 0x00000000: {
   41139                     // 0xf2b00000
   41140                     switch (instr & 0x00000040) {
   41141                       case 0x00000000: {
   41142                         // 0xf2b00000
   41143                         if (((instr & 0x800) == 0x800)) {
   41144                           UnallocatedA32(instr);
   41145                           return;
   41146                         }
   41147                         unsigned rd = ExtractDRegister(instr, 22, 12);
   41148                         unsigned rn = ExtractDRegister(instr, 7, 16);
   41149                         unsigned rm = ExtractDRegister(instr, 5, 0);
   41150                         uint32_t imm = (instr >> 8) & 0xf;
   41151                         // VEXT{<c>}{<q>}.8 {<Dd>}, <Dn>, <Dm>, #<imm> ; A1
   41152                         vext(al,
   41153                              Untyped8,
   41154                              DRegister(rd),
   41155                              DRegister(rn),
   41156                              DRegister(rm),
   41157                              imm);
   41158                         break;
   41159                       }
   41160                       case 0x00000040: {
   41161                         // 0xf2b00040
   41162                         if (((instr >> 12) & 1) != 0) {
   41163                           UnallocatedA32(instr);
   41164                           return;
   41165                         }
   41166                         unsigned rd = ExtractQRegister(instr, 22, 12);
   41167                         if (((instr >> 16) & 1) != 0) {
   41168                           UnallocatedA32(instr);
   41169                           return;
   41170                         }
   41171                         unsigned rn = ExtractQRegister(instr, 7, 16);
   41172                         if ((instr & 1) != 0) {
   41173                           UnallocatedA32(instr);
   41174                           return;
   41175                         }
   41176                         unsigned rm = ExtractQRegister(instr, 5, 0);
   41177                         uint32_t imm = (instr >> 8) & 0xf;
   41178                         // VEXT{<c>}{<q>}.8 {<Qd>}, <Qn>, <Qm>, #<imm> ; A1
   41179                         vext(al,
   41180                              Untyped8,
   41181                              QRegister(rd),
   41182                              QRegister(rn),
   41183                              QRegister(rm),
   41184                              imm);
   41185                         break;
   41186                       }
   41187                     }
   41188                     break;
   41189                   }
   41190                   case 0x01000000: {
   41191                     // 0xf3b00000
   41192                     switch (instr & 0x00000800) {
   41193                       case 0x00000000: {
   41194                         // 0xf3b00000
   41195                         switch (instr & 0x00030200) {
   41196                           case 0x00000000: {
   41197                             // 0xf3b00000
   41198                             switch (instr & 0x000005c0) {
   41199                               case 0x00000000: {
   41200                                 // 0xf3b00000
   41201                                 DataType dt =
   41202                                     Dt_size_7_Decode((instr >> 18) & 0x3);
   41203                                 if (dt.Is(kDataTypeValueInvalid)) {
   41204                                   UnallocatedA32(instr);
   41205                                   return;
   41206                                 }
   41207                                 unsigned rd = ExtractDRegister(instr, 22, 12);
   41208                                 unsigned rm = ExtractDRegister(instr, 5, 0);
   41209                                 // VREV64{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
   41210                                 vrev64(al, dt, DRegister(rd), DRegister(rm));
   41211                                 break;
   41212                               }
   41213                               case 0x00000040: {
   41214                                 // 0xf3b00040
   41215                                 DataType dt =
   41216                                     Dt_size_7_Decode((instr >> 18) & 0x3);
   41217                                 if (dt.Is(kDataTypeValueInvalid)) {
   41218                                   UnallocatedA32(instr);
   41219                                   return;
   41220                                 }
   41221                                 if (((instr >> 12) & 1) != 0) {
   41222                                   UnallocatedA32(instr);
   41223                                   return;
   41224                                 }
   41225                                 unsigned rd = ExtractQRegister(instr, 22, 12);
   41226                                 if ((instr & 1) != 0) {
   41227                                   UnallocatedA32(instr);
   41228                                   return;
   41229                                 }
   41230                                 unsigned rm = ExtractQRegister(instr, 5, 0);
   41231                                 // VREV64{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
   41232                                 vrev64(al, dt, QRegister(rd), QRegister(rm));
   41233                                 break;
   41234                               }
   41235                               case 0x00000080: {
   41236                                 // 0xf3b00080
   41237                                 DataType dt =
   41238                                     Dt_size_15_Decode((instr >> 18) & 0x3);
   41239                                 if (dt.Is(kDataTypeValueInvalid)) {
   41240                                   UnallocatedA32(instr);
   41241                                   return;
   41242                                 }
   41243                                 unsigned rd = ExtractDRegister(instr, 22, 12);
   41244                                 unsigned rm = ExtractDRegister(instr, 5, 0);
   41245                                 // VREV32{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
   41246                                 vrev32(al, dt, DRegister(rd), DRegister(rm));
   41247                                 break;
   41248                               }
   41249                               case 0x000000c0: {
   41250                                 // 0xf3b000c0
   41251                                 DataType dt =
   41252                                     Dt_size_15_Decode((instr >> 18) & 0x3);
   41253                                 if (dt.Is(kDataTypeValueInvalid)) {
   41254                                   UnallocatedA32(instr);
   41255                                   return;
   41256                                 }
   41257                                 if (((instr >> 12) & 1) != 0) {
   41258                                   UnallocatedA32(instr);
   41259                                   return;
   41260                                 }
   41261                                 unsigned rd = ExtractQRegister(instr, 22, 12);
   41262                                 if ((instr & 1) != 0) {
   41263                                   UnallocatedA32(instr);
   41264                                   return;
   41265                                 }
   41266                                 unsigned rm = ExtractQRegister(instr, 5, 0);
   41267                                 // VREV32{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
   41268                                 vrev32(al, dt, QRegister(rd), QRegister(rm));
   41269                                 break;
   41270                               }
   41271                               case 0x00000100: {
   41272                                 // 0xf3b00100
   41273                                 DataType dt =
   41274                                     Dt_size_1_Decode((instr >> 18) & 0x3);
   41275                                 if (dt.Is(kDataTypeValueInvalid)) {
   41276                                   UnallocatedA32(instr);
   41277                                   return;
   41278                                 }
   41279                                 unsigned rd = ExtractDRegister(instr, 22, 12);
   41280                                 unsigned rm = ExtractDRegister(instr, 5, 0);
   41281                                 // VREV16{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
   41282                                 vrev16(al, dt, DRegister(rd), DRegister(rm));
   41283                                 break;
   41284                               }
   41285                               case 0x00000140: {
   41286                                 // 0xf3b00140
   41287                                 DataType dt =
   41288                                     Dt_size_1_Decode((instr >> 18) & 0x3);
   41289                                 if (dt.Is(kDataTypeValueInvalid)) {
   41290                                   UnallocatedA32(instr);
   41291                                   return;
   41292                                 }
   41293                                 if (((instr >> 12) & 1) != 0) {
   41294                                   UnallocatedA32(instr);
   41295                                   return;
   41296                                 }
   41297                                 unsigned rd = ExtractQRegister(instr, 22, 12);
   41298                                 if ((instr & 1) != 0) {
   41299                                   UnallocatedA32(instr);
   41300                                   return;
   41301                                 }
   41302                                 unsigned rm = ExtractQRegister(instr, 5, 0);
   41303                                 // VREV16{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
   41304                                 vrev16(al, dt, QRegister(rd), QRegister(rm));
   41305                                 break;
   41306                               }
   41307                               case 0x00000400: {
   41308                                 // 0xf3b00400
   41309                                 DataType dt =
   41310                                     Dt_size_5_Decode((instr >> 18) & 0x3);
   41311                                 if (dt.Is(kDataTypeValueInvalid)) {
   41312                                   UnallocatedA32(instr);
   41313                                   return;
   41314                                 }
   41315                                 unsigned rd = ExtractDRegister(instr, 22, 12);
   41316                                 unsigned rm = ExtractDRegister(instr, 5, 0);
   41317                                 // VCLS{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
   41318                                 vcls(al, dt, DRegister(rd), DRegister(rm));
   41319                                 break;
   41320                               }
   41321                               case 0x00000440: {
   41322                                 // 0xf3b00440
   41323                                 DataType dt =
   41324                                     Dt_size_5_Decode((instr >> 18) & 0x3);
   41325                                 if (dt.Is(kDataTypeValueInvalid)) {
   41326                                   UnallocatedA32(instr);
   41327                                   return;
   41328                                 }
   41329                                 if (((instr >> 12) & 1) != 0) {
   41330                                   UnallocatedA32(instr);
   41331                                   return;
   41332                                 }
   41333                                 unsigned rd = ExtractQRegister(instr, 22, 12);
   41334                                 if ((instr & 1) != 0) {
   41335                                   UnallocatedA32(instr);
   41336                                   return;
   41337                                 }
   41338                                 unsigned rm = ExtractQRegister(instr, 5, 0);
   41339                                 // VCLS{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
   41340                                 vcls(al, dt, QRegister(rd), QRegister(rm));
   41341                                 break;
   41342                               }
   41343                               case 0x00000480: {
   41344                                 // 0xf3b00480
   41345                                 DataType dt =
   41346                                     Dt_size_4_Decode((instr >> 18) & 0x3);
   41347                                 if (dt.Is(kDataTypeValueInvalid)) {
   41348                                   UnallocatedA32(instr);
   41349                                   return;
   41350                                 }
   41351                                 unsigned rd = ExtractDRegister(instr, 22, 12);
   41352                                 unsigned rm = ExtractDRegister(instr, 5, 0);
   41353                                 // VCLZ{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
   41354                                 vclz(al, dt, DRegister(rd), DRegister(rm));
   41355                                 break;
   41356                               }
   41357                               case 0x000004c0: {
   41358                                 // 0xf3b004c0
   41359                                 DataType dt =
   41360                                     Dt_size_4_Decode((instr >> 18) & 0x3);
   41361                                 if (dt.Is(kDataTypeValueInvalid)) {
   41362                                   UnallocatedA32(instr);
   41363                                   return;
   41364                                 }
   41365                                 if (((instr >> 12) & 1) != 0) {
   41366                                   UnallocatedA32(instr);
   41367                                   return;
   41368                                 }
   41369                                 unsigned rd = ExtractQRegister(instr, 22, 12);
   41370                                 if ((instr & 1) != 0) {
   41371                                   UnallocatedA32(instr);
   41372                                   return;
   41373                                 }
   41374                                 unsigned rm = ExtractQRegister(instr, 5, 0);
   41375                                 // VCLZ{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
   41376                                 vclz(al, dt, QRegister(rd), QRegister(rm));
   41377                                 break;
   41378                               }
   41379                               case 0x00000500: {
   41380                                 // 0xf3b00500
   41381                                 if ((instr & 0x000c0000) == 0x00000000) {
   41382                                   unsigned rd = ExtractDRegister(instr, 22, 12);
   41383                                   unsigned rm = ExtractDRegister(instr, 5, 0);
   41384                                   // VCNT{<c>}{<q>}.8 <Dd>, <Dm> ; A1
   41385                                   vcnt(al,
   41386                                        Untyped8,
   41387                                        DRegister(rd),
   41388                                        DRegister(rm));
   41389                                 } else {
   41390                                   UnallocatedA32(instr);
   41391                                 }
   41392                                 break;
   41393                               }
   41394                               case 0x00000540: {
   41395                                 // 0xf3b00540
   41396                                 if ((instr & 0x000c0000) == 0x00000000) {
   41397                                   if (((instr >> 12) & 1) != 0) {
   41398                                     UnallocatedA32(instr);
   41399                                     return;
   41400                                   }
   41401                                   unsigned rd = ExtractQRegister(instr, 22, 12);
   41402                                   if ((instr & 1) != 0) {
   41403                                     UnallocatedA32(instr);
   41404                                     return;
   41405                                   }
   41406                                   unsigned rm = ExtractQRegister(instr, 5, 0);
   41407                                   // VCNT{<c>}{<q>}.8 <Qd>, <Qm> ; A1
   41408                                   vcnt(al,
   41409                                        Untyped8,
   41410                                        QRegister(rd),
   41411                                        QRegister(rm));
   41412                                 } else {
   41413                                   UnallocatedA32(instr);
   41414                                 }
   41415                                 break;
   41416                               }
   41417                               case 0x00000580: {
   41418                                 // 0xf3b00580
   41419                                 if ((instr & 0x000c0000) == 0x00000000) {
   41420                                   unsigned rd = ExtractDRegister(instr, 22, 12);
   41421                                   unsigned rm = ExtractDRegister(instr, 5, 0);
   41422                                   // VMVN{<c>}{<q>}{.<dt>} <Dd>, <Dm> ; A1
   41423                                   vmvn(al,
   41424                                        kDataTypeValueNone,
   41425                                        DRegister(rd),
   41426                                        DRegister(rm));
   41427                                 } else {
   41428                                   UnallocatedA32(instr);
   41429                                 }
   41430                                 break;
   41431                               }
   41432                               case 0x000005c0: {
   41433                                 // 0xf3b005c0
   41434                                 if ((instr & 0x000c0000) == 0x00000000) {
   41435                                   if (((instr >> 12) & 1) != 0) {
   41436                                     UnallocatedA32(instr);
   41437                                     return;
   41438                                   }
   41439                                   unsigned rd = ExtractQRegister(instr, 22, 12);
   41440                                   if ((instr & 1) != 0) {
   41441                                     UnallocatedA32(instr);
   41442                                     return;
   41443                                   }
   41444                                   unsigned rm = ExtractQRegister(instr, 5, 0);
   41445                                   // VMVN{<c>}{<q>}{.<dt>} <Qd>, <Qm> ; A1
   41446                                   vmvn(al,
   41447                                        kDataTypeValueNone,
   41448                                        QRegister(rd),
   41449                                        QRegister(rm));
   41450                                 } else {
   41451                                   UnallocatedA32(instr);
   41452                                 }
   41453                                 break;
   41454                               }
   41455                               default:
   41456                                 UnallocatedA32(instr);
   41457                                 break;
   41458                             }
   41459                             break;
   41460                           }
   41461                           case 0x00000200: {
   41462                             // 0xf3b00200
   41463                             switch (instr & 0x00000540) {
   41464                               case 0x00000000: {
   41465                                 // 0xf3b00200
   41466                                 DataType dt =
   41467                                     Dt_op_size_2_Decode(((instr >> 18) & 0x3) |
   41468                                                         ((instr >> 5) & 0x4));
   41469                                 if (dt.Is(kDataTypeValueInvalid)) {
   41470                                   UnallocatedA32(instr);
   41471                                   return;
   41472                                 }
   41473                                 unsigned rd = ExtractDRegister(instr, 22, 12);
   41474                                 unsigned rm = ExtractDRegister(instr, 5, 0);
   41475                                 // VPADDL{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
   41476                                 vpaddl(al, dt, DRegister(rd), DRegister(rm));
   41477                                 break;
   41478                               }
   41479                               case 0x00000040: {
   41480                                 // 0xf3b00240
   41481                                 DataType dt =
   41482                                     Dt_op_size_2_Decode(((instr >> 18) & 0x3) |
   41483                                                         ((instr >> 5) & 0x4));
   41484                                 if (dt.Is(kDataTypeValueInvalid)) {
   41485                                   UnallocatedA32(instr);
   41486                                   return;
   41487                                 }
   41488                                 if (((instr >> 12) & 1) != 0) {
   41489                                   UnallocatedA32(instr);
   41490                                   return;
   41491                                 }
   41492                                 unsigned rd = ExtractQRegister(instr, 22, 12);
   41493                                 if ((instr & 1) != 0) {
   41494                                   UnallocatedA32(instr);
   41495                                   return;
   41496                                 }
   41497                                 unsigned rm = ExtractQRegister(instr, 5, 0);
   41498                                 // VPADDL{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
   41499                                 vpaddl(al, dt, QRegister(rd), QRegister(rm));
   41500                                 break;
   41501                               }
   41502                               case 0x00000100: {
   41503                                 // 0xf3b00300
   41504                                 switch (instr & 0x00000080) {
   41505                                   case 0x00000000: {
   41506                                     // 0xf3b00300
   41507                                     UnimplementedA32("AESE", instr);
   41508                                     break;
   41509                                   }
   41510                                   case 0x00000080: {
   41511                                     // 0xf3b00380
   41512                                     UnimplementedA32("AESMC", instr);
   41513                                     break;
   41514                                   }
   41515                                 }
   41516                                 break;
   41517                               }
   41518                               case 0x00000140: {
   41519                                 // 0xf3b00340
   41520                                 switch (instr & 0x00000080) {
   41521                                   case 0x00000000: {
   41522                                     // 0xf3b00340
   41523                                     UnimplementedA32("AESD", instr);
   41524                                     break;
   41525                                   }
   41526                                   case 0x00000080: {
   41527                                     // 0xf3b003c0
   41528                                     UnimplementedA32("AESIMC", instr);
   41529                                     break;
   41530                                   }
   41531                                 }
   41532                                 break;
   41533                               }
   41534                               case 0x00000400: {
   41535                                 // 0xf3b00600
   41536                                 DataType dt =
   41537                                     Dt_op_size_2_Decode(((instr >> 18) & 0x3) |
   41538                                                         ((instr >> 5) & 0x4));
   41539                                 if (dt.Is(kDataTypeValueInvalid)) {
   41540                                   UnallocatedA32(instr);
   41541                                   return;
   41542                                 }
   41543                                 unsigned rd = ExtractDRegister(instr, 22, 12);
   41544                                 unsigned rm = ExtractDRegister(instr, 5, 0);
   41545                                 // VPADAL{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
   41546                                 vpadal(al, dt, DRegister(rd), DRegister(rm));
   41547                                 break;
   41548                               }
   41549                               case 0x00000440: {
   41550                                 // 0xf3b00640
   41551                                 DataType dt =
   41552                                     Dt_op_size_2_Decode(((instr >> 18) & 0x3) |
   41553                                                         ((instr >> 5) & 0x4));
   41554                                 if (dt.Is(kDataTypeValueInvalid)) {
   41555                                   UnallocatedA32(instr);
   41556                                   return;
   41557                                 }
   41558                                 if (((instr >> 12) & 1) != 0) {
   41559                                   UnallocatedA32(instr);
   41560                                   return;
   41561                                 }
   41562                                 unsigned rd = ExtractQRegister(instr, 22, 12);
   41563                                 if ((instr & 1) != 0) {
   41564                                   UnallocatedA32(instr);
   41565                                   return;
   41566                                 }
   41567                                 unsigned rm = ExtractQRegister(instr, 5, 0);
   41568                                 // VPADAL{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
   41569                                 vpadal(al, dt, QRegister(rd), QRegister(rm));
   41570                                 break;
   41571                               }
   41572                               case 0x00000500: {
   41573                                 // 0xf3b00700
   41574                                 switch (instr & 0x00000080) {
   41575                                   case 0x00000000: {
   41576                                     // 0xf3b00700
   41577                                     DataType dt =
   41578                                         Dt_size_5_Decode((instr >> 18) & 0x3);
   41579                                     if (dt.Is(kDataTypeValueInvalid)) {
   41580                                       UnallocatedA32(instr);
   41581                                       return;
   41582                                     }
   41583                                     unsigned rd =
   41584                                         ExtractDRegister(instr, 22, 12);
   41585                                     unsigned rm = ExtractDRegister(instr, 5, 0);
   41586                                     // VQABS{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
   41587                                     vqabs(al, dt, DRegister(rd), DRegister(rm));
   41588                                     break;
   41589                                   }
   41590                                   case 0x00000080: {
   41591                                     // 0xf3b00780
   41592                                     DataType dt =
   41593                                         Dt_size_5_Decode((instr >> 18) & 0x3);
   41594                                     if (dt.Is(kDataTypeValueInvalid)) {
   41595                                       UnallocatedA32(instr);
   41596                                       return;
   41597                                     }
   41598                                     unsigned rd =
   41599                                         ExtractDRegister(instr, 22, 12);
   41600                                     unsigned rm = ExtractDRegister(instr, 5, 0);
   41601                                     // VQNEG{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
   41602                                     vqneg(al, dt, DRegister(rd), DRegister(rm));
   41603                                     break;
   41604                                   }
   41605                                 }
   41606                                 break;
   41607                               }
   41608                               case 0x00000540: {
   41609                                 // 0xf3b00740
   41610                                 switch (instr & 0x00000080) {
   41611                                   case 0x00000000: {
   41612                                     // 0xf3b00740
   41613                                     DataType dt =
   41614                                         Dt_size_5_Decode((instr >> 18) & 0x3);
   41615                                     if (dt.Is(kDataTypeValueInvalid)) {
   41616                                       UnallocatedA32(instr);
   41617                                       return;
   41618                                     }
   41619                                     if (((instr >> 12) & 1) != 0) {
   41620                                       UnallocatedA32(instr);
   41621                                       return;
   41622                                     }
   41623                                     unsigned rd =
   41624                                         ExtractQRegister(instr, 22, 12);
   41625                                     if ((instr & 1) != 0) {
   41626                                       UnallocatedA32(instr);
   41627                                       return;
   41628                                     }
   41629                                     unsigned rm = ExtractQRegister(instr, 5, 0);
   41630                                     // VQABS{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
   41631                                     vqabs(al, dt, QRegister(rd), QRegister(rm));
   41632                                     break;
   41633                                   }
   41634                                   case 0x00000080: {
   41635                                     // 0xf3b007c0
   41636                                     DataType dt =
   41637                                         Dt_size_5_Decode((instr >> 18) & 0x3);
   41638                                     if (dt.Is(kDataTypeValueInvalid)) {
   41639                                       UnallocatedA32(instr);
   41640                                       return;
   41641                                     }
   41642                                     if (((instr >> 12) & 1) != 0) {
   41643                                       UnallocatedA32(instr);
   41644                                       return;
   41645                                     }
   41646                                     unsigned rd =
   41647                                         ExtractQRegister(instr, 22, 12);
   41648                                     if ((instr & 1) != 0) {
   41649                                       UnallocatedA32(instr);
   41650                                       return;
   41651                                     }
   41652                                     unsigned rm = ExtractQRegister(instr, 5, 0);
   41653                                     // VQNEG{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
   41654                                     vqneg(al, dt, QRegister(rd), QRegister(rm));
   41655                                     break;
   41656                                   }
   41657                                 }
   41658                                 break;
   41659                               }
   41660                             }
   41661                             break;
   41662                           }
   41663                           case 0x00010000: {
   41664                             // 0xf3b10000
   41665                             switch (instr & 0x000001c0) {
   41666                               case 0x00000000: {
   41667                                 // 0xf3b10000
   41668                                 DataType dt =
   41669                                     Dt_F_size_1_Decode(((instr >> 18) & 0x3) |
   41670                                                        ((instr >> 8) & 0x4));
   41671                                 if (dt.Is(kDataTypeValueInvalid)) {
   41672                                   UnallocatedA32(instr);
   41673                                   return;
   41674                                 }
   41675                                 unsigned rd = ExtractDRegister(instr, 22, 12);
   41676                                 unsigned rm = ExtractDRegister(instr, 5, 0);
   41677                                 // VCGT{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #0 ; A1
   41678                                 vcgt(al,
   41679                                      dt,
   41680                                      DRegister(rd),
   41681                                      DRegister(rm),
   41682                                      UINT32_C(0));
   41683                                 break;
   41684                               }
   41685                               case 0x00000040: {
   41686                                 // 0xf3b10040
   41687                                 DataType dt =
   41688                                     Dt_F_size_1_Decode(((instr >> 18) & 0x3) |
   41689                                                        ((instr >> 8) & 0x4));
   41690                                 if (dt.Is(kDataTypeValueInvalid)) {
   41691                                   UnallocatedA32(instr);
   41692                                   return;
   41693                                 }
   41694                                 if (((instr >> 12) & 1) != 0) {
   41695                                   UnallocatedA32(instr);
   41696                                   return;
   41697                                 }
   41698                                 unsigned rd = ExtractQRegister(instr, 22, 12);
   41699                                 if ((instr & 1) != 0) {
   41700                                   UnallocatedA32(instr);
   41701                                   return;
   41702                                 }
   41703                                 unsigned rm = ExtractQRegister(instr, 5, 0);
   41704                                 // VCGT{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #0 ; A1
   41705                                 vcgt(al,
   41706                                      dt,
   41707                                      QRegister(rd),
   41708                                      QRegister(rm),
   41709                                      UINT32_C(0));
   41710                                 break;
   41711                               }
   41712                               case 0x00000080: {
   41713                                 // 0xf3b10080
   41714                                 DataType dt =
   41715                                     Dt_F_size_1_Decode(((instr >> 18) & 0x3) |
   41716                                                        ((instr >> 8) & 0x4));
   41717                                 if (dt.Is(kDataTypeValueInvalid)) {
   41718                                   UnallocatedA32(instr);
   41719                                   return;
   41720                                 }
   41721                                 unsigned rd = ExtractDRegister(instr, 22, 12);
   41722                                 unsigned rm = ExtractDRegister(instr, 5, 0);
   41723                                 // VCGE{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #0 ; A1
   41724                                 vcge(al,
   41725                                      dt,
   41726                                      DRegister(rd),
   41727                                      DRegister(rm),
   41728                                      UINT32_C(0));
   41729                                 break;
   41730                               }
   41731                               case 0x000000c0: {
   41732                                 // 0xf3b100c0
   41733                                 DataType dt =
   41734                                     Dt_F_size_1_Decode(((instr >> 18) & 0x3) |
   41735                                                        ((instr >> 8) & 0x4));
   41736                                 if (dt.Is(kDataTypeValueInvalid)) {
   41737                                   UnallocatedA32(instr);
   41738                                   return;
   41739                                 }
   41740                                 if (((instr >> 12) & 1) != 0) {
   41741                                   UnallocatedA32(instr);
   41742                                   return;
   41743                                 }
   41744                                 unsigned rd = ExtractQRegister(instr, 22, 12);
   41745                                 if ((instr & 1) != 0) {
   41746                                   UnallocatedA32(instr);
   41747                                   return;
   41748                                 }
   41749                                 unsigned rm = ExtractQRegister(instr, 5, 0);
   41750                                 // VCGE{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #0 ; A1
   41751                                 vcge(al,
   41752                                      dt,
   41753                                      QRegister(rd),
   41754                                      QRegister(rm),
   41755                                      UINT32_C(0));
   41756                                 break;
   41757                               }
   41758                               case 0x00000100: {
   41759                                 // 0xf3b10100
   41760                                 DataType dt =
   41761                                     Dt_F_size_2_Decode(((instr >> 18) & 0x3) |
   41762                                                        ((instr >> 8) & 0x4));
   41763                                 if (dt.Is(kDataTypeValueInvalid)) {
   41764                                   UnallocatedA32(instr);
   41765                                   return;
   41766                                 }
   41767                                 unsigned rd = ExtractDRegister(instr, 22, 12);
   41768                                 unsigned rm = ExtractDRegister(instr, 5, 0);
   41769                                 // VCEQ{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #0 ; A1
   41770                                 vceq(al,
   41771                                      dt,
   41772                                      DRegister(rd),
   41773                                      DRegister(rm),
   41774                                      UINT32_C(0));
   41775                                 break;
   41776                               }
   41777                               case 0x00000140: {
   41778                                 // 0xf3b10140
   41779                                 DataType dt =
   41780                                     Dt_F_size_2_Decode(((instr >> 18) & 0x3) |
   41781                                                        ((instr >> 8) & 0x4));
   41782                                 if (dt.Is(kDataTypeValueInvalid)) {
   41783                                   UnallocatedA32(instr);
   41784                                   return;
   41785                                 }
   41786                                 if (((instr >> 12) & 1) != 0) {
   41787                                   UnallocatedA32(instr);
   41788                                   return;
   41789                                 }
   41790                                 unsigned rd = ExtractQRegister(instr, 22, 12);
   41791                                 if ((instr & 1) != 0) {
   41792                                   UnallocatedA32(instr);
   41793                                   return;
   41794                                 }
   41795                                 unsigned rm = ExtractQRegister(instr, 5, 0);
   41796                                 // VCEQ{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #0 ; A1
   41797                                 vceq(al,
   41798                                      dt,
   41799                                      QRegister(rd),
   41800                                      QRegister(rm),
   41801                                      UINT32_C(0));
   41802                                 break;
   41803                               }
   41804                               case 0x00000180: {
   41805                                 // 0xf3b10180
   41806                                 DataType dt =
   41807                                     Dt_F_size_1_Decode(((instr >> 18) & 0x3) |
   41808                                                        ((instr >> 8) & 0x4));
   41809                                 if (dt.Is(kDataTypeValueInvalid)) {
   41810                                   UnallocatedA32(instr);
   41811                                   return;
   41812                                 }
   41813                                 unsigned rd = ExtractDRegister(instr, 22, 12);
   41814                                 unsigned rm = ExtractDRegister(instr, 5, 0);
   41815                                 // VCLE{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #0 ; A1
   41816                                 vcle(al,
   41817                                      dt,
   41818                                      DRegister(rd),
   41819                                      DRegister(rm),
   41820                                      UINT32_C(0));
   41821                                 break;
   41822                               }
   41823                               case 0x000001c0: {
   41824                                 // 0xf3b101c0
   41825                                 DataType dt =
   41826                                     Dt_F_size_1_Decode(((instr >> 18) & 0x3) |
   41827                                                        ((instr >> 8) & 0x4));
   41828                                 if (dt.Is(kDataTypeValueInvalid)) {
   41829                                   UnallocatedA32(instr);
   41830                                   return;
   41831                                 }
   41832                                 if (((instr >> 12) & 1) != 0) {
   41833                                   UnallocatedA32(instr);
   41834                                   return;
   41835                                 }
   41836                                 unsigned rd = ExtractQRegister(instr, 22, 12);
   41837                                 if ((instr & 1) != 0) {
   41838                                   UnallocatedA32(instr);
   41839                                   return;
   41840                                 }
   41841                                 unsigned rm = ExtractQRegister(instr, 5, 0);
   41842                                 // VCLE{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #0 ; A1
   41843                                 vcle(al,
   41844                                      dt,
   41845                                      QRegister(rd),
   41846                                      QRegister(rm),
   41847                                      UINT32_C(0));
   41848                                 break;
   41849                               }
   41850                             }
   41851                             break;
   41852                           }
   41853                           case 0x00010200: {
   41854                             // 0xf3b10200
   41855                             switch (instr & 0x000001c0) {
   41856                               case 0x00000000: {
   41857                                 // 0xf3b10200
   41858                                 DataType dt =
   41859                                     Dt_F_size_1_Decode(((instr >> 18) & 0x3) |
   41860                                                        ((instr >> 8) & 0x4));
   41861                                 if (dt.Is(kDataTypeValueInvalid)) {
   41862                                   UnallocatedA32(instr);
   41863                                   return;
   41864                                 }
   41865                                 unsigned rd = ExtractDRegister(instr, 22, 12);
   41866                                 unsigned rm = ExtractDRegister(instr, 5, 0);
   41867                                 // VCLT{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #0 ; A1
   41868                                 vclt(al,
   41869                                      dt,
   41870                                      DRegister(rd),
   41871                                      DRegister(rm),
   41872                                      UINT32_C(0));
   41873                                 break;
   41874                               }
   41875                               case 0x00000040: {
   41876                                 // 0xf3b10240
   41877                                 DataType dt =
   41878                                     Dt_F_size_1_Decode(((instr >> 18) & 0x3) |
   41879                                                        ((instr >> 8) & 0x4));
   41880                                 if (dt.Is(kDataTypeValueInvalid)) {
   41881                                   UnallocatedA32(instr);
   41882                                   return;
   41883                                 }
   41884                                 if (((instr >> 12) & 1) != 0) {
   41885                                   UnallocatedA32(instr);
   41886                                   return;
   41887                                 }
   41888                                 unsigned rd = ExtractQRegister(instr, 22, 12);
   41889                                 if ((instr & 1) != 0) {
   41890                                   UnallocatedA32(instr);
   41891                                   return;
   41892                                 }
   41893                                 unsigned rm = ExtractQRegister(instr, 5, 0);
   41894                                 // VCLT{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #0 ; A1
   41895                                 vclt(al,
   41896                                      dt,
   41897                                      QRegister(rd),
   41898                                      QRegister(rm),
   41899                                      UINT32_C(0));
   41900                                 break;
   41901                               }
   41902                               case 0x000000c0: {
   41903                                 // 0xf3b102c0
   41904                                 if ((instr & 0x000c0400) == 0x00080000) {
   41905                                   UnimplementedA32("SHA1H", instr);
   41906                                 } else {
   41907                                   UnallocatedA32(instr);
   41908                                 }
   41909                                 break;
   41910                               }
   41911                               case 0x00000100: {
   41912                                 // 0xf3b10300
   41913                                 DataType dt =
   41914                                     Dt_F_size_1_Decode(((instr >> 18) & 0x3) |
   41915                                                        ((instr >> 8) & 0x4));
   41916                                 if (dt.Is(kDataTypeValueInvalid)) {
   41917                                   UnallocatedA32(instr);
   41918                                   return;
   41919                                 }
   41920                                 unsigned rd = ExtractDRegister(instr, 22, 12);
   41921                                 unsigned rm = ExtractDRegister(instr, 5, 0);
   41922                                 // VABS{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
   41923                                 vabs(al, dt, DRegister(rd), DRegister(rm));
   41924                                 break;
   41925                               }
   41926                               case 0x00000140: {
   41927                                 // 0xf3b10340
   41928                                 DataType dt =
   41929                                     Dt_F_size_1_Decode(((instr >> 18) & 0x3) |
   41930                                                        ((instr >> 8) & 0x4));
   41931                                 if (dt.Is(kDataTypeValueInvalid)) {
   41932                                   UnallocatedA32(instr);
   41933                                   return;
   41934                                 }
   41935                                 if (((instr >> 12) & 1) != 0) {
   41936                                   UnallocatedA32(instr);
   41937                                   return;
   41938                                 }
   41939                                 unsigned rd = ExtractQRegister(instr, 22, 12);
   41940                                 if ((instr & 1) != 0) {
   41941                                   UnallocatedA32(instr);
   41942                                   return;
   41943                                 }
   41944                                 unsigned rm = ExtractQRegister(instr, 5, 0);
   41945                                 // VABS{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
   41946                                 vabs(al, dt, QRegister(rd), QRegister(rm));
   41947                                 break;
   41948                               }
   41949                               case 0x00000180: {
   41950                                 // 0xf3b10380
   41951                                 DataType dt =
   41952                                     Dt_F_size_1_Decode(((instr >> 18) & 0x3) |
   41953                                                        ((instr >> 8) & 0x4));
   41954                                 if (dt.Is(kDataTypeValueInvalid)) {
   41955                                   UnallocatedA32(instr);
   41956                                   return;
   41957                                 }
   41958                                 unsigned rd = ExtractDRegister(instr, 22, 12);
   41959                                 unsigned rm = ExtractDRegister(instr, 5, 0);
   41960                                 // VNEG{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
   41961                                 vneg(al, dt, DRegister(rd), DRegister(rm));
   41962                                 break;
   41963                               }
   41964                               case 0x000001c0: {
   41965                                 // 0xf3b103c0
   41966                                 DataType dt =
   41967                                     Dt_F_size_1_Decode(((instr >> 18) & 0x3) |
   41968                                                        ((instr >> 8) & 0x4));
   41969                                 if (dt.Is(kDataTypeValueInvalid)) {
   41970                                   UnallocatedA32(instr);
   41971                                   return;
   41972                                 }
   41973                                 if (((instr >> 12) & 1) != 0) {
   41974                                   UnallocatedA32(instr);
   41975                                   return;
   41976                                 }
   41977                                 unsigned rd = ExtractQRegister(instr, 22, 12);
   41978                                 if ((instr & 1) != 0) {
   41979                                   UnallocatedA32(instr);
   41980                                   return;
   41981                                 }
   41982                                 unsigned rm = ExtractQRegister(instr, 5, 0);
   41983                                 // VNEG{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
   41984                                 vneg(al, dt, QRegister(rd), QRegister(rm));
   41985                                 break;
   41986                               }
   41987                               default:
   41988                                 UnallocatedA32(instr);
   41989                                 break;
   41990                             }
   41991                             break;
   41992                           }
   41993                           case 0x00020000: {
   41994                             // 0xf3b20000
   41995                             switch (instr & 0x000005c0) {
   41996                               case 0x00000000: {
   41997                                 // 0xf3b20000
   41998                                 if ((instr & 0x000c0000) == 0x00000000) {
   41999                                   unsigned rd = ExtractDRegister(instr, 22, 12);
   42000                                   unsigned rm = ExtractDRegister(instr, 5, 0);
   42001                                   // VSWP{<c>}{<q>}{.<dt>} <Dd>, <Dm> ; A1
   42002                                   vswp(al,
   42003                                        kDataTypeValueNone,
   42004                                        DRegister(rd),
   42005                                        DRegister(rm));
   42006                                 } else {
   42007                                   UnallocatedA32(instr);
   42008                                 }
   42009                                 break;
   42010                               }
   42011                               case 0x00000040: {
   42012                                 // 0xf3b20040
   42013                                 if ((instr & 0x000c0000) == 0x00000000) {
   42014                                   if (((instr >> 12) & 1) != 0) {
   42015                                     UnallocatedA32(instr);
   42016                                     return;
   42017                                   }
   42018                                   unsigned rd = ExtractQRegister(instr, 22, 12);
   42019                                   if ((instr & 1) != 0) {
   42020                                     UnallocatedA32(instr);
   42021                                     return;
   42022                                   }
   42023                                   unsigned rm = ExtractQRegister(instr, 5, 0);
   42024                                   // VSWP{<c>}{<q>}{.<dt>} <Qd>, <Qm> ; A1
   42025                                   vswp(al,
   42026                                        kDataTypeValueNone,
   42027                                        QRegister(rd),
   42028                                        QRegister(rm));
   42029                                 } else {
   42030                                   UnallocatedA32(instr);
   42031                                 }
   42032                                 break;
   42033                               }
   42034                               case 0x00000080: {
   42035                                 // 0xf3b20080
   42036                                 DataType dt =
   42037                                     Dt_size_7_Decode((instr >> 18) & 0x3);
   42038                                 if (dt.Is(kDataTypeValueInvalid)) {
   42039                                   UnallocatedA32(instr);
   42040                                   return;
   42041                                 }
   42042                                 unsigned rd = ExtractDRegister(instr, 22, 12);
   42043                                 unsigned rm = ExtractDRegister(instr, 5, 0);
   42044                                 // VTRN{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
   42045                                 vtrn(al, dt, DRegister(rd), DRegister(rm));
   42046                                 break;
   42047                               }
   42048                               case 0x000000c0: {
   42049                                 // 0xf3b200c0
   42050                                 DataType dt =
   42051                                     Dt_size_7_Decode((instr >> 18) & 0x3);
   42052                                 if (dt.Is(kDataTypeValueInvalid)) {
   42053                                   UnallocatedA32(instr);
   42054                                   return;
   42055                                 }
   42056                                 if (((instr >> 12) & 1) != 0) {
   42057                                   UnallocatedA32(instr);
   42058                                   return;
   42059                                 }
   42060                                 unsigned rd = ExtractQRegister(instr, 22, 12);
   42061                                 if ((instr & 1) != 0) {
   42062                                   UnallocatedA32(instr);
   42063                                   return;
   42064                                 }
   42065                                 unsigned rm = ExtractQRegister(instr, 5, 0);
   42066                                 // VTRN{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
   42067                                 vtrn(al, dt, QRegister(rd), QRegister(rm));
   42068                                 break;
   42069                               }
   42070                               case 0x00000100: {
   42071                                 // 0xf3b20100
   42072                                 DataType dt =
   42073                                     Dt_size_15_Decode((instr >> 18) & 0x3);
   42074                                 if (dt.Is(kDataTypeValueInvalid)) {
   42075                                   UnallocatedA32(instr);
   42076                                   return;
   42077                                 }
   42078                                 unsigned rd = ExtractDRegister(instr, 22, 12);
   42079                                 unsigned rm = ExtractDRegister(instr, 5, 0);
   42080                                 // VUZP{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
   42081                                 vuzp(al, dt, DRegister(rd), DRegister(rm));
   42082                                 break;
   42083                               }
   42084                               case 0x00000140: {
   42085                                 // 0xf3b20140
   42086                                 DataType dt =
   42087                                     Dt_size_7_Decode((instr >> 18) & 0x3);
   42088                                 if (dt.Is(kDataTypeValueInvalid)) {
   42089                                   UnallocatedA32(instr);
   42090                                   return;
   42091                                 }
   42092                                 if (((instr >> 12) & 1) != 0) {
   42093                                   UnallocatedA32(instr);
   42094                                   return;
   42095                                 }
   42096                                 unsigned rd = ExtractQRegister(instr, 22, 12);
   42097                                 if ((instr & 1) != 0) {
   42098                                   UnallocatedA32(instr);
   42099                                   return;
   42100                                 }
   42101                                 unsigned rm = ExtractQRegister(instr, 5, 0);
   42102                                 // VUZP{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
   42103                                 vuzp(al, dt, QRegister(rd), QRegister(rm));
   42104                                 break;
   42105                               }
   42106                               case 0x00000180: {
   42107                                 // 0xf3b20180
   42108                                 DataType dt =
   42109                                     Dt_size_15_Decode((instr >> 18) & 0x3);
   42110                                 if (dt.Is(kDataTypeValueInvalid)) {
   42111                                   UnallocatedA32(instr);
   42112                                   return;
   42113                                 }
   42114                                 unsigned rd = ExtractDRegister(instr, 22, 12);
   42115                                 unsigned rm = ExtractDRegister(instr, 5, 0);
   42116                                 // VZIP{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
   42117                                 vzip(al, dt, DRegister(rd), DRegister(rm));
   42118                                 break;
   42119                               }
   42120                               case 0x000001c0: {
   42121                                 // 0xf3b201c0
   42122                                 DataType dt =
   42123                                     Dt_size_7_Decode((instr >> 18) & 0x3);
   42124                                 if (dt.Is(kDataTypeValueInvalid)) {
   42125                                   UnallocatedA32(instr);
   42126                                   return;
   42127                                 }
   42128                                 if (((instr >> 12) & 1) != 0) {
   42129                                   UnallocatedA32(instr);
   42130                                   return;
   42131                                 }
   42132                                 unsigned rd = ExtractQRegister(instr, 22, 12);
   42133                                 if ((instr & 1) != 0) {
   42134                                   UnallocatedA32(instr);
   42135                                   return;
   42136                                 }
   42137                                 unsigned rm = ExtractQRegister(instr, 5, 0);
   42138                                 // VZIP{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
   42139                                 vzip(al, dt, QRegister(rd), QRegister(rm));
   42140                                 break;
   42141                               }
   42142                               case 0x00000400: {
   42143                                 // 0xf3b20400
   42144                                 if ((instr & 0x000c0000) == 0x00080000) {
   42145                                   unsigned rd = ExtractDRegister(instr, 22, 12);
   42146                                   unsigned rm = ExtractDRegister(instr, 5, 0);
   42147                                   // VRINTN{<q>}.F32.F32 <Dd>, <Dm> ; A1
   42148                                   vrintn(F32,
   42149                                          F32,
   42150                                          DRegister(rd),
   42151                                          DRegister(rm));
   42152                                 } else {
   42153                                   UnallocatedA32(instr);
   42154                                 }
   42155                                 break;
   42156                               }
   42157                               case 0x00000440: {
   42158                                 // 0xf3b20440
   42159                                 if ((instr & 0x000c0000) == 0x00080000) {
   42160                                   if (((instr >> 12) & 1) != 0) {
   42161                                     UnallocatedA32(instr);
   42162                                     return;
   42163                                   }
   42164                                   unsigned rd = ExtractQRegister(instr, 22, 12);
   42165                                   if ((instr & 1) != 0) {
   42166                                     UnallocatedA32(instr);
   42167                                     return;
   42168                                   }
   42169                                   unsigned rm = ExtractQRegister(instr, 5, 0);
   42170                                   // VRINTN{<q>}.F32.F32 <Qd>, <Qm> ; A1
   42171                                   vrintn(F32,
   42172                                          F32,
   42173                                          QRegister(rd),
   42174                                          QRegister(rm));
   42175                                 } else {
   42176                                   UnallocatedA32(instr);
   42177                                 }
   42178                                 break;
   42179                               }
   42180                               case 0x00000480: {
   42181                                 // 0xf3b20480
   42182                                 if ((instr & 0x000c0000) == 0x00080000) {
   42183                                   unsigned rd = ExtractDRegister(instr, 22, 12);
   42184                                   unsigned rm = ExtractDRegister(instr, 5, 0);
   42185                                   // VRINTX{<q>}.F32.F32 <Dd>, <Dm> ; A1
   42186                                   vrintx(al,
   42187                                          F32,
   42188                                          F32,
   42189                                          DRegister(rd),
   42190                                          DRegister(rm));
   42191                                 } else {
   42192                                   UnallocatedA32(instr);
   42193                                 }
   42194                                 break;
   42195                               }
   42196                               case 0x000004c0: {
   42197                                 // 0xf3b204c0
   42198                                 if ((instr & 0x000c0000) == 0x00080000) {
   42199                                   if (((instr >> 12) & 1) != 0) {
   42200                                     UnallocatedA32(instr);
   42201                                     return;
   42202                                   }
   42203                                   unsigned rd = ExtractQRegister(instr, 22, 12);
   42204                                   if ((instr & 1) != 0) {
   42205                                     UnallocatedA32(instr);
   42206                                     return;
   42207                                   }
   42208                                   unsigned rm = ExtractQRegister(instr, 5, 0);
   42209                                   // VRINTX{<q>}.F32.F32 <Qd>, <Qm> ; A1
   42210                                   vrintx(F32,
   42211                                          F32,
   42212                                          QRegister(rd),
   42213                                          QRegister(rm));
   42214                                 } else {
   42215                                   UnallocatedA32(instr);
   42216                                 }
   42217                                 break;
   42218                               }
   42219                               case 0x00000500: {
   42220                                 // 0xf3b20500
   42221                                 if ((instr & 0x000c0000) == 0x00080000) {
   42222                                   unsigned rd = ExtractDRegister(instr, 22, 12);
   42223                                   unsigned rm = ExtractDRegister(instr, 5, 0);
   42224                                   // VRINTA{<q>}.F32.F32 <Dd>, <Dm> ; A1
   42225                                   vrinta(F32,
   42226                                          F32,
   42227                                          DRegister(rd),
   42228                                          DRegister(rm));
   42229                                 } else {
   42230                                   UnallocatedA32(instr);
   42231                                 }
   42232                                 break;
   42233                               }
   42234                               case 0x00000540: {
   42235                                 // 0xf3b20540
   42236                                 if ((instr & 0x000c0000) == 0x00080000) {
   42237                                   if (((instr >> 12) & 1) != 0) {
   42238                                     UnallocatedA32(instr);
   42239                                     return;
   42240                                   }
   42241                                   unsigned rd = ExtractQRegister(instr, 22, 12);
   42242                                   if ((instr & 1) != 0) {
   42243                                     UnallocatedA32(instr);
   42244                                     return;
   42245                                   }
   42246                                   unsigned rm = ExtractQRegister(instr, 5, 0);
   42247                                   // VRINTA{<q>}.F32.F32 <Qd>, <Qm> ; A1
   42248                                   vrinta(F32,
   42249                                          F32,
   42250                                          QRegister(rd),
   42251                                          QRegister(rm));
   42252                                 } else {
   42253                                   UnallocatedA32(instr);
   42254                                 }
   42255                                 break;
   42256                               }
   42257                               case 0x00000580: {
   42258                                 // 0xf3b20580
   42259                                 if ((instr & 0x000c0000) == 0x00080000) {
   42260                                   unsigned rd = ExtractDRegister(instr, 22, 12);
   42261                                   unsigned rm = ExtractDRegister(instr, 5, 0);
   42262                                   // VRINTZ{<q>}.F32.F32 <Dd>, <Dm> ; A1
   42263                                   vrintz(al,
   42264                                          F32,
   42265                                          F32,
   42266                                          DRegister(rd),
   42267                                          DRegister(rm));
   42268                                 } else {
   42269                                   UnallocatedA32(instr);
   42270                                 }
   42271                                 break;
   42272                               }
   42273                               case 0x000005c0: {
   42274                                 // 0xf3b205c0
   42275                                 if ((instr & 0x000c0000) == 0x00080000) {
   42276                                   if (((instr >> 12) & 1) != 0) {
   42277                                     UnallocatedA32(instr);
   42278                                     return;
   42279                                   }
   42280                                   unsigned rd = ExtractQRegister(instr, 22, 12);
   42281                                   if ((instr & 1) != 0) {
   42282                                     UnallocatedA32(instr);
   42283                                     return;
   42284                                   }
   42285                                   unsigned rm = ExtractQRegister(instr, 5, 0);
   42286                                   // VRINTZ{<q>}.F32.F32 <Qd>, <Qm> ; A1
   42287                                   vrintz(F32,
   42288                                          F32,
   42289                                          QRegister(rd),
   42290                                          QRegister(rm));
   42291                                 } else {
   42292                                   UnallocatedA32(instr);
   42293                                 }
   42294                                 break;
   42295                               }
   42296                             }
   42297                             break;
   42298                           }
   42299                           case 0x00020200: {
   42300                             // 0xf3b20200
   42301                             switch (instr & 0x00000580) {
   42302                               case 0x00000000: {
   42303                                 // 0xf3b20200
   42304                                 switch (instr & 0x00000040) {
   42305                                   case 0x00000000: {
   42306                                     // 0xf3b20200
   42307                                     DataType dt =
   42308                                         Dt_size_3_Decode((instr >> 18) & 0x3);
   42309                                     if (dt.Is(kDataTypeValueInvalid)) {
   42310                                       UnallocatedA32(instr);
   42311                                       return;
   42312                                     }
   42313                                     unsigned rd =
   42314                                         ExtractDRegister(instr, 22, 12);
   42315                                     if ((instr & 1) != 0) {
   42316                                       UnallocatedA32(instr);
   42317                                       return;
   42318                                     }
   42319                                     unsigned rm = ExtractQRegister(instr, 5, 0);
   42320                                     // VMOVN{<c>}{<q>}.<dt> <Dd>, <Qm> ; A1
   42321                                     vmovn(al, dt, DRegister(rd), QRegister(rm));
   42322                                     break;
   42323                                   }
   42324                                   case 0x00000040: {
   42325                                     // 0xf3b20240
   42326                                     DataType dt =
   42327                                         Dt_size_14_Decode((instr >> 18) & 0x3);
   42328                                     if (dt.Is(kDataTypeValueInvalid)) {
   42329                                       UnallocatedA32(instr);
   42330                                       return;
   42331                                     }
   42332                                     unsigned rd =
   42333                                         ExtractDRegister(instr, 22, 12);
   42334                                     if ((instr & 1) != 0) {
   42335                                       UnallocatedA32(instr);
   42336                                       return;
   42337                                     }
   42338                                     unsigned rm = ExtractQRegister(instr, 5, 0);
   42339                                     // VQMOVUN{<c>}{<q>}.<dt> <Dd>, <Qm> ; A1
   42340                                     vqmovun(al,
   42341                                             dt,
   42342                                             DRegister(rd),
   42343                                             QRegister(rm));
   42344                                     break;
   42345                                   }
   42346                                 }
   42347                                 break;
   42348                               }
   42349                               case 0x00000080: {
   42350                                 // 0xf3b20280
   42351                                 DataType dt =
   42352                                     Dt_op_size_3_Decode(((instr >> 18) & 0x3) |
   42353                                                         ((instr >> 4) & 0x4));
   42354                                 if (dt.Is(kDataTypeValueInvalid)) {
   42355                                   UnallocatedA32(instr);
   42356                                   return;
   42357                                 }
   42358                                 unsigned rd = ExtractDRegister(instr, 22, 12);
   42359                                 if ((instr & 1) != 0) {
   42360                                   UnallocatedA32(instr);
   42361                                   return;
   42362                                 }
   42363                                 unsigned rm = ExtractQRegister(instr, 5, 0);
   42364                                 // VQMOVN{<c>}{<q>}.<dt> <Dd>, <Qm> ; A1
   42365                                 vqmovn(al, dt, DRegister(rd), QRegister(rm));
   42366                                 break;
   42367                               }
   42368                               case 0x00000100: {
   42369                                 // 0xf3b20300
   42370                                 if ((instr & 0x00000040) == 0x00000000) {
   42371                                   DataType dt =
   42372                                       Dt_size_16_Decode((instr >> 18) & 0x3);
   42373                                   if (dt.Is(kDataTypeValueInvalid)) {
   42374                                     UnallocatedA32(instr);
   42375                                     return;
   42376                                   }
   42377                                   if (((instr >> 12) & 1) != 0) {
   42378                                     UnallocatedA32(instr);
   42379                                     return;
   42380                                   }
   42381                                   unsigned rd = ExtractQRegister(instr, 22, 12);
   42382                                   unsigned rm = ExtractDRegister(instr, 5, 0);
   42383                                   uint32_t imm = dt.GetSize();
   42384                                   // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A2 NOLINT(whitespace/line_length)
   42385                                   vshll(al,
   42386                                         dt,
   42387                                         QRegister(rd),
   42388                                         DRegister(rm),
   42389                                         imm);
   42390                                 } else {
   42391                                   UnallocatedA32(instr);
   42392                                 }
   42393                                 break;
   42394                               }
   42395                               case 0x00000180: {
   42396                                 // 0xf3b20380
   42397                                 switch (instr & 0x000c0040) {
   42398                                   case 0x00080000: {
   42399                                     // 0xf3ba0380
   42400                                     UnimplementedA32("SHA1SU1", instr);
   42401                                     break;
   42402                                   }
   42403                                   case 0x00080040: {
   42404                                     // 0xf3ba03c0
   42405                                     UnimplementedA32("SHA256SU0", instr);
   42406                                     break;
   42407                                   }
   42408                                   default:
   42409                                     UnallocatedA32(instr);
   42410                                     break;
   42411                                 }
   42412                                 break;
   42413                               }
   42414                               case 0x00000400: {
   42415                                 // 0xf3b20600
   42416                                 if ((instr & 0x000c0040) == 0x00040000) {
   42417                                   unsigned rd = ExtractDRegister(instr, 22, 12);
   42418                                   if ((instr & 1) != 0) {
   42419                                     UnallocatedA32(instr);
   42420                                     return;
   42421                                   }
   42422                                   unsigned rm = ExtractQRegister(instr, 5, 0);
   42423                                   // VCVT{<c>}{<q>}.F16.F32 <Dd>, <Qm> ; A1
   42424                                   vcvt(al,
   42425                                        F16,
   42426                                        F32,
   42427                                        DRegister(rd),
   42428                                        QRegister(rm));
   42429                                 } else {
   42430                                   UnallocatedA32(instr);
   42431                                 }
   42432                                 break;
   42433                               }
   42434                               case 0x00000480: {
   42435                                 // 0xf3b20680
   42436                                 switch (instr & 0x000c0040) {
   42437                                   case 0x00080000: {
   42438                                     // 0xf3ba0680
   42439                                     unsigned rd =
   42440                                         ExtractDRegister(instr, 22, 12);
   42441                                     unsigned rm = ExtractDRegister(instr, 5, 0);
   42442                                     // VRINTM{<q>}.F32.F32 <Dd>, <Dm> ; A1
   42443                                     vrintm(F32,
   42444                                            F32,
   42445                                            DRegister(rd),
   42446                                            DRegister(rm));
   42447                                     break;
   42448                                   }
   42449                                   case 0x00080040: {
   42450                                     // 0xf3ba06c0
   42451                                     if (((instr >> 12) & 1) != 0) {
   42452                                       UnallocatedA32(instr);
   42453                                       return;
   42454                                     }
   42455                                     unsigned rd =
   42456                                         ExtractQRegister(instr, 22, 12);
   42457                                     if ((instr & 1) != 0) {
   42458                                       UnallocatedA32(instr);
   42459                                       return;
   42460                                     }
   42461                                     unsigned rm = ExtractQRegister(instr, 5, 0);
   42462                                     // VRINTM{<q>}.F32.F32 <Qd>, <Qm> ; A1
   42463                                     vrintm(F32,
   42464                                            F32,
   42465                                            QRegister(rd),
   42466                                            QRegister(rm));
   42467                                     break;
   42468                                   }
   42469                                   default:
   42470                                     UnallocatedA32(instr);
   42471                                     break;
   42472                                 }
   42473                                 break;
   42474                               }
   42475                               case 0x00000500: {
   42476                                 // 0xf3b20700
   42477                                 if ((instr & 0x000c0040) == 0x00040000) {
   42478                                   if (((instr >> 12) & 1) != 0) {
   42479                                     UnallocatedA32(instr);
   42480                                     return;
   42481                                   }
   42482                                   unsigned rd = ExtractQRegister(instr, 22, 12);
   42483                                   unsigned rm = ExtractDRegister(instr, 5, 0);
   42484                                   // VCVT{<c>}{<q>}.F32.F16 <Qd>, <Dm> ; A1
   42485                                   vcvt(al,
   42486                                        F32,
   42487                                        F16,
   42488                                        QRegister(rd),
   42489                                        DRegister(rm));
   42490                                 } else {
   42491                                   UnallocatedA32(instr);
   42492                                 }
   42493                                 break;
   42494                               }
   42495                               case 0x00000580: {
   42496                                 // 0xf3b20780
   42497                                 switch (instr & 0x000c0040) {
   42498                                   case 0x00080000: {
   42499                                     // 0xf3ba0780
   42500                                     unsigned rd =
   42501                                         ExtractDRegister(instr, 22, 12);
   42502                                     unsigned rm = ExtractDRegister(instr, 5, 0);
   42503                                     // VRINTP{<q>}.F32.F32 <Dd>, <Dm> ; A1
   42504                                     vrintp(F32,
   42505                                            F32,
   42506                                            DRegister(rd),
   42507                                            DRegister(rm));
   42508                                     break;
   42509                                   }
   42510                                   case 0x00080040: {
   42511                                     // 0xf3ba07c0
   42512                                     if (((instr >> 12) & 1) != 0) {
   42513                                       UnallocatedA32(instr);
   42514                                       return;
   42515                                     }
   42516                                     unsigned rd =
   42517                                         ExtractQRegister(instr, 22, 12);
   42518                                     if ((instr & 1) != 0) {
   42519                                       UnallocatedA32(instr);
   42520                                       return;
   42521                                     }
   42522                                     unsigned rm = ExtractQRegister(instr, 5, 0);
   42523                                     // VRINTP{<q>}.F32.F32 <Qd>, <Qm> ; A1
   42524                                     vrintp(F32,
   42525                                            F32,
   42526                                            QRegister(rd),
   42527                                            QRegister(rm));
   42528                                     break;
   42529                                   }
   42530                                   default:
   42531                                     UnallocatedA32(instr);
   42532                                     break;
   42533                                 }
   42534                                 break;
   42535                               }
   42536                             }
   42537                             break;
   42538                           }
   42539                           case 0x00030000: {
   42540                             // 0xf3b30000
   42541                             switch (instr & 0x00000440) {
   42542                               case 0x00000000: {
   42543                                 // 0xf3b30000
   42544                                 switch (instr & 0x000c0100) {
   42545                                   case 0x00080000: {
   42546                                     // 0xf3bb0000
   42547                                     DataType dt =
   42548                                         Dt_op_3_Decode((instr >> 7) & 0x1);
   42549                                     if (dt.Is(kDataTypeValueInvalid)) {
   42550                                       UnallocatedA32(instr);
   42551                                       return;
   42552                                     }
   42553                                     unsigned rd =
   42554                                         ExtractDRegister(instr, 22, 12);
   42555                                     unsigned rm = ExtractDRegister(instr, 5, 0);
   42556                                     // VCVTA{<q>}.<dt>.F32 <Dd>, <Dm> ; A1
   42557                                     vcvta(dt,
   42558                                           F32,
   42559                                           DRegister(rd),
   42560                                           DRegister(rm));
   42561                                     break;
   42562                                   }
   42563                                   case 0x00080100: {
   42564                                     // 0xf3bb0100
   42565                                     DataType dt =
   42566                                         Dt_op_3_Decode((instr >> 7) & 0x1);
   42567                                     if (dt.Is(kDataTypeValueInvalid)) {
   42568                                       UnallocatedA32(instr);
   42569                                       return;
   42570                                     }
   42571                                     unsigned rd =
   42572                                         ExtractDRegister(instr, 22, 12);
   42573                                     unsigned rm = ExtractDRegister(instr, 5, 0);
   42574                                     // VCVTN{<q>}.<dt>.F32 <Dd>, <Dm> ; A1
   42575                                     vcvtn(dt,
   42576                                           F32,
   42577                                           DRegister(rd),
   42578                                           DRegister(rm));
   42579                                     break;
   42580                                   }
   42581                                   default:
   42582                                     UnallocatedA32(instr);
   42583                                     break;
   42584                                 }
   42585                                 break;
   42586                               }
   42587                               case 0x00000040: {
   42588                                 // 0xf3b30040
   42589                                 switch (instr & 0x000c0100) {
   42590                                   case 0x00080000: {
   42591                                     // 0xf3bb0040
   42592                                     DataType dt =
   42593                                         Dt_op_3_Decode((instr >> 7) & 0x1);
   42594                                     if (dt.Is(kDataTypeValueInvalid)) {
   42595                                       UnallocatedA32(instr);
   42596                                       return;
   42597                                     }
   42598                                     if (((instr >> 12) & 1) != 0) {
   42599                                       UnallocatedA32(instr);
   42600                                       return;
   42601                                     }
   42602                                     unsigned rd =
   42603                                         ExtractQRegister(instr, 22, 12);
   42604                                     if ((instr & 1) != 0) {
   42605                                       UnallocatedA32(instr);
   42606                                       return;
   42607                                     }
   42608                                     unsigned rm = ExtractQRegister(instr, 5, 0);
   42609                                     // VCVTA{<q>}.<dt>.F32 <Qd>, <Qm> ; A1
   42610                                     vcvta(dt,
   42611                                           F32,
   42612                                           QRegister(rd),
   42613                                           QRegister(rm));
   42614                                     break;
   42615                                   }
   42616                                   case 0x00080100: {
   42617                                     // 0xf3bb0140
   42618                                     DataType dt =
   42619                                         Dt_op_3_Decode((instr >> 7) & 0x1);
   42620                                     if (dt.Is(kDataTypeValueInvalid)) {
   42621                                       UnallocatedA32(instr);
   42622                                       return;
   42623                                     }
   42624                                     if (((instr >> 12) & 1) != 0) {
   42625                                       UnallocatedA32(instr);
   42626                                       return;
   42627                                     }
   42628                                     unsigned rd =
   42629                                         ExtractQRegister(instr, 22, 12);
   42630                                     if ((instr & 1) != 0) {
   42631                                       UnallocatedA32(instr);
   42632                                       return;
   42633                                     }
   42634                                     unsigned rm = ExtractQRegister(instr, 5, 0);
   42635                                     // VCVTN{<q>}.<dt>.F32 <Qd>, <Qm> ; A1
   42636                                     vcvtn(dt,
   42637                                           F32,
   42638                                           QRegister(rd),
   42639                                           QRegister(rm));
   42640                                     break;
   42641                                   }
   42642                                   default:
   42643                                     UnallocatedA32(instr);
   42644                                     break;
   42645                                 }
   42646                                 break;
   42647                               }
   42648                               case 0x00000400: {
   42649                                 // 0xf3b30400
   42650                                 switch (instr & 0x00000080) {
   42651                                   case 0x00000000: {
   42652                                     // 0xf3b30400
   42653                                     DataType dt = Dt_F_size_4_Decode(
   42654                                         ((instr >> 18) & 0x3) |
   42655                                         ((instr >> 6) & 0x4));
   42656                                     if (dt.Is(kDataTypeValueInvalid)) {
   42657                                       UnallocatedA32(instr);
   42658                                       return;
   42659                                     }
   42660                                     unsigned rd =
   42661                                         ExtractDRegister(instr, 22, 12);
   42662                                     unsigned rm = ExtractDRegister(instr, 5, 0);
   42663                                     // VRECPE{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
   42664                                     vrecpe(al,
   42665                                            dt,
   42666                                            DRegister(rd),
   42667                                            DRegister(rm));
   42668                                     break;
   42669                                   }
   42670                                   case 0x00000080: {
   42671                                     // 0xf3b30480
   42672                                     DataType dt = Dt_F_size_4_Decode(
   42673                                         ((instr >> 18) & 0x3) |
   42674                                         ((instr >> 6) & 0x4));
   42675                                     if (dt.Is(kDataTypeValueInvalid)) {
   42676                                       UnallocatedA32(instr);
   42677                                       return;
   42678                                     }
   42679                                     unsigned rd =
   42680                                         ExtractDRegister(instr, 22, 12);
   42681                                     unsigned rm = ExtractDRegister(instr, 5, 0);
   42682                                     // VRSQRTE{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
   42683                                     vrsqrte(al,
   42684                                             dt,
   42685                                             DRegister(rd),
   42686                                             DRegister(rm));
   42687                                     break;
   42688                                   }
   42689                                 }
   42690                                 break;
   42691                               }
   42692                               case 0x00000440: {
   42693                                 // 0xf3b30440
   42694                                 switch (instr & 0x00000080) {
   42695                                   case 0x00000000: {
   42696                                     // 0xf3b30440
   42697                                     DataType dt = Dt_F_size_4_Decode(
   42698                                         ((instr >> 18) & 0x3) |
   42699                                         ((instr >> 6) & 0x4));
   42700                                     if (dt.Is(kDataTypeValueInvalid)) {
   42701                                       UnallocatedA32(instr);
   42702                                       return;
   42703                                     }
   42704                                     if (((instr >> 12) & 1) != 0) {
   42705                                       UnallocatedA32(instr);
   42706                                       return;
   42707                                     }
   42708                                     unsigned rd =
   42709                                         ExtractQRegister(instr, 22, 12);
   42710                                     if ((instr & 1) != 0) {
   42711                                       UnallocatedA32(instr);
   42712                                       return;
   42713                                     }
   42714                                     unsigned rm = ExtractQRegister(instr, 5, 0);
   42715                                     // VRECPE{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
   42716                                     vrecpe(al,
   42717                                            dt,
   42718                                            QRegister(rd),
   42719                                            QRegister(rm));
   42720                                     break;
   42721                                   }
   42722                                   case 0x00000080: {
   42723                                     // 0xf3b304c0
   42724                                     DataType dt = Dt_F_size_4_Decode(
   42725                                         ((instr >> 18) & 0x3) |
   42726                                         ((instr >> 6) & 0x4));
   42727                                     if (dt.Is(kDataTypeValueInvalid)) {
   42728                                       UnallocatedA32(instr);
   42729                                       return;
   42730                                     }
   42731                                     if (((instr >> 12) & 1) != 0) {
   42732                                       UnallocatedA32(instr);
   42733                                       return;
   42734                                     }
   42735                                     unsigned rd =
   42736                                         ExtractQRegister(instr, 22, 12);
   42737                                     if ((instr & 1) != 0) {
   42738                                       UnallocatedA32(instr);
   42739                                       return;
   42740                                     }
   42741                                     unsigned rm = ExtractQRegister(instr, 5, 0);
   42742                                     // VRSQRTE{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
   42743                                     vrsqrte(al,
   42744                                             dt,
   42745                                             QRegister(rd),
   42746                                             QRegister(rm));
   42747                                     break;
   42748                                   }
   42749                                 }
   42750                                 break;
   42751                               }
   42752                             }
   42753                             break;
   42754                           }
   42755                           case 0x00030200: {
   42756                             // 0xf3b30200
   42757                             switch (instr & 0x000c0440) {
   42758                               case 0x00080000: {
   42759                                 // 0xf3bb0200
   42760                                 switch (instr & 0x00000100) {
   42761                                   case 0x00000000: {
   42762                                     // 0xf3bb0200
   42763                                     DataType dt =
   42764                                         Dt_op_3_Decode((instr >> 7) & 0x1);
   42765                                     if (dt.Is(kDataTypeValueInvalid)) {
   42766                                       UnallocatedA32(instr);
   42767                                       return;
   42768                                     }
   42769                                     unsigned rd =
   42770                                         ExtractDRegister(instr, 22, 12);
   42771                                     unsigned rm = ExtractDRegister(instr, 5, 0);
   42772                                     // VCVTP{<q>}.<dt>.F32 <Dd>, <Dm> ; A1
   42773                                     vcvtp(dt,
   42774                                           F32,
   42775                                           DRegister(rd),
   42776                                           DRegister(rm));
   42777                                     break;
   42778                                   }
   42779                                   case 0x00000100: {
   42780                                     // 0xf3bb0300
   42781                                     DataType dt =
   42782                                         Dt_op_3_Decode((instr >> 7) & 0x1);
   42783                                     if (dt.Is(kDataTypeValueInvalid)) {
   42784                                       UnallocatedA32(instr);
   42785                                       return;
   42786                                     }
   42787                                     unsigned rd =
   42788                                         ExtractDRegister(instr, 22, 12);
   42789                                     unsigned rm = ExtractDRegister(instr, 5, 0);
   42790                                     // VCVTM{<q>}.<dt>.F32 <Dd>, <Dm> ; A1
   42791                                     vcvtm(dt,
   42792                                           F32,
   42793                                           DRegister(rd),
   42794                                           DRegister(rm));
   42795                                     break;
   42796                                   }
   42797                                 }
   42798                                 break;
   42799                               }
   42800                               case 0x00080040: {
   42801                                 // 0xf3bb0240
   42802                                 switch (instr & 0x00000100) {
   42803                                   case 0x00000000: {
   42804                                     // 0xf3bb0240
   42805                                     DataType dt =
   42806                                         Dt_op_3_Decode((instr >> 7) & 0x1);
   42807                                     if (dt.Is(kDataTypeValueInvalid)) {
   42808                                       UnallocatedA32(instr);
   42809                                       return;
   42810                                     }
   42811                                     if (((instr >> 12) & 1) != 0) {
   42812                                       UnallocatedA32(instr);
   42813                                       return;
   42814                                     }
   42815                                     unsigned rd =
   42816                                         ExtractQRegister(instr, 22, 12);
   42817                                     if ((instr & 1) != 0) {
   42818                                       UnallocatedA32(instr);
   42819                                       return;
   42820                                     }
   42821                                     unsigned rm = ExtractQRegister(instr, 5, 0);
   42822                                     // VCVTP{<q>}.<dt>.F32 <Qd>, <Qm> ; A1
   42823                                     vcvtp(dt,
   42824                                           F32,
   42825                                           QRegister(rd),
   42826                                           QRegister(rm));
   42827                                     break;
   42828                                   }
   42829                                   case 0x00000100: {
   42830                                     // 0xf3bb0340
   42831                                     DataType dt =
   42832                                         Dt_op_3_Decode((instr >> 7) & 0x1);
   42833                                     if (dt.Is(kDataTypeValueInvalid)) {
   42834                                       UnallocatedA32(instr);
   42835                                       return;
   42836                                     }
   42837                                     if (((instr >> 12) & 1) != 0) {
   42838                                       UnallocatedA32(instr);
   42839                                       return;
   42840                                     }
   42841                                     unsigned rd =
   42842                                         ExtractQRegister(instr, 22, 12);
   42843                                     if ((instr & 1) != 0) {
   42844                                       UnallocatedA32(instr);
   42845                                       return;
   42846                                     }
   42847                                     unsigned rm = ExtractQRegister(instr, 5, 0);
   42848                                     // VCVTM{<q>}.<dt>.F32 <Qd>, <Qm> ; A1
   42849                                     vcvtm(dt,
   42850                                           F32,
   42851                                           QRegister(rd),
   42852                                           QRegister(rm));
   42853                                     break;
   42854                                   }
   42855                                 }
   42856                                 break;
   42857                               }
   42858                               case 0x00080400: {
   42859                                 // 0xf3bb0600
   42860                                 DataType dt1 =
   42861                                     Dt_op_1_Decode1((instr >> 7) & 0x3);
   42862                                 if (dt1.Is(kDataTypeValueInvalid)) {
   42863                                   UnallocatedA32(instr);
   42864                                   return;
   42865                                 }
   42866                                 DataType dt2 =
   42867                                     Dt_op_1_Decode2((instr >> 7) & 0x3);
   42868                                 if (dt2.Is(kDataTypeValueInvalid)) {
   42869                                   UnallocatedA32(instr);
   42870                                   return;
   42871                                 }
   42872                                 unsigned rd = ExtractDRegister(instr, 22, 12);
   42873                                 unsigned rm = ExtractDRegister(instr, 5, 0);
   42874                                 // VCVT{<c>}{<q>}.<dt>.<dt> <Dd>, <Dm> ; A1
   42875                                 vcvt(al,
   42876                                      dt1,
   42877                                      dt2,
   42878                                      DRegister(rd),
   42879                                      DRegister(rm));
   42880                                 break;
   42881                               }
   42882                               case 0x00080440: {
   42883                                 // 0xf3bb0640
   42884                                 DataType dt1 =
   42885                                     Dt_op_1_Decode1((instr >> 7) & 0x3);
   42886                                 if (dt1.Is(kDataTypeValueInvalid)) {
   42887                                   UnallocatedA32(instr);
   42888                                   return;
   42889                                 }
   42890                                 DataType dt2 =
   42891                                     Dt_op_1_Decode2((instr >> 7) & 0x3);
   42892                                 if (dt2.Is(kDataTypeValueInvalid)) {
   42893                                   UnallocatedA32(instr);
   42894                                   return;
   42895                                 }
   42896                                 if (((instr >> 12) & 1) != 0) {
   42897                                   UnallocatedA32(instr);
   42898                                   return;
   42899                                 }
   42900                                 unsigned rd = ExtractQRegister(instr, 22, 12);
   42901                                 if ((instr & 1) != 0) {
   42902                                   UnallocatedA32(instr);
   42903                                   return;
   42904                                 }
   42905                                 unsigned rm = ExtractQRegister(instr, 5, 0);
   42906                                 // VCVT{<c>}{<q>}.<dt>.<dt> <Qd>, <Qm> ; A1
   42907                                 vcvt(al,
   42908                                      dt1,
   42909                                      dt2,
   42910                                      QRegister(rd),
   42911                                      QRegister(rm));
   42912                                 break;
   42913                               }
   42914                               default:
   42915                                 UnallocatedA32(instr);
   42916                                 break;
   42917                             }
   42918                             break;
   42919                           }
   42920                         }
   42921                         break;
   42922                       }
   42923                       case 0x00000800: {
   42924                         // 0xf3b00800
   42925                         switch (instr & 0x00000440) {
   42926                           case 0x00000000: {
   42927                             // 0xf3b00800
   42928                             unsigned rd = ExtractDRegister(instr, 22, 12);
   42929                             unsigned first = ExtractDRegister(instr, 7, 16);
   42930                             unsigned length;
   42931                             SpacingType spacing = kSingle;
   42932                             switch ((instr >> 8) & 0x3) {
   42933                               default:
   42934                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
   42935                               case 0x0:
   42936                                 length = 1;
   42937                                 break;
   42938                               case 0x1:
   42939                                 length = 2;
   42940                                 break;
   42941                               case 0x2:
   42942                                 length = 3;
   42943                                 break;
   42944                               case 0x3:
   42945                                 length = 4;
   42946                                 break;
   42947                             }
   42948                             unsigned last = first + length - 1;
   42949                             TransferType transfer = kMultipleLanes;
   42950                             unsigned rm = ExtractDRegister(instr, 5, 0);
   42951                             // VTBL{<c>}{<q>}.8 <Dd>, <list>, <Dm> ; A1
   42952                             vtbl(al,
   42953                                  Untyped8,
   42954                                  DRegister(rd),
   42955                                  NeonRegisterList(DRegister(first),
   42956                                                   DRegister(last),
   42957                                                   spacing,
   42958                                                   transfer),
   42959                                  DRegister(rm));
   42960                             break;
   42961                           }
   42962                           case 0x00000040: {
   42963                             // 0xf3b00840
   42964                             unsigned rd = ExtractDRegister(instr, 22, 12);
   42965                             unsigned first = ExtractDRegister(instr, 7, 16);
   42966                             unsigned length;
   42967                             SpacingType spacing = kSingle;
   42968                             switch ((instr >> 8) & 0x3) {
   42969                               default:
   42970                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
   42971                               case 0x0:
   42972                                 length = 1;
   42973                                 break;
   42974                               case 0x1:
   42975                                 length = 2;
   42976                                 break;
   42977                               case 0x2:
   42978                                 length = 3;
   42979                                 break;
   42980                               case 0x3:
   42981                                 length = 4;
   42982                                 break;
   42983                             }
   42984                             unsigned last = first + length - 1;
   42985                             TransferType transfer = kMultipleLanes;
   42986                             unsigned rm = ExtractDRegister(instr, 5, 0);
   42987                             // VTBX{<c>}{<q>}.8 <Dd>, <list>, <Dm> ; A1
   42988                             vtbx(al,
   42989                                  Untyped8,
   42990                                  DRegister(rd),
   42991                                  NeonRegisterList(DRegister(first),
   42992                                                   DRegister(last),
   42993                                                   spacing,
   42994                                                   transfer),
   42995                                  DRegister(rm));
   42996                             break;
   42997                           }
   42998                           case 0x00000400: {
   42999                             // 0xf3b00c00
   43000                             if ((instr & 0x00000380) == 0x00000000) {
   43001                               unsigned lane;
   43002                               DataType dt =
   43003                                   Dt_imm4_1_Decode((instr >> 16) & 0xf, &lane);
   43004                               if (dt.Is(kDataTypeValueInvalid)) {
   43005                                 UnallocatedA32(instr);
   43006                                 return;
   43007                               }
   43008                               unsigned rd = ExtractDRegister(instr, 22, 12);
   43009                               unsigned rm = ExtractDRegister(instr, 5, 0);
   43010                               // VDUP{<c>}{<q>}.<dt> <Dd>, <Dm[x]> ; A1
   43011                               vdup(al,
   43012                                    dt,
   43013                                    DRegister(rd),
   43014                                    DRegisterLane(rm, lane));
   43015                             } else {
   43016                               UnallocatedA32(instr);
   43017                             }
   43018                             break;
   43019                           }
   43020                           case 0x00000440: {
   43021                             // 0xf3b00c40
   43022                             if ((instr & 0x00000380) == 0x00000000) {
   43023                               unsigned lane;
   43024                               DataType dt =
   43025                                   Dt_imm4_1_Decode((instr >> 16) & 0xf, &lane);
   43026                               if (dt.Is(kDataTypeValueInvalid)) {
   43027                                 UnallocatedA32(instr);
   43028                                 return;
   43029                               }
   43030                               if (((instr >> 12) & 1) != 0) {
   43031                                 UnallocatedA32(instr);
   43032                                 return;
   43033                               }
   43034                               unsigned rd = ExtractQRegister(instr, 22, 12);
   43035                               unsigned rm = ExtractDRegister(instr, 5, 0);
   43036                               // VDUP{<c>}{<q>}.<dt> <Qd>, <Dm[x]> ; A1
   43037                               vdup(al,
   43038                                    dt,
   43039                                    QRegister(rd),
   43040                                    DRegisterLane(rm, lane));
   43041                             } else {
   43042                               UnallocatedA32(instr);
   43043                             }
   43044                             break;
   43045                           }
   43046                         }
   43047                         break;
   43048                       }
   43049                     }
   43050                     break;
   43051                   }
   43052                 }
   43053                 break;
   43054               }
   43055               default: {
   43056                 switch (instr & 0x00000c40) {
   43057                   case 0x00000000: {
   43058                     // 0xf2800000
   43059                     switch (instr & 0x00000300) {
   43060                       case 0x00000000: {
   43061                         // 0xf2800000
   43062                         if (((instr & 0x300000) == 0x300000)) {
   43063                           UnallocatedA32(instr);
   43064                           return;
   43065                         }
   43066                         DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
   43067                                                          ((instr >> 22) & 0x4));
   43068                         if (dt.Is(kDataTypeValueInvalid)) {
   43069                           UnallocatedA32(instr);
   43070                           return;
   43071                         }
   43072                         if (((instr >> 12) & 1) != 0) {
   43073                           UnallocatedA32(instr);
   43074                           return;
   43075                         }
   43076                         unsigned rd = ExtractQRegister(instr, 22, 12);
   43077                         unsigned rn = ExtractDRegister(instr, 7, 16);
   43078                         unsigned rm = ExtractDRegister(instr, 5, 0);
   43079                         // VADDL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; A1
   43080                         vaddl(al,
   43081                               dt,
   43082                               QRegister(rd),
   43083                               DRegister(rn),
   43084                               DRegister(rm));
   43085                         break;
   43086                       }
   43087                       case 0x00000100: {
   43088                         // 0xf2800100
   43089                         if (((instr & 0x300000) == 0x300000)) {
   43090                           UnallocatedA32(instr);
   43091                           return;
   43092                         }
   43093                         DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
   43094                                                          ((instr >> 22) & 0x4));
   43095                         if (dt.Is(kDataTypeValueInvalid)) {
   43096                           UnallocatedA32(instr);
   43097                           return;
   43098                         }
   43099                         if (((instr >> 12) & 1) != 0) {
   43100                           UnallocatedA32(instr);
   43101                           return;
   43102                         }
   43103                         unsigned rd = ExtractQRegister(instr, 22, 12);
   43104                         if (((instr >> 16) & 1) != 0) {
   43105                           UnallocatedA32(instr);
   43106                           return;
   43107                         }
   43108                         unsigned rn = ExtractQRegister(instr, 7, 16);
   43109                         unsigned rm = ExtractDRegister(instr, 5, 0);
   43110                         // VADDW{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Dm> ; A1
   43111                         vaddw(al,
   43112                               dt,
   43113                               QRegister(rd),
   43114                               QRegister(rn),
   43115                               DRegister(rm));
   43116                         break;
   43117                       }
   43118                       case 0x00000200: {
   43119                         // 0xf2800200
   43120                         if (((instr & 0x300000) == 0x300000)) {
   43121                           UnallocatedA32(instr);
   43122                           return;
   43123                         }
   43124                         DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
   43125                                                          ((instr >> 22) & 0x4));
   43126                         if (dt.Is(kDataTypeValueInvalid)) {
   43127                           UnallocatedA32(instr);
   43128                           return;
   43129                         }
   43130                         if (((instr >> 12) & 1) != 0) {
   43131                           UnallocatedA32(instr);
   43132                           return;
   43133                         }
   43134                         unsigned rd = ExtractQRegister(instr, 22, 12);
   43135                         unsigned rn = ExtractDRegister(instr, 7, 16);
   43136                         unsigned rm = ExtractDRegister(instr, 5, 0);
   43137                         // VSUBL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; A1
   43138                         vsubl(al,
   43139                               dt,
   43140                               QRegister(rd),
   43141                               DRegister(rn),
   43142                               DRegister(rm));
   43143                         break;
   43144                       }
   43145                       case 0x00000300: {
   43146                         // 0xf2800300
   43147                         if (((instr & 0x300000) == 0x300000)) {
   43148                           UnallocatedA32(instr);
   43149                           return;
   43150                         }
   43151                         DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
   43152                                                          ((instr >> 22) & 0x4));
   43153                         if (dt.Is(kDataTypeValueInvalid)) {
   43154                           UnallocatedA32(instr);
   43155                           return;
   43156                         }
   43157                         if (((instr >> 12) & 1) != 0) {
   43158                           UnallocatedA32(instr);
   43159                           return;
   43160                         }
   43161                         unsigned rd = ExtractQRegister(instr, 22, 12);
   43162                         if (((instr >> 16) & 1) != 0) {
   43163                           UnallocatedA32(instr);
   43164                           return;
   43165                         }
   43166                         unsigned rn = ExtractQRegister(instr, 7, 16);
   43167                         unsigned rm = ExtractDRegister(instr, 5, 0);
   43168                         // VSUBW{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Dm> ; A1
   43169                         vsubw(al,
   43170                               dt,
   43171                               QRegister(rd),
   43172                               QRegister(rn),
   43173                               DRegister(rm));
   43174                         break;
   43175                       }
   43176                     }
   43177                     break;
   43178                   }
   43179                   case 0x00000040: {
   43180                     // 0xf2800040
   43181                     switch (instr & 0x00000200) {
   43182                       case 0x00000000: {
   43183                         // 0xf2800040
   43184                         switch (instr & 0x01000000) {
   43185                           case 0x00000000: {
   43186                             // 0xf2800040
   43187                             if (((instr & 0x300000) == 0x300000)) {
   43188                               UnallocatedA32(instr);
   43189                               return;
   43190                             }
   43191                             DataType dt = Dt_size_9_Decode((instr >> 20) & 0x3,
   43192                                                            (instr >> 8) & 0x1);
   43193                             if (dt.Is(kDataTypeValueInvalid)) {
   43194                               UnallocatedA32(instr);
   43195                               return;
   43196                             }
   43197                             unsigned rd = ExtractDRegister(instr, 22, 12);
   43198                             unsigned rn = ExtractDRegister(instr, 7, 16);
   43199                             int lane;
   43200                             unsigned rm =
   43201                                 ExtractDRegisterAndLane(instr, dt, 5, 0, &lane);
   43202                             // VMLA{<c>}{<q>}.<type><size> <Dd>, <Dn>, <Dm[x]> ; A1 NOLINT(whitespace/line_length)
   43203                             vmla(al,
   43204                                  dt,
   43205                                  DRegister(rd),
   43206                                  DRegister(rn),
   43207                                  DRegisterLane(rm, lane));
   43208                             break;
   43209                           }
   43210                           case 0x01000000: {
   43211                             // 0xf3800040
   43212                             if (((instr & 0x300000) == 0x300000)) {
   43213                               UnallocatedA32(instr);
   43214                               return;
   43215                             }
   43216                             DataType dt = Dt_size_9_Decode((instr >> 20) & 0x3,
   43217                                                            (instr >> 8) & 0x1);
   43218                             if (dt.Is(kDataTypeValueInvalid)) {
   43219                               UnallocatedA32(instr);
   43220                               return;
   43221                             }
   43222                             if (((instr >> 12) & 1) != 0) {
   43223                               UnallocatedA32(instr);
   43224                               return;
   43225                             }
   43226                             unsigned rd = ExtractQRegister(instr, 22, 12);
   43227                             if (((instr >> 16) & 1) != 0) {
   43228                               UnallocatedA32(instr);
   43229                               return;
   43230                             }
   43231                             unsigned rn = ExtractQRegister(instr, 7, 16);
   43232                             int lane;
   43233                             unsigned rm =
   43234                                 ExtractDRegisterAndLane(instr, dt, 5, 0, &lane);
   43235                             // VMLA{<c>}{<q>}.<type><size> <Qd>, <Qn>, <Dm[x]> ; A1 NOLINT(whitespace/line_length)
   43236                             vmla(al,
   43237                                  dt,
   43238                                  QRegister(rd),
   43239                                  QRegister(rn),
   43240                                  DRegisterLane(rm, lane));
   43241                             break;
   43242                           }
   43243                         }
   43244                         break;
   43245                       }
   43246                       case 0x00000200: {
   43247                         // 0xf2800240
   43248                         switch (instr & 0x00000100) {
   43249                           case 0x00000000: {
   43250                             // 0xf2800240
   43251                             if (((instr & 0x300000) == 0x300000)) {
   43252                               UnallocatedA32(instr);
   43253                               return;
   43254                             }
   43255                             DataType dt =
   43256                                 Dt_size_11_Decode((instr >> 20) & 0x3,
   43257                                                   (instr >> 24) & 0x1);
   43258                             if (dt.Is(kDataTypeValueInvalid)) {
   43259                               UnallocatedA32(instr);
   43260                               return;
   43261                             }
   43262                             if (((instr >> 12) & 1) != 0) {
   43263                               UnallocatedA32(instr);
   43264                               return;
   43265                             }
   43266                             unsigned rd = ExtractQRegister(instr, 22, 12);
   43267                             unsigned rn = ExtractDRegister(instr, 7, 16);
   43268                             int lane;
   43269                             unsigned rm =
   43270                                 ExtractDRegisterAndLane(instr, dt, 5, 0, &lane);
   43271                             // VMLAL{<c>}{<q>}.<type><size> <Qd>, <Dn>, <Dm[x]> ; A1 NOLINT(whitespace/line_length)
   43272                             vmlal(al,
   43273                                   dt,
   43274                                   QRegister(rd),
   43275                                   DRegister(rn),
   43276                                   DRegisterLane(rm, lane));
   43277                             break;
   43278                           }
   43279                           case 0x00000100: {
   43280                             // 0xf2800340
   43281                             if ((instr & 0x01000000) == 0x00000000) {
   43282                               if (((instr & 0x300000) == 0x300000)) {
   43283                                 UnallocatedA32(instr);
   43284                                 return;
   43285                               }
   43286                               DataType dt =
   43287                                   Dt_size_13_Decode((instr >> 20) & 0x3);
   43288                               if (dt.Is(kDataTypeValueInvalid)) {
   43289                                 UnallocatedA32(instr);
   43290                                 return;
   43291                               }
   43292                               if (((instr >> 12) & 1) != 0) {
   43293                                 UnallocatedA32(instr);
   43294                                 return;
   43295                               }
   43296                               unsigned rd = ExtractQRegister(instr, 22, 12);
   43297                               unsigned rn = ExtractDRegister(instr, 7, 16);
   43298                               uint32_t mvm =
   43299                                   (instr & 0xf) | ((instr >> 1) & 0x10);
   43300                               uint32_t shift = 4;
   43301                               if (dt.Is(S16)) {
   43302                                 shift = 3;
   43303                               }
   43304                               uint32_t vm = mvm & ((1 << shift) - 1);
   43305                               uint32_t index = mvm >> shift;
   43306                               // VQDMLAL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm>[<index>] ; A2 NOLINT(whitespace/line_length)
   43307                               vqdmlal(al,
   43308                                       dt,
   43309                                       QRegister(rd),
   43310                                       DRegister(rn),
   43311                                       DRegister(vm),
   43312                                       index);
   43313                             } else {
   43314                               UnallocatedA32(instr);
   43315                             }
   43316                             break;
   43317                           }
   43318                         }
   43319                         break;
   43320                       }
   43321                     }
   43322                     break;
   43323                   }
   43324                   case 0x00000400: {
   43325                     // 0xf2800400
   43326                     switch (instr & 0x00000300) {
   43327                       case 0x00000000: {
   43328                         // 0xf2800400
   43329                         switch (instr & 0x01000000) {
   43330                           case 0x00000000: {
   43331                             // 0xf2800400
   43332                             if (((instr & 0x300000) == 0x300000)) {
   43333                               UnallocatedA32(instr);
   43334                               return;
   43335                             }
   43336                             DataType dt = Dt_size_3_Decode((instr >> 20) & 0x3);
   43337                             if (dt.Is(kDataTypeValueInvalid)) {
   43338                               UnallocatedA32(instr);
   43339                               return;
   43340                             }
   43341                             unsigned rd = ExtractDRegister(instr, 22, 12);
   43342                             if (((instr >> 16) & 1) != 0) {
   43343                               UnallocatedA32(instr);
   43344                               return;
   43345                             }
   43346                             unsigned rn = ExtractQRegister(instr, 7, 16);
   43347                             if ((instr & 1) != 0) {
   43348                               UnallocatedA32(instr);
   43349                               return;
   43350                             }
   43351                             unsigned rm = ExtractQRegister(instr, 5, 0);
   43352                             // VADDHN{<c>}{<q>}.<dt> <Dd>, <Qn>, <Qm> ; A1
   43353                             vaddhn(al,
   43354                                    dt,
   43355                                    DRegister(rd),
   43356                                    QRegister(rn),
   43357                                    QRegister(rm));
   43358                             break;
   43359                           }
   43360                           case 0x01000000: {
   43361                             // 0xf3800400
   43362                             if (((instr & 0x300000) == 0x300000)) {
   43363                               UnallocatedA32(instr);
   43364                               return;
   43365                             }
   43366                             DataType dt = Dt_size_3_Decode((instr >> 20) & 0x3);
   43367                             if (dt.Is(kDataTypeValueInvalid)) {
   43368                               UnallocatedA32(instr);
   43369                               return;
   43370                             }
   43371                             unsigned rd = ExtractDRegister(instr, 22, 12);
   43372                             if (((instr >> 16) & 1) != 0) {
   43373                               UnallocatedA32(instr);
   43374                               return;
   43375                             }
   43376                             unsigned rn = ExtractQRegister(instr, 7, 16);
   43377                             if ((instr & 1) != 0) {
   43378                               UnallocatedA32(instr);
   43379                               return;
   43380                             }
   43381                             unsigned rm = ExtractQRegister(instr, 5, 0);
   43382                             // VRADDHN{<c>}{<q>}.<dt> <Dd>, <Qn>, <Qm> ; A1
   43383                             vraddhn(al,
   43384                                     dt,
   43385                                     DRegister(rd),
   43386                                     QRegister(rn),
   43387                                     QRegister(rm));
   43388                             break;
   43389                           }
   43390                         }
   43391                         break;
   43392                       }
   43393                       case 0x00000100: {
   43394                         // 0xf2800500
   43395                         if (((instr & 0x300000) == 0x300000)) {
   43396                           UnallocatedA32(instr);
   43397                           return;
   43398                         }
   43399                         DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
   43400                                                          ((instr >> 22) & 0x4));
   43401                         if (dt.Is(kDataTypeValueInvalid)) {
   43402                           UnallocatedA32(instr);
   43403                           return;
   43404                         }
   43405                         if (((instr >> 12) & 1) != 0) {
   43406                           UnallocatedA32(instr);
   43407                           return;
   43408                         }
   43409                         unsigned rd = ExtractQRegister(instr, 22, 12);
   43410                         unsigned rn = ExtractDRegister(instr, 7, 16);
   43411                         unsigned rm = ExtractDRegister(instr, 5, 0);
   43412                         // VABAL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; A1
   43413                         vabal(al,
   43414                               dt,
   43415                               QRegister(rd),
   43416                               DRegister(rn),
   43417                               DRegister(rm));
   43418                         break;
   43419                       }
   43420                       case 0x00000200: {
   43421                         // 0xf2800600
   43422                         switch (instr & 0x01000000) {
   43423                           case 0x00000000: {
   43424                             // 0xf2800600
   43425                             if (((instr & 0x300000) == 0x300000)) {
   43426                               UnallocatedA32(instr);
   43427                               return;
   43428                             }
   43429                             DataType dt = Dt_size_3_Decode((instr >> 20) & 0x3);
   43430                             if (dt.Is(kDataTypeValueInvalid)) {
   43431                               UnallocatedA32(instr);
   43432                               return;
   43433                             }
   43434                             unsigned rd = ExtractDRegister(instr, 22, 12);
   43435                             if (((instr >> 16) & 1) != 0) {
   43436                               UnallocatedA32(instr);
   43437                               return;
   43438                             }
   43439                             unsigned rn = ExtractQRegister(instr, 7, 16);
   43440                             if ((instr & 1) != 0) {
   43441                               UnallocatedA32(instr);
   43442                               return;
   43443                             }
   43444                             unsigned rm = ExtractQRegister(instr, 5, 0);
   43445                             // VSUBHN{<c>}{<q>}.<dt> <Dd>, <Qn>, <Qm> ; A1
   43446                             vsubhn(al,
   43447                                    dt,
   43448                                    DRegister(rd),
   43449                                    QRegister(rn),
   43450                                    QRegister(rm));
   43451                             break;
   43452                           }
   43453                           case 0x01000000: {
   43454                             // 0xf3800600
   43455                             if (((instr & 0x300000) == 0x300000)) {
   43456                               UnallocatedA32(instr);
   43457                               return;
   43458                             }
   43459                             DataType dt = Dt_size_3_Decode((instr >> 20) & 0x3);
   43460                             if (dt.Is(kDataTypeValueInvalid)) {
   43461                               UnallocatedA32(instr);
   43462                               return;
   43463                             }
   43464                             unsigned rd = ExtractDRegister(instr, 22, 12);
   43465                             if (((instr >> 16) & 1) != 0) {
   43466                               UnallocatedA32(instr);
   43467                               return;
   43468                             }
   43469                             unsigned rn = ExtractQRegister(instr, 7, 16);
   43470                             if ((instr & 1) != 0) {
   43471                               UnallocatedA32(instr);
   43472                               return;
   43473                             }
   43474                             unsigned rm = ExtractQRegister(instr, 5, 0);
   43475                             // VRSUBHN{<c>}{<q>}.<dt> <Dd>, <Qn>, <Qm> ; A1
   43476                             vrsubhn(al,
   43477                                     dt,
   43478                                     DRegister(rd),
   43479                                     QRegister(rn),
   43480                                     QRegister(rm));
   43481                             break;
   43482                           }
   43483                         }
   43484                         break;
   43485                       }
   43486                       case 0x00000300: {
   43487                         // 0xf2800700
   43488                         if (((instr & 0x300000) == 0x300000)) {
   43489                           UnallocatedA32(instr);
   43490                           return;
   43491                         }
   43492                         DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
   43493                                                          ((instr >> 22) & 0x4));
   43494                         if (dt.Is(kDataTypeValueInvalid)) {
   43495                           UnallocatedA32(instr);
   43496                           return;
   43497                         }
   43498                         if (((instr >> 12) & 1) != 0) {
   43499                           UnallocatedA32(instr);
   43500                           return;
   43501                         }
   43502                         unsigned rd = ExtractQRegister(instr, 22, 12);
   43503                         unsigned rn = ExtractDRegister(instr, 7, 16);
   43504                         unsigned rm = ExtractDRegister(instr, 5, 0);
   43505                         // VABDL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; A1
   43506                         vabdl(al,
   43507                               dt,
   43508                               QRegister(rd),
   43509                               DRegister(rn),
   43510                               DRegister(rm));
   43511                         break;
   43512                       }
   43513                     }
   43514                     break;
   43515                   }
   43516                   case 0x00000440: {
   43517                     // 0xf2800440
   43518                     switch (instr & 0x00000200) {
   43519                       case 0x00000000: {
   43520                         // 0xf2800440
   43521                         switch (instr & 0x01000000) {
   43522                           case 0x00000000: {
   43523                             // 0xf2800440
   43524                             if (((instr & 0x300000) == 0x300000)) {
   43525                               UnallocatedA32(instr);
   43526                               return;
   43527                             }
   43528                             DataType dt = Dt_size_9_Decode((instr >> 20) & 0x3,
   43529                                                            (instr >> 8) & 0x1);
   43530                             if (dt.Is(kDataTypeValueInvalid)) {
   43531                               UnallocatedA32(instr);
   43532                               return;
   43533                             }
   43534                             unsigned rd = ExtractDRegister(instr, 22, 12);
   43535                             unsigned rn = ExtractDRegister(instr, 7, 16);
   43536                             int lane;
   43537                             unsigned rm =
   43538                                 ExtractDRegisterAndLane(instr, dt, 5, 0, &lane);
   43539                             // VMLS{<c>}{<q>}.<type><size> <Dd>, <Dn>, <Dm[x]> ; A1 NOLINT(whitespace/line_length)
   43540                             vmls(al,
   43541                                  dt,
   43542                                  DRegister(rd),
   43543                                  DRegister(rn),
   43544                                  DRegisterLane(rm, lane));
   43545                             break;
   43546                           }
   43547                           case 0x01000000: {
   43548                             // 0xf3800440
   43549                             if (((instr & 0x300000) == 0x300000)) {
   43550                               UnallocatedA32(instr);
   43551                               return;
   43552                             }
   43553                             DataType dt = Dt_size_9_Decode((instr >> 20) & 0x3,
   43554                                                            (instr >> 8) & 0x1);
   43555                             if (dt.Is(kDataTypeValueInvalid)) {
   43556                               UnallocatedA32(instr);
   43557                               return;
   43558                             }
   43559                             if (((instr >> 12) & 1) != 0) {
   43560                               UnallocatedA32(instr);
   43561                               return;
   43562                             }
   43563                             unsigned rd = ExtractQRegister(instr, 22, 12);
   43564                             if (((instr >> 16) & 1) != 0) {
   43565                               UnallocatedA32(instr);
   43566                               return;
   43567                             }
   43568                             unsigned rn = ExtractQRegister(instr, 7, 16);
   43569                             int lane;
   43570                             unsigned rm =
   43571                                 ExtractDRegisterAndLane(instr, dt, 5, 0, &lane);
   43572                             // VMLS{<c>}{<q>}.<type><size> <Qd>, <Qn>, <Dm[x]> ; A1 NOLINT(whitespace/line_length)
   43573                             vmls(al,
   43574                                  dt,
   43575                                  QRegister(rd),
   43576                                  QRegister(rn),
   43577                                  DRegisterLane(rm, lane));
   43578                             break;
   43579                           }
   43580                         }
   43581                         break;
   43582                       }
   43583                       case 0x00000200: {
   43584                         // 0xf2800640
   43585                         switch (instr & 0x00000100) {
   43586                           case 0x00000000: {
   43587                             // 0xf2800640
   43588                             if (((instr & 0x300000) == 0x300000)) {
   43589                               UnallocatedA32(instr);
   43590                               return;
   43591                             }
   43592                             DataType dt =
   43593                                 Dt_size_11_Decode((instr >> 20) & 0x3,
   43594                                                   (instr >> 24) & 0x1);
   43595                             if (dt.Is(kDataTypeValueInvalid)) {
   43596                               UnallocatedA32(instr);
   43597                               return;
   43598                             }
   43599                             if (((instr >> 12) & 1) != 0) {
   43600                               UnallocatedA32(instr);
   43601                               return;
   43602                             }
   43603                             unsigned rd = ExtractQRegister(instr, 22, 12);
   43604                             unsigned rn = ExtractDRegister(instr, 7, 16);
   43605                             int lane;
   43606                             unsigned rm =
   43607                                 ExtractDRegisterAndLane(instr, dt, 5, 0, &lane);
   43608                             // VMLSL{<c>}{<q>}.<type><size> <Qd>, <Dn>, <Dm[x]> ; A1 NOLINT(whitespace/line_length)
   43609                             vmlsl(al,
   43610                                   dt,
   43611                                   QRegister(rd),
   43612                                   DRegister(rn),
   43613                                   DRegisterLane(rm, lane));
   43614                             break;
   43615                           }
   43616                           case 0x00000100: {
   43617                             // 0xf2800740
   43618                             if ((instr & 0x01000000) == 0x00000000) {
   43619                               if (((instr & 0x300000) == 0x300000)) {
   43620                                 UnallocatedA32(instr);
   43621                                 return;
   43622                               }
   43623                               DataType dt =
   43624                                   Dt_size_13_Decode((instr >> 20) & 0x3);
   43625                               if (dt.Is(kDataTypeValueInvalid)) {
   43626                                 UnallocatedA32(instr);
   43627                                 return;
   43628                               }
   43629                               if (((instr >> 12) & 1) != 0) {
   43630                                 UnallocatedA32(instr);
   43631                                 return;
   43632                               }
   43633                               unsigned rd = ExtractQRegister(instr, 22, 12);
   43634                               unsigned rn = ExtractDRegister(instr, 7, 16);
   43635                               uint32_t mvm =
   43636                                   (instr & 0xf) | ((instr >> 1) & 0x10);
   43637                               uint32_t shift = 4;
   43638                               if (dt.Is(S16)) {
   43639                                 shift = 3;
   43640                               }
   43641                               uint32_t vm = mvm & ((1 << shift) - 1);
   43642                               uint32_t index = mvm >> shift;
   43643                               // VQDMLSL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm>[<index>] ; A2 NOLINT(whitespace/line_length)
   43644                               vqdmlsl(al,
   43645                                       dt,
   43646                                       QRegister(rd),
   43647                                       DRegister(rn),
   43648                                       DRegister(vm),
   43649                                       index);
   43650                             } else {
   43651                               UnallocatedA32(instr);
   43652                             }
   43653                             break;
   43654                           }
   43655                         }
   43656                         break;
   43657                       }
   43658                     }
   43659                     break;
   43660                   }
   43661                   case 0x00000800: {
   43662                     // 0xf2800800
   43663                     switch (instr & 0x00000300) {
   43664                       case 0x00000000: {
   43665                         // 0xf2800800
   43666                         if (((instr & 0x300000) == 0x300000)) {
   43667                           UnallocatedA32(instr);
   43668                           return;
   43669                         }
   43670                         DataType dt = Dt_size_12_Decode((instr >> 20) & 0x3,
   43671                                                         (instr >> 24) & 0x1);
   43672                         if (dt.Is(kDataTypeValueInvalid)) {
   43673                           UnallocatedA32(instr);
   43674                           return;
   43675                         }
   43676                         if (((instr >> 12) & 1) != 0) {
   43677                           UnallocatedA32(instr);
   43678                           return;
   43679                         }
   43680                         unsigned rd = ExtractQRegister(instr, 22, 12);
   43681                         unsigned rn = ExtractDRegister(instr, 7, 16);
   43682                         unsigned rm = ExtractDRegister(instr, 5, 0);
   43683                         // VMLAL{<c>}{<q>}.<type><size> <Qd>, <Dn>, <Dm> ; A1
   43684                         vmlal(al,
   43685                               dt,
   43686                               QRegister(rd),
   43687                               DRegister(rn),
   43688                               DRegister(rm));
   43689                         break;
   43690                       }
   43691                       case 0x00000100: {
   43692                         // 0xf2800900
   43693                         if ((instr & 0x01000000) == 0x00000000) {
   43694                           if (((instr & 0x300000) == 0x300000)) {
   43695                             UnallocatedA32(instr);
   43696                             return;
   43697                           }
   43698                           DataType dt = Dt_size_13_Decode((instr >> 20) & 0x3);
   43699                           if (dt.Is(kDataTypeValueInvalid)) {
   43700                             UnallocatedA32(instr);
   43701                             return;
   43702                           }
   43703                           if (((instr >> 12) & 1) != 0) {
   43704                             UnallocatedA32(instr);
   43705                             return;
   43706                           }
   43707                           unsigned rd = ExtractQRegister(instr, 22, 12);
   43708                           unsigned rn = ExtractDRegister(instr, 7, 16);
   43709                           unsigned rm = ExtractDRegister(instr, 5, 0);
   43710                           // VQDMLAL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; A1
   43711                           vqdmlal(al,
   43712                                   dt,
   43713                                   QRegister(rd),
   43714                                   DRegister(rn),
   43715                                   DRegister(rm));
   43716                         } else {
   43717                           UnallocatedA32(instr);
   43718                         }
   43719                         break;
   43720                       }
   43721                       case 0x00000200: {
   43722                         // 0xf2800a00
   43723                         if (((instr & 0x300000) == 0x300000)) {
   43724                           UnallocatedA32(instr);
   43725                           return;
   43726                         }
   43727                         DataType dt = Dt_size_12_Decode((instr >> 20) & 0x3,
   43728                                                         (instr >> 24) & 0x1);
   43729                         if (dt.Is(kDataTypeValueInvalid)) {
   43730                           UnallocatedA32(instr);
   43731                           return;
   43732                         }
   43733                         if (((instr >> 12) & 1) != 0) {
   43734                           UnallocatedA32(instr);
   43735                           return;
   43736                         }
   43737                         unsigned rd = ExtractQRegister(instr, 22, 12);
   43738                         unsigned rn = ExtractDRegister(instr, 7, 16);
   43739                         unsigned rm = ExtractDRegister(instr, 5, 0);
   43740                         // VMLSL{<c>}{<q>}.<type><size> <Qd>, <Dn>, <Dm> ; A1
   43741                         vmlsl(al,
   43742                               dt,
   43743                               QRegister(rd),
   43744                               DRegister(rn),
   43745                               DRegister(rm));
   43746                         break;
   43747                       }
   43748                       case 0x00000300: {
   43749                         // 0xf2800b00
   43750                         if ((instr & 0x01000000) == 0x00000000) {
   43751                           if (((instr & 0x300000) == 0x300000)) {
   43752                             UnallocatedA32(instr);
   43753                             return;
   43754                           }
   43755                           DataType dt = Dt_size_13_Decode((instr >> 20) & 0x3);
   43756                           if (dt.Is(kDataTypeValueInvalid)) {
   43757                             UnallocatedA32(instr);
   43758                             return;
   43759                           }
   43760                           if (((instr >> 12) & 1) != 0) {
   43761                             UnallocatedA32(instr);
   43762                             return;
   43763                           }
   43764                           unsigned rd = ExtractQRegister(instr, 22, 12);
   43765                           unsigned rn = ExtractDRegister(instr, 7, 16);
   43766                           unsigned rm = ExtractDRegister(instr, 5, 0);
   43767                           // VQDMLSL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; A1
   43768                           vqdmlsl(al,
   43769                                   dt,
   43770                                   QRegister(rd),
   43771                                   DRegister(rn),
   43772                                   DRegister(rm));
   43773                         } else {
   43774                           UnallocatedA32(instr);
   43775                         }
   43776                         break;
   43777                       }
   43778                     }
   43779                     break;
   43780                   }
   43781                   case 0x00000840: {
   43782                     // 0xf2800840
   43783                     switch (instr & 0x00000200) {
   43784                       case 0x00000000: {
   43785                         // 0xf2800840
   43786                         switch (instr & 0x01000000) {
   43787                           case 0x00000000: {
   43788                             // 0xf2800840
   43789                             if (((instr & 0x300000) == 0x300000)) {
   43790                               UnallocatedA32(instr);
   43791                               return;
   43792                             }
   43793                             DataType dt = Dt_F_size_3_Decode(
   43794                                 ((instr >> 20) & 0x3) | ((instr >> 6) & 0x4));
   43795                             if (dt.Is(kDataTypeValueInvalid)) {
   43796                               UnallocatedA32(instr);
   43797                               return;
   43798                             }
   43799                             unsigned rd = ExtractDRegister(instr, 22, 12);
   43800                             unsigned rn = ExtractDRegister(instr, 7, 16);
   43801                             uint32_t mvm =
   43802                                 (instr & 0xf) | ((instr >> 1) & 0x10);
   43803                             uint32_t shift = 4;
   43804                             if (dt.Is(I16)) {
   43805                               shift = 3;
   43806                             }
   43807                             uint32_t vm = mvm & ((1 << shift) - 1);
   43808                             uint32_t index = mvm >> shift;
   43809                             // VMUL{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm>[<index>] ; A1 NOLINT(whitespace/line_length)
   43810                             vmul(al,
   43811                                  dt,
   43812                                  DRegister(rd),
   43813                                  DRegister(rn),
   43814                                  DRegister(vm),
   43815                                  index);
   43816                             break;
   43817                           }
   43818                           case 0x01000000: {
   43819                             // 0xf3800840
   43820                             if (((instr & 0x300000) == 0x300000)) {
   43821                               UnallocatedA32(instr);
   43822                               return;
   43823                             }
   43824                             DataType dt = Dt_F_size_3_Decode(
   43825                                 ((instr >> 20) & 0x3) | ((instr >> 6) & 0x4));
   43826                             if (dt.Is(kDataTypeValueInvalid)) {
   43827                               UnallocatedA32(instr);
   43828                               return;
   43829                             }
   43830                             if (((instr >> 12) & 1) != 0) {
   43831                               UnallocatedA32(instr);
   43832                               return;
   43833                             }
   43834                             unsigned rd = ExtractQRegister(instr, 22, 12);
   43835                             if (((instr >> 16) & 1) != 0) {
   43836                               UnallocatedA32(instr);
   43837                               return;
   43838                             }
   43839                             unsigned rn = ExtractQRegister(instr, 7, 16);
   43840                             uint32_t mvm =
   43841                                 (instr & 0xf) | ((instr >> 1) & 0x10);
   43842                             uint32_t shift = 4;
   43843                             if (dt.Is(I16)) {
   43844                               shift = 3;
   43845                             }
   43846                             uint32_t vm = mvm & ((1 << shift) - 1);
   43847                             uint32_t index = mvm >> shift;
   43848                             // VMUL{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Dm>[<index>] ; A1 NOLINT(whitespace/line_length)
   43849                             vmul(al,
   43850                                  dt,
   43851                                  QRegister(rd),
   43852                                  QRegister(rn),
   43853                                  DRegister(vm),
   43854                                  index);
   43855                             break;
   43856                           }
   43857                         }
   43858                         break;
   43859                       }
   43860                       case 0x00000200: {
   43861                         // 0xf2800a40
   43862                         switch (instr & 0x00000100) {
   43863                           case 0x00000000: {
   43864                             // 0xf2800a40
   43865                             if (((instr & 0x300000) == 0x300000)) {
   43866                               UnallocatedA32(instr);
   43867                               return;
   43868                             }
   43869                             DataType dt = Dt_U_size_2_Decode(
   43870                                 ((instr >> 20) & 0x3) | ((instr >> 22) & 0x4));
   43871                             if (dt.Is(kDataTypeValueInvalid)) {
   43872                               UnallocatedA32(instr);
   43873                               return;
   43874                             }
   43875                             if (((instr >> 12) & 1) != 0) {
   43876                               UnallocatedA32(instr);
   43877                               return;
   43878                             }
   43879                             unsigned rd = ExtractQRegister(instr, 22, 12);
   43880                             unsigned rn = ExtractDRegister(instr, 7, 16);
   43881                             uint32_t mvm =
   43882                                 (instr & 0xf) | ((instr >> 1) & 0x10);
   43883                             uint32_t shift = 4;
   43884                             if (dt.Is(S16) || dt.Is(U16)) {
   43885                               shift = 3;
   43886                             }
   43887                             uint32_t vm = mvm & ((1 << shift) - 1);
   43888                             uint32_t index = mvm >> shift;
   43889                             // VMULL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm>[<index>] ; A1 NOLINT(whitespace/line_length)
   43890                             vmull(al,
   43891                                   dt,
   43892                                   QRegister(rd),
   43893                                   DRegister(rn),
   43894                                   DRegister(vm),
   43895                                   index);
   43896                             break;
   43897                           }
   43898                           case 0x00000100: {
   43899                             // 0xf2800b40
   43900                             if ((instr & 0x01000000) == 0x00000000) {
   43901                               if (((instr & 0x300000) == 0x300000)) {
   43902                                 UnallocatedA32(instr);
   43903                                 return;
   43904                               }
   43905                               DataType dt =
   43906                                   Dt_size_13_Decode((instr >> 20) & 0x3);
   43907                               if (dt.Is(kDataTypeValueInvalid)) {
   43908                                 UnallocatedA32(instr);
   43909                                 return;
   43910                               }
   43911                               if (((instr >> 12) & 1) != 0) {
   43912                                 UnallocatedA32(instr);
   43913                                 return;
   43914                               }
   43915                               unsigned rd = ExtractQRegister(instr, 22, 12);
   43916                               unsigned rn = ExtractDRegister(instr, 7, 16);
   43917                               int lane;
   43918                               unsigned rm = ExtractDRegisterAndLane(instr,
   43919                                                                     dt,
   43920                                                                     5,
   43921                                                                     0,
   43922                                                                     &lane);
   43923                               // VQDMULL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm[x]> ; A2
   43924                               vqdmull(al,
   43925                                       dt,
   43926                                       QRegister(rd),
   43927                                       DRegister(rn),
   43928                                       DRegisterLane(rm, lane));
   43929                             } else {
   43930                               UnallocatedA32(instr);
   43931                             }
   43932                             break;
   43933                           }
   43934                         }
   43935                         break;
   43936                       }
   43937                     }
   43938                     break;
   43939                   }
   43940                   case 0x00000c00: {
   43941                     // 0xf2800c00
   43942                     switch (instr & 0x00000100) {
   43943                       case 0x00000000: {
   43944                         // 0xf2800c00
   43945                         if (((instr & 0x300000) == 0x300000)) {
   43946                           UnallocatedA32(instr);
   43947                           return;
   43948                         }
   43949                         DataType dt = Dt_op_U_size_1_Decode(
   43950                             ((instr >> 20) & 0x3) | ((instr >> 22) & 0x4) |
   43951                             ((instr >> 6) & 0x8));
   43952                         if (dt.Is(kDataTypeValueInvalid)) {
   43953                           UnallocatedA32(instr);
   43954                           return;
   43955                         }
   43956                         if (((instr >> 12) & 1) != 0) {
   43957                           UnallocatedA32(instr);
   43958                           return;
   43959                         }
   43960                         unsigned rd = ExtractQRegister(instr, 22, 12);
   43961                         unsigned rn = ExtractDRegister(instr, 7, 16);
   43962                         unsigned rm = ExtractDRegister(instr, 5, 0);
   43963                         // VMULL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; A1
   43964                         vmull(al,
   43965                               dt,
   43966                               QRegister(rd),
   43967                               DRegister(rn),
   43968                               DRegister(rm));
   43969                         break;
   43970                       }
   43971                       case 0x00000100: {
   43972                         // 0xf2800d00
   43973                         if ((instr & 0x01000200) == 0x00000000) {
   43974                           if (((instr & 0x300000) == 0x300000)) {
   43975                             UnallocatedA32(instr);
   43976                             return;
   43977                           }
   43978                           DataType dt = Dt_size_13_Decode((instr >> 20) & 0x3);
   43979                           if (dt.Is(kDataTypeValueInvalid)) {
   43980                             UnallocatedA32(instr);
   43981                             return;
   43982                           }
   43983                           if (((instr >> 12) & 1) != 0) {
   43984                             UnallocatedA32(instr);
   43985                             return;
   43986                           }
   43987                           unsigned rd = ExtractQRegister(instr, 22, 12);
   43988                           unsigned rn = ExtractDRegister(instr, 7, 16);
   43989                           unsigned rm = ExtractDRegister(instr, 5, 0);
   43990                           // VQDMULL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; A1
   43991                           vqdmull(al,
   43992                                   dt,
   43993                                   QRegister(rd),
   43994                                   DRegister(rn),
   43995                                   DRegister(rm));
   43996                         } else {
   43997                           UnallocatedA32(instr);
   43998                         }
   43999                         break;
   44000                       }
   44001                     }
   44002                     break;
   44003                   }
   44004                   case 0x00000c40: {
   44005                     // 0xf2800c40
   44006                     switch (instr & 0x01000300) {
   44007                       case 0x00000000: {
   44008                         // 0xf2800c40
   44009                         if (((instr & 0x300000) == 0x300000)) {
   44010                           UnallocatedA32(instr);
   44011                           return;
   44012                         }
   44013                         DataType dt = Dt_size_13_Decode((instr >> 20) & 0x3);
   44014                         if (dt.Is(kDataTypeValueInvalid)) {
   44015                           UnallocatedA32(instr);
   44016                           return;
   44017                         }
   44018                         unsigned rd = ExtractDRegister(instr, 22, 12);
   44019                         unsigned rn = ExtractDRegister(instr, 7, 16);
   44020                         int lane;
   44021                         unsigned rm =
   44022                             ExtractDRegisterAndLane(instr, dt, 5, 0, &lane);
   44023                         // VQDMULH{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm[x]> ; A2
   44024                         vqdmulh(al,
   44025                                 dt,
   44026                                 DRegister(rd),
   44027                                 DRegister(rn),
   44028                                 DRegisterLane(rm, lane));
   44029                         break;
   44030                       }
   44031                       case 0x00000100: {
   44032                         // 0xf2800d40
   44033                         if (((instr & 0x300000) == 0x300000)) {
   44034                           UnallocatedA32(instr);
   44035                           return;
   44036                         }
   44037                         DataType dt = Dt_size_13_Decode((instr >> 20) & 0x3);
   44038                         if (dt.Is(kDataTypeValueInvalid)) {
   44039                           UnallocatedA32(instr);
   44040                           return;
   44041                         }
   44042                         unsigned rd = ExtractDRegister(instr, 22, 12);
   44043                         unsigned rn = ExtractDRegister(instr, 7, 16);
   44044                         int lane;
   44045                         unsigned rm =
   44046                             ExtractDRegisterAndLane(instr, dt, 5, 0, &lane);
   44047                         // VQRDMULH{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm[x]> ; A2
   44048                         vqrdmulh(al,
   44049                                  dt,
   44050                                  DRegister(rd),
   44051                                  DRegister(rn),
   44052                                  DRegisterLane(rm, lane));
   44053                         break;
   44054                       }
   44055                       case 0x01000000: {
   44056                         // 0xf3800c40
   44057                         if (((instr & 0x300000) == 0x300000)) {
   44058                           UnallocatedA32(instr);
   44059                           return;
   44060                         }
   44061                         DataType dt = Dt_size_13_Decode((instr >> 20) & 0x3);
   44062                         if (dt.Is(kDataTypeValueInvalid)) {
   44063                           UnallocatedA32(instr);
   44064                           return;
   44065                         }
   44066                         if (((instr >> 12) & 1) != 0) {
   44067                           UnallocatedA32(instr);
   44068                           return;
   44069                         }
   44070                         unsigned rd = ExtractQRegister(instr, 22, 12);
   44071                         if (((instr >> 16) & 1) != 0) {
   44072                           UnallocatedA32(instr);
   44073                           return;
   44074                         }
   44075                         unsigned rn = ExtractQRegister(instr, 7, 16);
   44076                         int lane;
   44077                         unsigned rm =
   44078                             ExtractDRegisterAndLane(instr, dt, 5, 0, &lane);
   44079                         // VQDMULH{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Dm[x]> ; A2
   44080                         vqdmulh(al,
   44081                                 dt,
   44082                                 QRegister(rd),
   44083                                 QRegister(rn),
   44084                                 DRegisterLane(rm, lane));
   44085                         break;
   44086                       }
   44087                       case 0x01000100: {
   44088                         // 0xf3800d40
   44089                         if (((instr & 0x300000) == 0x300000)) {
   44090                           UnallocatedA32(instr);
   44091                           return;
   44092                         }
   44093                         DataType dt = Dt_size_13_Decode((instr >> 20) & 0x3);
   44094                         if (dt.Is(kDataTypeValueInvalid)) {
   44095                           UnallocatedA32(instr);
   44096                           return;
   44097                         }
   44098                         if (((instr >> 12) & 1) != 0) {
   44099                           UnallocatedA32(instr);
   44100                           return;
   44101                         }
   44102                         unsigned rd = ExtractQRegister(instr, 22, 12);
   44103                         if (((instr >> 16) & 1) != 0) {
   44104                           UnallocatedA32(instr);
   44105                           return;
   44106                         }
   44107                         unsigned rn = ExtractQRegister(instr, 7, 16);
   44108                         int lane;
   44109                         unsigned rm =
   44110                             ExtractDRegisterAndLane(instr, dt, 5, 0, &lane);
   44111                         // VQRDMULH{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Dm[x]> ; A2
   44112                         vqrdmulh(al,
   44113                                  dt,
   44114                                  QRegister(rd),
   44115                                  QRegister(rn),
   44116                                  DRegisterLane(rm, lane));
   44117                         break;
   44118                       }
   44119                       default:
   44120                         UnallocatedA32(instr);
   44121                         break;
   44122                     }
   44123                     break;
   44124                   }
   44125                 }
   44126                 break;
   44127               }
   44128             }
   44129             break;
   44130           }
   44131           case 0x00800010: {
   44132             // 0xf2800010
   44133             switch (instr & 0x00000040) {
   44134               case 0x00000000: {
   44135                 // 0xf2800010
   44136                 switch (instr & 0x00000c00) {
   44137                   case 0x00000000: {
   44138                     // 0xf2800010
   44139                     switch (instr & 0x00380080) {
   44140                       case 0x00000000: {
   44141                         // 0xf2800010
   44142                         switch (instr & 0x00000100) {
   44143                           case 0x00000000: {
   44144                             // 0xf2800010
   44145                             switch (instr & 0x00000200) {
   44146                               default: {
   44147                                 switch (instr & 0x00000020) {
   44148                                   case 0x00000020: {
   44149                                     // 0xf2800030
   44150                                     if (((instr & 0xd00) == 0x100) ||
   44151                                         ((instr & 0xd00) == 0x500) ||
   44152                                         ((instr & 0xd00) == 0x900) ||
   44153                                         ((instr & 0xe00) == 0xe00)) {
   44154                                       UnallocatedA32(instr);
   44155                                       return;
   44156                                     }
   44157                                     unsigned cmode = (instr >> 8) & 0xf;
   44158                                     DataType dt =
   44159                                         ImmediateVmvn::DecodeDt(cmode);
   44160                                     if (dt.Is(kDataTypeValueInvalid)) {
   44161                                       UnallocatedA32(instr);
   44162                                       return;
   44163                                     }
   44164                                     unsigned rd =
   44165                                         ExtractDRegister(instr, 22, 12);
   44166                                     DOperand imm =
   44167                                         ImmediateVmvn::DecodeImmediate(
   44168                                             cmode,
   44169                                             (instr & 0xf) |
   44170                                                 ((instr >> 12) & 0x70) |
   44171                                                 ((instr >> 17) & 0x80));
   44172                                     // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1
   44173                                     vmvn(al, dt, DRegister(rd), imm);
   44174                                     break;
   44175                                   }
   44176                                   default: {
   44177                                     if (((instr & 0x920) == 0x100) ||
   44178                                         ((instr & 0x520) == 0x100) ||
   44179                                         ((instr & 0x820) == 0x20) ||
   44180                                         ((instr & 0x420) == 0x20) ||
   44181                                         ((instr & 0x220) == 0x20) ||
   44182                                         ((instr & 0x120) == 0x120)) {
   44183                                       UnallocatedA32(instr);
   44184                                       return;
   44185                                     }
   44186                                     unsigned cmode = ((instr >> 8) & 0xf) |
   44187                                                      ((instr >> 1) & 0x10);
   44188                                     DataType dt =
   44189                                         ImmediateVmov::DecodeDt(cmode);
   44190                                     if (dt.Is(kDataTypeValueInvalid)) {
   44191                                       UnallocatedA32(instr);
   44192                                       return;
   44193                                     }
   44194                                     unsigned rd =
   44195                                         ExtractDRegister(instr, 22, 12);
   44196                                     DOperand imm =
   44197                                         ImmediateVmov::DecodeImmediate(
   44198                                             cmode,
   44199                                             (instr & 0xf) |
   44200                                                 ((instr >> 12) & 0x70) |
   44201                                                 ((instr >> 17) & 0x80));
   44202                                     // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1
   44203                                     vmov(al, dt, DRegister(rd), imm);
   44204                                     break;
   44205                                   }
   44206                                 }
   44207                                 break;
   44208                               }
   44209                             }
   44210                             break;
   44211                           }
   44212                           case 0x00000100: {
   44213                             // 0xf2800110
   44214                             switch (instr & 0x00000020) {
   44215                               case 0x00000000: {
   44216                                 // 0xf2800110
   44217                                 if (((instr & 0x100) == 0x0) ||
   44218                                     ((instr & 0xc00) == 0xc00)) {
   44219                                   UnallocatedA32(instr);
   44220                                   return;
   44221                                 }
   44222                                 unsigned cmode = (instr >> 8) & 0xf;
   44223                                 DataType dt = ImmediateVorr::DecodeDt(cmode);
   44224                                 if (dt.Is(kDataTypeValueInvalid)) {
   44225                                   UnallocatedA32(instr);
   44226                                   return;
   44227                                 }
   44228                                 unsigned rd = ExtractDRegister(instr, 22, 12);
   44229                                 DOperand imm = ImmediateVorr::DecodeImmediate(
   44230                                     cmode,
   44231                                     (instr & 0xf) | ((instr >> 12) & 0x70) |
   44232                                         ((instr >> 17) & 0x80));
   44233                                 // VORR{<c>}{<q>}.<dt> {<Ddn>}, <Ddn>, #<imm> ; A1 NOLINT(whitespace/line_length)
   44234                                 vorr(al, dt, DRegister(rd), DRegister(rd), imm);
   44235                                 break;
   44236                               }
   44237                               case 0x00000020: {
   44238                                 // 0xf2800130
   44239                                 if (((instr & 0x100) == 0x0) ||
   44240                                     ((instr & 0xc00) == 0xc00)) {
   44241                                   UnallocatedA32(instr);
   44242                                   return;
   44243                                 }
   44244                                 unsigned cmode = (instr >> 8) & 0xf;
   44245                                 DataType dt = ImmediateVbic::DecodeDt(cmode);
   44246                                 if (dt.Is(kDataTypeValueInvalid)) {
   44247                                   UnallocatedA32(instr);
   44248                                   return;
   44249                                 }
   44250                                 unsigned rd = ExtractDRegister(instr, 22, 12);
   44251                                 DOperand imm = ImmediateVbic::DecodeImmediate(
   44252                                     cmode,
   44253                                     (instr & 0xf) | ((instr >> 12) & 0x70) |
   44254                                         ((instr >> 17) & 0x80));
   44255                                 // VBIC{<c>}{<q>}.<dt> {<Ddn>}, <Ddn>, #<imm> ; A1 NOLINT(whitespace/line_length)
   44256                                 vbic(al, dt, DRegister(rd), DRegister(rd), imm);
   44257                                 break;
   44258                               }
   44259                             }
   44260                             break;
   44261                           }
   44262                         }
   44263                         break;
   44264                       }
   44265                       default: {
   44266                         switch (instr & 0x00000300) {
   44267                           case 0x00000000: {
   44268                             // 0xf2800010
   44269                             if (((instr & 0x380080) == 0x0)) {
   44270                               UnallocatedA32(instr);
   44271                               return;
   44272                             }
   44273                             DataType dt =
   44274                                 Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
   44275                                                        ((instr >> 4) & 0x8),
   44276                                                    (instr >> 24) & 0x1);
   44277                             if (dt.Is(kDataTypeValueInvalid)) {
   44278                               UnallocatedA32(instr);
   44279                               return;
   44280                             }
   44281                             unsigned rd = ExtractDRegister(instr, 22, 12);
   44282                             unsigned rm = ExtractDRegister(instr, 5, 0);
   44283                             uint32_t imm6 = (instr >> 16) & 0x3f;
   44284                             uint32_t imm =
   44285                                 (dt.IsSize(64) ? 64 : (dt.GetSize() * 2)) -
   44286                                 imm6;
   44287                             // VSHR{<c>}{<q>}.<type><size> {<Dd>}, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   44288                             vshr(al, dt, DRegister(rd), DRegister(rm), imm);
   44289                             break;
   44290                           }
   44291                           case 0x00000100: {
   44292                             // 0xf2800110
   44293                             if (((instr & 0x380080) == 0x0)) {
   44294                               UnallocatedA32(instr);
   44295                               return;
   44296                             }
   44297                             DataType dt =
   44298                                 Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
   44299                                                        ((instr >> 4) & 0x8),
   44300                                                    (instr >> 24) & 0x1);
   44301                             if (dt.Is(kDataTypeValueInvalid)) {
   44302                               UnallocatedA32(instr);
   44303                               return;
   44304                             }
   44305                             unsigned rd = ExtractDRegister(instr, 22, 12);
   44306                             unsigned rm = ExtractDRegister(instr, 5, 0);
   44307                             uint32_t imm6 = (instr >> 16) & 0x3f;
   44308                             uint32_t imm =
   44309                                 (dt.IsSize(64) ? 64 : (dt.GetSize() * 2)) -
   44310                                 imm6;
   44311                             // VSRA{<c>}{<q>}.<type><size> {<Dd>}, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   44312                             vsra(al, dt, DRegister(rd), DRegister(rm), imm);
   44313                             break;
   44314                           }
   44315                           case 0x00000200: {
   44316                             // 0xf2800210
   44317                             if (((instr & 0x380080) == 0x0)) {
   44318                               UnallocatedA32(instr);
   44319                               return;
   44320                             }
   44321                             DataType dt =
   44322                                 Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
   44323                                                        ((instr >> 4) & 0x8),
   44324                                                    (instr >> 24) & 0x1);
   44325                             if (dt.Is(kDataTypeValueInvalid)) {
   44326                               UnallocatedA32(instr);
   44327                               return;
   44328                             }
   44329                             unsigned rd = ExtractDRegister(instr, 22, 12);
   44330                             unsigned rm = ExtractDRegister(instr, 5, 0);
   44331                             uint32_t imm6 = (instr >> 16) & 0x3f;
   44332                             uint32_t imm =
   44333                                 (dt.IsSize(64) ? 64 : (dt.GetSize() * 2)) -
   44334                                 imm6;
   44335                             // VRSHR{<c>}{<q>}.<type><size> {<Dd>}, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   44336                             vrshr(al, dt, DRegister(rd), DRegister(rm), imm);
   44337                             break;
   44338                           }
   44339                           case 0x00000300: {
   44340                             // 0xf2800310
   44341                             if (((instr & 0x380080) == 0x0)) {
   44342                               UnallocatedA32(instr);
   44343                               return;
   44344                             }
   44345                             DataType dt =
   44346                                 Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
   44347                                                        ((instr >> 4) & 0x8),
   44348                                                    (instr >> 24) & 0x1);
   44349                             if (dt.Is(kDataTypeValueInvalid)) {
   44350                               UnallocatedA32(instr);
   44351                               return;
   44352                             }
   44353                             unsigned rd = ExtractDRegister(instr, 22, 12);
   44354                             unsigned rm = ExtractDRegister(instr, 5, 0);
   44355                             uint32_t imm6 = (instr >> 16) & 0x3f;
   44356                             uint32_t imm =
   44357                                 (dt.IsSize(64) ? 64 : (dt.GetSize() * 2)) -
   44358                                 imm6;
   44359                             // VRSRA{<c>}{<q>}.<type><size> {<Dd>}, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   44360                             vrsra(al, dt, DRegister(rd), DRegister(rm), imm);
   44361                             break;
   44362                           }
   44363                         }
   44364                         break;
   44365                       }
   44366                     }
   44367                     break;
   44368                   }
   44369                   case 0x00000400: {
   44370                     // 0xf2800410
   44371                     switch (instr & 0x00380080) {
   44372                       case 0x00000000: {
   44373                         // 0xf2800410
   44374                         switch (instr & 0x00000100) {
   44375                           case 0x00000000: {
   44376                             // 0xf2800410
   44377                             switch (instr & 0x00000200) {
   44378                               default: {
   44379                                 switch (instr & 0x00000020) {
   44380                                   case 0x00000020: {
   44381                                     // 0xf2800430
   44382                                     if (((instr & 0xd00) == 0x100) ||
   44383                                         ((instr & 0xd00) == 0x500) ||
   44384                                         ((instr & 0xd00) == 0x900) ||
   44385                                         ((instr & 0xe00) == 0xe00)) {
   44386                                       UnallocatedA32(instr);
   44387                                       return;
   44388                                     }
   44389                                     unsigned cmode = (instr >> 8) & 0xf;
   44390                                     DataType dt =
   44391                                         ImmediateVmvn::DecodeDt(cmode);
   44392                                     if (dt.Is(kDataTypeValueInvalid)) {
   44393                                       UnallocatedA32(instr);
   44394                                       return;
   44395                                     }
   44396                                     unsigned rd =
   44397                                         ExtractDRegister(instr, 22, 12);
   44398                                     DOperand imm =
   44399                                         ImmediateVmvn::DecodeImmediate(
   44400                                             cmode,
   44401                                             (instr & 0xf) |
   44402                                                 ((instr >> 12) & 0x70) |
   44403                                                 ((instr >> 17) & 0x80));
   44404                                     // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1
   44405                                     vmvn(al, dt, DRegister(rd), imm);
   44406                                     break;
   44407                                   }
   44408                                   default: {
   44409                                     if (((instr & 0x920) == 0x100) ||
   44410                                         ((instr & 0x520) == 0x100) ||
   44411                                         ((instr & 0x820) == 0x20) ||
   44412                                         ((instr & 0x420) == 0x20) ||
   44413                                         ((instr & 0x220) == 0x20) ||
   44414                                         ((instr & 0x120) == 0x120)) {
   44415                                       UnallocatedA32(instr);
   44416                                       return;
   44417                                     }
   44418                                     unsigned cmode = ((instr >> 8) & 0xf) |
   44419                                                      ((instr >> 1) & 0x10);
   44420                                     DataType dt =
   44421                                         ImmediateVmov::DecodeDt(cmode);
   44422                                     if (dt.Is(kDataTypeValueInvalid)) {
   44423                                       UnallocatedA32(instr);
   44424                                       return;
   44425                                     }
   44426                                     unsigned rd =
   44427                                         ExtractDRegister(instr, 22, 12);
   44428                                     DOperand imm =
   44429                                         ImmediateVmov::DecodeImmediate(
   44430                                             cmode,
   44431                                             (instr & 0xf) |
   44432                                                 ((instr >> 12) & 0x70) |
   44433                                                 ((instr >> 17) & 0x80));
   44434                                     // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1
   44435                                     vmov(al, dt, DRegister(rd), imm);
   44436                                     break;
   44437                                   }
   44438                                 }
   44439                                 break;
   44440                               }
   44441                             }
   44442                             break;
   44443                           }
   44444                           case 0x00000100: {
   44445                             // 0xf2800510
   44446                             switch (instr & 0x00000020) {
   44447                               case 0x00000000: {
   44448                                 // 0xf2800510
   44449                                 if (((instr & 0x100) == 0x0) ||
   44450                                     ((instr & 0xc00) == 0xc00)) {
   44451                                   UnallocatedA32(instr);
   44452                                   return;
   44453                                 }
   44454                                 unsigned cmode = (instr >> 8) & 0xf;
   44455                                 DataType dt = ImmediateVorr::DecodeDt(cmode);
   44456                                 if (dt.Is(kDataTypeValueInvalid)) {
   44457                                   UnallocatedA32(instr);
   44458                                   return;
   44459                                 }
   44460                                 unsigned rd = ExtractDRegister(instr, 22, 12);
   44461                                 DOperand imm = ImmediateVorr::DecodeImmediate(
   44462                                     cmode,
   44463                                     (instr & 0xf) | ((instr >> 12) & 0x70) |
   44464                                         ((instr >> 17) & 0x80));
   44465                                 // VORR{<c>}{<q>}.<dt> {<Ddn>}, <Ddn>, #<imm> ; A1 NOLINT(whitespace/line_length)
   44466                                 vorr(al, dt, DRegister(rd), DRegister(rd), imm);
   44467                                 break;
   44468                               }
   44469                               case 0x00000020: {
   44470                                 // 0xf2800530
   44471                                 if (((instr & 0x100) == 0x0) ||
   44472                                     ((instr & 0xc00) == 0xc00)) {
   44473                                   UnallocatedA32(instr);
   44474                                   return;
   44475                                 }
   44476                                 unsigned cmode = (instr >> 8) & 0xf;
   44477                                 DataType dt = ImmediateVbic::DecodeDt(cmode);
   44478                                 if (dt.Is(kDataTypeValueInvalid)) {
   44479                                   UnallocatedA32(instr);
   44480                                   return;
   44481                                 }
   44482                                 unsigned rd = ExtractDRegister(instr, 22, 12);
   44483                                 DOperand imm = ImmediateVbic::DecodeImmediate(
   44484                                     cmode,
   44485                                     (instr & 0xf) | ((instr >> 12) & 0x70) |
   44486                                         ((instr >> 17) & 0x80));
   44487                                 // VBIC{<c>}{<q>}.<dt> {<Ddn>}, <Ddn>, #<imm> ; A1 NOLINT(whitespace/line_length)
   44488                                 vbic(al, dt, DRegister(rd), DRegister(rd), imm);
   44489                                 break;
   44490                               }
   44491                             }
   44492                             break;
   44493                           }
   44494                         }
   44495                         break;
   44496                       }
   44497                       default: {
   44498                         switch (instr & 0x00000300) {
   44499                           case 0x00000000: {
   44500                             // 0xf2800410
   44501                             if ((instr & 0x01000000) == 0x01000000) {
   44502                               if (((instr & 0x380080) == 0x0)) {
   44503                                 UnallocatedA32(instr);
   44504                                 return;
   44505                               }
   44506                               DataType dt = Dt_L_imm6_4_Decode(
   44507                                   ((instr >> 19) & 0x7) | ((instr >> 4) & 0x8));
   44508                               if (dt.Is(kDataTypeValueInvalid)) {
   44509                                 UnallocatedA32(instr);
   44510                                 return;
   44511                               }
   44512                               unsigned rd = ExtractDRegister(instr, 22, 12);
   44513                               unsigned rm = ExtractDRegister(instr, 5, 0);
   44514                               uint32_t imm6 = (instr >> 16) & 0x3f;
   44515                               uint32_t imm =
   44516                                   (dt.IsSize(64) ? 64 : (dt.GetSize() * 2)) -
   44517                                   imm6;
   44518                               // VSRI{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #<imm> ; A1
   44519                               vsri(al, dt, DRegister(rd), DRegister(rm), imm);
   44520                             } else {
   44521                               UnallocatedA32(instr);
   44522                             }
   44523                             break;
   44524                           }
   44525                           case 0x00000100: {
   44526                             // 0xf2800510
   44527                             switch (instr & 0x01000000) {
   44528                               case 0x00000000: {
   44529                                 // 0xf2800510
   44530                                 if (((instr & 0x380080) == 0x0)) {
   44531                                   UnallocatedA32(instr);
   44532                                   return;
   44533                                 }
   44534                                 DataType dt =
   44535                                     Dt_L_imm6_3_Decode(((instr >> 19) & 0x7) |
   44536                                                        ((instr >> 4) & 0x8));
   44537                                 if (dt.Is(kDataTypeValueInvalid)) {
   44538                                   UnallocatedA32(instr);
   44539                                   return;
   44540                                 }
   44541                                 unsigned rd = ExtractDRegister(instr, 22, 12);
   44542                                 unsigned rm = ExtractDRegister(instr, 5, 0);
   44543                                 uint32_t imm6 = (instr >> 16) & 0x3f;
   44544                                 uint32_t imm =
   44545                                     imm6 - (dt.IsSize(64) ? 0 : dt.GetSize());
   44546                                 // VSHL{<c>}{<q>}.I<size> {<Dd>}, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   44547                                 vshl(al, dt, DRegister(rd), DRegister(rm), imm);
   44548                                 break;
   44549                               }
   44550                               case 0x01000000: {
   44551                                 // 0xf3800510
   44552                                 if (((instr & 0x380080) == 0x0)) {
   44553                                   UnallocatedA32(instr);
   44554                                   return;
   44555                                 }
   44556                                 DataType dt =
   44557                                     Dt_L_imm6_4_Decode(((instr >> 19) & 0x7) |
   44558                                                        ((instr >> 4) & 0x8));
   44559                                 if (dt.Is(kDataTypeValueInvalid)) {
   44560                                   UnallocatedA32(instr);
   44561                                   return;
   44562                                 }
   44563                                 unsigned rd = ExtractDRegister(instr, 22, 12);
   44564                                 unsigned rm = ExtractDRegister(instr, 5, 0);
   44565                                 uint32_t imm6 = (instr >> 16) & 0x3f;
   44566                                 uint32_t imm =
   44567                                     imm6 - (dt.IsSize(64) ? 0 : dt.GetSize());
   44568                                 // VSLI{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #<imm> ; A1
   44569                                 vsli(al, dt, DRegister(rd), DRegister(rm), imm);
   44570                                 break;
   44571                               }
   44572                             }
   44573                             break;
   44574                           }
   44575                           case 0x00000200: {
   44576                             // 0xf2800610
   44577                             if (((instr & 0x380080) == 0x0)) {
   44578                               UnallocatedA32(instr);
   44579                               return;
   44580                             }
   44581                             DataType dt =
   44582                                 Dt_L_imm6_2_Decode(((instr >> 19) & 0x7) |
   44583                                                        ((instr >> 4) & 0x8),
   44584                                                    (instr >> 24) & 0x1);
   44585                             if (dt.Is(kDataTypeValueInvalid)) {
   44586                               UnallocatedA32(instr);
   44587                               return;
   44588                             }
   44589                             unsigned rd = ExtractDRegister(instr, 22, 12);
   44590                             unsigned rm = ExtractDRegister(instr, 5, 0);
   44591                             uint32_t imm6 = (instr >> 16) & 0x3f;
   44592                             uint32_t imm =
   44593                                 imm6 - (dt.IsSize(64) ? 0 : dt.GetSize());
   44594                             // VQSHLU{<c>}{<q>}.<type><size> {<Dd>}, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   44595                             vqshlu(al, dt, DRegister(rd), DRegister(rm), imm);
   44596                             break;
   44597                           }
   44598                           case 0x00000300: {
   44599                             // 0xf2800710
   44600                             if (((instr & 0x380080) == 0x0)) {
   44601                               UnallocatedA32(instr);
   44602                               return;
   44603                             }
   44604                             DataType dt =
   44605                                 Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
   44606                                                        ((instr >> 4) & 0x8),
   44607                                                    (instr >> 24) & 0x1);
   44608                             if (dt.Is(kDataTypeValueInvalid)) {
   44609                               UnallocatedA32(instr);
   44610                               return;
   44611                             }
   44612                             unsigned rd = ExtractDRegister(instr, 22, 12);
   44613                             unsigned rm = ExtractDRegister(instr, 5, 0);
   44614                             uint32_t imm6 = (instr >> 16) & 0x3f;
   44615                             uint32_t imm =
   44616                                 imm6 - (dt.IsSize(64) ? 0 : dt.GetSize());
   44617                             // VQSHL{<c>}{<q>}.<type><size> {<Dd>}, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   44618                             vqshl(al, dt, DRegister(rd), DRegister(rm), imm);
   44619                             break;
   44620                           }
   44621                         }
   44622                         break;
   44623                       }
   44624                     }
   44625                     break;
   44626                   }
   44627                   case 0x00000800: {
   44628                     // 0xf2800810
   44629                     switch (instr & 0x00000080) {
   44630                       case 0x00000000: {
   44631                         // 0xf2800810
   44632                         switch (instr & 0x00380000) {
   44633                           case 0x00000000: {
   44634                             // 0xf2800810
   44635                             switch (instr & 0x00000100) {
   44636                               case 0x00000000: {
   44637                                 // 0xf2800810
   44638                                 switch (instr & 0x00000200) {
   44639                                   default: {
   44640                                     switch (instr & 0x00000020) {
   44641                                       case 0x00000020: {
   44642                                         // 0xf2800830
   44643                                         if (((instr & 0xd00) == 0x100) ||
   44644                                             ((instr & 0xd00) == 0x500) ||
   44645                                             ((instr & 0xd00) == 0x900) ||
   44646                                             ((instr & 0xe00) == 0xe00)) {
   44647                                           UnallocatedA32(instr);
   44648                                           return;
   44649                                         }
   44650                                         unsigned cmode = (instr >> 8) & 0xf;
   44651                                         DataType dt =
   44652                                             ImmediateVmvn::DecodeDt(cmode);
   44653                                         if (dt.Is(kDataTypeValueInvalid)) {
   44654                                           UnallocatedA32(instr);
   44655                                           return;
   44656                                         }
   44657                                         unsigned rd =
   44658                                             ExtractDRegister(instr, 22, 12);
   44659                                         DOperand imm =
   44660                                             ImmediateVmvn::DecodeImmediate(
   44661                                                 cmode,
   44662                                                 (instr & 0xf) |
   44663                                                     ((instr >> 12) & 0x70) |
   44664                                                     ((instr >> 17) & 0x80));
   44665                                         // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1
   44666                                         vmvn(al, dt, DRegister(rd), imm);
   44667                                         break;
   44668                                       }
   44669                                       default: {
   44670                                         if (((instr & 0x920) == 0x100) ||
   44671                                             ((instr & 0x520) == 0x100) ||
   44672                                             ((instr & 0x820) == 0x20) ||
   44673                                             ((instr & 0x420) == 0x20) ||
   44674                                             ((instr & 0x220) == 0x20) ||
   44675                                             ((instr & 0x120) == 0x120)) {
   44676                                           UnallocatedA32(instr);
   44677                                           return;
   44678                                         }
   44679                                         unsigned cmode = ((instr >> 8) & 0xf) |
   44680                                                          ((instr >> 1) & 0x10);
   44681                                         DataType dt =
   44682                                             ImmediateVmov::DecodeDt(cmode);
   44683                                         if (dt.Is(kDataTypeValueInvalid)) {
   44684                                           UnallocatedA32(instr);
   44685                                           return;
   44686                                         }
   44687                                         unsigned rd =
   44688                                             ExtractDRegister(instr, 22, 12);
   44689                                         DOperand imm =
   44690                                             ImmediateVmov::DecodeImmediate(
   44691                                                 cmode,
   44692                                                 (instr & 0xf) |
   44693                                                     ((instr >> 12) & 0x70) |
   44694                                                     ((instr >> 17) & 0x80));
   44695                                         // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1
   44696                                         vmov(al, dt, DRegister(rd), imm);
   44697                                         break;
   44698                                       }
   44699                                     }
   44700                                     break;
   44701                                   }
   44702                                 }
   44703                                 break;
   44704                               }
   44705                               case 0x00000100: {
   44706                                 // 0xf2800910
   44707                                 switch (instr & 0x00000020) {
   44708                                   case 0x00000000: {
   44709                                     // 0xf2800910
   44710                                     if (((instr & 0x100) == 0x0) ||
   44711                                         ((instr & 0xc00) == 0xc00)) {
   44712                                       UnallocatedA32(instr);
   44713                                       return;
   44714                                     }
   44715                                     unsigned cmode = (instr >> 8) & 0xf;
   44716                                     DataType dt =
   44717                                         ImmediateVorr::DecodeDt(cmode);
   44718                                     if (dt.Is(kDataTypeValueInvalid)) {
   44719                                       UnallocatedA32(instr);
   44720                                       return;
   44721                                     }
   44722                                     unsigned rd =
   44723                                         ExtractDRegister(instr, 22, 12);
   44724                                     DOperand imm =
   44725                                         ImmediateVorr::DecodeImmediate(
   44726                                             cmode,
   44727                                             (instr & 0xf) |
   44728                                                 ((instr >> 12) & 0x70) |
   44729                                                 ((instr >> 17) & 0x80));
   44730                                     // VORR{<c>}{<q>}.<dt> {<Ddn>}, <Ddn>, #<imm> ; A1 NOLINT(whitespace/line_length)
   44731                                     vorr(al,
   44732                                          dt,
   44733                                          DRegister(rd),
   44734                                          DRegister(rd),
   44735                                          imm);
   44736                                     break;
   44737                                   }
   44738                                   case 0x00000020: {
   44739                                     // 0xf2800930
   44740                                     if (((instr & 0x100) == 0x0) ||
   44741                                         ((instr & 0xc00) == 0xc00)) {
   44742                                       UnallocatedA32(instr);
   44743                                       return;
   44744                                     }
   44745                                     unsigned cmode = (instr >> 8) & 0xf;
   44746                                     DataType dt =
   44747                                         ImmediateVbic::DecodeDt(cmode);
   44748                                     if (dt.Is(kDataTypeValueInvalid)) {
   44749                                       UnallocatedA32(instr);
   44750                                       return;
   44751                                     }
   44752                                     unsigned rd =
   44753                                         ExtractDRegister(instr, 22, 12);
   44754                                     DOperand imm =
   44755                                         ImmediateVbic::DecodeImmediate(
   44756                                             cmode,
   44757                                             (instr & 0xf) |
   44758                                                 ((instr >> 12) & 0x70) |
   44759                                                 ((instr >> 17) & 0x80));
   44760                                     // VBIC{<c>}{<q>}.<dt> {<Ddn>}, <Ddn>, #<imm> ; A1 NOLINT(whitespace/line_length)
   44761                                     vbic(al,
   44762                                          dt,
   44763                                          DRegister(rd),
   44764                                          DRegister(rd),
   44765                                          imm);
   44766                                     break;
   44767                                   }
   44768                                 }
   44769                                 break;
   44770                               }
   44771                             }
   44772                             break;
   44773                           }
   44774                           case 0x00180000: {
   44775                             // 0xf2980810
   44776                             switch (instr & 0x00000300) {
   44777                               case 0x00000000: {
   44778                                 // 0xf2980810
   44779                                 switch (instr & 0x01000000) {
   44780                                   case 0x00000000: {
   44781                                     // 0xf2980810
   44782                                     if (((instr & 0x380000) == 0x0)) {
   44783                                       UnallocatedA32(instr);
   44784                                       return;
   44785                                     }
   44786                                     DataType dt =
   44787                                         Dt_imm6_3_Decode((instr >> 19) & 0x7);
   44788                                     if (dt.Is(kDataTypeValueInvalid)) {
   44789                                       UnallocatedA32(instr);
   44790                                       return;
   44791                                     }
   44792                                     unsigned rd =
   44793                                         ExtractDRegister(instr, 22, 12);
   44794                                     if ((instr & 1) != 0) {
   44795                                       UnallocatedA32(instr);
   44796                                       return;
   44797                                     }
   44798                                     unsigned rm = ExtractQRegister(instr, 5, 0);
   44799                                     uint32_t imm6 = (instr >> 16) & 0x3f;
   44800                                     uint32_t imm = dt.GetSize() - imm6;
   44801                                     // VSHRN{<c>}{<q>}.I<size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   44802                                     vshrn(al,
   44803                                           dt,
   44804                                           DRegister(rd),
   44805                                           QRegister(rm),
   44806                                           imm);
   44807                                     break;
   44808                                   }
   44809                                   case 0x01000000: {
   44810                                     // 0xf3980810
   44811                                     if (((instr & 0x380000) == 0x0)) {
   44812                                       UnallocatedA32(instr);
   44813                                       return;
   44814                                     }
   44815                                     DataType dt =
   44816                                         Dt_imm6_2_Decode((instr >> 19) & 0x7,
   44817                                                          (instr >> 24) & 0x1);
   44818                                     if (dt.Is(kDataTypeValueInvalid)) {
   44819                                       UnallocatedA32(instr);
   44820                                       return;
   44821                                     }
   44822                                     unsigned rd =
   44823                                         ExtractDRegister(instr, 22, 12);
   44824                                     if ((instr & 1) != 0) {
   44825                                       UnallocatedA32(instr);
   44826                                       return;
   44827                                     }
   44828                                     unsigned rm = ExtractQRegister(instr, 5, 0);
   44829                                     uint32_t imm6 = (instr >> 16) & 0x3f;
   44830                                     uint32_t imm = dt.GetSize() - imm6;
   44831                                     // VQSHRUN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   44832                                     vqshrun(al,
   44833                                             dt,
   44834                                             DRegister(rd),
   44835                                             QRegister(rm),
   44836                                             imm);
   44837                                     break;
   44838                                   }
   44839                                 }
   44840                                 break;
   44841                               }
   44842                               case 0x00000100: {
   44843                                 // 0xf2980910
   44844                                 if (((instr & 0x380000) == 0x0)) {
   44845                                   UnallocatedA32(instr);
   44846                                   return;
   44847                                 }
   44848                                 DataType dt =
   44849                                     Dt_imm6_1_Decode((instr >> 19) & 0x7,
   44850                                                      (instr >> 24) & 0x1);
   44851                                 if (dt.Is(kDataTypeValueInvalid)) {
   44852                                   UnallocatedA32(instr);
   44853                                   return;
   44854                                 }
   44855                                 unsigned rd = ExtractDRegister(instr, 22, 12);
   44856                                 if ((instr & 1) != 0) {
   44857                                   UnallocatedA32(instr);
   44858                                   return;
   44859                                 }
   44860                                 unsigned rm = ExtractQRegister(instr, 5, 0);
   44861                                 uint32_t imm6 = (instr >> 16) & 0x3f;
   44862                                 uint32_t imm = dt.GetSize() - imm6;
   44863                                 // VQSHRN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   44864                                 vqshrn(al,
   44865                                        dt,
   44866                                        DRegister(rd),
   44867                                        QRegister(rm),
   44868                                        imm);
   44869                                 break;
   44870                               }
   44871                               case 0x00000200: {
   44872                                 // 0xf2980a10
   44873                                 if (((instr & 0x380000) == 0x0) ||
   44874                                     ((instr & 0x3f0000) == 0x80000) ||
   44875                                     ((instr & 0x3f0000) == 0x100000) ||
   44876                                     ((instr & 0x3f0000) == 0x200000)) {
   44877                                   UnallocatedA32(instr);
   44878                                   return;
   44879                                 }
   44880                                 DataType dt =
   44881                                     Dt_imm6_4_Decode((instr >> 19) & 0x7,
   44882                                                      (instr >> 24) & 0x1);
   44883                                 if (dt.Is(kDataTypeValueInvalid)) {
   44884                                   UnallocatedA32(instr);
   44885                                   return;
   44886                                 }
   44887                                 if (((instr >> 12) & 1) != 0) {
   44888                                   UnallocatedA32(instr);
   44889                                   return;
   44890                                 }
   44891                                 unsigned rd = ExtractQRegister(instr, 22, 12);
   44892                                 unsigned rm = ExtractDRegister(instr, 5, 0);
   44893                                 uint32_t imm6 = (instr >> 16) & 0x3f;
   44894                                 uint32_t imm = imm6 - dt.GetSize();
   44895                                 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   44896                                 vshll(al,
   44897                                       dt,
   44898                                       QRegister(rd),
   44899                                       DRegister(rm),
   44900                                       imm);
   44901                                 break;
   44902                               }
   44903                               default:
   44904                                 UnallocatedA32(instr);
   44905                                 break;
   44906                             }
   44907                             break;
   44908                           }
   44909                           case 0x00280000: {
   44910                             // 0xf2a80810
   44911                             switch (instr & 0x00000300) {
   44912                               case 0x00000000: {
   44913                                 // 0xf2a80810
   44914                                 switch (instr & 0x01000000) {
   44915                                   case 0x00000000: {
   44916                                     // 0xf2a80810
   44917                                     if (((instr & 0x380000) == 0x0)) {
   44918                                       UnallocatedA32(instr);
   44919                                       return;
   44920                                     }
   44921                                     DataType dt =
   44922                                         Dt_imm6_3_Decode((instr >> 19) & 0x7);
   44923                                     if (dt.Is(kDataTypeValueInvalid)) {
   44924                                       UnallocatedA32(instr);
   44925                                       return;
   44926                                     }
   44927                                     unsigned rd =
   44928                                         ExtractDRegister(instr, 22, 12);
   44929                                     if ((instr & 1) != 0) {
   44930                                       UnallocatedA32(instr);
   44931                                       return;
   44932                                     }
   44933                                     unsigned rm = ExtractQRegister(instr, 5, 0);
   44934                                     uint32_t imm6 = (instr >> 16) & 0x3f;
   44935                                     uint32_t imm = dt.GetSize() - imm6;
   44936                                     // VSHRN{<c>}{<q>}.I<size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   44937                                     vshrn(al,
   44938                                           dt,
   44939                                           DRegister(rd),
   44940                                           QRegister(rm),
   44941                                           imm);
   44942                                     break;
   44943                                   }
   44944                                   case 0x01000000: {
   44945                                     // 0xf3a80810
   44946                                     if (((instr & 0x380000) == 0x0)) {
   44947                                       UnallocatedA32(instr);
   44948                                       return;
   44949                                     }
   44950                                     DataType dt =
   44951                                         Dt_imm6_2_Decode((instr >> 19) & 0x7,
   44952                                                          (instr >> 24) & 0x1);
   44953                                     if (dt.Is(kDataTypeValueInvalid)) {
   44954                                       UnallocatedA32(instr);
   44955                                       return;
   44956                                     }
   44957                                     unsigned rd =
   44958                                         ExtractDRegister(instr, 22, 12);
   44959                                     if ((instr & 1) != 0) {
   44960                                       UnallocatedA32(instr);
   44961                                       return;
   44962                                     }
   44963                                     unsigned rm = ExtractQRegister(instr, 5, 0);
   44964                                     uint32_t imm6 = (instr >> 16) & 0x3f;
   44965                                     uint32_t imm = dt.GetSize() - imm6;
   44966                                     // VQSHRUN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   44967                                     vqshrun(al,
   44968                                             dt,
   44969                                             DRegister(rd),
   44970                                             QRegister(rm),
   44971                                             imm);
   44972                                     break;
   44973                                   }
   44974                                 }
   44975                                 break;
   44976                               }
   44977                               case 0x00000100: {
   44978                                 // 0xf2a80910
   44979                                 if (((instr & 0x380000) == 0x0)) {
   44980                                   UnallocatedA32(instr);
   44981                                   return;
   44982                                 }
   44983                                 DataType dt =
   44984                                     Dt_imm6_1_Decode((instr >> 19) & 0x7,
   44985                                                      (instr >> 24) & 0x1);
   44986                                 if (dt.Is(kDataTypeValueInvalid)) {
   44987                                   UnallocatedA32(instr);
   44988                                   return;
   44989                                 }
   44990                                 unsigned rd = ExtractDRegister(instr, 22, 12);
   44991                                 if ((instr & 1) != 0) {
   44992                                   UnallocatedA32(instr);
   44993                                   return;
   44994                                 }
   44995                                 unsigned rm = ExtractQRegister(instr, 5, 0);
   44996                                 uint32_t imm6 = (instr >> 16) & 0x3f;
   44997                                 uint32_t imm = dt.GetSize() - imm6;
   44998                                 // VQSHRN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   44999                                 vqshrn(al,
   45000                                        dt,
   45001                                        DRegister(rd),
   45002                                        QRegister(rm),
   45003                                        imm);
   45004                                 break;
   45005                               }
   45006                               case 0x00000200: {
   45007                                 // 0xf2a80a10
   45008                                 if (((instr & 0x380000) == 0x0) ||
   45009                                     ((instr & 0x3f0000) == 0x80000) ||
   45010                                     ((instr & 0x3f0000) == 0x100000) ||
   45011                                     ((instr & 0x3f0000) == 0x200000)) {
   45012                                   UnallocatedA32(instr);
   45013                                   return;
   45014                                 }
   45015                                 DataType dt =
   45016                                     Dt_imm6_4_Decode((instr >> 19) & 0x7,
   45017                                                      (instr >> 24) & 0x1);
   45018                                 if (dt.Is(kDataTypeValueInvalid)) {
   45019                                   UnallocatedA32(instr);
   45020                                   return;
   45021                                 }
   45022                                 if (((instr >> 12) & 1) != 0) {
   45023                                   UnallocatedA32(instr);
   45024                                   return;
   45025                                 }
   45026                                 unsigned rd = ExtractQRegister(instr, 22, 12);
   45027                                 unsigned rm = ExtractDRegister(instr, 5, 0);
   45028                                 uint32_t imm6 = (instr >> 16) & 0x3f;
   45029                                 uint32_t imm = imm6 - dt.GetSize();
   45030                                 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   45031                                 vshll(al,
   45032                                       dt,
   45033                                       QRegister(rd),
   45034                                       DRegister(rm),
   45035                                       imm);
   45036                                 break;
   45037                               }
   45038                               default:
   45039                                 UnallocatedA32(instr);
   45040                                 break;
   45041                             }
   45042                             break;
   45043                           }
   45044                           case 0x00300000: {
   45045                             // 0xf2b00810
   45046                             switch (instr & 0x00000300) {
   45047                               case 0x00000000: {
   45048                                 // 0xf2b00810
   45049                                 switch (instr & 0x01000000) {
   45050                                   case 0x00000000: {
   45051                                     // 0xf2b00810
   45052                                     if (((instr & 0x380000) == 0x0)) {
   45053                                       UnallocatedA32(instr);
   45054                                       return;
   45055                                     }
   45056                                     DataType dt =
   45057                                         Dt_imm6_3_Decode((instr >> 19) & 0x7);
   45058                                     if (dt.Is(kDataTypeValueInvalid)) {
   45059                                       UnallocatedA32(instr);
   45060                                       return;
   45061                                     }
   45062                                     unsigned rd =
   45063                                         ExtractDRegister(instr, 22, 12);
   45064                                     if ((instr & 1) != 0) {
   45065                                       UnallocatedA32(instr);
   45066                                       return;
   45067                                     }
   45068                                     unsigned rm = ExtractQRegister(instr, 5, 0);
   45069                                     uint32_t imm6 = (instr >> 16) & 0x3f;
   45070                                     uint32_t imm = dt.GetSize() - imm6;
   45071                                     // VSHRN{<c>}{<q>}.I<size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   45072                                     vshrn(al,
   45073                                           dt,
   45074                                           DRegister(rd),
   45075                                           QRegister(rm),
   45076                                           imm);
   45077                                     break;
   45078                                   }
   45079                                   case 0x01000000: {
   45080                                     // 0xf3b00810
   45081                                     if (((instr & 0x380000) == 0x0)) {
   45082                                       UnallocatedA32(instr);
   45083                                       return;
   45084                                     }
   45085                                     DataType dt =
   45086                                         Dt_imm6_2_Decode((instr >> 19) & 0x7,
   45087                                                          (instr >> 24) & 0x1);
   45088                                     if (dt.Is(kDataTypeValueInvalid)) {
   45089                                       UnallocatedA32(instr);
   45090                                       return;
   45091                                     }
   45092                                     unsigned rd =
   45093                                         ExtractDRegister(instr, 22, 12);
   45094                                     if ((instr & 1) != 0) {
   45095                                       UnallocatedA32(instr);
   45096                                       return;
   45097                                     }
   45098                                     unsigned rm = ExtractQRegister(instr, 5, 0);
   45099                                     uint32_t imm6 = (instr >> 16) & 0x3f;
   45100                                     uint32_t imm = dt.GetSize() - imm6;
   45101                                     // VQSHRUN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   45102                                     vqshrun(al,
   45103                                             dt,
   45104                                             DRegister(rd),
   45105                                             QRegister(rm),
   45106                                             imm);
   45107                                     break;
   45108                                   }
   45109                                 }
   45110                                 break;
   45111                               }
   45112                               case 0x00000100: {
   45113                                 // 0xf2b00910
   45114                                 if (((instr & 0x380000) == 0x0)) {
   45115                                   UnallocatedA32(instr);
   45116                                   return;
   45117                                 }
   45118                                 DataType dt =
   45119                                     Dt_imm6_1_Decode((instr >> 19) & 0x7,
   45120                                                      (instr >> 24) & 0x1);
   45121                                 if (dt.Is(kDataTypeValueInvalid)) {
   45122                                   UnallocatedA32(instr);
   45123                                   return;
   45124                                 }
   45125                                 unsigned rd = ExtractDRegister(instr, 22, 12);
   45126                                 if ((instr & 1) != 0) {
   45127                                   UnallocatedA32(instr);
   45128                                   return;
   45129                                 }
   45130                                 unsigned rm = ExtractQRegister(instr, 5, 0);
   45131                                 uint32_t imm6 = (instr >> 16) & 0x3f;
   45132                                 uint32_t imm = dt.GetSize() - imm6;
   45133                                 // VQSHRN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   45134                                 vqshrn(al,
   45135                                        dt,
   45136                                        DRegister(rd),
   45137                                        QRegister(rm),
   45138                                        imm);
   45139                                 break;
   45140                               }
   45141                               case 0x00000200: {
   45142                                 // 0xf2b00a10
   45143                                 if (((instr & 0x380000) == 0x0) ||
   45144                                     ((instr & 0x3f0000) == 0x80000) ||
   45145                                     ((instr & 0x3f0000) == 0x100000) ||
   45146                                     ((instr & 0x3f0000) == 0x200000)) {
   45147                                   UnallocatedA32(instr);
   45148                                   return;
   45149                                 }
   45150                                 DataType dt =
   45151                                     Dt_imm6_4_Decode((instr >> 19) & 0x7,
   45152                                                      (instr >> 24) & 0x1);
   45153                                 if (dt.Is(kDataTypeValueInvalid)) {
   45154                                   UnallocatedA32(instr);
   45155                                   return;
   45156                                 }
   45157                                 if (((instr >> 12) & 1) != 0) {
   45158                                   UnallocatedA32(instr);
   45159                                   return;
   45160                                 }
   45161                                 unsigned rd = ExtractQRegister(instr, 22, 12);
   45162                                 unsigned rm = ExtractDRegister(instr, 5, 0);
   45163                                 uint32_t imm6 = (instr >> 16) & 0x3f;
   45164                                 uint32_t imm = imm6 - dt.GetSize();
   45165                                 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   45166                                 vshll(al,
   45167                                       dt,
   45168                                       QRegister(rd),
   45169                                       DRegister(rm),
   45170                                       imm);
   45171                                 break;
   45172                               }
   45173                               default:
   45174                                 UnallocatedA32(instr);
   45175                                 break;
   45176                             }
   45177                             break;
   45178                           }
   45179                           case 0x00380000: {
   45180                             // 0xf2b80810
   45181                             switch (instr & 0x00000300) {
   45182                               case 0x00000000: {
   45183                                 // 0xf2b80810
   45184                                 switch (instr & 0x01000000) {
   45185                                   case 0x00000000: {
   45186                                     // 0xf2b80810
   45187                                     if (((instr & 0x380000) == 0x0)) {
   45188                                       UnallocatedA32(instr);
   45189                                       return;
   45190                                     }
   45191                                     DataType dt =
   45192                                         Dt_imm6_3_Decode((instr >> 19) & 0x7);
   45193                                     if (dt.Is(kDataTypeValueInvalid)) {
   45194                                       UnallocatedA32(instr);
   45195                                       return;
   45196                                     }
   45197                                     unsigned rd =
   45198                                         ExtractDRegister(instr, 22, 12);
   45199                                     if ((instr & 1) != 0) {
   45200                                       UnallocatedA32(instr);
   45201                                       return;
   45202                                     }
   45203                                     unsigned rm = ExtractQRegister(instr, 5, 0);
   45204                                     uint32_t imm6 = (instr >> 16) & 0x3f;
   45205                                     uint32_t imm = dt.GetSize() - imm6;
   45206                                     // VSHRN{<c>}{<q>}.I<size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   45207                                     vshrn(al,
   45208                                           dt,
   45209                                           DRegister(rd),
   45210                                           QRegister(rm),
   45211                                           imm);
   45212                                     break;
   45213                                   }
   45214                                   case 0x01000000: {
   45215                                     // 0xf3b80810
   45216                                     if (((instr & 0x380000) == 0x0)) {
   45217                                       UnallocatedA32(instr);
   45218                                       return;
   45219                                     }
   45220                                     DataType dt =
   45221                                         Dt_imm6_2_Decode((instr >> 19) & 0x7,
   45222                                                          (instr >> 24) & 0x1);
   45223                                     if (dt.Is(kDataTypeValueInvalid)) {
   45224                                       UnallocatedA32(instr);
   45225                                       return;
   45226                                     }
   45227                                     unsigned rd =
   45228                                         ExtractDRegister(instr, 22, 12);
   45229                                     if ((instr & 1) != 0) {
   45230                                       UnallocatedA32(instr);
   45231                                       return;
   45232                                     }
   45233                                     unsigned rm = ExtractQRegister(instr, 5, 0);
   45234                                     uint32_t imm6 = (instr >> 16) & 0x3f;
   45235                                     uint32_t imm = dt.GetSize() - imm6;
   45236                                     // VQSHRUN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   45237                                     vqshrun(al,
   45238                                             dt,
   45239                                             DRegister(rd),
   45240                                             QRegister(rm),
   45241                                             imm);
   45242                                     break;
   45243                                   }
   45244                                 }
   45245                                 break;
   45246                               }
   45247                               case 0x00000100: {
   45248                                 // 0xf2b80910
   45249                                 if (((instr & 0x380000) == 0x0)) {
   45250                                   UnallocatedA32(instr);
   45251                                   return;
   45252                                 }
   45253                                 DataType dt =
   45254                                     Dt_imm6_1_Decode((instr >> 19) & 0x7,
   45255                                                      (instr >> 24) & 0x1);
   45256                                 if (dt.Is(kDataTypeValueInvalid)) {
   45257                                   UnallocatedA32(instr);
   45258                                   return;
   45259                                 }
   45260                                 unsigned rd = ExtractDRegister(instr, 22, 12);
   45261                                 if ((instr & 1) != 0) {
   45262                                   UnallocatedA32(instr);
   45263                                   return;
   45264                                 }
   45265                                 unsigned rm = ExtractQRegister(instr, 5, 0);
   45266                                 uint32_t imm6 = (instr >> 16) & 0x3f;
   45267                                 uint32_t imm = dt.GetSize() - imm6;
   45268                                 // VQSHRN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   45269                                 vqshrn(al,
   45270                                        dt,
   45271                                        DRegister(rd),
   45272                                        QRegister(rm),
   45273                                        imm);
   45274                                 break;
   45275                               }
   45276                               case 0x00000200: {
   45277                                 // 0xf2b80a10
   45278                                 if (((instr & 0x380000) == 0x0) ||
   45279                                     ((instr & 0x3f0000) == 0x80000) ||
   45280                                     ((instr & 0x3f0000) == 0x100000) ||
   45281                                     ((instr & 0x3f0000) == 0x200000)) {
   45282                                   UnallocatedA32(instr);
   45283                                   return;
   45284                                 }
   45285                                 DataType dt =
   45286                                     Dt_imm6_4_Decode((instr >> 19) & 0x7,
   45287                                                      (instr >> 24) & 0x1);
   45288                                 if (dt.Is(kDataTypeValueInvalid)) {
   45289                                   UnallocatedA32(instr);
   45290                                   return;
   45291                                 }
   45292                                 if (((instr >> 12) & 1) != 0) {
   45293                                   UnallocatedA32(instr);
   45294                                   return;
   45295                                 }
   45296                                 unsigned rd = ExtractQRegister(instr, 22, 12);
   45297                                 unsigned rm = ExtractDRegister(instr, 5, 0);
   45298                                 uint32_t imm6 = (instr >> 16) & 0x3f;
   45299                                 uint32_t imm = imm6 - dt.GetSize();
   45300                                 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   45301                                 vshll(al,
   45302                                       dt,
   45303                                       QRegister(rd),
   45304                                       DRegister(rm),
   45305                                       imm);
   45306                                 break;
   45307                               }
   45308                               default:
   45309                                 UnallocatedA32(instr);
   45310                                 break;
   45311                             }
   45312                             break;
   45313                           }
   45314                           default: {
   45315                             switch (instr & 0x00000300) {
   45316                               case 0x00000000: {
   45317                                 // 0xf2800810
   45318                                 switch (instr & 0x01000000) {
   45319                                   case 0x00000000: {
   45320                                     // 0xf2800810
   45321                                     if (((instr & 0x380000) == 0x0)) {
   45322                                       UnallocatedA32(instr);
   45323                                       return;
   45324                                     }
   45325                                     DataType dt =
   45326                                         Dt_imm6_3_Decode((instr >> 19) & 0x7);
   45327                                     if (dt.Is(kDataTypeValueInvalid)) {
   45328                                       UnallocatedA32(instr);
   45329                                       return;
   45330                                     }
   45331                                     unsigned rd =
   45332                                         ExtractDRegister(instr, 22, 12);
   45333                                     if ((instr & 1) != 0) {
   45334                                       UnallocatedA32(instr);
   45335                                       return;
   45336                                     }
   45337                                     unsigned rm = ExtractQRegister(instr, 5, 0);
   45338                                     uint32_t imm6 = (instr >> 16) & 0x3f;
   45339                                     uint32_t imm = dt.GetSize() - imm6;
   45340                                     // VSHRN{<c>}{<q>}.I<size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   45341                                     vshrn(al,
   45342                                           dt,
   45343                                           DRegister(rd),
   45344                                           QRegister(rm),
   45345                                           imm);
   45346                                     break;
   45347                                   }
   45348                                   case 0x01000000: {
   45349                                     // 0xf3800810
   45350                                     if (((instr & 0x380000) == 0x0)) {
   45351                                       UnallocatedA32(instr);
   45352                                       return;
   45353                                     }
   45354                                     DataType dt =
   45355                                         Dt_imm6_2_Decode((instr >> 19) & 0x7,
   45356                                                          (instr >> 24) & 0x1);
   45357                                     if (dt.Is(kDataTypeValueInvalid)) {
   45358                                       UnallocatedA32(instr);
   45359                                       return;
   45360                                     }
   45361                                     unsigned rd =
   45362                                         ExtractDRegister(instr, 22, 12);
   45363                                     if ((instr & 1) != 0) {
   45364                                       UnallocatedA32(instr);
   45365                                       return;
   45366                                     }
   45367                                     unsigned rm = ExtractQRegister(instr, 5, 0);
   45368                                     uint32_t imm6 = (instr >> 16) & 0x3f;
   45369                                     uint32_t imm = dt.GetSize() - imm6;
   45370                                     // VQSHRUN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   45371                                     vqshrun(al,
   45372                                             dt,
   45373                                             DRegister(rd),
   45374                                             QRegister(rm),
   45375                                             imm);
   45376                                     break;
   45377                                   }
   45378                                 }
   45379                                 break;
   45380                               }
   45381                               case 0x00000100: {
   45382                                 // 0xf2800910
   45383                                 if (((instr & 0x380000) == 0x0)) {
   45384                                   UnallocatedA32(instr);
   45385                                   return;
   45386                                 }
   45387                                 DataType dt =
   45388                                     Dt_imm6_1_Decode((instr >> 19) & 0x7,
   45389                                                      (instr >> 24) & 0x1);
   45390                                 if (dt.Is(kDataTypeValueInvalid)) {
   45391                                   UnallocatedA32(instr);
   45392                                   return;
   45393                                 }
   45394                                 unsigned rd = ExtractDRegister(instr, 22, 12);
   45395                                 if ((instr & 1) != 0) {
   45396                                   UnallocatedA32(instr);
   45397                                   return;
   45398                                 }
   45399                                 unsigned rm = ExtractQRegister(instr, 5, 0);
   45400                                 uint32_t imm6 = (instr >> 16) & 0x3f;
   45401                                 uint32_t imm = dt.GetSize() - imm6;
   45402                                 // VQSHRN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   45403                                 vqshrn(al,
   45404                                        dt,
   45405                                        DRegister(rd),
   45406                                        QRegister(rm),
   45407                                        imm);
   45408                                 break;
   45409                               }
   45410                               case 0x00000200: {
   45411                                 // 0xf2800a10
   45412                                 switch (instr & 0x00070000) {
   45413                                   case 0x00000000: {
   45414                                     // 0xf2800a10
   45415                                     switch (instr & 0x003f0000) {
   45416                                       case 0x00080000: {
   45417                                         // 0xf2880a10
   45418                                         if (((instr & 0x380000) == 0x0) ||
   45419                                             ((instr & 0x380000) == 0x180000) ||
   45420                                             ((instr & 0x380000) == 0x280000) ||
   45421                                             ((instr & 0x380000) == 0x300000) ||
   45422                                             ((instr & 0x380000) == 0x380000)) {
   45423                                           UnallocatedA32(instr);
   45424                                           return;
   45425                                         }
   45426                                         DataType dt = Dt_U_imm3H_1_Decode(
   45427                                             ((instr >> 19) & 0x7) |
   45428                                             ((instr >> 21) & 0x8));
   45429                                         if (dt.Is(kDataTypeValueInvalid)) {
   45430                                           UnallocatedA32(instr);
   45431                                           return;
   45432                                         }
   45433                                         if (((instr >> 12) & 1) != 0) {
   45434                                           UnallocatedA32(instr);
   45435                                           return;
   45436                                         }
   45437                                         unsigned rd =
   45438                                             ExtractQRegister(instr, 22, 12);
   45439                                         unsigned rm =
   45440                                             ExtractDRegister(instr, 5, 0);
   45441                                         // VMOVL{<c>}{<q>}.<dt> <Qd>, <Dm> ; A1
   45442                                         vmovl(al,
   45443                                               dt,
   45444                                               QRegister(rd),
   45445                                               DRegister(rm));
   45446                                         break;
   45447                                       }
   45448                                       case 0x00090000: {
   45449                                         // 0xf2890a10
   45450                                         if (((instr & 0x380000) == 0x0) ||
   45451                                             ((instr & 0x3f0000) == 0x80000) ||
   45452                                             ((instr & 0x3f0000) == 0x100000) ||
   45453                                             ((instr & 0x3f0000) == 0x200000)) {
   45454                                           UnallocatedA32(instr);
   45455                                           return;
   45456                                         }
   45457                                         DataType dt =
   45458                                             Dt_imm6_4_Decode((instr >> 19) &
   45459                                                                  0x7,
   45460                                                              (instr >> 24) &
   45461                                                                  0x1);
   45462                                         if (dt.Is(kDataTypeValueInvalid)) {
   45463                                           UnallocatedA32(instr);
   45464                                           return;
   45465                                         }
   45466                                         if (((instr >> 12) & 1) != 0) {
   45467                                           UnallocatedA32(instr);
   45468                                           return;
   45469                                         }
   45470                                         unsigned rd =
   45471                                             ExtractQRegister(instr, 22, 12);
   45472                                         unsigned rm =
   45473                                             ExtractDRegister(instr, 5, 0);
   45474                                         uint32_t imm6 = (instr >> 16) & 0x3f;
   45475                                         uint32_t imm = imm6 - dt.GetSize();
   45476                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   45477                                         vshll(al,
   45478                                               dt,
   45479                                               QRegister(rd),
   45480                                               DRegister(rm),
   45481                                               imm);
   45482                                         break;
   45483                                       }
   45484                                       case 0x000a0000: {
   45485                                         // 0xf28a0a10
   45486                                         if (((instr & 0x380000) == 0x0) ||
   45487                                             ((instr & 0x3f0000) == 0x80000) ||
   45488                                             ((instr & 0x3f0000) == 0x100000) ||
   45489                                             ((instr & 0x3f0000) == 0x200000)) {
   45490                                           UnallocatedA32(instr);
   45491                                           return;
   45492                                         }
   45493                                         DataType dt =
   45494                                             Dt_imm6_4_Decode((instr >> 19) &
   45495                                                                  0x7,
   45496                                                              (instr >> 24) &
   45497                                                                  0x1);
   45498                                         if (dt.Is(kDataTypeValueInvalid)) {
   45499                                           UnallocatedA32(instr);
   45500                                           return;
   45501                                         }
   45502                                         if (((instr >> 12) & 1) != 0) {
   45503                                           UnallocatedA32(instr);
   45504                                           return;
   45505                                         }
   45506                                         unsigned rd =
   45507                                             ExtractQRegister(instr, 22, 12);
   45508                                         unsigned rm =
   45509                                             ExtractDRegister(instr, 5, 0);
   45510                                         uint32_t imm6 = (instr >> 16) & 0x3f;
   45511                                         uint32_t imm = imm6 - dt.GetSize();
   45512                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   45513                                         vshll(al,
   45514                                               dt,
   45515                                               QRegister(rd),
   45516                                               DRegister(rm),
   45517                                               imm);
   45518                                         break;
   45519                                       }
   45520                                       case 0x000b0000: {
   45521                                         // 0xf28b0a10
   45522                                         if (((instr & 0x380000) == 0x0) ||
   45523                                             ((instr & 0x3f0000) == 0x80000) ||
   45524                                             ((instr & 0x3f0000) == 0x100000) ||
   45525                                             ((instr & 0x3f0000) == 0x200000)) {
   45526                                           UnallocatedA32(instr);
   45527                                           return;
   45528                                         }
   45529                                         DataType dt =
   45530                                             Dt_imm6_4_Decode((instr >> 19) &
   45531                                                                  0x7,
   45532                                                              (instr >> 24) &
   45533                                                                  0x1);
   45534                                         if (dt.Is(kDataTypeValueInvalid)) {
   45535                                           UnallocatedA32(instr);
   45536                                           return;
   45537                                         }
   45538                                         if (((instr >> 12) & 1) != 0) {
   45539                                           UnallocatedA32(instr);
   45540                                           return;
   45541                                         }
   45542                                         unsigned rd =
   45543                                             ExtractQRegister(instr, 22, 12);
   45544                                         unsigned rm =
   45545                                             ExtractDRegister(instr, 5, 0);
   45546                                         uint32_t imm6 = (instr >> 16) & 0x3f;
   45547                                         uint32_t imm = imm6 - dt.GetSize();
   45548                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   45549                                         vshll(al,
   45550                                               dt,
   45551                                               QRegister(rd),
   45552                                               DRegister(rm),
   45553                                               imm);
   45554                                         break;
   45555                                       }
   45556                                       case 0x000c0000: {
   45557                                         // 0xf28c0a10
   45558                                         if (((instr & 0x380000) == 0x0) ||
   45559                                             ((instr & 0x3f0000) == 0x80000) ||
   45560                                             ((instr & 0x3f0000) == 0x100000) ||
   45561                                             ((instr & 0x3f0000) == 0x200000)) {
   45562                                           UnallocatedA32(instr);
   45563                                           return;
   45564                                         }
   45565                                         DataType dt =
   45566                                             Dt_imm6_4_Decode((instr >> 19) &
   45567                                                                  0x7,
   45568                                                              (instr >> 24) &
   45569                                                                  0x1);
   45570                                         if (dt.Is(kDataTypeValueInvalid)) {
   45571                                           UnallocatedA32(instr);
   45572                                           return;
   45573                                         }
   45574                                         if (((instr >> 12) & 1) != 0) {
   45575                                           UnallocatedA32(instr);
   45576                                           return;
   45577                                         }
   45578                                         unsigned rd =
   45579                                             ExtractQRegister(instr, 22, 12);
   45580                                         unsigned rm =
   45581                                             ExtractDRegister(instr, 5, 0);
   45582                                         uint32_t imm6 = (instr >> 16) & 0x3f;
   45583                                         uint32_t imm = imm6 - dt.GetSize();
   45584                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   45585                                         vshll(al,
   45586                                               dt,
   45587                                               QRegister(rd),
   45588                                               DRegister(rm),
   45589                                               imm);
   45590                                         break;
   45591                                       }
   45592                                       case 0x000d0000: {
   45593                                         // 0xf28d0a10
   45594                                         if (((instr & 0x380000) == 0x0) ||
   45595                                             ((instr & 0x3f0000) == 0x80000) ||
   45596                                             ((instr & 0x3f0000) == 0x100000) ||
   45597                                             ((instr & 0x3f0000) == 0x200000)) {
   45598                                           UnallocatedA32(instr);
   45599                                           return;
   45600                                         }
   45601                                         DataType dt =
   45602                                             Dt_imm6_4_Decode((instr >> 19) &
   45603                                                                  0x7,
   45604                                                              (instr >> 24) &
   45605                                                                  0x1);
   45606                                         if (dt.Is(kDataTypeValueInvalid)) {
   45607                                           UnallocatedA32(instr);
   45608                                           return;
   45609                                         }
   45610                                         if (((instr >> 12) & 1) != 0) {
   45611                                           UnallocatedA32(instr);
   45612                                           return;
   45613                                         }
   45614                                         unsigned rd =
   45615                                             ExtractQRegister(instr, 22, 12);
   45616                                         unsigned rm =
   45617                                             ExtractDRegister(instr, 5, 0);
   45618                                         uint32_t imm6 = (instr >> 16) & 0x3f;
   45619                                         uint32_t imm = imm6 - dt.GetSize();
   45620                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   45621                                         vshll(al,
   45622                                               dt,
   45623                                               QRegister(rd),
   45624                                               DRegister(rm),
   45625                                               imm);
   45626                                         break;
   45627                                       }
   45628                                       case 0x000e0000: {
   45629                                         // 0xf28e0a10
   45630                                         if (((instr & 0x380000) == 0x0) ||
   45631                                             ((instr & 0x3f0000) == 0x80000) ||
   45632                                             ((instr & 0x3f0000) == 0x100000) ||
   45633                                             ((instr & 0x3f0000) == 0x200000)) {
   45634                                           UnallocatedA32(instr);
   45635                                           return;
   45636                                         }
   45637                                         DataType dt =
   45638                                             Dt_imm6_4_Decode((instr >> 19) &
   45639                                                                  0x7,
   45640                                                              (instr >> 24) &
   45641                                                                  0x1);
   45642                                         if (dt.Is(kDataTypeValueInvalid)) {
   45643                                           UnallocatedA32(instr);
   45644                                           return;
   45645                                         }
   45646                                         if (((instr >> 12) & 1) != 0) {
   45647                                           UnallocatedA32(instr);
   45648                                           return;
   45649                                         }
   45650                                         unsigned rd =
   45651                                             ExtractQRegister(instr, 22, 12);
   45652                                         unsigned rm =
   45653                                             ExtractDRegister(instr, 5, 0);
   45654                                         uint32_t imm6 = (instr >> 16) & 0x3f;
   45655                                         uint32_t imm = imm6 - dt.GetSize();
   45656                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   45657                                         vshll(al,
   45658                                               dt,
   45659                                               QRegister(rd),
   45660                                               DRegister(rm),
   45661                                               imm);
   45662                                         break;
   45663                                       }
   45664                                       case 0x000f0000: {
   45665                                         // 0xf28f0a10
   45666                                         if (((instr & 0x380000) == 0x0) ||
   45667                                             ((instr & 0x3f0000) == 0x80000) ||
   45668                                             ((instr & 0x3f0000) == 0x100000) ||
   45669                                             ((instr & 0x3f0000) == 0x200000)) {
   45670                                           UnallocatedA32(instr);
   45671                                           return;
   45672                                         }
   45673                                         DataType dt =
   45674                                             Dt_imm6_4_Decode((instr >> 19) &
   45675                                                                  0x7,
   45676                                                              (instr >> 24) &
   45677                                                                  0x1);
   45678                                         if (dt.Is(kDataTypeValueInvalid)) {
   45679                                           UnallocatedA32(instr);
   45680                                           return;
   45681                                         }
   45682                                         if (((instr >> 12) & 1) != 0) {
   45683                                           UnallocatedA32(instr);
   45684                                           return;
   45685                                         }
   45686                                         unsigned rd =
   45687                                             ExtractQRegister(instr, 22, 12);
   45688                                         unsigned rm =
   45689                                             ExtractDRegister(instr, 5, 0);
   45690                                         uint32_t imm6 = (instr >> 16) & 0x3f;
   45691                                         uint32_t imm = imm6 - dt.GetSize();
   45692                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   45693                                         vshll(al,
   45694                                               dt,
   45695                                               QRegister(rd),
   45696                                               DRegister(rm),
   45697                                               imm);
   45698                                         break;
   45699                                       }
   45700                                       case 0x00100000: {
   45701                                         // 0xf2900a10
   45702                                         if (((instr & 0x380000) == 0x0) ||
   45703                                             ((instr & 0x380000) == 0x180000) ||
   45704                                             ((instr & 0x380000) == 0x280000) ||
   45705                                             ((instr & 0x380000) == 0x300000) ||
   45706                                             ((instr & 0x380000) == 0x380000)) {
   45707                                           UnallocatedA32(instr);
   45708                                           return;
   45709                                         }
   45710                                         DataType dt = Dt_U_imm3H_1_Decode(
   45711                                             ((instr >> 19) & 0x7) |
   45712                                             ((instr >> 21) & 0x8));
   45713                                         if (dt.Is(kDataTypeValueInvalid)) {
   45714                                           UnallocatedA32(instr);
   45715                                           return;
   45716                                         }
   45717                                         if (((instr >> 12) & 1) != 0) {
   45718                                           UnallocatedA32(instr);
   45719                                           return;
   45720                                         }
   45721                                         unsigned rd =
   45722                                             ExtractQRegister(instr, 22, 12);
   45723                                         unsigned rm =
   45724                                             ExtractDRegister(instr, 5, 0);
   45725                                         // VMOVL{<c>}{<q>}.<dt> <Qd>, <Dm> ; A1
   45726                                         vmovl(al,
   45727                                               dt,
   45728                                               QRegister(rd),
   45729                                               DRegister(rm));
   45730                                         break;
   45731                                       }
   45732                                       case 0x00110000: {
   45733                                         // 0xf2910a10
   45734                                         if (((instr & 0x380000) == 0x0) ||
   45735                                             ((instr & 0x3f0000) == 0x80000) ||
   45736                                             ((instr & 0x3f0000) == 0x100000) ||
   45737                                             ((instr & 0x3f0000) == 0x200000)) {
   45738                                           UnallocatedA32(instr);
   45739                                           return;
   45740                                         }
   45741                                         DataType dt =
   45742                                             Dt_imm6_4_Decode((instr >> 19) &
   45743                                                                  0x7,
   45744                                                              (instr >> 24) &
   45745                                                                  0x1);
   45746                                         if (dt.Is(kDataTypeValueInvalid)) {
   45747                                           UnallocatedA32(instr);
   45748                                           return;
   45749                                         }
   45750                                         if (((instr >> 12) & 1) != 0) {
   45751                                           UnallocatedA32(instr);
   45752                                           return;
   45753                                         }
   45754                                         unsigned rd =
   45755                                             ExtractQRegister(instr, 22, 12);
   45756                                         unsigned rm =
   45757                                             ExtractDRegister(instr, 5, 0);
   45758                                         uint32_t imm6 = (instr >> 16) & 0x3f;
   45759                                         uint32_t imm = imm6 - dt.GetSize();
   45760                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   45761                                         vshll(al,
   45762                                               dt,
   45763                                               QRegister(rd),
   45764                                               DRegister(rm),
   45765                                               imm);
   45766                                         break;
   45767                                       }
   45768                                       case 0x00120000: {
   45769                                         // 0xf2920a10
   45770                                         if (((instr & 0x380000) == 0x0) ||
   45771                                             ((instr & 0x3f0000) == 0x80000) ||
   45772                                             ((instr & 0x3f0000) == 0x100000) ||
   45773                                             ((instr & 0x3f0000) == 0x200000)) {
   45774                                           UnallocatedA32(instr);
   45775                                           return;
   45776                                         }
   45777                                         DataType dt =
   45778                                             Dt_imm6_4_Decode((instr >> 19) &
   45779                                                                  0x7,
   45780                                                              (instr >> 24) &
   45781                                                                  0x1);
   45782                                         if (dt.Is(kDataTypeValueInvalid)) {
   45783                                           UnallocatedA32(instr);
   45784                                           return;
   45785                                         }
   45786                                         if (((instr >> 12) & 1) != 0) {
   45787                                           UnallocatedA32(instr);
   45788                                           return;
   45789                                         }
   45790                                         unsigned rd =
   45791                                             ExtractQRegister(instr, 22, 12);
   45792                                         unsigned rm =
   45793                                             ExtractDRegister(instr, 5, 0);
   45794                                         uint32_t imm6 = (instr >> 16) & 0x3f;
   45795                                         uint32_t imm = imm6 - dt.GetSize();
   45796                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   45797                                         vshll(al,
   45798                                               dt,
   45799                                               QRegister(rd),
   45800                                               DRegister(rm),
   45801                                               imm);
   45802                                         break;
   45803                                       }
   45804                                       case 0x00130000: {
   45805                                         // 0xf2930a10
   45806                                         if (((instr & 0x380000) == 0x0) ||
   45807                                             ((instr & 0x3f0000) == 0x80000) ||
   45808                                             ((instr & 0x3f0000) == 0x100000) ||
   45809                                             ((instr & 0x3f0000) == 0x200000)) {
   45810                                           UnallocatedA32(instr);
   45811                                           return;
   45812                                         }
   45813                                         DataType dt =
   45814                                             Dt_imm6_4_Decode((instr >> 19) &
   45815                                                                  0x7,
   45816                                                              (instr >> 24) &
   45817                                                                  0x1);
   45818                                         if (dt.Is(kDataTypeValueInvalid)) {
   45819                                           UnallocatedA32(instr);
   45820                                           return;
   45821                                         }
   45822                                         if (((instr >> 12) & 1) != 0) {
   45823                                           UnallocatedA32(instr);
   45824                                           return;
   45825                                         }
   45826                                         unsigned rd =
   45827                                             ExtractQRegister(instr, 22, 12);
   45828                                         unsigned rm =
   45829                                             ExtractDRegister(instr, 5, 0);
   45830                                         uint32_t imm6 = (instr >> 16) & 0x3f;
   45831                                         uint32_t imm = imm6 - dt.GetSize();
   45832                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   45833                                         vshll(al,
   45834                                               dt,
   45835                                               QRegister(rd),
   45836                                               DRegister(rm),
   45837                                               imm);
   45838                                         break;
   45839                                       }
   45840                                       case 0x00140000: {
   45841                                         // 0xf2940a10
   45842                                         if (((instr & 0x380000) == 0x0) ||
   45843                                             ((instr & 0x3f0000) == 0x80000) ||
   45844                                             ((instr & 0x3f0000) == 0x100000) ||
   45845                                             ((instr & 0x3f0000) == 0x200000)) {
   45846                                           UnallocatedA32(instr);
   45847                                           return;
   45848                                         }
   45849                                         DataType dt =
   45850                                             Dt_imm6_4_Decode((instr >> 19) &
   45851                                                                  0x7,
   45852                                                              (instr >> 24) &
   45853                                                                  0x1);
   45854                                         if (dt.Is(kDataTypeValueInvalid)) {
   45855                                           UnallocatedA32(instr);
   45856                                           return;
   45857                                         }
   45858                                         if (((instr >> 12) & 1) != 0) {
   45859                                           UnallocatedA32(instr);
   45860                                           return;
   45861                                         }
   45862                                         unsigned rd =
   45863                                             ExtractQRegister(instr, 22, 12);
   45864                                         unsigned rm =
   45865                                             ExtractDRegister(instr, 5, 0);
   45866                                         uint32_t imm6 = (instr >> 16) & 0x3f;
   45867                                         uint32_t imm = imm6 - dt.GetSize();
   45868                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   45869                                         vshll(al,
   45870                                               dt,
   45871                                               QRegister(rd),
   45872                                               DRegister(rm),
   45873                                               imm);
   45874                                         break;
   45875                                       }
   45876                                       case 0x00150000: {
   45877                                         // 0xf2950a10
   45878                                         if (((instr & 0x380000) == 0x0) ||
   45879                                             ((instr & 0x3f0000) == 0x80000) ||
   45880                                             ((instr & 0x3f0000) == 0x100000) ||
   45881                                             ((instr & 0x3f0000) == 0x200000)) {
   45882                                           UnallocatedA32(instr);
   45883                                           return;
   45884                                         }
   45885                                         DataType dt =
   45886                                             Dt_imm6_4_Decode((instr >> 19) &
   45887                                                                  0x7,
   45888                                                              (instr >> 24) &
   45889                                                                  0x1);
   45890                                         if (dt.Is(kDataTypeValueInvalid)) {
   45891                                           UnallocatedA32(instr);
   45892                                           return;
   45893                                         }
   45894                                         if (((instr >> 12) & 1) != 0) {
   45895                                           UnallocatedA32(instr);
   45896                                           return;
   45897                                         }
   45898                                         unsigned rd =
   45899                                             ExtractQRegister(instr, 22, 12);
   45900                                         unsigned rm =
   45901                                             ExtractDRegister(instr, 5, 0);
   45902                                         uint32_t imm6 = (instr >> 16) & 0x3f;
   45903                                         uint32_t imm = imm6 - dt.GetSize();
   45904                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   45905                                         vshll(al,
   45906                                               dt,
   45907                                               QRegister(rd),
   45908                                               DRegister(rm),
   45909                                               imm);
   45910                                         break;
   45911                                       }
   45912                                       case 0x00160000: {
   45913                                         // 0xf2960a10
   45914                                         if (((instr & 0x380000) == 0x0) ||
   45915                                             ((instr & 0x3f0000) == 0x80000) ||
   45916                                             ((instr & 0x3f0000) == 0x100000) ||
   45917                                             ((instr & 0x3f0000) == 0x200000)) {
   45918                                           UnallocatedA32(instr);
   45919                                           return;
   45920                                         }
   45921                                         DataType dt =
   45922                                             Dt_imm6_4_Decode((instr >> 19) &
   45923                                                                  0x7,
   45924                                                              (instr >> 24) &
   45925                                                                  0x1);
   45926                                         if (dt.Is(kDataTypeValueInvalid)) {
   45927                                           UnallocatedA32(instr);
   45928                                           return;
   45929                                         }
   45930                                         if (((instr >> 12) & 1) != 0) {
   45931                                           UnallocatedA32(instr);
   45932                                           return;
   45933                                         }
   45934                                         unsigned rd =
   45935                                             ExtractQRegister(instr, 22, 12);
   45936                                         unsigned rm =
   45937                                             ExtractDRegister(instr, 5, 0);
   45938                                         uint32_t imm6 = (instr >> 16) & 0x3f;
   45939                                         uint32_t imm = imm6 - dt.GetSize();
   45940                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   45941                                         vshll(al,
   45942                                               dt,
   45943                                               QRegister(rd),
   45944                                               DRegister(rm),
   45945                                               imm);
   45946                                         break;
   45947                                       }
   45948                                       case 0x00170000: {
   45949                                         // 0xf2970a10
   45950                                         if (((instr & 0x380000) == 0x0) ||
   45951                                             ((instr & 0x3f0000) == 0x80000) ||
   45952                                             ((instr & 0x3f0000) == 0x100000) ||
   45953                                             ((instr & 0x3f0000) == 0x200000)) {
   45954                                           UnallocatedA32(instr);
   45955                                           return;
   45956                                         }
   45957                                         DataType dt =
   45958                                             Dt_imm6_4_Decode((instr >> 19) &
   45959                                                                  0x7,
   45960                                                              (instr >> 24) &
   45961                                                                  0x1);
   45962                                         if (dt.Is(kDataTypeValueInvalid)) {
   45963                                           UnallocatedA32(instr);
   45964                                           return;
   45965                                         }
   45966                                         if (((instr >> 12) & 1) != 0) {
   45967                                           UnallocatedA32(instr);
   45968                                           return;
   45969                                         }
   45970                                         unsigned rd =
   45971                                             ExtractQRegister(instr, 22, 12);
   45972                                         unsigned rm =
   45973                                             ExtractDRegister(instr, 5, 0);
   45974                                         uint32_t imm6 = (instr >> 16) & 0x3f;
   45975                                         uint32_t imm = imm6 - dt.GetSize();
   45976                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   45977                                         vshll(al,
   45978                                               dt,
   45979                                               QRegister(rd),
   45980                                               DRegister(rm),
   45981                                               imm);
   45982                                         break;
   45983                                       }
   45984                                       case 0x00180000: {
   45985                                         // 0xf2980a10
   45986                                         if (((instr & 0x380000) == 0x0) ||
   45987                                             ((instr & 0x3f0000) == 0x80000) ||
   45988                                             ((instr & 0x3f0000) == 0x100000) ||
   45989                                             ((instr & 0x3f0000) == 0x200000)) {
   45990                                           UnallocatedA32(instr);
   45991                                           return;
   45992                                         }
   45993                                         DataType dt =
   45994                                             Dt_imm6_4_Decode((instr >> 19) &
   45995                                                                  0x7,
   45996                                                              (instr >> 24) &
   45997                                                                  0x1);
   45998                                         if (dt.Is(kDataTypeValueInvalid)) {
   45999                                           UnallocatedA32(instr);
   46000                                           return;
   46001                                         }
   46002                                         if (((instr >> 12) & 1) != 0) {
   46003                                           UnallocatedA32(instr);
   46004                                           return;
   46005                                         }
   46006                                         unsigned rd =
   46007                                             ExtractQRegister(instr, 22, 12);
   46008                                         unsigned rm =
   46009                                             ExtractDRegister(instr, 5, 0);
   46010                                         uint32_t imm6 = (instr >> 16) & 0x3f;
   46011                                         uint32_t imm = imm6 - dt.GetSize();
   46012                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   46013                                         vshll(al,
   46014                                               dt,
   46015                                               QRegister(rd),
   46016                                               DRegister(rm),
   46017                                               imm);
   46018                                         break;
   46019                                       }
   46020                                       case 0x00190000: {
   46021                                         // 0xf2990a10
   46022                                         if (((instr & 0x380000) == 0x0) ||
   46023                                             ((instr & 0x3f0000) == 0x80000) ||
   46024                                             ((instr & 0x3f0000) == 0x100000) ||
   46025                                             ((instr & 0x3f0000) == 0x200000)) {
   46026                                           UnallocatedA32(instr);
   46027                                           return;
   46028                                         }
   46029                                         DataType dt =
   46030                                             Dt_imm6_4_Decode((instr >> 19) &
   46031                                                                  0x7,
   46032                                                              (instr >> 24) &
   46033                                                                  0x1);
   46034                                         if (dt.Is(kDataTypeValueInvalid)) {
   46035                                           UnallocatedA32(instr);
   46036                                           return;
   46037                                         }
   46038                                         if (((instr >> 12) & 1) != 0) {
   46039                                           UnallocatedA32(instr);
   46040                                           return;
   46041                                         }
   46042                                         unsigned rd =
   46043                                             ExtractQRegister(instr, 22, 12);
   46044                                         unsigned rm =
   46045                                             ExtractDRegister(instr, 5, 0);
   46046                                         uint32_t imm6 = (instr >> 16) & 0x3f;
   46047                                         uint32_t imm = imm6 - dt.GetSize();
   46048                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   46049                                         vshll(al,
   46050                                               dt,
   46051                                               QRegister(rd),
   46052                                               DRegister(rm),
   46053                                               imm);
   46054                                         break;
   46055                                       }
   46056                                       case 0x001a0000: {
   46057                                         // 0xf29a0a10
   46058                                         if (((instr & 0x380000) == 0x0) ||
   46059                                             ((instr & 0x3f0000) == 0x80000) ||
   46060                                             ((instr & 0x3f0000) == 0x100000) ||
   46061                                             ((instr & 0x3f0000) == 0x200000)) {
   46062                                           UnallocatedA32(instr);
   46063                                           return;
   46064                                         }
   46065                                         DataType dt =
   46066                                             Dt_imm6_4_Decode((instr >> 19) &
   46067                                                                  0x7,
   46068                                                              (instr >> 24) &
   46069                                                                  0x1);
   46070                                         if (dt.Is(kDataTypeValueInvalid)) {
   46071                                           UnallocatedA32(instr);
   46072                                           return;
   46073                                         }
   46074                                         if (((instr >> 12) & 1) != 0) {
   46075                                           UnallocatedA32(instr);
   46076                                           return;
   46077                                         }
   46078                                         unsigned rd =
   46079                                             ExtractQRegister(instr, 22, 12);
   46080                                         unsigned rm =
   46081                                             ExtractDRegister(instr, 5, 0);
   46082                                         uint32_t imm6 = (instr >> 16) & 0x3f;
   46083                                         uint32_t imm = imm6 - dt.GetSize();
   46084                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   46085                                         vshll(al,
   46086                                               dt,
   46087                                               QRegister(rd),
   46088                                               DRegister(rm),
   46089                                               imm);
   46090                                         break;
   46091                                       }
   46092                                       case 0x001b0000: {
   46093                                         // 0xf29b0a10
   46094                                         if (((instr & 0x380000) == 0x0) ||
   46095                                             ((instr & 0x3f0000) == 0x80000) ||
   46096                                             ((instr & 0x3f0000) == 0x100000) ||
   46097                                             ((instr & 0x3f0000) == 0x200000)) {
   46098                                           UnallocatedA32(instr);
   46099                                           return;
   46100                                         }
   46101                                         DataType dt =
   46102                                             Dt_imm6_4_Decode((instr >> 19) &
   46103                                                                  0x7,
   46104                                                              (instr >> 24) &
   46105                                                                  0x1);
   46106                                         if (dt.Is(kDataTypeValueInvalid)) {
   46107                                           UnallocatedA32(instr);
   46108                                           return;
   46109                                         }
   46110                                         if (((instr >> 12) & 1) != 0) {
   46111                                           UnallocatedA32(instr);
   46112                                           return;
   46113                                         }
   46114                                         unsigned rd =
   46115                                             ExtractQRegister(instr, 22, 12);
   46116                                         unsigned rm =
   46117                                             ExtractDRegister(instr, 5, 0);
   46118                                         uint32_t imm6 = (instr >> 16) & 0x3f;
   46119                                         uint32_t imm = imm6 - dt.GetSize();
   46120                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   46121                                         vshll(al,
   46122                                               dt,
   46123                                               QRegister(rd),
   46124                                               DRegister(rm),
   46125                                               imm);
   46126                                         break;
   46127                                       }
   46128                                       case 0x001c0000: {
   46129                                         // 0xf29c0a10
   46130                                         if (((instr & 0x380000) == 0x0) ||
   46131                                             ((instr & 0x3f0000) == 0x80000) ||
   46132                                             ((instr & 0x3f0000) == 0x100000) ||
   46133                                             ((instr & 0x3f0000) == 0x200000)) {
   46134                                           UnallocatedA32(instr);
   46135                                           return;
   46136                                         }
   46137                                         DataType dt =
   46138                                             Dt_imm6_4_Decode((instr >> 19) &
   46139                                                                  0x7,
   46140                                                              (instr >> 24) &
   46141                                                                  0x1);
   46142                                         if (dt.Is(kDataTypeValueInvalid)) {
   46143                                           UnallocatedA32(instr);
   46144                                           return;
   46145                                         }
   46146                                         if (((instr >> 12) & 1) != 0) {
   46147                                           UnallocatedA32(instr);
   46148                                           return;
   46149                                         }
   46150                                         unsigned rd =
   46151                                             ExtractQRegister(instr, 22, 12);
   46152                                         unsigned rm =
   46153                                             ExtractDRegister(instr, 5, 0);
   46154                                         uint32_t imm6 = (instr >> 16) & 0x3f;
   46155                                         uint32_t imm = imm6 - dt.GetSize();
   46156                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   46157                                         vshll(al,
   46158                                               dt,
   46159                                               QRegister(rd),
   46160                                               DRegister(rm),
   46161                                               imm);
   46162                                         break;
   46163                                       }
   46164                                       case 0x001d0000: {
   46165                                         // 0xf29d0a10
   46166                                         if (((instr & 0x380000) == 0x0) ||
   46167                                             ((instr & 0x3f0000) == 0x80000) ||
   46168                                             ((instr & 0x3f0000) == 0x100000) ||
   46169                                             ((instr & 0x3f0000) == 0x200000)) {
   46170                                           UnallocatedA32(instr);
   46171                                           return;
   46172                                         }
   46173                                         DataType dt =
   46174                                             Dt_imm6_4_Decode((instr >> 19) &
   46175                                                                  0x7,
   46176                                                              (instr >> 24) &
   46177                                                                  0x1);
   46178                                         if (dt.Is(kDataTypeValueInvalid)) {
   46179                                           UnallocatedA32(instr);
   46180                                           return;
   46181                                         }
   46182                                         if (((instr >> 12) & 1) != 0) {
   46183                                           UnallocatedA32(instr);
   46184                                           return;
   46185                                         }
   46186                                         unsigned rd =
   46187                                             ExtractQRegister(instr, 22, 12);
   46188                                         unsigned rm =
   46189                                             ExtractDRegister(instr, 5, 0);
   46190                                         uint32_t imm6 = (instr >> 16) & 0x3f;
   46191                                         uint32_t imm = imm6 - dt.GetSize();
   46192                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   46193                                         vshll(al,
   46194                                               dt,
   46195                                               QRegister(rd),
   46196                                               DRegister(rm),
   46197                                               imm);
   46198                                         break;
   46199                                       }
   46200                                       case 0x001e0000: {
   46201                                         // 0xf29e0a10
   46202                                         if (((instr & 0x380000) == 0x0) ||
   46203                                             ((instr & 0x3f0000) == 0x80000) ||
   46204                                             ((instr & 0x3f0000) == 0x100000) ||
   46205                                             ((instr & 0x3f0000) == 0x200000)) {
   46206                                           UnallocatedA32(instr);
   46207                                           return;
   46208                                         }
   46209                                         DataType dt =
   46210                                             Dt_imm6_4_Decode((instr >> 19) &
   46211                                                                  0x7,
   46212                                                              (instr >> 24) &
   46213                                                                  0x1);
   46214                                         if (dt.Is(kDataTypeValueInvalid)) {
   46215                                           UnallocatedA32(instr);
   46216                                           return;
   46217                                         }
   46218                                         if (((instr >> 12) & 1) != 0) {
   46219                                           UnallocatedA32(instr);
   46220                                           return;
   46221                                         }
   46222                                         unsigned rd =
   46223                                             ExtractQRegister(instr, 22, 12);
   46224                                         unsigned rm =
   46225                                             ExtractDRegister(instr, 5, 0);
   46226                                         uint32_t imm6 = (instr >> 16) & 0x3f;
   46227                                         uint32_t imm = imm6 - dt.GetSize();
   46228                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   46229                                         vshll(al,
   46230                                               dt,
   46231                                               QRegister(rd),
   46232                                               DRegister(rm),
   46233                                               imm);
   46234                                         break;
   46235                                       }
   46236                                       case 0x001f0000: {
   46237                                         // 0xf29f0a10
   46238                                         if (((instr & 0x380000) == 0x0) ||
   46239                                             ((instr & 0x3f0000) == 0x80000) ||
   46240                                             ((instr & 0x3f0000) == 0x100000) ||
   46241                                             ((instr & 0x3f0000) == 0x200000)) {
   46242                                           UnallocatedA32(instr);
   46243                                           return;
   46244                                         }
   46245                                         DataType dt =
   46246                                             Dt_imm6_4_Decode((instr >> 19) &
   46247                                                                  0x7,
   46248                                                              (instr >> 24) &
   46249                                                                  0x1);
   46250                                         if (dt.Is(kDataTypeValueInvalid)) {
   46251                                           UnallocatedA32(instr);
   46252                                           return;
   46253                                         }
   46254                                         if (((instr >> 12) & 1) != 0) {
   46255                                           UnallocatedA32(instr);
   46256                                           return;
   46257                                         }
   46258                                         unsigned rd =
   46259                                             ExtractQRegister(instr, 22, 12);
   46260                                         unsigned rm =
   46261                                             ExtractDRegister(instr, 5, 0);
   46262                                         uint32_t imm6 = (instr >> 16) & 0x3f;
   46263                                         uint32_t imm = imm6 - dt.GetSize();
   46264                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   46265                                         vshll(al,
   46266                                               dt,
   46267                                               QRegister(rd),
   46268                                               DRegister(rm),
   46269                                               imm);
   46270                                         break;
   46271                                       }
   46272                                       case 0x00200000: {
   46273                                         // 0xf2a00a10
   46274                                         if (((instr & 0x380000) == 0x0) ||
   46275                                             ((instr & 0x380000) == 0x180000) ||
   46276                                             ((instr & 0x380000) == 0x280000) ||
   46277                                             ((instr & 0x380000) == 0x300000) ||
   46278                                             ((instr & 0x380000) == 0x380000)) {
   46279                                           UnallocatedA32(instr);
   46280                                           return;
   46281                                         }
   46282                                         DataType dt = Dt_U_imm3H_1_Decode(
   46283                                             ((instr >> 19) & 0x7) |
   46284                                             ((instr >> 21) & 0x8));
   46285                                         if (dt.Is(kDataTypeValueInvalid)) {
   46286                                           UnallocatedA32(instr);
   46287                                           return;
   46288                                         }
   46289                                         if (((instr >> 12) & 1) != 0) {
   46290                                           UnallocatedA32(instr);
   46291                                           return;
   46292                                         }
   46293                                         unsigned rd =
   46294                                             ExtractQRegister(instr, 22, 12);
   46295                                         unsigned rm =
   46296                                             ExtractDRegister(instr, 5, 0);
   46297                                         // VMOVL{<c>}{<q>}.<dt> <Qd>, <Dm> ; A1
   46298                                         vmovl(al,
   46299                                               dt,
   46300                                               QRegister(rd),
   46301                                               DRegister(rm));
   46302                                         break;
   46303                                       }
   46304                                       case 0x00210000: {
   46305                                         // 0xf2a10a10
   46306                                         if (((instr & 0x380000) == 0x0) ||
   46307                                             ((instr & 0x3f0000) == 0x80000) ||
   46308                                             ((instr & 0x3f0000) == 0x100000) ||
   46309                                             ((instr & 0x3f0000) == 0x200000)) {
   46310                                           UnallocatedA32(instr);
   46311                                           return;
   46312                                         }
   46313                                         DataType dt =
   46314                                             Dt_imm6_4_Decode((instr >> 19) &
   46315                                                                  0x7,
   46316                                                              (instr >> 24) &
   46317                                                                  0x1);
   46318                                         if (dt.Is(kDataTypeValueInvalid)) {
   46319                                           UnallocatedA32(instr);
   46320                                           return;
   46321                                         }
   46322                                         if (((instr >> 12) & 1) != 0) {
   46323                                           UnallocatedA32(instr);
   46324                                           return;
   46325                                         }
   46326                                         unsigned rd =
   46327                                             ExtractQRegister(instr, 22, 12);
   46328                                         unsigned rm =
   46329                                             ExtractDRegister(instr, 5, 0);
   46330                                         uint32_t imm6 = (instr >> 16) & 0x3f;
   46331                                         uint32_t imm = imm6 - dt.GetSize();
   46332                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   46333                                         vshll(al,
   46334                                               dt,
   46335                                               QRegister(rd),
   46336                                               DRegister(rm),
   46337                                               imm);
   46338                                         break;
   46339                                       }
   46340                                       case 0x00220000: {
   46341                                         // 0xf2a20a10
   46342                                         if (((instr & 0x380000) == 0x0) ||
   46343                                             ((instr & 0x3f0000) == 0x80000) ||
   46344                                             ((instr & 0x3f0000) == 0x100000) ||
   46345                                             ((instr & 0x3f0000) == 0x200000)) {
   46346                                           UnallocatedA32(instr);
   46347                                           return;
   46348                                         }
   46349                                         DataType dt =
   46350                                             Dt_imm6_4_Decode((instr >> 19) &
   46351                                                                  0x7,
   46352                                                              (instr >> 24) &
   46353                                                                  0x1);
   46354                                         if (dt.Is(kDataTypeValueInvalid)) {
   46355                                           UnallocatedA32(instr);
   46356                                           return;
   46357                                         }
   46358                                         if (((instr >> 12) & 1) != 0) {
   46359                                           UnallocatedA32(instr);
   46360                                           return;
   46361                                         }
   46362                                         unsigned rd =
   46363                                             ExtractQRegister(instr, 22, 12);
   46364                                         unsigned rm =
   46365                                             ExtractDRegister(instr, 5, 0);
   46366                                         uint32_t imm6 = (instr >> 16) & 0x3f;
   46367                                         uint32_t imm = imm6 - dt.GetSize();
   46368                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   46369                                         vshll(al,
   46370                                               dt,
   46371                                               QRegister(rd),
   46372                                               DRegister(rm),
   46373                                               imm);
   46374                                         break;
   46375                                       }
   46376                                       case 0x00230000: {
   46377                                         // 0xf2a30a10
   46378                                         if (((instr & 0x380000) == 0x0) ||
   46379                                             ((instr & 0x3f0000) == 0x80000) ||
   46380                                             ((instr & 0x3f0000) == 0x100000) ||
   46381                                             ((instr & 0x3f0000) == 0x200000)) {
   46382                                           UnallocatedA32(instr);
   46383                                           return;
   46384                                         }
   46385                                         DataType dt =
   46386                                             Dt_imm6_4_Decode((instr >> 19) &
   46387                                                                  0x7,
   46388                                                              (instr >> 24) &
   46389                                                                  0x1);
   46390                                         if (dt.Is(kDataTypeValueInvalid)) {
   46391                                           UnallocatedA32(instr);
   46392                                           return;
   46393                                         }
   46394                                         if (((instr >> 12) & 1) != 0) {
   46395                                           UnallocatedA32(instr);
   46396                                           return;
   46397                                         }
   46398                                         unsigned rd =
   46399                                             ExtractQRegister(instr, 22, 12);
   46400                                         unsigned rm =
   46401                                             ExtractDRegister(instr, 5, 0);
   46402                                         uint32_t imm6 = (instr >> 16) & 0x3f;
   46403                                         uint32_t imm = imm6 - dt.GetSize();
   46404                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   46405                                         vshll(al,
   46406                                               dt,
   46407                                               QRegister(rd),
   46408                                               DRegister(rm),
   46409                                               imm);
   46410                                         break;
   46411                                       }
   46412                                       case 0x00240000: {
   46413                                         // 0xf2a40a10
   46414                                         if (((instr & 0x380000) == 0x0) ||
   46415                                             ((instr & 0x3f0000) == 0x80000) ||
   46416                                             ((instr & 0x3f0000) == 0x100000) ||
   46417                                             ((instr & 0x3f0000) == 0x200000)) {
   46418                                           UnallocatedA32(instr);
   46419                                           return;
   46420                                         }
   46421                                         DataType dt =
   46422                                             Dt_imm6_4_Decode((instr >> 19) &
   46423                                                                  0x7,
   46424                                                              (instr >> 24) &
   46425                                                                  0x1);
   46426                                         if (dt.Is(kDataTypeValueInvalid)) {
   46427                                           UnallocatedA32(instr);
   46428                                           return;
   46429                                         }
   46430                                         if (((instr >> 12) & 1) != 0) {
   46431                                           UnallocatedA32(instr);
   46432                                           return;
   46433                                         }
   46434                                         unsigned rd =
   46435                                             ExtractQRegister(instr, 22, 12);
   46436                                         unsigned rm =
   46437                                             ExtractDRegister(instr, 5, 0);
   46438                                         uint32_t imm6 = (instr >> 16) & 0x3f;
   46439                                         uint32_t imm = imm6 - dt.GetSize();
   46440                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   46441                                         vshll(al,
   46442                                               dt,
   46443                                               QRegister(rd),
   46444                                               DRegister(rm),
   46445                                               imm);
   46446                                         break;
   46447                                       }
   46448                                       case 0x00250000: {
   46449                                         // 0xf2a50a10
   46450                                         if (((instr & 0x380000) == 0x0) ||
   46451                                             ((instr & 0x3f0000) == 0x80000) ||
   46452                                             ((instr & 0x3f0000) == 0x100000) ||
   46453                                             ((instr & 0x3f0000) == 0x200000)) {
   46454                                           UnallocatedA32(instr);
   46455                                           return;
   46456                                         }
   46457                                         DataType dt =
   46458                                             Dt_imm6_4_Decode((instr >> 19) &
   46459                                                                  0x7,
   46460                                                              (instr >> 24) &
   46461                                                                  0x1);
   46462                                         if (dt.Is(kDataTypeValueInvalid)) {
   46463                                           UnallocatedA32(instr);
   46464                                           return;
   46465                                         }
   46466                                         if (((instr >> 12) & 1) != 0) {
   46467                                           UnallocatedA32(instr);
   46468                                           return;
   46469                                         }
   46470                                         unsigned rd =
   46471                                             ExtractQRegister(instr, 22, 12);
   46472                                         unsigned rm =
   46473                                             ExtractDRegister(instr, 5, 0);
   46474                                         uint32_t imm6 = (instr >> 16) & 0x3f;
   46475                                         uint32_t imm = imm6 - dt.GetSize();
   46476                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   46477                                         vshll(al,
   46478                                               dt,
   46479                                               QRegister(rd),
   46480                                               DRegister(rm),
   46481                                               imm);
   46482                                         break;
   46483                                       }
   46484                                       case 0x00260000: {
   46485                                         // 0xf2a60a10
   46486                                         if (((instr & 0x380000) == 0x0) ||
   46487                                             ((instr & 0x3f0000) == 0x80000) ||
   46488                                             ((instr & 0x3f0000) == 0x100000) ||
   46489                                             ((instr & 0x3f0000) == 0x200000)) {
   46490                                           UnallocatedA32(instr);
   46491                                           return;
   46492                                         }
   46493                                         DataType dt =
   46494                                             Dt_imm6_4_Decode((instr >> 19) &
   46495                                                                  0x7,
   46496                                                              (instr >> 24) &
   46497                                                                  0x1);
   46498                                         if (dt.Is(kDataTypeValueInvalid)) {
   46499                                           UnallocatedA32(instr);
   46500                                           return;
   46501                                         }
   46502                                         if (((instr >> 12) & 1) != 0) {
   46503                                           UnallocatedA32(instr);
   46504                                           return;
   46505                                         }
   46506                                         unsigned rd =
   46507                                             ExtractQRegister(instr, 22, 12);
   46508                                         unsigned rm =
   46509                                             ExtractDRegister(instr, 5, 0);
   46510                                         uint32_t imm6 = (instr >> 16) & 0x3f;
   46511                                         uint32_t imm = imm6 - dt.GetSize();
   46512                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   46513                                         vshll(al,
   46514                                               dt,
   46515                                               QRegister(rd),
   46516                                               DRegister(rm),
   46517                                               imm);
   46518                                         break;
   46519                                       }
   46520                                       case 0x00270000: {
   46521                                         // 0xf2a70a10
   46522                                         if (((instr & 0x380000) == 0x0) ||
   46523                                             ((instr & 0x3f0000) == 0x80000) ||
   46524                                             ((instr & 0x3f0000) == 0x100000) ||
   46525                                             ((instr & 0x3f0000) == 0x200000)) {
   46526                                           UnallocatedA32(instr);
   46527                                           return;
   46528                                         }
   46529                                         DataType dt =
   46530                                             Dt_imm6_4_Decode((instr >> 19) &
   46531                                                                  0x7,
   46532                                                              (instr >> 24) &
   46533                                                                  0x1);
   46534                                         if (dt.Is(kDataTypeValueInvalid)) {
   46535                                           UnallocatedA32(instr);
   46536                                           return;
   46537                                         }
   46538                                         if (((instr >> 12) & 1) != 0) {
   46539                                           UnallocatedA32(instr);
   46540                                           return;
   46541                                         }
   46542                                         unsigned rd =
   46543                                             ExtractQRegister(instr, 22, 12);
   46544                                         unsigned rm =
   46545                                             ExtractDRegister(instr, 5, 0);
   46546                                         uint32_t imm6 = (instr >> 16) & 0x3f;
   46547                                         uint32_t imm = imm6 - dt.GetSize();
   46548                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   46549                                         vshll(al,
   46550                                               dt,
   46551                                               QRegister(rd),
   46552                                               DRegister(rm),
   46553                                               imm);
   46554                                         break;
   46555                                       }
   46556                                       case 0x00280000: {
   46557                                         // 0xf2a80a10
   46558                                         if (((instr & 0x380000) == 0x0) ||
   46559                                             ((instr & 0x3f0000) == 0x80000) ||
   46560                                             ((instr & 0x3f0000) == 0x100000) ||
   46561                                             ((instr & 0x3f0000) == 0x200000)) {
   46562                                           UnallocatedA32(instr);
   46563                                           return;
   46564                                         }
   46565                                         DataType dt =
   46566                                             Dt_imm6_4_Decode((instr >> 19) &
   46567                                                                  0x7,
   46568                                                              (instr >> 24) &
   46569                                                                  0x1);
   46570                                         if (dt.Is(kDataTypeValueInvalid)) {
   46571                                           UnallocatedA32(instr);
   46572                                           return;
   46573                                         }
   46574                                         if (((instr >> 12) & 1) != 0) {
   46575                                           UnallocatedA32(instr);
   46576                                           return;
   46577                                         }
   46578                                         unsigned rd =
   46579                                             ExtractQRegister(instr, 22, 12);
   46580                                         unsigned rm =
   46581                                             ExtractDRegister(instr, 5, 0);
   46582                                         uint32_t imm6 = (instr >> 16) & 0x3f;
   46583                                         uint32_t imm = imm6 - dt.GetSize();
   46584                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   46585                                         vshll(al,
   46586                                               dt,
   46587                                               QRegister(rd),
   46588                                               DRegister(rm),
   46589                                               imm);
   46590                                         break;
   46591                                       }
   46592                                       case 0x00290000: {
   46593                                         // 0xf2a90a10
   46594                                         if (((instr & 0x380000) == 0x0) ||
   46595                                             ((instr & 0x3f0000) == 0x80000) ||
   46596                                             ((instr & 0x3f0000) == 0x100000) ||
   46597                                             ((instr & 0x3f0000) == 0x200000)) {
   46598                                           UnallocatedA32(instr);
   46599                                           return;
   46600                                         }
   46601                                         DataType dt =
   46602                                             Dt_imm6_4_Decode((instr >> 19) &
   46603                                                                  0x7,
   46604                                                              (instr >> 24) &
   46605                                                                  0x1);
   46606                                         if (dt.Is(kDataTypeValueInvalid)) {
   46607                                           UnallocatedA32(instr);
   46608                                           return;
   46609                                         }
   46610                                         if (((instr >> 12) & 1) != 0) {
   46611                                           UnallocatedA32(instr);
   46612                                           return;
   46613                                         }
   46614                                         unsigned rd =
   46615                                             ExtractQRegister(instr, 22, 12);
   46616                                         unsigned rm =
   46617                                             ExtractDRegister(instr, 5, 0);
   46618                                         uint32_t imm6 = (instr >> 16) & 0x3f;
   46619                                         uint32_t imm = imm6 - dt.GetSize();
   46620                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   46621                                         vshll(al,
   46622                                               dt,
   46623                                               QRegister(rd),
   46624                                               DRegister(rm),
   46625                                               imm);
   46626                                         break;
   46627                                       }
   46628                                       case 0x002a0000: {
   46629                                         // 0xf2aa0a10
   46630                                         if (((instr & 0x380000) == 0x0) ||
   46631                                             ((instr & 0x3f0000) == 0x80000) ||
   46632                                             ((instr & 0x3f0000) == 0x100000) ||
   46633                                             ((instr & 0x3f0000) == 0x200000)) {
   46634                                           UnallocatedA32(instr);
   46635                                           return;
   46636                                         }
   46637                                         DataType dt =
   46638                                             Dt_imm6_4_Decode((instr >> 19) &
   46639                                                                  0x7,
   46640                                                              (instr >> 24) &
   46641                                                                  0x1);
   46642                                         if (dt.Is(kDataTypeValueInvalid)) {
   46643                                           UnallocatedA32(instr);
   46644                                           return;
   46645                                         }
   46646                                         if (((instr >> 12) & 1) != 0) {
   46647                                           UnallocatedA32(instr);
   46648                                           return;
   46649                                         }
   46650                                         unsigned rd =
   46651                                             ExtractQRegister(instr, 22, 12);
   46652                                         unsigned rm =
   46653                                             ExtractDRegister(instr, 5, 0);
   46654                                         uint32_t imm6 = (instr >> 16) & 0x3f;
   46655                                         uint32_t imm = imm6 - dt.GetSize();
   46656                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   46657                                         vshll(al,
   46658                                               dt,
   46659                                               QRegister(rd),
   46660                                               DRegister(rm),
   46661                                               imm);
   46662                                         break;
   46663                                       }
   46664                                       case 0x002b0000: {
   46665                                         // 0xf2ab0a10
   46666                                         if (((instr & 0x380000) == 0x0) ||
   46667                                             ((instr & 0x3f0000) == 0x80000) ||
   46668                                             ((instr & 0x3f0000) == 0x100000) ||
   46669                                             ((instr & 0x3f0000) == 0x200000)) {
   46670                                           UnallocatedA32(instr);
   46671                                           return;
   46672                                         }
   46673                                         DataType dt =
   46674                                             Dt_imm6_4_Decode((instr >> 19) &
   46675                                                                  0x7,
   46676                                                              (instr >> 24) &
   46677                                                                  0x1);
   46678                                         if (dt.Is(kDataTypeValueInvalid)) {
   46679                                           UnallocatedA32(instr);
   46680                                           return;
   46681                                         }
   46682                                         if (((instr >> 12) & 1) != 0) {
   46683                                           UnallocatedA32(instr);
   46684                                           return;
   46685                                         }
   46686                                         unsigned rd =
   46687                                             ExtractQRegister(instr, 22, 12);
   46688                                         unsigned rm =
   46689                                             ExtractDRegister(instr, 5, 0);
   46690                                         uint32_t imm6 = (instr >> 16) & 0x3f;
   46691                                         uint32_t imm = imm6 - dt.GetSize();
   46692                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   46693                                         vshll(al,
   46694                                               dt,
   46695                                               QRegister(rd),
   46696                                               DRegister(rm),
   46697                                               imm);
   46698                                         break;
   46699                                       }
   46700                                       case 0x002c0000: {
   46701                                         // 0xf2ac0a10
   46702                                         if (((instr & 0x380000) == 0x0) ||
   46703                                             ((instr & 0x3f0000) == 0x80000) ||
   46704                                             ((instr & 0x3f0000) == 0x100000) ||
   46705                                             ((instr & 0x3f0000) == 0x200000)) {
   46706                                           UnallocatedA32(instr);
   46707                                           return;
   46708                                         }
   46709                                         DataType dt =
   46710                                             Dt_imm6_4_Decode((instr >> 19) &
   46711                                                                  0x7,
   46712                                                              (instr >> 24) &
   46713                                                                  0x1);
   46714                                         if (dt.Is(kDataTypeValueInvalid)) {
   46715                                           UnallocatedA32(instr);
   46716                                           return;
   46717                                         }
   46718                                         if (((instr >> 12) & 1) != 0) {
   46719                                           UnallocatedA32(instr);
   46720                                           return;
   46721                                         }
   46722                                         unsigned rd =
   46723                                             ExtractQRegister(instr, 22, 12);
   46724                                         unsigned rm =
   46725                                             ExtractDRegister(instr, 5, 0);
   46726                                         uint32_t imm6 = (instr >> 16) & 0x3f;
   46727                                         uint32_t imm = imm6 - dt.GetSize();
   46728                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   46729                                         vshll(al,
   46730                                               dt,
   46731                                               QRegister(rd),
   46732                                               DRegister(rm),
   46733                                               imm);
   46734                                         break;
   46735                                       }
   46736                                       case 0x002d0000: {
   46737                                         // 0xf2ad0a10
   46738                                         if (((instr & 0x380000) == 0x0) ||
   46739                                             ((instr & 0x3f0000) == 0x80000) ||
   46740                                             ((instr & 0x3f0000) == 0x100000) ||
   46741                                             ((instr & 0x3f0000) == 0x200000)) {
   46742                                           UnallocatedA32(instr);
   46743                                           return;
   46744                                         }
   46745                                         DataType dt =
   46746                                             Dt_imm6_4_Decode((instr >> 19) &
   46747                                                                  0x7,
   46748                                                              (instr >> 24) &
   46749                                                                  0x1);
   46750                                         if (dt.Is(kDataTypeValueInvalid)) {
   46751                                           UnallocatedA32(instr);
   46752                                           return;
   46753                                         }
   46754                                         if (((instr >> 12) & 1) != 0) {
   46755                                           UnallocatedA32(instr);
   46756                                           return;
   46757                                         }
   46758                                         unsigned rd =
   46759                                             ExtractQRegister(instr, 22, 12);
   46760                                         unsigned rm =
   46761                                             ExtractDRegister(instr, 5, 0);
   46762                                         uint32_t imm6 = (instr >> 16) & 0x3f;
   46763                                         uint32_t imm = imm6 - dt.GetSize();
   46764                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   46765                                         vshll(al,
   46766                                               dt,
   46767                                               QRegister(rd),
   46768                                               DRegister(rm),
   46769                                               imm);
   46770                                         break;
   46771                                       }
   46772                                       case 0x002e0000: {
   46773                                         // 0xf2ae0a10
   46774                                         if (((instr & 0x380000) == 0x0) ||
   46775                                             ((instr & 0x3f0000) == 0x80000) ||
   46776                                             ((instr & 0x3f0000) == 0x100000) ||
   46777                                             ((instr & 0x3f0000) == 0x200000)) {
   46778                                           UnallocatedA32(instr);
   46779                                           return;
   46780                                         }
   46781                                         DataType dt =
   46782                                             Dt_imm6_4_Decode((instr >> 19) &
   46783                                                                  0x7,
   46784                                                              (instr >> 24) &
   46785                                                                  0x1);
   46786                                         if (dt.Is(kDataTypeValueInvalid)) {
   46787                                           UnallocatedA32(instr);
   46788                                           return;
   46789                                         }
   46790                                         if (((instr >> 12) & 1) != 0) {
   46791                                           UnallocatedA32(instr);
   46792                                           return;
   46793                                         }
   46794                                         unsigned rd =
   46795                                             ExtractQRegister(instr, 22, 12);
   46796                                         unsigned rm =
   46797                                             ExtractDRegister(instr, 5, 0);
   46798                                         uint32_t imm6 = (instr >> 16) & 0x3f;
   46799                                         uint32_t imm = imm6 - dt.GetSize();
   46800                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   46801                                         vshll(al,
   46802                                               dt,
   46803                                               QRegister(rd),
   46804                                               DRegister(rm),
   46805                                               imm);
   46806                                         break;
   46807                                       }
   46808                                       case 0x002f0000: {
   46809                                         // 0xf2af0a10
   46810                                         if (((instr & 0x380000) == 0x0) ||
   46811                                             ((instr & 0x3f0000) == 0x80000) ||
   46812                                             ((instr & 0x3f0000) == 0x100000) ||
   46813                                             ((instr & 0x3f0000) == 0x200000)) {
   46814                                           UnallocatedA32(instr);
   46815                                           return;
   46816                                         }
   46817                                         DataType dt =
   46818                                             Dt_imm6_4_Decode((instr >> 19) &
   46819                                                                  0x7,
   46820                                                              (instr >> 24) &
   46821                                                                  0x1);
   46822                                         if (dt.Is(kDataTypeValueInvalid)) {
   46823                                           UnallocatedA32(instr);
   46824                                           return;
   46825                                         }
   46826                                         if (((instr >> 12) & 1) != 0) {
   46827                                           UnallocatedA32(instr);
   46828                                           return;
   46829                                         }
   46830                                         unsigned rd =
   46831                                             ExtractQRegister(instr, 22, 12);
   46832                                         unsigned rm =
   46833                                             ExtractDRegister(instr, 5, 0);
   46834                                         uint32_t imm6 = (instr >> 16) & 0x3f;
   46835                                         uint32_t imm = imm6 - dt.GetSize();
   46836                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   46837                                         vshll(al,
   46838                                               dt,
   46839                                               QRegister(rd),
   46840                                               DRegister(rm),
   46841                                               imm);
   46842                                         break;
   46843                                       }
   46844                                       case 0x00300000: {
   46845                                         // 0xf2b00a10
   46846                                         if (((instr & 0x380000) == 0x0) ||
   46847                                             ((instr & 0x3f0000) == 0x80000) ||
   46848                                             ((instr & 0x3f0000) == 0x100000) ||
   46849                                             ((instr & 0x3f0000) == 0x200000)) {
   46850                                           UnallocatedA32(instr);
   46851                                           return;
   46852                                         }
   46853                                         DataType dt =
   46854                                             Dt_imm6_4_Decode((instr >> 19) &
   46855                                                                  0x7,
   46856                                                              (instr >> 24) &
   46857                                                                  0x1);
   46858                                         if (dt.Is(kDataTypeValueInvalid)) {
   46859                                           UnallocatedA32(instr);
   46860                                           return;
   46861                                         }
   46862                                         if (((instr >> 12) & 1) != 0) {
   46863                                           UnallocatedA32(instr);
   46864                                           return;
   46865                                         }
   46866                                         unsigned rd =
   46867                                             ExtractQRegister(instr, 22, 12);
   46868                                         unsigned rm =
   46869                                             ExtractDRegister(instr, 5, 0);
   46870                                         uint32_t imm6 = (instr >> 16) & 0x3f;
   46871                                         uint32_t imm = imm6 - dt.GetSize();
   46872                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   46873                                         vshll(al,
   46874                                               dt,
   46875                                               QRegister(rd),
   46876                                               DRegister(rm),
   46877                                               imm);
   46878                                         break;
   46879                                       }
   46880                                       case 0x00310000: {
   46881                                         // 0xf2b10a10
   46882                                         if (((instr & 0x380000) == 0x0) ||
   46883                                             ((instr & 0x3f0000) == 0x80000) ||
   46884                                             ((instr & 0x3f0000) == 0x100000) ||
   46885                                             ((instr & 0x3f0000) == 0x200000)) {
   46886                                           UnallocatedA32(instr);
   46887                                           return;
   46888                                         }
   46889                                         DataType dt =
   46890                                             Dt_imm6_4_Decode((instr >> 19) &
   46891                                                                  0x7,
   46892                                                              (instr >> 24) &
   46893                                                                  0x1);
   46894                                         if (dt.Is(kDataTypeValueInvalid)) {
   46895                                           UnallocatedA32(instr);
   46896                                           return;
   46897                                         }
   46898                                         if (((instr >> 12) & 1) != 0) {
   46899                                           UnallocatedA32(instr);
   46900                                           return;
   46901                                         }
   46902                                         unsigned rd =
   46903                                             ExtractQRegister(instr, 22, 12);
   46904                                         unsigned rm =
   46905                                             ExtractDRegister(instr, 5, 0);
   46906                                         uint32_t imm6 = (instr >> 16) & 0x3f;
   46907                                         uint32_t imm = imm6 - dt.GetSize();
   46908                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   46909                                         vshll(al,
   46910                                               dt,
   46911                                               QRegister(rd),
   46912                                               DRegister(rm),
   46913                                               imm);
   46914                                         break;
   46915                                       }
   46916                                       case 0x00320000: {
   46917                                         // 0xf2b20a10
   46918                                         if (((instr & 0x380000) == 0x0) ||
   46919                                             ((instr & 0x3f0000) == 0x80000) ||
   46920                                             ((instr & 0x3f0000) == 0x100000) ||
   46921                                             ((instr & 0x3f0000) == 0x200000)) {
   46922                                           UnallocatedA32(instr);
   46923                                           return;
   46924                                         }
   46925                                         DataType dt =
   46926                                             Dt_imm6_4_Decode((instr >> 19) &
   46927                                                                  0x7,
   46928                                                              (instr >> 24) &
   46929                                                                  0x1);
   46930                                         if (dt.Is(kDataTypeValueInvalid)) {
   46931                                           UnallocatedA32(instr);
   46932                                           return;
   46933                                         }
   46934                                         if (((instr >> 12) & 1) != 0) {
   46935                                           UnallocatedA32(instr);
   46936                                           return;
   46937                                         }
   46938                                         unsigned rd =
   46939                                             ExtractQRegister(instr, 22, 12);
   46940                                         unsigned rm =
   46941                                             ExtractDRegister(instr, 5, 0);
   46942                                         uint32_t imm6 = (instr >> 16) & 0x3f;
   46943                                         uint32_t imm = imm6 - dt.GetSize();
   46944                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   46945                                         vshll(al,
   46946                                               dt,
   46947                                               QRegister(rd),
   46948                                               DRegister(rm),
   46949                                               imm);
   46950                                         break;
   46951                                       }
   46952                                       case 0x00330000: {
   46953                                         // 0xf2b30a10
   46954                                         if (((instr & 0x380000) == 0x0) ||
   46955                                             ((instr & 0x3f0000) == 0x80000) ||
   46956                                             ((instr & 0x3f0000) == 0x100000) ||
   46957                                             ((instr & 0x3f0000) == 0x200000)) {
   46958                                           UnallocatedA32(instr);
   46959                                           return;
   46960                                         }
   46961                                         DataType dt =
   46962                                             Dt_imm6_4_Decode((instr >> 19) &
   46963                                                                  0x7,
   46964                                                              (instr >> 24) &
   46965                                                                  0x1);
   46966                                         if (dt.Is(kDataTypeValueInvalid)) {
   46967                                           UnallocatedA32(instr);
   46968                                           return;
   46969                                         }
   46970                                         if (((instr >> 12) & 1) != 0) {
   46971                                           UnallocatedA32(instr);
   46972                                           return;
   46973                                         }
   46974                                         unsigned rd =
   46975                                             ExtractQRegister(instr, 22, 12);
   46976                                         unsigned rm =
   46977                                             ExtractDRegister(instr, 5, 0);
   46978                                         uint32_t imm6 = (instr >> 16) & 0x3f;
   46979                                         uint32_t imm = imm6 - dt.GetSize();
   46980                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   46981                                         vshll(al,
   46982                                               dt,
   46983                                               QRegister(rd),
   46984                                               DRegister(rm),
   46985                                               imm);
   46986                                         break;
   46987                                       }
   46988                                       case 0x00340000: {
   46989                                         // 0xf2b40a10
   46990                                         if (((instr & 0x380000) == 0x0) ||
   46991                                             ((instr & 0x3f0000) == 0x80000) ||
   46992                                             ((instr & 0x3f0000) == 0x100000) ||
   46993                                             ((instr & 0x3f0000) == 0x200000)) {
   46994                                           UnallocatedA32(instr);
   46995                                           return;
   46996                                         }
   46997                                         DataType dt =
   46998                                             Dt_imm6_4_Decode((instr >> 19) &
   46999                                                                  0x7,
   47000                                                              (instr >> 24) &
   47001                                                                  0x1);
   47002                                         if (dt.Is(kDataTypeValueInvalid)) {
   47003                                           UnallocatedA32(instr);
   47004                                           return;
   47005                                         }
   47006                                         if (((instr >> 12) & 1) != 0) {
   47007                                           UnallocatedA32(instr);
   47008                                           return;
   47009                                         }
   47010                                         unsigned rd =
   47011                                             ExtractQRegister(instr, 22, 12);
   47012                                         unsigned rm =
   47013                                             ExtractDRegister(instr, 5, 0);
   47014                                         uint32_t imm6 = (instr >> 16) & 0x3f;
   47015                                         uint32_t imm = imm6 - dt.GetSize();
   47016                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   47017                                         vshll(al,
   47018                                               dt,
   47019                                               QRegister(rd),
   47020                                               DRegister(rm),
   47021                                               imm);
   47022                                         break;
   47023                                       }
   47024                                       case 0x00350000: {
   47025                                         // 0xf2b50a10
   47026                                         if (((instr & 0x380000) == 0x0) ||
   47027                                             ((instr & 0x3f0000) == 0x80000) ||
   47028                                             ((instr & 0x3f0000) == 0x100000) ||
   47029                                             ((instr & 0x3f0000) == 0x200000)) {
   47030                                           UnallocatedA32(instr);
   47031                                           return;
   47032                                         }
   47033                                         DataType dt =
   47034                                             Dt_imm6_4_Decode((instr >> 19) &
   47035                                                                  0x7,
   47036                                                              (instr >> 24) &
   47037                                                                  0x1);
   47038                                         if (dt.Is(kDataTypeValueInvalid)) {
   47039                                           UnallocatedA32(instr);
   47040                                           return;
   47041                                         }
   47042                                         if (((instr >> 12) & 1) != 0) {
   47043                                           UnallocatedA32(instr);
   47044                                           return;
   47045                                         }
   47046                                         unsigned rd =
   47047                                             ExtractQRegister(instr, 22, 12);
   47048                                         unsigned rm =
   47049                                             ExtractDRegister(instr, 5, 0);
   47050                                         uint32_t imm6 = (instr >> 16) & 0x3f;
   47051                                         uint32_t imm = imm6 - dt.GetSize();
   47052                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   47053                                         vshll(al,
   47054                                               dt,
   47055                                               QRegister(rd),
   47056                                               DRegister(rm),
   47057                                               imm);
   47058                                         break;
   47059                                       }
   47060                                       case 0x00360000: {
   47061                                         // 0xf2b60a10
   47062                                         if (((instr & 0x380000) == 0x0) ||
   47063                                             ((instr & 0x3f0000) == 0x80000) ||
   47064                                             ((instr & 0x3f0000) == 0x100000) ||
   47065                                             ((instr & 0x3f0000) == 0x200000)) {
   47066                                           UnallocatedA32(instr);
   47067                                           return;
   47068                                         }
   47069                                         DataType dt =
   47070                                             Dt_imm6_4_Decode((instr >> 19) &
   47071                                                                  0x7,
   47072                                                              (instr >> 24) &
   47073                                                                  0x1);
   47074                                         if (dt.Is(kDataTypeValueInvalid)) {
   47075                                           UnallocatedA32(instr);
   47076                                           return;
   47077                                         }
   47078                                         if (((instr >> 12) & 1) != 0) {
   47079                                           UnallocatedA32(instr);
   47080                                           return;
   47081                                         }
   47082                                         unsigned rd =
   47083                                             ExtractQRegister(instr, 22, 12);
   47084                                         unsigned rm =
   47085                                             ExtractDRegister(instr, 5, 0);
   47086                                         uint32_t imm6 = (instr >> 16) & 0x3f;
   47087                                         uint32_t imm = imm6 - dt.GetSize();
   47088                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   47089                                         vshll(al,
   47090                                               dt,
   47091                                               QRegister(rd),
   47092                                               DRegister(rm),
   47093                                               imm);
   47094                                         break;
   47095                                       }
   47096                                       case 0x00370000: {
   47097                                         // 0xf2b70a10
   47098                                         if (((instr & 0x380000) == 0x0) ||
   47099                                             ((instr & 0x3f0000) == 0x80000) ||
   47100                                             ((instr & 0x3f0000) == 0x100000) ||
   47101                                             ((instr & 0x3f0000) == 0x200000)) {
   47102                                           UnallocatedA32(instr);
   47103                                           return;
   47104                                         }
   47105                                         DataType dt =
   47106                                             Dt_imm6_4_Decode((instr >> 19) &
   47107                                                                  0x7,
   47108                                                              (instr >> 24) &
   47109                                                                  0x1);
   47110                                         if (dt.Is(kDataTypeValueInvalid)) {
   47111                                           UnallocatedA32(instr);
   47112                                           return;
   47113                                         }
   47114                                         if (((instr >> 12) & 1) != 0) {
   47115                                           UnallocatedA32(instr);
   47116                                           return;
   47117                                         }
   47118                                         unsigned rd =
   47119                                             ExtractQRegister(instr, 22, 12);
   47120                                         unsigned rm =
   47121                                             ExtractDRegister(instr, 5, 0);
   47122                                         uint32_t imm6 = (instr >> 16) & 0x3f;
   47123                                         uint32_t imm = imm6 - dt.GetSize();
   47124                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   47125                                         vshll(al,
   47126                                               dt,
   47127                                               QRegister(rd),
   47128                                               DRegister(rm),
   47129                                               imm);
   47130                                         break;
   47131                                       }
   47132                                       case 0x00380000: {
   47133                                         // 0xf2b80a10
   47134                                         if (((instr & 0x380000) == 0x0) ||
   47135                                             ((instr & 0x3f0000) == 0x80000) ||
   47136                                             ((instr & 0x3f0000) == 0x100000) ||
   47137                                             ((instr & 0x3f0000) == 0x200000)) {
   47138                                           UnallocatedA32(instr);
   47139                                           return;
   47140                                         }
   47141                                         DataType dt =
   47142                                             Dt_imm6_4_Decode((instr >> 19) &
   47143                                                                  0x7,
   47144                                                              (instr >> 24) &
   47145                                                                  0x1);
   47146                                         if (dt.Is(kDataTypeValueInvalid)) {
   47147                                           UnallocatedA32(instr);
   47148                                           return;
   47149                                         }
   47150                                         if (((instr >> 12) & 1) != 0) {
   47151                                           UnallocatedA32(instr);
   47152                                           return;
   47153                                         }
   47154                                         unsigned rd =
   47155                                             ExtractQRegister(instr, 22, 12);
   47156                                         unsigned rm =
   47157                                             ExtractDRegister(instr, 5, 0);
   47158                                         uint32_t imm6 = (instr >> 16) & 0x3f;
   47159                                         uint32_t imm = imm6 - dt.GetSize();
   47160                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   47161                                         vshll(al,
   47162                                               dt,
   47163                                               QRegister(rd),
   47164                                               DRegister(rm),
   47165                                               imm);
   47166                                         break;
   47167                                       }
   47168                                       case 0x00390000: {
   47169                                         // 0xf2b90a10
   47170                                         if (((instr & 0x380000) == 0x0) ||
   47171                                             ((instr & 0x3f0000) == 0x80000) ||
   47172                                             ((instr & 0x3f0000) == 0x100000) ||
   47173                                             ((instr & 0x3f0000) == 0x200000)) {
   47174                                           UnallocatedA32(instr);
   47175                                           return;
   47176                                         }
   47177                                         DataType dt =
   47178                                             Dt_imm6_4_Decode((instr >> 19) &
   47179                                                                  0x7,
   47180                                                              (instr >> 24) &
   47181                                                                  0x1);
   47182                                         if (dt.Is(kDataTypeValueInvalid)) {
   47183                                           UnallocatedA32(instr);
   47184                                           return;
   47185                                         }
   47186                                         if (((instr >> 12) & 1) != 0) {
   47187                                           UnallocatedA32(instr);
   47188                                           return;
   47189                                         }
   47190                                         unsigned rd =
   47191                                             ExtractQRegister(instr, 22, 12);
   47192                                         unsigned rm =
   47193                                             ExtractDRegister(instr, 5, 0);
   47194                                         uint32_t imm6 = (instr >> 16) & 0x3f;
   47195                                         uint32_t imm = imm6 - dt.GetSize();
   47196                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   47197                                         vshll(al,
   47198                                               dt,
   47199                                               QRegister(rd),
   47200                                               DRegister(rm),
   47201                                               imm);
   47202                                         break;
   47203                                       }
   47204                                       case 0x003a0000: {
   47205                                         // 0xf2ba0a10
   47206                                         if (((instr & 0x380000) == 0x0) ||
   47207                                             ((instr & 0x3f0000) == 0x80000) ||
   47208                                             ((instr & 0x3f0000) == 0x100000) ||
   47209                                             ((instr & 0x3f0000) == 0x200000)) {
   47210                                           UnallocatedA32(instr);
   47211                                           return;
   47212                                         }
   47213                                         DataType dt =
   47214                                             Dt_imm6_4_Decode((instr >> 19) &
   47215                                                                  0x7,
   47216                                                              (instr >> 24) &
   47217                                                                  0x1);
   47218                                         if (dt.Is(kDataTypeValueInvalid)) {
   47219                                           UnallocatedA32(instr);
   47220                                           return;
   47221                                         }
   47222                                         if (((instr >> 12) & 1) != 0) {
   47223                                           UnallocatedA32(instr);
   47224                                           return;
   47225                                         }
   47226                                         unsigned rd =
   47227                                             ExtractQRegister(instr, 22, 12);
   47228                                         unsigned rm =
   47229                                             ExtractDRegister(instr, 5, 0);
   47230                                         uint32_t imm6 = (instr >> 16) & 0x3f;
   47231                                         uint32_t imm = imm6 - dt.GetSize();
   47232                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   47233                                         vshll(al,
   47234                                               dt,
   47235                                               QRegister(rd),
   47236                                               DRegister(rm),
   47237                                               imm);
   47238                                         break;
   47239                                       }
   47240                                       case 0x003b0000: {
   47241                                         // 0xf2bb0a10
   47242                                         if (((instr & 0x380000) == 0x0) ||
   47243                                             ((instr & 0x3f0000) == 0x80000) ||
   47244                                             ((instr & 0x3f0000) == 0x100000) ||
   47245                                             ((instr & 0x3f0000) == 0x200000)) {
   47246                                           UnallocatedA32(instr);
   47247                                           return;
   47248                                         }
   47249                                         DataType dt =
   47250                                             Dt_imm6_4_Decode((instr >> 19) &
   47251                                                                  0x7,
   47252                                                              (instr >> 24) &
   47253                                                                  0x1);
   47254                                         if (dt.Is(kDataTypeValueInvalid)) {
   47255                                           UnallocatedA32(instr);
   47256                                           return;
   47257                                         }
   47258                                         if (((instr >> 12) & 1) != 0) {
   47259                                           UnallocatedA32(instr);
   47260                                           return;
   47261                                         }
   47262                                         unsigned rd =
   47263                                             ExtractQRegister(instr, 22, 12);
   47264                                         unsigned rm =
   47265                                             ExtractDRegister(instr, 5, 0);
   47266                                         uint32_t imm6 = (instr >> 16) & 0x3f;
   47267                                         uint32_t imm = imm6 - dt.GetSize();
   47268                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   47269                                         vshll(al,
   47270                                               dt,
   47271                                               QRegister(rd),
   47272                                               DRegister(rm),
   47273                                               imm);
   47274                                         break;
   47275                                       }
   47276                                       case 0x003c0000: {
   47277                                         // 0xf2bc0a10
   47278                                         if (((instr & 0x380000) == 0x0) ||
   47279                                             ((instr & 0x3f0000) == 0x80000) ||
   47280                                             ((instr & 0x3f0000) == 0x100000) ||
   47281                                             ((instr & 0x3f0000) == 0x200000)) {
   47282                                           UnallocatedA32(instr);
   47283                                           return;
   47284                                         }
   47285                                         DataType dt =
   47286                                             Dt_imm6_4_Decode((instr >> 19) &
   47287                                                                  0x7,
   47288                                                              (instr >> 24) &
   47289                                                                  0x1);
   47290                                         if (dt.Is(kDataTypeValueInvalid)) {
   47291                                           UnallocatedA32(instr);
   47292                                           return;
   47293                                         }
   47294                                         if (((instr >> 12) & 1) != 0) {
   47295                                           UnallocatedA32(instr);
   47296                                           return;
   47297                                         }
   47298                                         unsigned rd =
   47299                                             ExtractQRegister(instr, 22, 12);
   47300                                         unsigned rm =
   47301                                             ExtractDRegister(instr, 5, 0);
   47302                                         uint32_t imm6 = (instr >> 16) & 0x3f;
   47303                                         uint32_t imm = imm6 - dt.GetSize();
   47304                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   47305                                         vshll(al,
   47306                                               dt,
   47307                                               QRegister(rd),
   47308                                               DRegister(rm),
   47309                                               imm);
   47310                                         break;
   47311                                       }
   47312                                       case 0x003d0000: {
   47313                                         // 0xf2bd0a10
   47314                                         if (((instr & 0x380000) == 0x0) ||
   47315                                             ((instr & 0x3f0000) == 0x80000) ||
   47316                                             ((instr & 0x3f0000) == 0x100000) ||
   47317                                             ((instr & 0x3f0000) == 0x200000)) {
   47318                                           UnallocatedA32(instr);
   47319                                           return;
   47320                                         }
   47321                                         DataType dt =
   47322                                             Dt_imm6_4_Decode((instr >> 19) &
   47323                                                                  0x7,
   47324                                                              (instr >> 24) &
   47325                                                                  0x1);
   47326                                         if (dt.Is(kDataTypeValueInvalid)) {
   47327                                           UnallocatedA32(instr);
   47328                                           return;
   47329                                         }
   47330                                         if (((instr >> 12) & 1) != 0) {
   47331                                           UnallocatedA32(instr);
   47332                                           return;
   47333                                         }
   47334                                         unsigned rd =
   47335                                             ExtractQRegister(instr, 22, 12);
   47336                                         unsigned rm =
   47337                                             ExtractDRegister(instr, 5, 0);
   47338                                         uint32_t imm6 = (instr >> 16) & 0x3f;
   47339                                         uint32_t imm = imm6 - dt.GetSize();
   47340                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   47341                                         vshll(al,
   47342                                               dt,
   47343                                               QRegister(rd),
   47344                                               DRegister(rm),
   47345                                               imm);
   47346                                         break;
   47347                                       }
   47348                                       case 0x003e0000: {
   47349                                         // 0xf2be0a10
   47350                                         if (((instr & 0x380000) == 0x0) ||
   47351                                             ((instr & 0x3f0000) == 0x80000) ||
   47352                                             ((instr & 0x3f0000) == 0x100000) ||
   47353                                             ((instr & 0x3f0000) == 0x200000)) {
   47354                                           UnallocatedA32(instr);
   47355                                           return;
   47356                                         }
   47357                                         DataType dt =
   47358                                             Dt_imm6_4_Decode((instr >> 19) &
   47359                                                                  0x7,
   47360                                                              (instr >> 24) &
   47361                                                                  0x1);
   47362                                         if (dt.Is(kDataTypeValueInvalid)) {
   47363                                           UnallocatedA32(instr);
   47364                                           return;
   47365                                         }
   47366                                         if (((instr >> 12) & 1) != 0) {
   47367                                           UnallocatedA32(instr);
   47368                                           return;
   47369                                         }
   47370                                         unsigned rd =
   47371                                             ExtractQRegister(instr, 22, 12);
   47372                                         unsigned rm =
   47373                                             ExtractDRegister(instr, 5, 0);
   47374                                         uint32_t imm6 = (instr >> 16) & 0x3f;
   47375                                         uint32_t imm = imm6 - dt.GetSize();
   47376                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   47377                                         vshll(al,
   47378                                               dt,
   47379                                               QRegister(rd),
   47380                                               DRegister(rm),
   47381                                               imm);
   47382                                         break;
   47383                                       }
   47384                                       case 0x003f0000: {
   47385                                         // 0xf2bf0a10
   47386                                         if (((instr & 0x380000) == 0x0) ||
   47387                                             ((instr & 0x3f0000) == 0x80000) ||
   47388                                             ((instr & 0x3f0000) == 0x100000) ||
   47389                                             ((instr & 0x3f0000) == 0x200000)) {
   47390                                           UnallocatedA32(instr);
   47391                                           return;
   47392                                         }
   47393                                         DataType dt =
   47394                                             Dt_imm6_4_Decode((instr >> 19) &
   47395                                                                  0x7,
   47396                                                              (instr >> 24) &
   47397                                                                  0x1);
   47398                                         if (dt.Is(kDataTypeValueInvalid)) {
   47399                                           UnallocatedA32(instr);
   47400                                           return;
   47401                                         }
   47402                                         if (((instr >> 12) & 1) != 0) {
   47403                                           UnallocatedA32(instr);
   47404                                           return;
   47405                                         }
   47406                                         unsigned rd =
   47407                                             ExtractQRegister(instr, 22, 12);
   47408                                         unsigned rm =
   47409                                             ExtractDRegister(instr, 5, 0);
   47410                                         uint32_t imm6 = (instr >> 16) & 0x3f;
   47411                                         uint32_t imm = imm6 - dt.GetSize();
   47412                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   47413                                         vshll(al,
   47414                                               dt,
   47415                                               QRegister(rd),
   47416                                               DRegister(rm),
   47417                                               imm);
   47418                                         break;
   47419                                       }
   47420                                       default:
   47421                                         UnallocatedA32(instr);
   47422                                         break;
   47423                                     }
   47424                                     break;
   47425                                   }
   47426                                   default: {
   47427                                     if (((instr & 0x380000) == 0x0) ||
   47428                                         ((instr & 0x3f0000) == 0x80000) ||
   47429                                         ((instr & 0x3f0000) == 0x100000) ||
   47430                                         ((instr & 0x3f0000) == 0x200000)) {
   47431                                       UnallocatedA32(instr);
   47432                                       return;
   47433                                     }
   47434                                     DataType dt =
   47435                                         Dt_imm6_4_Decode((instr >> 19) & 0x7,
   47436                                                          (instr >> 24) & 0x1);
   47437                                     if (dt.Is(kDataTypeValueInvalid)) {
   47438                                       UnallocatedA32(instr);
   47439                                       return;
   47440                                     }
   47441                                     if (((instr >> 12) & 1) != 0) {
   47442                                       UnallocatedA32(instr);
   47443                                       return;
   47444                                     }
   47445                                     unsigned rd =
   47446                                         ExtractQRegister(instr, 22, 12);
   47447                                     unsigned rm = ExtractDRegister(instr, 5, 0);
   47448                                     uint32_t imm6 = (instr >> 16) & 0x3f;
   47449                                     uint32_t imm = imm6 - dt.GetSize();
   47450                                     // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   47451                                     vshll(al,
   47452                                           dt,
   47453                                           QRegister(rd),
   47454                                           DRegister(rm),
   47455                                           imm);
   47456                                     break;
   47457                                   }
   47458                                 }
   47459                                 break;
   47460                               }
   47461                               default:
   47462                                 UnallocatedA32(instr);
   47463                                 break;
   47464                             }
   47465                             break;
   47466                           }
   47467                         }
   47468                         break;
   47469                       }
   47470                       default:
   47471                         UnallocatedA32(instr);
   47472                         break;
   47473                     }
   47474                     break;
   47475                   }
   47476                   case 0x00000c00: {
   47477                     // 0xf2800c10
   47478                     switch (instr & 0x00000080) {
   47479                       case 0x00000000: {
   47480                         // 0xf2800c10
   47481                         switch (instr & 0x00200000) {
   47482                           case 0x00000000: {
   47483                             // 0xf2800c10
   47484                             switch (instr & 0x00180000) {
   47485                               case 0x00000000: {
   47486                                 // 0xf2800c10
   47487                                 switch (instr & 0x00000300) {
   47488                                   case 0x00000200: {
   47489                                     // 0xf2800e10
   47490                                     if (((instr & 0x920) == 0x100) ||
   47491                                         ((instr & 0x520) == 0x100) ||
   47492                                         ((instr & 0x820) == 0x20) ||
   47493                                         ((instr & 0x420) == 0x20) ||
   47494                                         ((instr & 0x220) == 0x20) ||
   47495                                         ((instr & 0x120) == 0x120)) {
   47496                                       UnallocatedA32(instr);
   47497                                       return;
   47498                                     }
   47499                                     unsigned cmode = ((instr >> 8) & 0xf) |
   47500                                                      ((instr >> 1) & 0x10);
   47501                                     DataType dt =
   47502                                         ImmediateVmov::DecodeDt(cmode);
   47503                                     if (dt.Is(kDataTypeValueInvalid)) {
   47504                                       UnallocatedA32(instr);
   47505                                       return;
   47506                                     }
   47507                                     unsigned rd =
   47508                                         ExtractDRegister(instr, 22, 12);
   47509                                     DOperand imm =
   47510                                         ImmediateVmov::DecodeImmediate(
   47511                                             cmode,
   47512                                             (instr & 0xf) |
   47513                                                 ((instr >> 12) & 0x70) |
   47514                                                 ((instr >> 17) & 0x80));
   47515                                     // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1
   47516                                     vmov(al, dt, DRegister(rd), imm);
   47517                                     break;
   47518                                   }
   47519                                   case 0x00000300: {
   47520                                     // 0xf2800f10
   47521                                     if (((instr & 0x920) == 0x100) ||
   47522                                         ((instr & 0x520) == 0x100) ||
   47523                                         ((instr & 0x820) == 0x20) ||
   47524                                         ((instr & 0x420) == 0x20) ||
   47525                                         ((instr & 0x220) == 0x20) ||
   47526                                         ((instr & 0x120) == 0x120)) {
   47527                                       UnallocatedA32(instr);
   47528                                       return;
   47529                                     }
   47530                                     unsigned cmode = ((instr >> 8) & 0xf) |
   47531                                                      ((instr >> 1) & 0x10);
   47532                                     DataType dt =
   47533                                         ImmediateVmov::DecodeDt(cmode);
   47534                                     if (dt.Is(kDataTypeValueInvalid)) {
   47535                                       UnallocatedA32(instr);
   47536                                       return;
   47537                                     }
   47538                                     unsigned rd =
   47539                                         ExtractDRegister(instr, 22, 12);
   47540                                     DOperand imm =
   47541                                         ImmediateVmov::DecodeImmediate(
   47542                                             cmode,
   47543                                             (instr & 0xf) |
   47544                                                 ((instr >> 12) & 0x70) |
   47545                                                 ((instr >> 17) & 0x80));
   47546                                     // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1
   47547                                     vmov(al, dt, DRegister(rd), imm);
   47548                                     break;
   47549                                   }
   47550                                   default: {
   47551                                     switch (instr & 0x00000020) {
   47552                                       case 0x00000020: {
   47553                                         // 0xf2800c30
   47554                                         switch (instr & 0x00000f20) {
   47555                                           case 0x00000000: {
   47556                                             // 0xf2800c10
   47557                                             if (((instr & 0x920) == 0x100) ||
   47558                                                 ((instr & 0x520) == 0x100) ||
   47559                                                 ((instr & 0x820) == 0x20) ||
   47560                                                 ((instr & 0x420) == 0x20) ||
   47561                                                 ((instr & 0x220) == 0x20) ||
   47562                                                 ((instr & 0x120) == 0x120)) {
   47563                                               UnallocatedA32(instr);
   47564                                               return;
   47565                                             }
   47566                                             unsigned cmode =
   47567                                                 ((instr >> 8) & 0xf) |
   47568                                                 ((instr >> 1) & 0x10);
   47569                                             DataType dt =
   47570                                                 ImmediateVmov::DecodeDt(cmode);
   47571                                             if (dt.Is(kDataTypeValueInvalid)) {
   47572                                               UnallocatedA32(instr);
   47573                                               return;
   47574                                             }
   47575                                             unsigned rd =
   47576                                                 ExtractDRegister(instr, 22, 12);
   47577                                             DOperand imm =
   47578                                                 ImmediateVmov::DecodeImmediate(
   47579                                                     cmode,
   47580                                                     (instr & 0xf) |
   47581                                                         ((instr >> 12) & 0x70) |
   47582                                                         ((instr >> 17) & 0x80));
   47583                                             // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
   47584                                             vmov(al, dt, DRegister(rd), imm);
   47585                                             break;
   47586                                           }
   47587                                           case 0x00000020: {
   47588                                             // 0xf2800c30
   47589                                             if (((instr & 0xd00) == 0x100) ||
   47590                                                 ((instr & 0xd00) == 0x500) ||
   47591                                                 ((instr & 0xd00) == 0x900) ||
   47592                                                 ((instr & 0xe00) == 0xe00)) {
   47593                                               UnallocatedA32(instr);
   47594                                               return;
   47595                                             }
   47596                                             unsigned cmode = (instr >> 8) & 0xf;
   47597                                             DataType dt =
   47598                                                 ImmediateVmvn::DecodeDt(cmode);
   47599                                             if (dt.Is(kDataTypeValueInvalid)) {
   47600                                               UnallocatedA32(instr);
   47601                                               return;
   47602                                             }
   47603                                             unsigned rd =
   47604                                                 ExtractDRegister(instr, 22, 12);
   47605                                             DOperand imm =
   47606                                                 ImmediateVmvn::DecodeImmediate(
   47607                                                     cmode,
   47608                                                     (instr & 0xf) |
   47609                                                         ((instr >> 12) & 0x70) |
   47610                                                         ((instr >> 17) & 0x80));
   47611                                             // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
   47612                                             vmvn(al, dt, DRegister(rd), imm);
   47613                                             break;
   47614                                           }
   47615                                           case 0x00000200: {
   47616                                             // 0xf2800e10
   47617                                             if (((instr & 0x920) == 0x100) ||
   47618                                                 ((instr & 0x520) == 0x100) ||
   47619                                                 ((instr & 0x820) == 0x20) ||
   47620                                                 ((instr & 0x420) == 0x20) ||
   47621                                                 ((instr & 0x220) == 0x20) ||
   47622                                                 ((instr & 0x120) == 0x120)) {
   47623                                               UnallocatedA32(instr);
   47624                                               return;
   47625                                             }
   47626                                             unsigned cmode =
   47627                                                 ((instr >> 8) & 0xf) |
   47628                                                 ((instr >> 1) & 0x10);
   47629                                             DataType dt =
   47630                                                 ImmediateVmov::DecodeDt(cmode);
   47631                                             if (dt.Is(kDataTypeValueInvalid)) {
   47632                                               UnallocatedA32(instr);
   47633                                               return;
   47634                                             }
   47635                                             unsigned rd =
   47636                                                 ExtractDRegister(instr, 22, 12);
   47637                                             DOperand imm =
   47638                                                 ImmediateVmov::DecodeImmediate(
   47639                                                     cmode,
   47640                                                     (instr & 0xf) |
   47641                                                         ((instr >> 12) & 0x70) |
   47642                                                         ((instr >> 17) & 0x80));
   47643                                             // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
   47644                                             vmov(al, dt, DRegister(rd), imm);
   47645                                             break;
   47646                                           }
   47647                                           case 0x00000220: {
   47648                                             // 0xf2800e30
   47649                                             if (((instr & 0xd00) == 0x100) ||
   47650                                                 ((instr & 0xd00) == 0x500) ||
   47651                                                 ((instr & 0xd00) == 0x900) ||
   47652                                                 ((instr & 0xe00) == 0xe00)) {
   47653                                               UnallocatedA32(instr);
   47654                                               return;
   47655                                             }
   47656                                             unsigned cmode = (instr >> 8) & 0xf;
   47657                                             DataType dt =
   47658                                                 ImmediateVmvn::DecodeDt(cmode);
   47659                                             if (dt.Is(kDataTypeValueInvalid)) {
   47660                                               UnallocatedA32(instr);
   47661                                               return;
   47662                                             }
   47663                                             unsigned rd =
   47664                                                 ExtractDRegister(instr, 22, 12);
   47665                                             DOperand imm =
   47666                                                 ImmediateVmvn::DecodeImmediate(
   47667                                                     cmode,
   47668                                                     (instr & 0xf) |
   47669                                                         ((instr >> 12) & 0x70) |
   47670                                                         ((instr >> 17) & 0x80));
   47671                                             // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
   47672                                             vmvn(al, dt, DRegister(rd), imm);
   47673                                             break;
   47674                                           }
   47675                                           case 0x00000400: {
   47676                                             // 0xf2800c10
   47677                                             if (((instr & 0x920) == 0x100) ||
   47678                                                 ((instr & 0x520) == 0x100) ||
   47679                                                 ((instr & 0x820) == 0x20) ||
   47680                                                 ((instr & 0x420) == 0x20) ||
   47681                                                 ((instr & 0x220) == 0x20) ||
   47682                                                 ((instr & 0x120) == 0x120)) {
   47683                                               UnallocatedA32(instr);
   47684                                               return;
   47685                                             }
   47686                                             unsigned cmode =
   47687                                                 ((instr >> 8) & 0xf) |
   47688                                                 ((instr >> 1) & 0x10);
   47689                                             DataType dt =
   47690                                                 ImmediateVmov::DecodeDt(cmode);
   47691                                             if (dt.Is(kDataTypeValueInvalid)) {
   47692                                               UnallocatedA32(instr);
   47693                                               return;
   47694                                             }
   47695                                             unsigned rd =
   47696                                                 ExtractDRegister(instr, 22, 12);
   47697                                             DOperand imm =
   47698                                                 ImmediateVmov::DecodeImmediate(
   47699                                                     cmode,
   47700                                                     (instr & 0xf) |
   47701                                                         ((instr >> 12) & 0x70) |
   47702                                                         ((instr >> 17) & 0x80));
   47703                                             // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
   47704                                             vmov(al, dt, DRegister(rd), imm);
   47705                                             break;
   47706                                           }
   47707                                           case 0x00000420: {
   47708                                             // 0xf2800c30
   47709                                             if (((instr & 0xd00) == 0x100) ||
   47710                                                 ((instr & 0xd00) == 0x500) ||
   47711                                                 ((instr & 0xd00) == 0x900) ||
   47712                                                 ((instr & 0xe00) == 0xe00)) {
   47713                                               UnallocatedA32(instr);
   47714                                               return;
   47715                                             }
   47716                                             unsigned cmode = (instr >> 8) & 0xf;
   47717                                             DataType dt =
   47718                                                 ImmediateVmvn::DecodeDt(cmode);
   47719                                             if (dt.Is(kDataTypeValueInvalid)) {
   47720                                               UnallocatedA32(instr);
   47721                                               return;
   47722                                             }
   47723                                             unsigned rd =
   47724                                                 ExtractDRegister(instr, 22, 12);
   47725                                             DOperand imm =
   47726                                                 ImmediateVmvn::DecodeImmediate(
   47727                                                     cmode,
   47728                                                     (instr & 0xf) |
   47729                                                         ((instr >> 12) & 0x70) |
   47730                                                         ((instr >> 17) & 0x80));
   47731                                             // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
   47732                                             vmvn(al, dt, DRegister(rd), imm);
   47733                                             break;
   47734                                           }
   47735                                           case 0x00000600: {
   47736                                             // 0xf2800e10
   47737                                             if (((instr & 0x920) == 0x100) ||
   47738                                                 ((instr & 0x520) == 0x100) ||
   47739                                                 ((instr & 0x820) == 0x20) ||
   47740                                                 ((instr & 0x420) == 0x20) ||
   47741                                                 ((instr & 0x220) == 0x20) ||
   47742                                                 ((instr & 0x120) == 0x120)) {
   47743                                               UnallocatedA32(instr);
   47744                                               return;
   47745                                             }
   47746                                             unsigned cmode =
   47747                                                 ((instr >> 8) & 0xf) |
   47748                                                 ((instr >> 1) & 0x10);
   47749                                             DataType dt =
   47750                                                 ImmediateVmov::DecodeDt(cmode);
   47751                                             if (dt.Is(kDataTypeValueInvalid)) {
   47752                                               UnallocatedA32(instr);
   47753                                               return;
   47754                                             }
   47755                                             unsigned rd =
   47756                                                 ExtractDRegister(instr, 22, 12);
   47757                                             DOperand imm =
   47758                                                 ImmediateVmov::DecodeImmediate(
   47759                                                     cmode,
   47760                                                     (instr & 0xf) |
   47761                                                         ((instr >> 12) & 0x70) |
   47762                                                         ((instr >> 17) & 0x80));
   47763                                             // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
   47764                                             vmov(al, dt, DRegister(rd), imm);
   47765                                             break;
   47766                                           }
   47767                                           case 0x00000620: {
   47768                                             // 0xf2800e30
   47769                                             if (((instr & 0xd00) == 0x100) ||
   47770                                                 ((instr & 0xd00) == 0x500) ||
   47771                                                 ((instr & 0xd00) == 0x900) ||
   47772                                                 ((instr & 0xe00) == 0xe00)) {
   47773                                               UnallocatedA32(instr);
   47774                                               return;
   47775                                             }
   47776                                             unsigned cmode = (instr >> 8) & 0xf;
   47777                                             DataType dt =
   47778                                                 ImmediateVmvn::DecodeDt(cmode);
   47779                                             if (dt.Is(kDataTypeValueInvalid)) {
   47780                                               UnallocatedA32(instr);
   47781                                               return;
   47782                                             }
   47783                                             unsigned rd =
   47784                                                 ExtractDRegister(instr, 22, 12);
   47785                                             DOperand imm =
   47786                                                 ImmediateVmvn::DecodeImmediate(
   47787                                                     cmode,
   47788                                                     (instr & 0xf) |
   47789                                                         ((instr >> 12) & 0x70) |
   47790                                                         ((instr >> 17) & 0x80));
   47791                                             // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
   47792                                             vmvn(al, dt, DRegister(rd), imm);
   47793                                             break;
   47794                                           }
   47795                                           case 0x00000800: {
   47796                                             // 0xf2800c10
   47797                                             if (((instr & 0x920) == 0x100) ||
   47798                                                 ((instr & 0x520) == 0x100) ||
   47799                                                 ((instr & 0x820) == 0x20) ||
   47800                                                 ((instr & 0x420) == 0x20) ||
   47801                                                 ((instr & 0x220) == 0x20) ||
   47802                                                 ((instr & 0x120) == 0x120)) {
   47803                                               UnallocatedA32(instr);
   47804                                               return;
   47805                                             }
   47806                                             unsigned cmode =
   47807                                                 ((instr >> 8) & 0xf) |
   47808                                                 ((instr >> 1) & 0x10);
   47809                                             DataType dt =
   47810                                                 ImmediateVmov::DecodeDt(cmode);
   47811                                             if (dt.Is(kDataTypeValueInvalid)) {
   47812                                               UnallocatedA32(instr);
   47813                                               return;
   47814                                             }
   47815                                             unsigned rd =
   47816                                                 ExtractDRegister(instr, 22, 12);
   47817                                             DOperand imm =
   47818                                                 ImmediateVmov::DecodeImmediate(
   47819                                                     cmode,
   47820                                                     (instr & 0xf) |
   47821                                                         ((instr >> 12) & 0x70) |
   47822                                                         ((instr >> 17) & 0x80));
   47823                                             // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
   47824                                             vmov(al, dt, DRegister(rd), imm);
   47825                                             break;
   47826                                           }
   47827                                           case 0x00000820: {
   47828                                             // 0xf2800c30
   47829                                             if (((instr & 0xd00) == 0x100) ||
   47830                                                 ((instr & 0xd00) == 0x500) ||
   47831                                                 ((instr & 0xd00) == 0x900) ||
   47832                                                 ((instr & 0xe00) == 0xe00)) {
   47833                                               UnallocatedA32(instr);
   47834                                               return;
   47835                                             }
   47836                                             unsigned cmode = (instr >> 8) & 0xf;
   47837                                             DataType dt =
   47838                                                 ImmediateVmvn::DecodeDt(cmode);
   47839                                             if (dt.Is(kDataTypeValueInvalid)) {
   47840                                               UnallocatedA32(instr);
   47841                                               return;
   47842                                             }
   47843                                             unsigned rd =
   47844                                                 ExtractDRegister(instr, 22, 12);
   47845                                             DOperand imm =
   47846                                                 ImmediateVmvn::DecodeImmediate(
   47847                                                     cmode,
   47848                                                     (instr & 0xf) |
   47849                                                         ((instr >> 12) & 0x70) |
   47850                                                         ((instr >> 17) & 0x80));
   47851                                             // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
   47852                                             vmvn(al, dt, DRegister(rd), imm);
   47853                                             break;
   47854                                           }
   47855                                           case 0x00000a00: {
   47856                                             // 0xf2800e10
   47857                                             if (((instr & 0x920) == 0x100) ||
   47858                                                 ((instr & 0x520) == 0x100) ||
   47859                                                 ((instr & 0x820) == 0x20) ||
   47860                                                 ((instr & 0x420) == 0x20) ||
   47861                                                 ((instr & 0x220) == 0x20) ||
   47862                                                 ((instr & 0x120) == 0x120)) {
   47863                                               UnallocatedA32(instr);
   47864                                               return;
   47865                                             }
   47866                                             unsigned cmode =
   47867                                                 ((instr >> 8) & 0xf) |
   47868                                                 ((instr >> 1) & 0x10);
   47869                                             DataType dt =
   47870                                                 ImmediateVmov::DecodeDt(cmode);
   47871                                             if (dt.Is(kDataTypeValueInvalid)) {
   47872                                               UnallocatedA32(instr);
   47873                                               return;
   47874                                             }
   47875                                             unsigned rd =
   47876                                                 ExtractDRegister(instr, 22, 12);
   47877                                             DOperand imm =
   47878                                                 ImmediateVmov::DecodeImmediate(
   47879                                                     cmode,
   47880                                                     (instr & 0xf) |
   47881                                                         ((instr >> 12) & 0x70) |
   47882                                                         ((instr >> 17) & 0x80));
   47883                                             // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
   47884                                             vmov(al, dt, DRegister(rd), imm);
   47885                                             break;
   47886                                           }
   47887                                           case 0x00000a20: {
   47888                                             // 0xf2800e30
   47889                                             if (((instr & 0xd00) == 0x100) ||
   47890                                                 ((instr & 0xd00) == 0x500) ||
   47891                                                 ((instr & 0xd00) == 0x900) ||
   47892                                                 ((instr & 0xe00) == 0xe00)) {
   47893                                               UnallocatedA32(instr);
   47894                                               return;
   47895                                             }
   47896                                             unsigned cmode = (instr >> 8) & 0xf;
   47897                                             DataType dt =
   47898                                                 ImmediateVmvn::DecodeDt(cmode);
   47899                                             if (dt.Is(kDataTypeValueInvalid)) {
   47900                                               UnallocatedA32(instr);
   47901                                               return;
   47902                                             }
   47903                                             unsigned rd =
   47904                                                 ExtractDRegister(instr, 22, 12);
   47905                                             DOperand imm =
   47906                                                 ImmediateVmvn::DecodeImmediate(
   47907                                                     cmode,
   47908                                                     (instr & 0xf) |
   47909                                                         ((instr >> 12) & 0x70) |
   47910                                                         ((instr >> 17) & 0x80));
   47911                                             // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
   47912                                             vmvn(al, dt, DRegister(rd), imm);
   47913                                             break;
   47914                                           }
   47915                                           case 0x00000c00: {
   47916                                             // 0xf2800c10
   47917                                             if (((instr & 0x920) == 0x100) ||
   47918                                                 ((instr & 0x520) == 0x100) ||
   47919                                                 ((instr & 0x820) == 0x20) ||
   47920                                                 ((instr & 0x420) == 0x20) ||
   47921                                                 ((instr & 0x220) == 0x20) ||
   47922                                                 ((instr & 0x120) == 0x120)) {
   47923                                               UnallocatedA32(instr);
   47924                                               return;
   47925                                             }
   47926                                             unsigned cmode =
   47927                                                 ((instr >> 8) & 0xf) |
   47928                                                 ((instr >> 1) & 0x10);
   47929                                             DataType dt =
   47930                                                 ImmediateVmov::DecodeDt(cmode);
   47931                                             if (dt.Is(kDataTypeValueInvalid)) {
   47932                                               UnallocatedA32(instr);
   47933                                               return;
   47934                                             }
   47935                                             unsigned rd =
   47936                                                 ExtractDRegister(instr, 22, 12);
   47937                                             DOperand imm =
   47938                                                 ImmediateVmov::DecodeImmediate(
   47939                                                     cmode,
   47940                                                     (instr & 0xf) |
   47941                                                         ((instr >> 12) & 0x70) |
   47942                                                         ((instr >> 17) & 0x80));
   47943                                             // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
   47944                                             vmov(al, dt, DRegister(rd), imm);
   47945                                             break;
   47946                                           }
   47947                                           case 0x00000c20: {
   47948                                             // 0xf2800c30
   47949                                             if (((instr & 0xd00) == 0x100) ||
   47950                                                 ((instr & 0xd00) == 0x500) ||
   47951                                                 ((instr & 0xd00) == 0x900) ||
   47952                                                 ((instr & 0xe00) == 0xe00)) {
   47953                                               UnallocatedA32(instr);
   47954                                               return;
   47955                                             }
   47956                                             unsigned cmode = (instr >> 8) & 0xf;
   47957                                             DataType dt =
   47958                                                 ImmediateVmvn::DecodeDt(cmode);
   47959                                             if (dt.Is(kDataTypeValueInvalid)) {
   47960                                               UnallocatedA32(instr);
   47961                                               return;
   47962                                             }
   47963                                             unsigned rd =
   47964                                                 ExtractDRegister(instr, 22, 12);
   47965                                             DOperand imm =
   47966                                                 ImmediateVmvn::DecodeImmediate(
   47967                                                     cmode,
   47968                                                     (instr & 0xf) |
   47969                                                         ((instr >> 12) & 0x70) |
   47970                                                         ((instr >> 17) & 0x80));
   47971                                             // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
   47972                                             vmvn(al, dt, DRegister(rd), imm);
   47973                                             break;
   47974                                           }
   47975                                           case 0x00000d00: {
   47976                                             // 0xf2800d10
   47977                                             if (((instr & 0x920) == 0x100) ||
   47978                                                 ((instr & 0x520) == 0x100) ||
   47979                                                 ((instr & 0x820) == 0x20) ||
   47980                                                 ((instr & 0x420) == 0x20) ||
   47981                                                 ((instr & 0x220) == 0x20) ||
   47982                                                 ((instr & 0x120) == 0x120)) {
   47983                                               UnallocatedA32(instr);
   47984                                               return;
   47985                                             }
   47986                                             unsigned cmode =
   47987                                                 ((instr >> 8) & 0xf) |
   47988                                                 ((instr >> 1) & 0x10);
   47989                                             DataType dt =
   47990                                                 ImmediateVmov::DecodeDt(cmode);
   47991                                             if (dt.Is(kDataTypeValueInvalid)) {
   47992                                               UnallocatedA32(instr);
   47993                                               return;
   47994                                             }
   47995                                             unsigned rd =
   47996                                                 ExtractDRegister(instr, 22, 12);
   47997                                             DOperand imm =
   47998                                                 ImmediateVmov::DecodeImmediate(
   47999                                                     cmode,
   48000                                                     (instr & 0xf) |
   48001                                                         ((instr >> 12) & 0x70) |
   48002                                                         ((instr >> 17) & 0x80));
   48003                                             // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
   48004                                             vmov(al, dt, DRegister(rd), imm);
   48005                                             break;
   48006                                           }
   48007                                           case 0x00000d20: {
   48008                                             // 0xf2800d30
   48009                                             if (((instr & 0xd00) == 0x100) ||
   48010                                                 ((instr & 0xd00) == 0x500) ||
   48011                                                 ((instr & 0xd00) == 0x900) ||
   48012                                                 ((instr & 0xe00) == 0xe00)) {
   48013                                               UnallocatedA32(instr);
   48014                                               return;
   48015                                             }
   48016                                             unsigned cmode = (instr >> 8) & 0xf;
   48017                                             DataType dt =
   48018                                                 ImmediateVmvn::DecodeDt(cmode);
   48019                                             if (dt.Is(kDataTypeValueInvalid)) {
   48020                                               UnallocatedA32(instr);
   48021                                               return;
   48022                                             }
   48023                                             unsigned rd =
   48024                                                 ExtractDRegister(instr, 22, 12);
   48025                                             DOperand imm =
   48026                                                 ImmediateVmvn::DecodeImmediate(
   48027                                                     cmode,
   48028                                                     (instr & 0xf) |
   48029                                                         ((instr >> 12) & 0x70) |
   48030                                                         ((instr >> 17) & 0x80));
   48031                                             // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
   48032                                             vmvn(al, dt, DRegister(rd), imm);
   48033                                             break;
   48034                                           }
   48035                                           case 0x00000e00: {
   48036                                             // 0xf2800e10
   48037                                             if (((instr & 0x920) == 0x100) ||
   48038                                                 ((instr & 0x520) == 0x100) ||
   48039                                                 ((instr & 0x820) == 0x20) ||
   48040                                                 ((instr & 0x420) == 0x20) ||
   48041                                                 ((instr & 0x220) == 0x20) ||
   48042                                                 ((instr & 0x120) == 0x120)) {
   48043                                               UnallocatedA32(instr);
   48044                                               return;
   48045                                             }
   48046                                             unsigned cmode =
   48047                                                 ((instr >> 8) & 0xf) |
   48048                                                 ((instr >> 1) & 0x10);
   48049                                             DataType dt =
   48050                                                 ImmediateVmov::DecodeDt(cmode);
   48051                                             if (dt.Is(kDataTypeValueInvalid)) {
   48052                                               UnallocatedA32(instr);
   48053                                               return;
   48054                                             }
   48055                                             unsigned rd =
   48056                                                 ExtractDRegister(instr, 22, 12);
   48057                                             DOperand imm =
   48058                                                 ImmediateVmov::DecodeImmediate(
   48059                                                     cmode,
   48060                                                     (instr & 0xf) |
   48061                                                         ((instr >> 12) & 0x70) |
   48062                                                         ((instr >> 17) & 0x80));
   48063                                             // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
   48064                                             vmov(al, dt, DRegister(rd), imm);
   48065                                             break;
   48066                                           }
   48067                                           case 0x00000e20: {
   48068                                             // 0xf2800e30
   48069                                             if (((instr & 0x920) == 0x100) ||
   48070                                                 ((instr & 0x520) == 0x100) ||
   48071                                                 ((instr & 0x820) == 0x20) ||
   48072                                                 ((instr & 0x420) == 0x20) ||
   48073                                                 ((instr & 0x220) == 0x20) ||
   48074                                                 ((instr & 0x120) == 0x120)) {
   48075                                               UnallocatedA32(instr);
   48076                                               return;
   48077                                             }
   48078                                             unsigned cmode =
   48079                                                 ((instr >> 8) & 0xf) |
   48080                                                 ((instr >> 1) & 0x10);
   48081                                             DataType dt =
   48082                                                 ImmediateVmov::DecodeDt(cmode);
   48083                                             if (dt.Is(kDataTypeValueInvalid)) {
   48084                                               UnallocatedA32(instr);
   48085                                               return;
   48086                                             }
   48087                                             unsigned rd =
   48088                                                 ExtractDRegister(instr, 22, 12);
   48089                                             DOperand imm =
   48090                                                 ImmediateVmov::DecodeImmediate(
   48091                                                     cmode,
   48092                                                     (instr & 0xf) |
   48093                                                         ((instr >> 12) & 0x70) |
   48094                                                         ((instr >> 17) & 0x80));
   48095                                             // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
   48096                                             vmov(al, dt, DRegister(rd), imm);
   48097                                             break;
   48098                                           }
   48099                                           case 0x00000f00: {
   48100                                             // 0xf2800f10
   48101                                             if (((instr & 0x920) == 0x100) ||
   48102                                                 ((instr & 0x520) == 0x100) ||
   48103                                                 ((instr & 0x820) == 0x20) ||
   48104                                                 ((instr & 0x420) == 0x20) ||
   48105                                                 ((instr & 0x220) == 0x20) ||
   48106                                                 ((instr & 0x120) == 0x120)) {
   48107                                               UnallocatedA32(instr);
   48108                                               return;
   48109                                             }
   48110                                             unsigned cmode =
   48111                                                 ((instr >> 8) & 0xf) |
   48112                                                 ((instr >> 1) & 0x10);
   48113                                             DataType dt =
   48114                                                 ImmediateVmov::DecodeDt(cmode);
   48115                                             if (dt.Is(kDataTypeValueInvalid)) {
   48116                                               UnallocatedA32(instr);
   48117                                               return;
   48118                                             }
   48119                                             unsigned rd =
   48120                                                 ExtractDRegister(instr, 22, 12);
   48121                                             DOperand imm =
   48122                                                 ImmediateVmov::DecodeImmediate(
   48123                                                     cmode,
   48124                                                     (instr & 0xf) |
   48125                                                         ((instr >> 12) & 0x70) |
   48126                                                         ((instr >> 17) & 0x80));
   48127                                             // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
   48128                                             vmov(al, dt, DRegister(rd), imm);
   48129                                             break;
   48130                                           }
   48131                                           default:
   48132                                             UnallocatedA32(instr);
   48133                                             break;
   48134                                         }
   48135                                         break;
   48136                                       }
   48137                                       default: {
   48138                                         if (((instr & 0x920) == 0x100) ||
   48139                                             ((instr & 0x520) == 0x100) ||
   48140                                             ((instr & 0x820) == 0x20) ||
   48141                                             ((instr & 0x420) == 0x20) ||
   48142                                             ((instr & 0x220) == 0x20) ||
   48143                                             ((instr & 0x120) == 0x120)) {
   48144                                           UnallocatedA32(instr);
   48145                                           return;
   48146                                         }
   48147                                         unsigned cmode = ((instr >> 8) & 0xf) |
   48148                                                          ((instr >> 1) & 0x10);
   48149                                         DataType dt =
   48150                                             ImmediateVmov::DecodeDt(cmode);
   48151                                         if (dt.Is(kDataTypeValueInvalid)) {
   48152                                           UnallocatedA32(instr);
   48153                                           return;
   48154                                         }
   48155                                         unsigned rd =
   48156                                             ExtractDRegister(instr, 22, 12);
   48157                                         DOperand imm =
   48158                                             ImmediateVmov::DecodeImmediate(
   48159                                                 cmode,
   48160                                                 (instr & 0xf) |
   48161                                                     ((instr >> 12) & 0x70) |
   48162                                                     ((instr >> 17) & 0x80));
   48163                                         // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1
   48164                                         vmov(al, dt, DRegister(rd), imm);
   48165                                         break;
   48166                                       }
   48167                                     }
   48168                                     break;
   48169                                   }
   48170                                 }
   48171                                 break;
   48172                               }
   48173                               default:
   48174                                 UnallocatedA32(instr);
   48175                                 break;
   48176                             }
   48177                             break;
   48178                           }
   48179                           default: {
   48180                             if ((instr & 0x00000200) == 0x00000200) {
   48181                               if (((instr & 0x200000) == 0x0)) {
   48182                                 UnallocatedA32(instr);
   48183                                 return;
   48184                               }
   48185                               DataType dt1 = Dt_op_U_1_Decode1(
   48186                                   ((instr >> 24) & 0x1) | ((instr >> 7) & 0x2));
   48187                               if (dt1.Is(kDataTypeValueInvalid)) {
   48188                                 UnallocatedA32(instr);
   48189                                 return;
   48190                               }
   48191                               DataType dt2 = Dt_op_U_1_Decode2(
   48192                                   ((instr >> 24) & 0x1) | ((instr >> 7) & 0x2));
   48193                               if (dt2.Is(kDataTypeValueInvalid)) {
   48194                                 UnallocatedA32(instr);
   48195                                 return;
   48196                               }
   48197                               unsigned rd = ExtractDRegister(instr, 22, 12);
   48198                               unsigned rm = ExtractDRegister(instr, 5, 0);
   48199                               uint32_t fbits = 64 - ((instr >> 16) & 0x3f);
   48200                               // VCVT{<c>}{<q>}.<dt>.<dt> <Dd>, <Dm>, #<fbits> ; A1 NOLINT(whitespace/line_length)
   48201                               vcvt(al,
   48202                                    dt1,
   48203                                    dt2,
   48204                                    DRegister(rd),
   48205                                    DRegister(rm),
   48206                                    fbits);
   48207                             } else {
   48208                               UnallocatedA32(instr);
   48209                             }
   48210                             break;
   48211                           }
   48212                         }
   48213                         break;
   48214                       }
   48215                       default:
   48216                         UnallocatedA32(instr);
   48217                         break;
   48218                     }
   48219                     break;
   48220                   }
   48221                 }
   48222                 break;
   48223               }
   48224               case 0x00000040: {
   48225                 // 0xf2800050
   48226                 switch (instr & 0x00000c00) {
   48227                   case 0x00000000: {
   48228                     // 0xf2800050
   48229                     switch (instr & 0x00380080) {
   48230                       case 0x00000000: {
   48231                         // 0xf2800050
   48232                         switch (instr & 0x00000100) {
   48233                           case 0x00000000: {
   48234                             // 0xf2800050
   48235                             switch (instr & 0x00000200) {
   48236                               default: {
   48237                                 switch (instr & 0x00000020) {
   48238                                   case 0x00000020: {
   48239                                     // 0xf2800070
   48240                                     if (((instr & 0xd00) == 0x100) ||
   48241                                         ((instr & 0xd00) == 0x500) ||
   48242                                         ((instr & 0xd00) == 0x900) ||
   48243                                         ((instr & 0xe00) == 0xe00)) {
   48244                                       UnallocatedA32(instr);
   48245                                       return;
   48246                                     }
   48247                                     unsigned cmode = (instr >> 8) & 0xf;
   48248                                     DataType dt =
   48249                                         ImmediateVmvn::DecodeDt(cmode);
   48250                                     if (dt.Is(kDataTypeValueInvalid)) {
   48251                                       UnallocatedA32(instr);
   48252                                       return;
   48253                                     }
   48254                                     if (((instr >> 12) & 1) != 0) {
   48255                                       UnallocatedA32(instr);
   48256                                       return;
   48257                                     }
   48258                                     unsigned rd =
   48259                                         ExtractQRegister(instr, 22, 12);
   48260                                     QOperand imm =
   48261                                         ImmediateVmvn::DecodeImmediate(
   48262                                             cmode,
   48263                                             (instr & 0xf) |
   48264                                                 ((instr >> 12) & 0x70) |
   48265                                                 ((instr >> 17) & 0x80));
   48266                                     // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1
   48267                                     vmvn(al, dt, QRegister(rd), imm);
   48268                                     break;
   48269                                   }
   48270                                   default: {
   48271                                     if (((instr & 0x920) == 0x100) ||
   48272                                         ((instr & 0x520) == 0x100) ||
   48273                                         ((instr & 0x820) == 0x20) ||
   48274                                         ((instr & 0x420) == 0x20) ||
   48275                                         ((instr & 0x220) == 0x20) ||
   48276                                         ((instr & 0x120) == 0x120)) {
   48277                                       UnallocatedA32(instr);
   48278                                       return;
   48279                                     }
   48280                                     unsigned cmode = ((instr >> 8) & 0xf) |
   48281                                                      ((instr >> 1) & 0x10);
   48282                                     DataType dt =
   48283                                         ImmediateVmov::DecodeDt(cmode);
   48284                                     if (dt.Is(kDataTypeValueInvalid)) {
   48285                                       UnallocatedA32(instr);
   48286                                       return;
   48287                                     }
   48288                                     if (((instr >> 12) & 1) != 0) {
   48289                                       UnallocatedA32(instr);
   48290                                       return;
   48291                                     }
   48292                                     unsigned rd =
   48293                                         ExtractQRegister(instr, 22, 12);
   48294                                     QOperand imm =
   48295                                         ImmediateVmov::DecodeImmediate(
   48296                                             cmode,
   48297                                             (instr & 0xf) |
   48298                                                 ((instr >> 12) & 0x70) |
   48299                                                 ((instr >> 17) & 0x80));
   48300                                     // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1
   48301                                     vmov(al, dt, QRegister(rd), imm);
   48302                                     break;
   48303                                   }
   48304                                 }
   48305                                 break;
   48306                               }
   48307                             }
   48308                             break;
   48309                           }
   48310                           case 0x00000100: {
   48311                             // 0xf2800150
   48312                             switch (instr & 0x00000020) {
   48313                               case 0x00000000: {
   48314                                 // 0xf2800150
   48315                                 if (((instr & 0x100) == 0x0) ||
   48316                                     ((instr & 0xc00) == 0xc00)) {
   48317                                   UnallocatedA32(instr);
   48318                                   return;
   48319                                 }
   48320                                 unsigned cmode = (instr >> 8) & 0xf;
   48321                                 DataType dt = ImmediateVorr::DecodeDt(cmode);
   48322                                 if (dt.Is(kDataTypeValueInvalid)) {
   48323                                   UnallocatedA32(instr);
   48324                                   return;
   48325                                 }
   48326                                 if (((instr >> 12) & 1) != 0) {
   48327                                   UnallocatedA32(instr);
   48328                                   return;
   48329                                 }
   48330                                 unsigned rd = ExtractQRegister(instr, 22, 12);
   48331                                 QOperand imm = ImmediateVorr::DecodeImmediate(
   48332                                     cmode,
   48333                                     (instr & 0xf) | ((instr >> 12) & 0x70) |
   48334                                         ((instr >> 17) & 0x80));
   48335                                 // VORR{<c>}{<q>}.<dt> {<Qdn>}, <Qdn>, #<imm> ; A1 NOLINT(whitespace/line_length)
   48336                                 vorr(al, dt, QRegister(rd), QRegister(rd), imm);
   48337                                 break;
   48338                               }
   48339                               case 0x00000020: {
   48340                                 // 0xf2800170
   48341                                 if (((instr & 0x100) == 0x0) ||
   48342                                     ((instr & 0xc00) == 0xc00)) {
   48343                                   UnallocatedA32(instr);
   48344                                   return;
   48345                                 }
   48346                                 unsigned cmode = (instr >> 8) & 0xf;
   48347                                 DataType dt = ImmediateVbic::DecodeDt(cmode);
   48348                                 if (dt.Is(kDataTypeValueInvalid)) {
   48349                                   UnallocatedA32(instr);
   48350                                   return;
   48351                                 }
   48352                                 if (((instr >> 12) & 1) != 0) {
   48353                                   UnallocatedA32(instr);
   48354                                   return;
   48355                                 }
   48356                                 unsigned rd = ExtractQRegister(instr, 22, 12);
   48357                                 QOperand imm = ImmediateVbic::DecodeImmediate(
   48358                                     cmode,
   48359                                     (instr & 0xf) | ((instr >> 12) & 0x70) |
   48360                                         ((instr >> 17) & 0x80));
   48361                                 // VBIC{<c>}{<q>}.<dt> {<Qdn>}, <Qdn>, #<imm> ; A1 NOLINT(whitespace/line_length)
   48362                                 vbic(al, dt, QRegister(rd), QRegister(rd), imm);
   48363                                 break;
   48364                               }
   48365                             }
   48366                             break;
   48367                           }
   48368                         }
   48369                         break;
   48370                       }
   48371                       default: {
   48372                         switch (instr & 0x00000300) {
   48373                           case 0x00000000: {
   48374                             // 0xf2800050
   48375                             if (((instr & 0x380080) == 0x0)) {
   48376                               UnallocatedA32(instr);
   48377                               return;
   48378                             }
   48379                             DataType dt =
   48380                                 Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
   48381                                                        ((instr >> 4) & 0x8),
   48382                                                    (instr >> 24) & 0x1);
   48383                             if (dt.Is(kDataTypeValueInvalid)) {
   48384                               UnallocatedA32(instr);
   48385                               return;
   48386                             }
   48387                             if (((instr >> 12) & 1) != 0) {
   48388                               UnallocatedA32(instr);
   48389                               return;
   48390                             }
   48391                             unsigned rd = ExtractQRegister(instr, 22, 12);
   48392                             if ((instr & 1) != 0) {
   48393                               UnallocatedA32(instr);
   48394                               return;
   48395                             }
   48396                             unsigned rm = ExtractQRegister(instr, 5, 0);
   48397                             uint32_t imm6 = (instr >> 16) & 0x3f;
   48398                             uint32_t imm =
   48399                                 (dt.IsSize(64) ? 64 : (dt.GetSize() * 2)) -
   48400                                 imm6;
   48401                             // VSHR{<c>}{<q>}.<type><size> {<Qd>}, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   48402                             vshr(al, dt, QRegister(rd), QRegister(rm), imm);
   48403                             break;
   48404                           }
   48405                           case 0x00000100: {
   48406                             // 0xf2800150
   48407                             if (((instr & 0x380080) == 0x0)) {
   48408                               UnallocatedA32(instr);
   48409                               return;
   48410                             }
   48411                             DataType dt =
   48412                                 Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
   48413                                                        ((instr >> 4) & 0x8),
   48414                                                    (instr >> 24) & 0x1);
   48415                             if (dt.Is(kDataTypeValueInvalid)) {
   48416                               UnallocatedA32(instr);
   48417                               return;
   48418                             }
   48419                             if (((instr >> 12) & 1) != 0) {
   48420                               UnallocatedA32(instr);
   48421                               return;
   48422                             }
   48423                             unsigned rd = ExtractQRegister(instr, 22, 12);
   48424                             if ((instr & 1) != 0) {
   48425                               UnallocatedA32(instr);
   48426                               return;
   48427                             }
   48428                             unsigned rm = ExtractQRegister(instr, 5, 0);
   48429                             uint32_t imm6 = (instr >> 16) & 0x3f;
   48430                             uint32_t imm =
   48431                                 (dt.IsSize(64) ? 64 : (dt.GetSize() * 2)) -
   48432                                 imm6;
   48433                             // VSRA{<c>}{<q>}.<type><size> {<Qd>}, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   48434                             vsra(al, dt, QRegister(rd), QRegister(rm), imm);
   48435                             break;
   48436                           }
   48437                           case 0x00000200: {
   48438                             // 0xf2800250
   48439                             if (((instr & 0x380080) == 0x0)) {
   48440                               UnallocatedA32(instr);
   48441                               return;
   48442                             }
   48443                             DataType dt =
   48444                                 Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
   48445                                                        ((instr >> 4) & 0x8),
   48446                                                    (instr >> 24) & 0x1);
   48447                             if (dt.Is(kDataTypeValueInvalid)) {
   48448                               UnallocatedA32(instr);
   48449                               return;
   48450                             }
   48451                             if (((instr >> 12) & 1) != 0) {
   48452                               UnallocatedA32(instr);
   48453                               return;
   48454                             }
   48455                             unsigned rd = ExtractQRegister(instr, 22, 12);
   48456                             if ((instr & 1) != 0) {
   48457                               UnallocatedA32(instr);
   48458                               return;
   48459                             }
   48460                             unsigned rm = ExtractQRegister(instr, 5, 0);
   48461                             uint32_t imm6 = (instr >> 16) & 0x3f;
   48462                             uint32_t imm =
   48463                                 (dt.IsSize(64) ? 64 : (dt.GetSize() * 2)) -
   48464                                 imm6;
   48465                             // VRSHR{<c>}{<q>}.<type><size> {<Qd>}, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   48466                             vrshr(al, dt, QRegister(rd), QRegister(rm), imm);
   48467                             break;
   48468                           }
   48469                           case 0x00000300: {
   48470                             // 0xf2800350
   48471                             if (((instr & 0x380080) == 0x0)) {
   48472                               UnallocatedA32(instr);
   48473                               return;
   48474                             }
   48475                             DataType dt =
   48476                                 Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
   48477                                                        ((instr >> 4) & 0x8),
   48478                                                    (instr >> 24) & 0x1);
   48479                             if (dt.Is(kDataTypeValueInvalid)) {
   48480                               UnallocatedA32(instr);
   48481                               return;
   48482                             }
   48483                             if (((instr >> 12) & 1) != 0) {
   48484                               UnallocatedA32(instr);
   48485                               return;
   48486                             }
   48487                             unsigned rd = ExtractQRegister(instr, 22, 12);
   48488                             if ((instr & 1) != 0) {
   48489                               UnallocatedA32(instr);
   48490                               return;
   48491                             }
   48492                             unsigned rm = ExtractQRegister(instr, 5, 0);
   48493                             uint32_t imm6 = (instr >> 16) & 0x3f;
   48494                             uint32_t imm =
   48495                                 (dt.IsSize(64) ? 64 : (dt.GetSize() * 2)) -
   48496                                 imm6;
   48497                             // VRSRA{<c>}{<q>}.<type><size> {<Qd>}, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   48498                             vrsra(al, dt, QRegister(rd), QRegister(rm), imm);
   48499                             break;
   48500                           }
   48501                         }
   48502                         break;
   48503                       }
   48504                     }
   48505                     break;
   48506                   }
   48507                   case 0x00000400: {
   48508                     // 0xf2800450
   48509                     switch (instr & 0x00380080) {
   48510                       case 0x00000000: {
   48511                         // 0xf2800450
   48512                         switch (instr & 0x00000100) {
   48513                           case 0x00000000: {
   48514                             // 0xf2800450
   48515                             switch (instr & 0x00000200) {
   48516                               default: {
   48517                                 switch (instr & 0x00000020) {
   48518                                   case 0x00000020: {
   48519                                     // 0xf2800470
   48520                                     if (((instr & 0xd00) == 0x100) ||
   48521                                         ((instr & 0xd00) == 0x500) ||
   48522                                         ((instr & 0xd00) == 0x900) ||
   48523                                         ((instr & 0xe00) == 0xe00)) {
   48524                                       UnallocatedA32(instr);
   48525                                       return;
   48526                                     }
   48527                                     unsigned cmode = (instr >> 8) & 0xf;
   48528                                     DataType dt =
   48529                                         ImmediateVmvn::DecodeDt(cmode);
   48530                                     if (dt.Is(kDataTypeValueInvalid)) {
   48531                                       UnallocatedA32(instr);
   48532                                       return;
   48533                                     }
   48534                                     if (((instr >> 12) & 1) != 0) {
   48535                                       UnallocatedA32(instr);
   48536                                       return;
   48537                                     }
   48538                                     unsigned rd =
   48539                                         ExtractQRegister(instr, 22, 12);
   48540                                     QOperand imm =
   48541                                         ImmediateVmvn::DecodeImmediate(
   48542                                             cmode,
   48543                                             (instr & 0xf) |
   48544                                                 ((instr >> 12) & 0x70) |
   48545                                                 ((instr >> 17) & 0x80));
   48546                                     // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1
   48547                                     vmvn(al, dt, QRegister(rd), imm);
   48548                                     break;
   48549                                   }
   48550                                   default: {
   48551                                     if (((instr & 0x920) == 0x100) ||
   48552                                         ((instr & 0x520) == 0x100) ||
   48553                                         ((instr & 0x820) == 0x20) ||
   48554                                         ((instr & 0x420) == 0x20) ||
   48555                                         ((instr & 0x220) == 0x20) ||
   48556                                         ((instr & 0x120) == 0x120)) {
   48557                                       UnallocatedA32(instr);
   48558                                       return;
   48559                                     }
   48560                                     unsigned cmode = ((instr >> 8) & 0xf) |
   48561                                                      ((instr >> 1) & 0x10);
   48562                                     DataType dt =
   48563                                         ImmediateVmov::DecodeDt(cmode);
   48564                                     if (dt.Is(kDataTypeValueInvalid)) {
   48565                                       UnallocatedA32(instr);
   48566                                       return;
   48567                                     }
   48568                                     if (((instr >> 12) & 1) != 0) {
   48569                                       UnallocatedA32(instr);
   48570                                       return;
   48571                                     }
   48572                                     unsigned rd =
   48573                                         ExtractQRegister(instr, 22, 12);
   48574                                     QOperand imm =
   48575                                         ImmediateVmov::DecodeImmediate(
   48576                                             cmode,
   48577                                             (instr & 0xf) |
   48578                                                 ((instr >> 12) & 0x70) |
   48579                                                 ((instr >> 17) & 0x80));
   48580                                     // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1
   48581                                     vmov(al, dt, QRegister(rd), imm);
   48582                                     break;
   48583                                   }
   48584                                 }
   48585                                 break;
   48586                               }
   48587                             }
   48588                             break;
   48589                           }
   48590                           case 0x00000100: {
   48591                             // 0xf2800550
   48592                             switch (instr & 0x00000020) {
   48593                               case 0x00000000: {
   48594                                 // 0xf2800550
   48595                                 if (((instr & 0x100) == 0x0) ||
   48596                                     ((instr & 0xc00) == 0xc00)) {
   48597                                   UnallocatedA32(instr);
   48598                                   return;
   48599                                 }
   48600                                 unsigned cmode = (instr >> 8) & 0xf;
   48601                                 DataType dt = ImmediateVorr::DecodeDt(cmode);
   48602                                 if (dt.Is(kDataTypeValueInvalid)) {
   48603                                   UnallocatedA32(instr);
   48604                                   return;
   48605                                 }
   48606                                 if (((instr >> 12) & 1) != 0) {
   48607                                   UnallocatedA32(instr);
   48608                                   return;
   48609                                 }
   48610                                 unsigned rd = ExtractQRegister(instr, 22, 12);
   48611                                 QOperand imm = ImmediateVorr::DecodeImmediate(
   48612                                     cmode,
   48613                                     (instr & 0xf) | ((instr >> 12) & 0x70) |
   48614                                         ((instr >> 17) & 0x80));
   48615                                 // VORR{<c>}{<q>}.<dt> {<Qdn>}, <Qdn>, #<imm> ; A1 NOLINT(whitespace/line_length)
   48616                                 vorr(al, dt, QRegister(rd), QRegister(rd), imm);
   48617                                 break;
   48618                               }
   48619                               case 0x00000020: {
   48620                                 // 0xf2800570
   48621                                 if (((instr & 0x100) == 0x0) ||
   48622                                     ((instr & 0xc00) == 0xc00)) {
   48623                                   UnallocatedA32(instr);
   48624                                   return;
   48625                                 }
   48626                                 unsigned cmode = (instr >> 8) & 0xf;
   48627                                 DataType dt = ImmediateVbic::DecodeDt(cmode);
   48628                                 if (dt.Is(kDataTypeValueInvalid)) {
   48629                                   UnallocatedA32(instr);
   48630                                   return;
   48631                                 }
   48632                                 if (((instr >> 12) & 1) != 0) {
   48633                                   UnallocatedA32(instr);
   48634                                   return;
   48635                                 }
   48636                                 unsigned rd = ExtractQRegister(instr, 22, 12);
   48637                                 QOperand imm = ImmediateVbic::DecodeImmediate(
   48638                                     cmode,
   48639                                     (instr & 0xf) | ((instr >> 12) & 0x70) |
   48640                                         ((instr >> 17) & 0x80));
   48641                                 // VBIC{<c>}{<q>}.<dt> {<Qdn>}, <Qdn>, #<imm> ; A1 NOLINT(whitespace/line_length)
   48642                                 vbic(al, dt, QRegister(rd), QRegister(rd), imm);
   48643                                 break;
   48644                               }
   48645                             }
   48646                             break;
   48647                           }
   48648                         }
   48649                         break;
   48650                       }
   48651                       default: {
   48652                         switch (instr & 0x00000300) {
   48653                           case 0x00000000: {
   48654                             // 0xf2800450
   48655                             if ((instr & 0x01000000) == 0x01000000) {
   48656                               if (((instr & 0x380080) == 0x0)) {
   48657                                 UnallocatedA32(instr);
   48658                                 return;
   48659                               }
   48660                               DataType dt = Dt_L_imm6_4_Decode(
   48661                                   ((instr >> 19) & 0x7) | ((instr >> 4) & 0x8));
   48662                               if (dt.Is(kDataTypeValueInvalid)) {
   48663                                 UnallocatedA32(instr);
   48664                                 return;
   48665                               }
   48666                               if (((instr >> 12) & 1) != 0) {
   48667                                 UnallocatedA32(instr);
   48668                                 return;
   48669                               }
   48670                               unsigned rd = ExtractQRegister(instr, 22, 12);
   48671                               if ((instr & 1) != 0) {
   48672                                 UnallocatedA32(instr);
   48673                                 return;
   48674                               }
   48675                               unsigned rm = ExtractQRegister(instr, 5, 0);
   48676                               uint32_t imm6 = (instr >> 16) & 0x3f;
   48677                               uint32_t imm =
   48678                                   (dt.IsSize(64) ? 64 : (dt.GetSize() * 2)) -
   48679                                   imm6;
   48680                               // VSRI{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #<imm> ; A1
   48681                               vsri(al, dt, QRegister(rd), QRegister(rm), imm);
   48682                             } else {
   48683                               UnallocatedA32(instr);
   48684                             }
   48685                             break;
   48686                           }
   48687                           case 0x00000100: {
   48688                             // 0xf2800550
   48689                             switch (instr & 0x01000000) {
   48690                               case 0x00000000: {
   48691                                 // 0xf2800550
   48692                                 if (((instr & 0x380080) == 0x0)) {
   48693                                   UnallocatedA32(instr);
   48694                                   return;
   48695                                 }
   48696                                 DataType dt =
   48697                                     Dt_L_imm6_3_Decode(((instr >> 19) & 0x7) |
   48698                                                        ((instr >> 4) & 0x8));
   48699                                 if (dt.Is(kDataTypeValueInvalid)) {
   48700                                   UnallocatedA32(instr);
   48701                                   return;
   48702                                 }
   48703                                 if (((instr >> 12) & 1) != 0) {
   48704                                   UnallocatedA32(instr);
   48705                                   return;
   48706                                 }
   48707                                 unsigned rd = ExtractQRegister(instr, 22, 12);
   48708                                 if ((instr & 1) != 0) {
   48709                                   UnallocatedA32(instr);
   48710                                   return;
   48711                                 }
   48712                                 unsigned rm = ExtractQRegister(instr, 5, 0);
   48713                                 uint32_t imm6 = (instr >> 16) & 0x3f;
   48714                                 uint32_t imm =
   48715                                     imm6 - (dt.IsSize(64) ? 0 : dt.GetSize());
   48716                                 // VSHL{<c>}{<q>}.I<size> {<Qd>}, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   48717                                 vshl(al, dt, QRegister(rd), QRegister(rm), imm);
   48718                                 break;
   48719                               }
   48720                               case 0x01000000: {
   48721                                 // 0xf3800550
   48722                                 if (((instr & 0x380080) == 0x0)) {
   48723                                   UnallocatedA32(instr);
   48724                                   return;
   48725                                 }
   48726                                 DataType dt =
   48727                                     Dt_L_imm6_4_Decode(((instr >> 19) & 0x7) |
   48728                                                        ((instr >> 4) & 0x8));
   48729                                 if (dt.Is(kDataTypeValueInvalid)) {
   48730                                   UnallocatedA32(instr);
   48731                                   return;
   48732                                 }
   48733                                 if (((instr >> 12) & 1) != 0) {
   48734                                   UnallocatedA32(instr);
   48735                                   return;
   48736                                 }
   48737                                 unsigned rd = ExtractQRegister(instr, 22, 12);
   48738                                 if ((instr & 1) != 0) {
   48739                                   UnallocatedA32(instr);
   48740                                   return;
   48741                                 }
   48742                                 unsigned rm = ExtractQRegister(instr, 5, 0);
   48743                                 uint32_t imm6 = (instr >> 16) & 0x3f;
   48744                                 uint32_t imm =
   48745                                     imm6 - (dt.IsSize(64) ? 0 : dt.GetSize());
   48746                                 // VSLI{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #<imm> ; A1
   48747                                 vsli(al, dt, QRegister(rd), QRegister(rm), imm);
   48748                                 break;
   48749                               }
   48750                             }
   48751                             break;
   48752                           }
   48753                           case 0x00000200: {
   48754                             // 0xf2800650
   48755                             if (((instr & 0x380080) == 0x0)) {
   48756                               UnallocatedA32(instr);
   48757                               return;
   48758                             }
   48759                             DataType dt =
   48760                                 Dt_L_imm6_2_Decode(((instr >> 19) & 0x7) |
   48761                                                        ((instr >> 4) & 0x8),
   48762                                                    (instr >> 24) & 0x1);
   48763                             if (dt.Is(kDataTypeValueInvalid)) {
   48764                               UnallocatedA32(instr);
   48765                               return;
   48766                             }
   48767                             if (((instr >> 12) & 1) != 0) {
   48768                               UnallocatedA32(instr);
   48769                               return;
   48770                             }
   48771                             unsigned rd = ExtractQRegister(instr, 22, 12);
   48772                             if ((instr & 1) != 0) {
   48773                               UnallocatedA32(instr);
   48774                               return;
   48775                             }
   48776                             unsigned rm = ExtractQRegister(instr, 5, 0);
   48777                             uint32_t imm6 = (instr >> 16) & 0x3f;
   48778                             uint32_t imm =
   48779                                 imm6 - (dt.IsSize(64) ? 0 : dt.GetSize());
   48780                             // VQSHLU{<c>}{<q>}.<type><size> {<Qd>}, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   48781                             vqshlu(al, dt, QRegister(rd), QRegister(rm), imm);
   48782                             break;
   48783                           }
   48784                           case 0x00000300: {
   48785                             // 0xf2800750
   48786                             if (((instr & 0x380080) == 0x0)) {
   48787                               UnallocatedA32(instr);
   48788                               return;
   48789                             }
   48790                             DataType dt =
   48791                                 Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
   48792                                                        ((instr >> 4) & 0x8),
   48793                                                    (instr >> 24) & 0x1);
   48794                             if (dt.Is(kDataTypeValueInvalid)) {
   48795                               UnallocatedA32(instr);
   48796                               return;
   48797                             }
   48798                             if (((instr >> 12) & 1) != 0) {
   48799                               UnallocatedA32(instr);
   48800                               return;
   48801                             }
   48802                             unsigned rd = ExtractQRegister(instr, 22, 12);
   48803                             if ((instr & 1) != 0) {
   48804                               UnallocatedA32(instr);
   48805                               return;
   48806                             }
   48807                             unsigned rm = ExtractQRegister(instr, 5, 0);
   48808                             uint32_t imm6 = (instr >> 16) & 0x3f;
   48809                             uint32_t imm =
   48810                                 imm6 - (dt.IsSize(64) ? 0 : dt.GetSize());
   48811                             // VQSHL{<c>}{<q>}.<type><size> {<Qd>}, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   48812                             vqshl(al, dt, QRegister(rd), QRegister(rm), imm);
   48813                             break;
   48814                           }
   48815                         }
   48816                         break;
   48817                       }
   48818                     }
   48819                     break;
   48820                   }
   48821                   case 0x00000800: {
   48822                     // 0xf2800850
   48823                     switch (instr & 0x00000080) {
   48824                       case 0x00000000: {
   48825                         // 0xf2800850
   48826                         switch (instr & 0x00380000) {
   48827                           case 0x00000000: {
   48828                             // 0xf2800850
   48829                             switch (instr & 0x00000100) {
   48830                               case 0x00000000: {
   48831                                 // 0xf2800850
   48832                                 switch (instr & 0x00000200) {
   48833                                   default: {
   48834                                     switch (instr & 0x00000020) {
   48835                                       case 0x00000020: {
   48836                                         // 0xf2800870
   48837                                         if (((instr & 0xd00) == 0x100) ||
   48838                                             ((instr & 0xd00) == 0x500) ||
   48839                                             ((instr & 0xd00) == 0x900) ||
   48840                                             ((instr & 0xe00) == 0xe00)) {
   48841                                           UnallocatedA32(instr);
   48842                                           return;
   48843                                         }
   48844                                         unsigned cmode = (instr >> 8) & 0xf;
   48845                                         DataType dt =
   48846                                             ImmediateVmvn::DecodeDt(cmode);
   48847                                         if (dt.Is(kDataTypeValueInvalid)) {
   48848                                           UnallocatedA32(instr);
   48849                                           return;
   48850                                         }
   48851                                         if (((instr >> 12) & 1) != 0) {
   48852                                           UnallocatedA32(instr);
   48853                                           return;
   48854                                         }
   48855                                         unsigned rd =
   48856                                             ExtractQRegister(instr, 22, 12);
   48857                                         QOperand imm =
   48858                                             ImmediateVmvn::DecodeImmediate(
   48859                                                 cmode,
   48860                                                 (instr & 0xf) |
   48861                                                     ((instr >> 12) & 0x70) |
   48862                                                     ((instr >> 17) & 0x80));
   48863                                         // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1
   48864                                         vmvn(al, dt, QRegister(rd), imm);
   48865                                         break;
   48866                                       }
   48867                                       default: {
   48868                                         if (((instr & 0x920) == 0x100) ||
   48869                                             ((instr & 0x520) == 0x100) ||
   48870                                             ((instr & 0x820) == 0x20) ||
   48871                                             ((instr & 0x420) == 0x20) ||
   48872                                             ((instr & 0x220) == 0x20) ||
   48873                                             ((instr & 0x120) == 0x120)) {
   48874                                           UnallocatedA32(instr);
   48875                                           return;
   48876                                         }
   48877                                         unsigned cmode = ((instr >> 8) & 0xf) |
   48878                                                          ((instr >> 1) & 0x10);
   48879                                         DataType dt =
   48880                                             ImmediateVmov::DecodeDt(cmode);
   48881                                         if (dt.Is(kDataTypeValueInvalid)) {
   48882                                           UnallocatedA32(instr);
   48883                                           return;
   48884                                         }
   48885                                         if (((instr >> 12) & 1) != 0) {
   48886                                           UnallocatedA32(instr);
   48887                                           return;
   48888                                         }
   48889                                         unsigned rd =
   48890                                             ExtractQRegister(instr, 22, 12);
   48891                                         QOperand imm =
   48892                                             ImmediateVmov::DecodeImmediate(
   48893                                                 cmode,
   48894                                                 (instr & 0xf) |
   48895                                                     ((instr >> 12) & 0x70) |
   48896                                                     ((instr >> 17) & 0x80));
   48897                                         // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1
   48898                                         vmov(al, dt, QRegister(rd), imm);
   48899                                         break;
   48900                                       }
   48901                                     }
   48902                                     break;
   48903                                   }
   48904                                 }
   48905                                 break;
   48906                               }
   48907                               case 0x00000100: {
   48908                                 // 0xf2800950
   48909                                 switch (instr & 0x00000020) {
   48910                                   case 0x00000000: {
   48911                                     // 0xf2800950
   48912                                     if (((instr & 0x100) == 0x0) ||
   48913                                         ((instr & 0xc00) == 0xc00)) {
   48914                                       UnallocatedA32(instr);
   48915                                       return;
   48916                                     }
   48917                                     unsigned cmode = (instr >> 8) & 0xf;
   48918                                     DataType dt =
   48919                                         ImmediateVorr::DecodeDt(cmode);
   48920                                     if (dt.Is(kDataTypeValueInvalid)) {
   48921                                       UnallocatedA32(instr);
   48922                                       return;
   48923                                     }
   48924                                     if (((instr >> 12) & 1) != 0) {
   48925                                       UnallocatedA32(instr);
   48926                                       return;
   48927                                     }
   48928                                     unsigned rd =
   48929                                         ExtractQRegister(instr, 22, 12);
   48930                                     QOperand imm =
   48931                                         ImmediateVorr::DecodeImmediate(
   48932                                             cmode,
   48933                                             (instr & 0xf) |
   48934                                                 ((instr >> 12) & 0x70) |
   48935                                                 ((instr >> 17) & 0x80));
   48936                                     // VORR{<c>}{<q>}.<dt> {<Qdn>}, <Qdn>, #<imm> ; A1 NOLINT(whitespace/line_length)
   48937                                     vorr(al,
   48938                                          dt,
   48939                                          QRegister(rd),
   48940                                          QRegister(rd),
   48941                                          imm);
   48942                                     break;
   48943                                   }
   48944                                   case 0x00000020: {
   48945                                     // 0xf2800970
   48946                                     if (((instr & 0x100) == 0x0) ||
   48947                                         ((instr & 0xc00) == 0xc00)) {
   48948                                       UnallocatedA32(instr);
   48949                                       return;
   48950                                     }
   48951                                     unsigned cmode = (instr >> 8) & 0xf;
   48952                                     DataType dt =
   48953                                         ImmediateVbic::DecodeDt(cmode);
   48954                                     if (dt.Is(kDataTypeValueInvalid)) {
   48955                                       UnallocatedA32(instr);
   48956                                       return;
   48957                                     }
   48958                                     if (((instr >> 12) & 1) != 0) {
   48959                                       UnallocatedA32(instr);
   48960                                       return;
   48961                                     }
   48962                                     unsigned rd =
   48963                                         ExtractQRegister(instr, 22, 12);
   48964                                     QOperand imm =
   48965                                         ImmediateVbic::DecodeImmediate(
   48966                                             cmode,
   48967                                             (instr & 0xf) |
   48968                                                 ((instr >> 12) & 0x70) |
   48969                                                 ((instr >> 17) & 0x80));
   48970                                     // VBIC{<c>}{<q>}.<dt> {<Qdn>}, <Qdn>, #<imm> ; A1 NOLINT(whitespace/line_length)
   48971                                     vbic(al,
   48972                                          dt,
   48973                                          QRegister(rd),
   48974                                          QRegister(rd),
   48975                                          imm);
   48976                                     break;
   48977                                   }
   48978                                 }
   48979                                 break;
   48980                               }
   48981                             }
   48982                             break;
   48983                           }
   48984                           default: {
   48985                             switch (instr & 0x00000300) {
   48986                               case 0x00000000: {
   48987                                 // 0xf2800850
   48988                                 switch (instr & 0x01000000) {
   48989                                   case 0x00000000: {
   48990                                     // 0xf2800850
   48991                                     if (((instr & 0x380000) == 0x0)) {
   48992                                       UnallocatedA32(instr);
   48993                                       return;
   48994                                     }
   48995                                     DataType dt =
   48996                                         Dt_imm6_3_Decode((instr >> 19) & 0x7);
   48997                                     if (dt.Is(kDataTypeValueInvalid)) {
   48998                                       UnallocatedA32(instr);
   48999                                       return;
   49000                                     }
   49001                                     unsigned rd =
   49002                                         ExtractDRegister(instr, 22, 12);
   49003                                     if ((instr & 1) != 0) {
   49004                                       UnallocatedA32(instr);
   49005                                       return;
   49006                                     }
   49007                                     unsigned rm = ExtractQRegister(instr, 5, 0);
   49008                                     uint32_t imm6 = (instr >> 16) & 0x3f;
   49009                                     uint32_t imm = dt.GetSize() - imm6;
   49010                                     // VRSHRN{<c>}{<q>}.I<size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   49011                                     vrshrn(al,
   49012                                            dt,
   49013                                            DRegister(rd),
   49014                                            QRegister(rm),
   49015                                            imm);
   49016                                     break;
   49017                                   }
   49018                                   case 0x01000000: {
   49019                                     // 0xf3800850
   49020                                     if (((instr & 0x380000) == 0x0)) {
   49021                                       UnallocatedA32(instr);
   49022                                       return;
   49023                                     }
   49024                                     DataType dt =
   49025                                         Dt_imm6_2_Decode((instr >> 19) & 0x7,
   49026                                                          (instr >> 24) & 0x1);
   49027                                     if (dt.Is(kDataTypeValueInvalid)) {
   49028                                       UnallocatedA32(instr);
   49029                                       return;
   49030                                     }
   49031                                     unsigned rd =
   49032                                         ExtractDRegister(instr, 22, 12);
   49033                                     if ((instr & 1) != 0) {
   49034                                       UnallocatedA32(instr);
   49035                                       return;
   49036                                     }
   49037                                     unsigned rm = ExtractQRegister(instr, 5, 0);
   49038                                     uint32_t imm6 = (instr >> 16) & 0x3f;
   49039                                     uint32_t imm = dt.GetSize() - imm6;
   49040                                     // VQRSHRUN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   49041                                     vqrshrun(al,
   49042                                              dt,
   49043                                              DRegister(rd),
   49044                                              QRegister(rm),
   49045                                              imm);
   49046                                     break;
   49047                                   }
   49048                                 }
   49049                                 break;
   49050                               }
   49051                               case 0x00000100: {
   49052                                 // 0xf2800950
   49053                                 if (((instr & 0x380000) == 0x0)) {
   49054                                   UnallocatedA32(instr);
   49055                                   return;
   49056                                 }
   49057                                 DataType dt =
   49058                                     Dt_imm6_1_Decode((instr >> 19) & 0x7,
   49059                                                      (instr >> 24) & 0x1);
   49060                                 if (dt.Is(kDataTypeValueInvalid)) {
   49061                                   UnallocatedA32(instr);
   49062                                   return;
   49063                                 }
   49064                                 unsigned rd = ExtractDRegister(instr, 22, 12);
   49065                                 if ((instr & 1) != 0) {
   49066                                   UnallocatedA32(instr);
   49067                                   return;
   49068                                 }
   49069                                 unsigned rm = ExtractQRegister(instr, 5, 0);
   49070                                 uint32_t imm6 = (instr >> 16) & 0x3f;
   49071                                 uint32_t imm = dt.GetSize() - imm6;
   49072                                 // VQRSHRN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   49073                                 vqrshrn(al,
   49074                                         dt,
   49075                                         DRegister(rd),
   49076                                         QRegister(rm),
   49077                                         imm);
   49078                                 break;
   49079                               }
   49080                               default:
   49081                                 UnallocatedA32(instr);
   49082                                 break;
   49083                             }
   49084                             break;
   49085                           }
   49086                         }
   49087                         break;
   49088                       }
   49089                       default:
   49090                         UnallocatedA32(instr);
   49091                         break;
   49092                     }
   49093                     break;
   49094                   }
   49095                   case 0x00000c00: {
   49096                     // 0xf2800c50
   49097                     switch (instr & 0x00000080) {
   49098                       case 0x00000000: {
   49099                         // 0xf2800c50
   49100                         switch (instr & 0x00200000) {
   49101                           case 0x00000000: {
   49102                             // 0xf2800c50
   49103                             switch (instr & 0x00180000) {
   49104                               case 0x00000000: {
   49105                                 // 0xf2800c50
   49106                                 switch (instr & 0x00000300) {
   49107                                   case 0x00000200: {
   49108                                     // 0xf2800e50
   49109                                     if (((instr & 0x920) == 0x100) ||
   49110                                         ((instr & 0x520) == 0x100) ||
   49111                                         ((instr & 0x820) == 0x20) ||
   49112                                         ((instr & 0x420) == 0x20) ||
   49113                                         ((instr & 0x220) == 0x20) ||
   49114                                         ((instr & 0x120) == 0x120)) {
   49115                                       UnallocatedA32(instr);
   49116                                       return;
   49117                                     }
   49118                                     unsigned cmode = ((instr >> 8) & 0xf) |
   49119                                                      ((instr >> 1) & 0x10);
   49120                                     DataType dt =
   49121                                         ImmediateVmov::DecodeDt(cmode);
   49122                                     if (dt.Is(kDataTypeValueInvalid)) {
   49123                                       UnallocatedA32(instr);
   49124                                       return;
   49125                                     }
   49126                                     if (((instr >> 12) & 1) != 0) {
   49127                                       UnallocatedA32(instr);
   49128                                       return;
   49129                                     }
   49130                                     unsigned rd =
   49131                                         ExtractQRegister(instr, 22, 12);
   49132                                     QOperand imm =
   49133                                         ImmediateVmov::DecodeImmediate(
   49134                                             cmode,
   49135                                             (instr & 0xf) |
   49136                                                 ((instr >> 12) & 0x70) |
   49137                                                 ((instr >> 17) & 0x80));
   49138                                     // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1
   49139                                     vmov(al, dt, QRegister(rd), imm);
   49140                                     break;
   49141                                   }
   49142                                   case 0x00000300: {
   49143                                     // 0xf2800f50
   49144                                     if (((instr & 0x920) == 0x100) ||
   49145                                         ((instr & 0x520) == 0x100) ||
   49146                                         ((instr & 0x820) == 0x20) ||
   49147                                         ((instr & 0x420) == 0x20) ||
   49148                                         ((instr & 0x220) == 0x20) ||
   49149                                         ((instr & 0x120) == 0x120)) {
   49150                                       UnallocatedA32(instr);
   49151                                       return;
   49152                                     }
   49153                                     unsigned cmode = ((instr >> 8) & 0xf) |
   49154                                                      ((instr >> 1) & 0x10);
   49155                                     DataType dt =
   49156                                         ImmediateVmov::DecodeDt(cmode);
   49157                                     if (dt.Is(kDataTypeValueInvalid)) {
   49158                                       UnallocatedA32(instr);
   49159                                       return;
   49160                                     }
   49161                                     if (((instr >> 12) & 1) != 0) {
   49162                                       UnallocatedA32(instr);
   49163                                       return;
   49164                                     }
   49165                                     unsigned rd =
   49166                                         ExtractQRegister(instr, 22, 12);
   49167                                     QOperand imm =
   49168                                         ImmediateVmov::DecodeImmediate(
   49169                                             cmode,
   49170                                             (instr & 0xf) |
   49171                                                 ((instr >> 12) & 0x70) |
   49172                                                 ((instr >> 17) & 0x80));
   49173                                     // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1
   49174                                     vmov(al, dt, QRegister(rd), imm);
   49175                                     break;
   49176                                   }
   49177                                   default: {
   49178                                     switch (instr & 0x00000020) {
   49179                                       case 0x00000020: {
   49180                                         // 0xf2800c70
   49181                                         switch (instr & 0x00000f20) {
   49182                                           case 0x00000000: {
   49183                                             // 0xf2800c50
   49184                                             if (((instr & 0x920) == 0x100) ||
   49185                                                 ((instr & 0x520) == 0x100) ||
   49186                                                 ((instr & 0x820) == 0x20) ||
   49187                                                 ((instr & 0x420) == 0x20) ||
   49188                                                 ((instr & 0x220) == 0x20) ||
   49189                                                 ((instr & 0x120) == 0x120)) {
   49190                                               UnallocatedA32(instr);
   49191                                               return;
   49192                                             }
   49193                                             unsigned cmode =
   49194                                                 ((instr >> 8) & 0xf) |
   49195                                                 ((instr >> 1) & 0x10);
   49196                                             DataType dt =
   49197                                                 ImmediateVmov::DecodeDt(cmode);
   49198                                             if (dt.Is(kDataTypeValueInvalid)) {
   49199                                               UnallocatedA32(instr);
   49200                                               return;
   49201                                             }
   49202                                             if (((instr >> 12) & 1) != 0) {
   49203                                               UnallocatedA32(instr);
   49204                                               return;
   49205                                             }
   49206                                             unsigned rd =
   49207                                                 ExtractQRegister(instr, 22, 12);
   49208                                             QOperand imm =
   49209                                                 ImmediateVmov::DecodeImmediate(
   49210                                                     cmode,
   49211                                                     (instr & 0xf) |
   49212                                                         ((instr >> 12) & 0x70) |
   49213                                                         ((instr >> 17) & 0x80));
   49214                                             // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
   49215                                             vmov(al, dt, QRegister(rd), imm);
   49216                                             break;
   49217                                           }
   49218                                           case 0x00000020: {
   49219                                             // 0xf2800c70
   49220                                             if (((instr & 0xd00) == 0x100) ||
   49221                                                 ((instr & 0xd00) == 0x500) ||
   49222                                                 ((instr & 0xd00) == 0x900) ||
   49223                                                 ((instr & 0xe00) == 0xe00)) {
   49224                                               UnallocatedA32(instr);
   49225                                               return;
   49226                                             }
   49227                                             unsigned cmode = (instr >> 8) & 0xf;
   49228                                             DataType dt =
   49229                                                 ImmediateVmvn::DecodeDt(cmode);
   49230                                             if (dt.Is(kDataTypeValueInvalid)) {
   49231                                               UnallocatedA32(instr);
   49232                                               return;
   49233                                             }
   49234                                             if (((instr >> 12) & 1) != 0) {
   49235                                               UnallocatedA32(instr);
   49236                                               return;
   49237                                             }
   49238                                             unsigned rd =
   49239                                                 ExtractQRegister(instr, 22, 12);
   49240                                             QOperand imm =
   49241                                                 ImmediateVmvn::DecodeImmediate(
   49242                                                     cmode,
   49243                                                     (instr & 0xf) |
   49244                                                         ((instr >> 12) & 0x70) |
   49245                                                         ((instr >> 17) & 0x80));
   49246                                             // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
   49247                                             vmvn(al, dt, QRegister(rd), imm);
   49248                                             break;
   49249                                           }
   49250                                           case 0x00000200: {
   49251                                             // 0xf2800e50
   49252                                             if (((instr & 0x920) == 0x100) ||
   49253                                                 ((instr & 0x520) == 0x100) ||
   49254                                                 ((instr & 0x820) == 0x20) ||
   49255                                                 ((instr & 0x420) == 0x20) ||
   49256                                                 ((instr & 0x220) == 0x20) ||
   49257                                                 ((instr & 0x120) == 0x120)) {
   49258                                               UnallocatedA32(instr);
   49259                                               return;
   49260                                             }
   49261                                             unsigned cmode =
   49262                                                 ((instr >> 8) & 0xf) |
   49263                                                 ((instr >> 1) & 0x10);
   49264                                             DataType dt =
   49265                                                 ImmediateVmov::DecodeDt(cmode);
   49266                                             if (dt.Is(kDataTypeValueInvalid)) {
   49267                                               UnallocatedA32(instr);
   49268                                               return;
   49269                                             }
   49270                                             if (((instr >> 12) & 1) != 0) {
   49271                                               UnallocatedA32(instr);
   49272                                               return;
   49273                                             }
   49274                                             unsigned rd =
   49275                                                 ExtractQRegister(instr, 22, 12);
   49276                                             QOperand imm =
   49277                                                 ImmediateVmov::DecodeImmediate(
   49278                                                     cmode,
   49279                                                     (instr & 0xf) |
   49280                                                         ((instr >> 12) & 0x70) |
   49281                                                         ((instr >> 17) & 0x80));
   49282                                             // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
   49283                                             vmov(al, dt, QRegister(rd), imm);
   49284                                             break;
   49285                                           }
   49286                                           case 0x00000220: {
   49287                                             // 0xf2800e70
   49288                                             if (((instr & 0xd00) == 0x100) ||
   49289                                                 ((instr & 0xd00) == 0x500) ||
   49290                                                 ((instr & 0xd00) == 0x900) ||
   49291                                                 ((instr & 0xe00) == 0xe00)) {
   49292                                               UnallocatedA32(instr);
   49293                                               return;
   49294                                             }
   49295                                             unsigned cmode = (instr >> 8) & 0xf;
   49296                                             DataType dt =
   49297                                                 ImmediateVmvn::DecodeDt(cmode);
   49298                                             if (dt.Is(kDataTypeValueInvalid)) {
   49299                                               UnallocatedA32(instr);
   49300                                               return;
   49301                                             }
   49302                                             if (((instr >> 12) & 1) != 0) {
   49303                                               UnallocatedA32(instr);
   49304                                               return;
   49305                                             }
   49306                                             unsigned rd =
   49307                                                 ExtractQRegister(instr, 22, 12);
   49308                                             QOperand imm =
   49309                                                 ImmediateVmvn::DecodeImmediate(
   49310                                                     cmode,
   49311                                                     (instr & 0xf) |
   49312                                                         ((instr >> 12) & 0x70) |
   49313                                                         ((instr >> 17) & 0x80));
   49314                                             // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
   49315                                             vmvn(al, dt, QRegister(rd), imm);
   49316                                             break;
   49317                                           }
   49318                                           case 0x00000400: {
   49319                                             // 0xf2800c50
   49320                                             if (((instr & 0x920) == 0x100) ||
   49321                                                 ((instr & 0x520) == 0x100) ||
   49322                                                 ((instr & 0x820) == 0x20) ||
   49323                                                 ((instr & 0x420) == 0x20) ||
   49324                                                 ((instr & 0x220) == 0x20) ||
   49325                                                 ((instr & 0x120) == 0x120)) {
   49326                                               UnallocatedA32(instr);
   49327                                               return;
   49328                                             }
   49329                                             unsigned cmode =
   49330                                                 ((instr >> 8) & 0xf) |
   49331                                                 ((instr >> 1) & 0x10);
   49332                                             DataType dt =
   49333                                                 ImmediateVmov::DecodeDt(cmode);
   49334                                             if (dt.Is(kDataTypeValueInvalid)) {
   49335                                               UnallocatedA32(instr);
   49336                                               return;
   49337                                             }
   49338                                             if (((instr >> 12) & 1) != 0) {
   49339                                               UnallocatedA32(instr);
   49340                                               return;
   49341                                             }
   49342                                             unsigned rd =
   49343                                                 ExtractQRegister(instr, 22, 12);
   49344                                             QOperand imm =
   49345                                                 ImmediateVmov::DecodeImmediate(
   49346                                                     cmode,
   49347                                                     (instr & 0xf) |
   49348                                                         ((instr >> 12) & 0x70) |
   49349                                                         ((instr >> 17) & 0x80));
   49350                                             // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
   49351                                             vmov(al, dt, QRegister(rd), imm);
   49352                                             break;
   49353                                           }
   49354                                           case 0x00000420: {
   49355                                             // 0xf2800c70
   49356                                             if (((instr & 0xd00) == 0x100) ||
   49357                                                 ((instr & 0xd00) == 0x500) ||
   49358                                                 ((instr & 0xd00) == 0x900) ||
   49359                                                 ((instr & 0xe00) == 0xe00)) {
   49360                                               UnallocatedA32(instr);
   49361                                               return;
   49362                                             }
   49363                                             unsigned cmode = (instr >> 8) & 0xf;
   49364                                             DataType dt =
   49365                                                 ImmediateVmvn::DecodeDt(cmode);
   49366                                             if (dt.Is(kDataTypeValueInvalid)) {
   49367                                               UnallocatedA32(instr);
   49368                                               return;
   49369                                             }
   49370                                             if (((instr >> 12) & 1) != 0) {
   49371                                               UnallocatedA32(instr);
   49372                                               return;
   49373                                             }
   49374                                             unsigned rd =
   49375                                                 ExtractQRegister(instr, 22, 12);
   49376                                             QOperand imm =
   49377                                                 ImmediateVmvn::DecodeImmediate(
   49378                                                     cmode,
   49379                                                     (instr & 0xf) |
   49380                                                         ((instr >> 12) & 0x70) |
   49381                                                         ((instr >> 17) & 0x80));
   49382                                             // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
   49383                                             vmvn(al, dt, QRegister(rd), imm);
   49384                                             break;
   49385                                           }
   49386                                           case 0x00000600: {
   49387                                             // 0xf2800e50
   49388                                             if (((instr & 0x920) == 0x100) ||
   49389                                                 ((instr & 0x520) == 0x100) ||
   49390                                                 ((instr & 0x820) == 0x20) ||
   49391                                                 ((instr & 0x420) == 0x20) ||
   49392                                                 ((instr & 0x220) == 0x20) ||
   49393                                                 ((instr & 0x120) == 0x120)) {
   49394                                               UnallocatedA32(instr);
   49395                                               return;
   49396                                             }
   49397                                             unsigned cmode =
   49398                                                 ((instr >> 8) & 0xf) |
   49399                                                 ((instr >> 1) & 0x10);
   49400                                             DataType dt =
   49401                                                 ImmediateVmov::DecodeDt(cmode);
   49402                                             if (dt.Is(kDataTypeValueInvalid)) {
   49403                                               UnallocatedA32(instr);
   49404                                               return;
   49405                                             }
   49406                                             if (((instr >> 12) & 1) != 0) {
   49407                                               UnallocatedA32(instr);
   49408                                               return;
   49409                                             }
   49410                                             unsigned rd =
   49411                                                 ExtractQRegister(instr, 22, 12);
   49412                                             QOperand imm =
   49413                                                 ImmediateVmov::DecodeImmediate(
   49414                                                     cmode,
   49415                                                     (instr & 0xf) |
   49416                                                         ((instr >> 12) & 0x70) |
   49417                                                         ((instr >> 17) & 0x80));
   49418                                             // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
   49419                                             vmov(al, dt, QRegister(rd), imm);
   49420                                             break;
   49421                                           }
   49422                                           case 0x00000620: {
   49423                                             // 0xf2800e70
   49424                                             if (((instr & 0xd00) == 0x100) ||
   49425                                                 ((instr & 0xd00) == 0x500) ||
   49426                                                 ((instr & 0xd00) == 0x900) ||
   49427                                                 ((instr & 0xe00) == 0xe00)) {
   49428                                               UnallocatedA32(instr);
   49429                                               return;
   49430                                             }
   49431                                             unsigned cmode = (instr >> 8) & 0xf;
   49432                                             DataType dt =
   49433                                                 ImmediateVmvn::DecodeDt(cmode);
   49434                                             if (dt.Is(kDataTypeValueInvalid)) {
   49435                                               UnallocatedA32(instr);
   49436                                               return;
   49437                                             }
   49438                                             if (((instr >> 12) & 1) != 0) {
   49439                                               UnallocatedA32(instr);
   49440                                               return;
   49441                                             }
   49442                                             unsigned rd =
   49443                                                 ExtractQRegister(instr, 22, 12);
   49444                                             QOperand imm =
   49445                                                 ImmediateVmvn::DecodeImmediate(
   49446                                                     cmode,
   49447                                                     (instr & 0xf) |
   49448                                                         ((instr >> 12) & 0x70) |
   49449                                                         ((instr >> 17) & 0x80));
   49450                                             // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
   49451                                             vmvn(al, dt, QRegister(rd), imm);
   49452                                             break;
   49453                                           }
   49454                                           case 0x00000800: {
   49455                                             // 0xf2800c50
   49456                                             if (((instr & 0x920) == 0x100) ||
   49457                                                 ((instr & 0x520) == 0x100) ||
   49458                                                 ((instr & 0x820) == 0x20) ||
   49459                                                 ((instr & 0x420) == 0x20) ||
   49460                                                 ((instr & 0x220) == 0x20) ||
   49461                                                 ((instr & 0x120) == 0x120)) {
   49462                                               UnallocatedA32(instr);
   49463                                               return;
   49464                                             }
   49465                                             unsigned cmode =
   49466                                                 ((instr >> 8) & 0xf) |
   49467                                                 ((instr >> 1) & 0x10);
   49468                                             DataType dt =
   49469                                                 ImmediateVmov::DecodeDt(cmode);
   49470                                             if (dt.Is(kDataTypeValueInvalid)) {
   49471                                               UnallocatedA32(instr);
   49472                                               return;
   49473                                             }
   49474                                             if (((instr >> 12) & 1) != 0) {
   49475                                               UnallocatedA32(instr);
   49476                                               return;
   49477                                             }
   49478                                             unsigned rd =
   49479                                                 ExtractQRegister(instr, 22, 12);
   49480                                             QOperand imm =
   49481                                                 ImmediateVmov::DecodeImmediate(
   49482                                                     cmode,
   49483                                                     (instr & 0xf) |
   49484                                                         ((instr >> 12) & 0x70) |
   49485                                                         ((instr >> 17) & 0x80));
   49486                                             // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
   49487                                             vmov(al, dt, QRegister(rd), imm);
   49488                                             break;
   49489                                           }
   49490                                           case 0x00000820: {
   49491                                             // 0xf2800c70
   49492                                             if (((instr & 0xd00) == 0x100) ||
   49493                                                 ((instr & 0xd00) == 0x500) ||
   49494                                                 ((instr & 0xd00) == 0x900) ||
   49495                                                 ((instr & 0xe00) == 0xe00)) {
   49496                                               UnallocatedA32(instr);
   49497                                               return;
   49498                                             }
   49499                                             unsigned cmode = (instr >> 8) & 0xf;
   49500                                             DataType dt =
   49501                                                 ImmediateVmvn::DecodeDt(cmode);
   49502                                             if (dt.Is(kDataTypeValueInvalid)) {
   49503                                               UnallocatedA32(instr);
   49504                                               return;
   49505                                             }
   49506                                             if (((instr >> 12) & 1) != 0) {
   49507                                               UnallocatedA32(instr);
   49508                                               return;
   49509                                             }
   49510                                             unsigned rd =
   49511                                                 ExtractQRegister(instr, 22, 12);
   49512                                             QOperand imm =
   49513                                                 ImmediateVmvn::DecodeImmediate(
   49514                                                     cmode,
   49515                                                     (instr & 0xf) |
   49516                                                         ((instr >> 12) & 0x70) |
   49517                                                         ((instr >> 17) & 0x80));
   49518                                             // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
   49519                                             vmvn(al, dt, QRegister(rd), imm);
   49520                                             break;
   49521                                           }
   49522                                           case 0x00000a00: {
   49523                                             // 0xf2800e50
   49524                                             if (((instr & 0x920) == 0x100) ||
   49525                                                 ((instr & 0x520) == 0x100) ||
   49526                                                 ((instr & 0x820) == 0x20) ||
   49527                                                 ((instr & 0x420) == 0x20) ||
   49528                                                 ((instr & 0x220) == 0x20) ||
   49529                                                 ((instr & 0x120) == 0x120)) {
   49530                                               UnallocatedA32(instr);
   49531                                               return;
   49532                                             }
   49533                                             unsigned cmode =
   49534                                                 ((instr >> 8) & 0xf) |
   49535                                                 ((instr >> 1) & 0x10);
   49536                                             DataType dt =
   49537                                                 ImmediateVmov::DecodeDt(cmode);
   49538                                             if (dt.Is(kDataTypeValueInvalid)) {
   49539                                               UnallocatedA32(instr);
   49540                                               return;
   49541                                             }
   49542                                             if (((instr >> 12) & 1) != 0) {
   49543                                               UnallocatedA32(instr);
   49544                                               return;
   49545                                             }
   49546                                             unsigned rd =
   49547                                                 ExtractQRegister(instr, 22, 12);
   49548                                             QOperand imm =
   49549                                                 ImmediateVmov::DecodeImmediate(
   49550                                                     cmode,
   49551                                                     (instr & 0xf) |
   49552                                                         ((instr >> 12) & 0x70) |
   49553                                                         ((instr >> 17) & 0x80));
   49554                                             // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
   49555                                             vmov(al, dt, QRegister(rd), imm);
   49556                                             break;
   49557                                           }
   49558                                           case 0x00000a20: {
   49559                                             // 0xf2800e70
   49560                                             if (((instr & 0xd00) == 0x100) ||
   49561                                                 ((instr & 0xd00) == 0x500) ||
   49562                                                 ((instr & 0xd00) == 0x900) ||
   49563                                                 ((instr & 0xe00) == 0xe00)) {
   49564                                               UnallocatedA32(instr);
   49565                                               return;
   49566                                             }
   49567                                             unsigned cmode = (instr >> 8) & 0xf;
   49568                                             DataType dt =
   49569                                                 ImmediateVmvn::DecodeDt(cmode);
   49570                                             if (dt.Is(kDataTypeValueInvalid)) {
   49571                                               UnallocatedA32(instr);
   49572                                               return;
   49573                                             }
   49574                                             if (((instr >> 12) & 1) != 0) {
   49575                                               UnallocatedA32(instr);
   49576                                               return;
   49577                                             }
   49578                                             unsigned rd =
   49579                                                 ExtractQRegister(instr, 22, 12);
   49580                                             QOperand imm =
   49581                                                 ImmediateVmvn::DecodeImmediate(
   49582                                                     cmode,
   49583                                                     (instr & 0xf) |
   49584                                                         ((instr >> 12) & 0x70) |
   49585                                                         ((instr >> 17) & 0x80));
   49586                                             // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
   49587                                             vmvn(al, dt, QRegister(rd), imm);
   49588                                             break;
   49589                                           }
   49590                                           case 0x00000c00: {
   49591                                             // 0xf2800c50
   49592                                             if (((instr & 0x920) == 0x100) ||
   49593                                                 ((instr & 0x520) == 0x100) ||
   49594                                                 ((instr & 0x820) == 0x20) ||
   49595                                                 ((instr & 0x420) == 0x20) ||
   49596                                                 ((instr & 0x220) == 0x20) ||
   49597                                                 ((instr & 0x120) == 0x120)) {
   49598                                               UnallocatedA32(instr);
   49599                                               return;
   49600                                             }
   49601                                             unsigned cmode =
   49602                                                 ((instr >> 8) & 0xf) |
   49603                                                 ((instr >> 1) & 0x10);
   49604                                             DataType dt =
   49605                                                 ImmediateVmov::DecodeDt(cmode);
   49606                                             if (dt.Is(kDataTypeValueInvalid)) {
   49607                                               UnallocatedA32(instr);
   49608                                               return;
   49609                                             }
   49610                                             if (((instr >> 12) & 1) != 0) {
   49611                                               UnallocatedA32(instr);
   49612                                               return;
   49613                                             }
   49614                                             unsigned rd =
   49615                                                 ExtractQRegister(instr, 22, 12);
   49616                                             QOperand imm =
   49617                                                 ImmediateVmov::DecodeImmediate(
   49618                                                     cmode,
   49619                                                     (instr & 0xf) |
   49620                                                         ((instr >> 12) & 0x70) |
   49621                                                         ((instr >> 17) & 0x80));
   49622                                             // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
   49623                                             vmov(al, dt, QRegister(rd), imm);
   49624                                             break;
   49625                                           }
   49626                                           case 0x00000c20: {
   49627                                             // 0xf2800c70
   49628                                             if (((instr & 0xd00) == 0x100) ||
   49629                                                 ((instr & 0xd00) == 0x500) ||
   49630                                                 ((instr & 0xd00) == 0x900) ||
   49631                                                 ((instr & 0xe00) == 0xe00)) {
   49632                                               UnallocatedA32(instr);
   49633                                               return;
   49634                                             }
   49635                                             unsigned cmode = (instr >> 8) & 0xf;
   49636                                             DataType dt =
   49637                                                 ImmediateVmvn::DecodeDt(cmode);
   49638                                             if (dt.Is(kDataTypeValueInvalid)) {
   49639                                               UnallocatedA32(instr);
   49640                                               return;
   49641                                             }
   49642                                             if (((instr >> 12) & 1) != 0) {
   49643                                               UnallocatedA32(instr);
   49644                                               return;
   49645                                             }
   49646                                             unsigned rd =
   49647                                                 ExtractQRegister(instr, 22, 12);
   49648                                             QOperand imm =
   49649                                                 ImmediateVmvn::DecodeImmediate(
   49650                                                     cmode,
   49651                                                     (instr & 0xf) |
   49652                                                         ((instr >> 12) & 0x70) |
   49653                                                         ((instr >> 17) & 0x80));
   49654                                             // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
   49655                                             vmvn(al, dt, QRegister(rd), imm);
   49656                                             break;
   49657                                           }
   49658                                           case 0x00000d00: {
   49659                                             // 0xf2800d50
   49660                                             if (((instr & 0x920) == 0x100) ||
   49661                                                 ((instr & 0x520) == 0x100) ||
   49662                                                 ((instr & 0x820) == 0x20) ||
   49663                                                 ((instr & 0x420) == 0x20) ||
   49664                                                 ((instr & 0x220) == 0x20) ||
   49665                                                 ((instr & 0x120) == 0x120)) {
   49666                                               UnallocatedA32(instr);
   49667                                               return;
   49668                                             }
   49669                                             unsigned cmode =
   49670                                                 ((instr >> 8) & 0xf) |
   49671                                                 ((instr >> 1) & 0x10);
   49672                                             DataType dt =
   49673                                                 ImmediateVmov::DecodeDt(cmode);
   49674                                             if (dt.Is(kDataTypeValueInvalid)) {
   49675                                               UnallocatedA32(instr);
   49676                                               return;
   49677                                             }
   49678                                             if (((instr >> 12) & 1) != 0) {
   49679                                               UnallocatedA32(instr);
   49680                                               return;
   49681                                             }
   49682                                             unsigned rd =
   49683                                                 ExtractQRegister(instr, 22, 12);
   49684                                             QOperand imm =
   49685                                                 ImmediateVmov::DecodeImmediate(
   49686                                                     cmode,
   49687                                                     (instr & 0xf) |
   49688                                                         ((instr >> 12) & 0x70) |
   49689                                                         ((instr >> 17) & 0x80));
   49690                                             // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
   49691                                             vmov(al, dt, QRegister(rd), imm);
   49692                                             break;
   49693                                           }
   49694                                           case 0x00000d20: {
   49695                                             // 0xf2800d70
   49696                                             if (((instr & 0xd00) == 0x100) ||
   49697                                                 ((instr & 0xd00) == 0x500) ||
   49698                                                 ((instr & 0xd00) == 0x900) ||
   49699                                                 ((instr & 0xe00) == 0xe00)) {
   49700                                               UnallocatedA32(instr);
   49701                                               return;
   49702                                             }
   49703                                             unsigned cmode = (instr >> 8) & 0xf;
   49704                                             DataType dt =
   49705                                                 ImmediateVmvn::DecodeDt(cmode);
   49706                                             if (dt.Is(kDataTypeValueInvalid)) {
   49707                                               UnallocatedA32(instr);
   49708                                               return;
   49709                                             }
   49710                                             if (((instr >> 12) & 1) != 0) {
   49711                                               UnallocatedA32(instr);
   49712                                               return;
   49713                                             }
   49714                                             unsigned rd =
   49715                                                 ExtractQRegister(instr, 22, 12);
   49716                                             QOperand imm =
   49717                                                 ImmediateVmvn::DecodeImmediate(
   49718                                                     cmode,
   49719                                                     (instr & 0xf) |
   49720                                                         ((instr >> 12) & 0x70) |
   49721                                                         ((instr >> 17) & 0x80));
   49722                                             // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
   49723                                             vmvn(al, dt, QRegister(rd), imm);
   49724                                             break;
   49725                                           }
   49726                                           case 0x00000e00: {
   49727                                             // 0xf2800e50
   49728                                             if (((instr & 0x920) == 0x100) ||
   49729                                                 ((instr & 0x520) == 0x100) ||
   49730                                                 ((instr & 0x820) == 0x20) ||
   49731                                                 ((instr & 0x420) == 0x20) ||
   49732                                                 ((instr & 0x220) == 0x20) ||
   49733                                                 ((instr & 0x120) == 0x120)) {
   49734                                               UnallocatedA32(instr);
   49735                                               return;
   49736                                             }
   49737                                             unsigned cmode =
   49738                                                 ((instr >> 8) & 0xf) |
   49739                                                 ((instr >> 1) & 0x10);
   49740                                             DataType dt =
   49741                                                 ImmediateVmov::DecodeDt(cmode);
   49742                                             if (dt.Is(kDataTypeValueInvalid)) {
   49743                                               UnallocatedA32(instr);
   49744                                               return;
   49745                                             }
   49746                                             if (((instr >> 12) & 1) != 0) {
   49747                                               UnallocatedA32(instr);
   49748                                               return;
   49749                                             }
   49750                                             unsigned rd =
   49751                                                 ExtractQRegister(instr, 22, 12);
   49752                                             QOperand imm =
   49753                                                 ImmediateVmov::DecodeImmediate(
   49754                                                     cmode,
   49755                                                     (instr & 0xf) |
   49756                                                         ((instr >> 12) & 0x70) |
   49757                                                         ((instr >> 17) & 0x80));
   49758                                             // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
   49759                                             vmov(al, dt, QRegister(rd), imm);
   49760                                             break;
   49761                                           }
   49762                                           case 0x00000e20: {
   49763                                             // 0xf2800e70
   49764                                             if (((instr & 0x920) == 0x100) ||
   49765                                                 ((instr & 0x520) == 0x100) ||
   49766                                                 ((instr & 0x820) == 0x20) ||
   49767                                                 ((instr & 0x420) == 0x20) ||
   49768                                                 ((instr & 0x220) == 0x20) ||
   49769                                                 ((instr & 0x120) == 0x120)) {
   49770                                               UnallocatedA32(instr);
   49771                                               return;
   49772                                             }
   49773                                             unsigned cmode =
   49774                                                 ((instr >> 8) & 0xf) |
   49775                                                 ((instr >> 1) & 0x10);
   49776                                             DataType dt =
   49777                                                 ImmediateVmov::DecodeDt(cmode);
   49778                                             if (dt.Is(kDataTypeValueInvalid)) {
   49779                                               UnallocatedA32(instr);
   49780                                               return;
   49781                                             }
   49782                                             if (((instr >> 12) & 1) != 0) {
   49783                                               UnallocatedA32(instr);
   49784                                               return;
   49785                                             }
   49786                                             unsigned rd =
   49787                                                 ExtractQRegister(instr, 22, 12);
   49788                                             QOperand imm =
   49789                                                 ImmediateVmov::DecodeImmediate(
   49790                                                     cmode,
   49791                                                     (instr & 0xf) |
   49792                                                         ((instr >> 12) & 0x70) |
   49793                                                         ((instr >> 17) & 0x80));
   49794                                             // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
   49795                                             vmov(al, dt, QRegister(rd), imm);
   49796                                             break;
   49797                                           }
   49798                                           case 0x00000f00: {
   49799                                             // 0xf2800f50
   49800                                             if (((instr & 0x920) == 0x100) ||
   49801                                                 ((instr & 0x520) == 0x100) ||
   49802                                                 ((instr & 0x820) == 0x20) ||
   49803                                                 ((instr & 0x420) == 0x20) ||
   49804                                                 ((instr & 0x220) == 0x20) ||
   49805                                                 ((instr & 0x120) == 0x120)) {
   49806                                               UnallocatedA32(instr);
   49807                                               return;
   49808                                             }
   49809                                             unsigned cmode =
   49810                                                 ((instr >> 8) & 0xf) |
   49811                                                 ((instr >> 1) & 0x10);
   49812                                             DataType dt =
   49813                                                 ImmediateVmov::DecodeDt(cmode);
   49814                                             if (dt.Is(kDataTypeValueInvalid)) {
   49815                                               UnallocatedA32(instr);
   49816                                               return;
   49817                                             }
   49818                                             if (((instr >> 12) & 1) != 0) {
   49819                                               UnallocatedA32(instr);
   49820                                               return;
   49821                                             }
   49822                                             unsigned rd =
   49823                                                 ExtractQRegister(instr, 22, 12);
   49824                                             QOperand imm =
   49825                                                 ImmediateVmov::DecodeImmediate(
   49826                                                     cmode,
   49827                                                     (instr & 0xf) |
   49828                                                         ((instr >> 12) & 0x70) |
   49829                                                         ((instr >> 17) & 0x80));
   49830                                             // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
   49831                                             vmov(al, dt, QRegister(rd), imm);
   49832                                             break;
   49833                                           }
   49834                                           default:
   49835                                             UnallocatedA32(instr);
   49836                                             break;
   49837                                         }
   49838                                         break;
   49839                                       }
   49840                                       default: {
   49841                                         if (((instr & 0x920) == 0x100) ||
   49842                                             ((instr & 0x520) == 0x100) ||
   49843                                             ((instr & 0x820) == 0x20) ||
   49844                                             ((instr & 0x420) == 0x20) ||
   49845                                             ((instr & 0x220) == 0x20) ||
   49846                                             ((instr & 0x120) == 0x120)) {
   49847                                           UnallocatedA32(instr);
   49848                                           return;
   49849                                         }
   49850                                         unsigned cmode = ((instr >> 8) & 0xf) |
   49851                                                          ((instr >> 1) & 0x10);
   49852                                         DataType dt =
   49853                                             ImmediateVmov::DecodeDt(cmode);
   49854                                         if (dt.Is(kDataTypeValueInvalid)) {
   49855                                           UnallocatedA32(instr);
   49856                                           return;
   49857                                         }
   49858                                         if (((instr >> 12) & 1) != 0) {
   49859                                           UnallocatedA32(instr);
   49860                                           return;
   49861                                         }
   49862                                         unsigned rd =
   49863                                             ExtractQRegister(instr, 22, 12);
   49864                                         QOperand imm =
   49865                                             ImmediateVmov::DecodeImmediate(
   49866                                                 cmode,
   49867                                                 (instr & 0xf) |
   49868                                                     ((instr >> 12) & 0x70) |
   49869                                                     ((instr >> 17) & 0x80));
   49870                                         // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1
   49871                                         vmov(al, dt, QRegister(rd), imm);
   49872                                         break;
   49873                                       }
   49874                                     }
   49875                                     break;
   49876                                   }
   49877                                 }
   49878                                 break;
   49879                               }
   49880                               default:
   49881                                 UnallocatedA32(instr);
   49882                                 break;
   49883                             }
   49884                             break;
   49885                           }
   49886                           default: {
   49887                             if ((instr & 0x00000200) == 0x00000200) {
   49888                               if (((instr & 0x200000) == 0x0)) {
   49889                                 UnallocatedA32(instr);
   49890                                 return;
   49891                               }
   49892                               DataType dt1 = Dt_op_U_1_Decode1(
   49893                                   ((instr >> 24) & 0x1) | ((instr >> 7) & 0x2));
   49894                               if (dt1.Is(kDataTypeValueInvalid)) {
   49895                                 UnallocatedA32(instr);
   49896                                 return;
   49897                               }
   49898                               DataType dt2 = Dt_op_U_1_Decode2(
   49899                                   ((instr >> 24) & 0x1) | ((instr >> 7) & 0x2));
   49900                               if (dt2.Is(kDataTypeValueInvalid)) {
   49901                                 UnallocatedA32(instr);
   49902                                 return;
   49903                               }
   49904                               if (((instr >> 12) & 1) != 0) {
   49905                                 UnallocatedA32(instr);
   49906                                 return;
   49907                               }
   49908                               unsigned rd = ExtractQRegister(instr, 22, 12);
   49909                               if ((instr & 1) != 0) {
   49910                                 UnallocatedA32(instr);
   49911                                 return;
   49912                               }
   49913                               unsigned rm = ExtractQRegister(instr, 5, 0);
   49914                               uint32_t fbits = 64 - ((instr >> 16) & 0x3f);
   49915                               // VCVT{<c>}{<q>}.<dt>.<dt> <Qd>, <Qm>, #<fbits> ; A1 NOLINT(whitespace/line_length)
   49916                               vcvt(al,
   49917                                    dt1,
   49918                                    dt2,
   49919                                    QRegister(rd),
   49920                                    QRegister(rm),
   49921                                    fbits);
   49922                             } else {
   49923                               UnallocatedA32(instr);
   49924                             }
   49925                             break;
   49926                           }
   49927                         }
   49928                         break;
   49929                       }
   49930                       default:
   49931                         UnallocatedA32(instr);
   49932                         break;
   49933                     }
   49934                     break;
   49935                   }
   49936                 }
   49937                 break;
   49938               }
   49939             }
   49940             break;
   49941           }
   49942         }
   49943         break;
   49944       }
   49945       case 0x04000000: {
   49946         // 0xf4000000
   49947         switch (instr & 0x01300000) {
   49948           case 0x00000000: {
   49949             // 0xf4000000
   49950             switch (instr & 0x00800000) {
   49951               case 0x00000000: {
   49952                 // 0xf4000000
   49953                 switch (instr & 0x0000000d) {
   49954                   case 0x0000000d: {
   49955                     // 0xf400000d
   49956                     switch (instr & 0x00000002) {
   49957                       case 0x00000000: {
   49958                         // 0xf400000d
   49959                         switch (instr & 0x00000f00) {
   49960                           case 0x00000000: {
   49961                             // 0xf400000d
   49962                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
   49963                             if (dt.Is(kDataTypeValueInvalid)) {
   49964                               UnallocatedA32(instr);
   49965                               return;
   49966                             }
   49967                             Alignment align =
   49968                                 Align_align_4_Decode((instr >> 4) & 0x3);
   49969                             if (dt.Is(kDataTypeValueInvalid) ||
   49970                                 align.Is(kBadAlignment)) {
   49971                               UnallocatedA32(instr);
   49972                               return;
   49973                             }
   49974                             unsigned first = ExtractDRegister(instr, 22, 12);
   49975                             unsigned length;
   49976                             SpacingType spacing;
   49977                             switch ((instr >> 8) & 0xf) {
   49978                               default:
   49979                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
   49980                               case 0x0:
   49981                                 length = 4;
   49982                                 spacing = kSingle;
   49983                                 break;
   49984                               case 0x1:
   49985                                 length = 4;
   49986                                 spacing = kDouble;
   49987                                 break;
   49988                             }
   49989                             unsigned last =
   49990                                 first +
   49991                                 (length - 1) * (spacing == kSingle ? 1 : 2);
   49992                             TransferType transfer = kMultipleLanes;
   49993                             unsigned rn = (instr >> 16) & 0xf;
   49994                             // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
   49995                             vst4(al,
   49996                                  dt,
   49997                                  NeonRegisterList(DRegister(first),
   49998                                                   DRegister(last),
   49999                                                   spacing,
   50000                                                   transfer),
   50001                                  AlignedMemOperand(Register(rn),
   50002                                                    align,
   50003                                                    PostIndex));
   50004                             break;
   50005                           }
   50006                           case 0x00000100: {
   50007                             // 0xf400010d
   50008                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
   50009                             if (dt.Is(kDataTypeValueInvalid)) {
   50010                               UnallocatedA32(instr);
   50011                               return;
   50012                             }
   50013                             Alignment align =
   50014                                 Align_align_4_Decode((instr >> 4) & 0x3);
   50015                             if (dt.Is(kDataTypeValueInvalid) ||
   50016                                 align.Is(kBadAlignment)) {
   50017                               UnallocatedA32(instr);
   50018                               return;
   50019                             }
   50020                             unsigned first = ExtractDRegister(instr, 22, 12);
   50021                             unsigned length;
   50022                             SpacingType spacing;
   50023                             switch ((instr >> 8) & 0xf) {
   50024                               default:
   50025                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
   50026                               case 0x0:
   50027                                 length = 4;
   50028                                 spacing = kSingle;
   50029                                 break;
   50030                               case 0x1:
   50031                                 length = 4;
   50032                                 spacing = kDouble;
   50033                                 break;
   50034                             }
   50035                             unsigned last =
   50036                                 first +
   50037                                 (length - 1) * (spacing == kSingle ? 1 : 2);
   50038                             TransferType transfer = kMultipleLanes;
   50039                             unsigned rn = (instr >> 16) & 0xf;
   50040                             // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
   50041                             vst4(al,
   50042                                  dt,
   50043                                  NeonRegisterList(DRegister(first),
   50044                                                   DRegister(last),
   50045                                                   spacing,
   50046                                                   transfer),
   50047                                  AlignedMemOperand(Register(rn),
   50048                                                    align,
   50049                                                    PostIndex));
   50050                             break;
   50051                           }
   50052                           case 0x00000200: {
   50053                             // 0xf400020d
   50054                             if (((instr & 0xe20) == 0x620) ||
   50055                                 ((instr & 0xf30) == 0xa30)) {
   50056                               UnallocatedA32(instr);
   50057                               return;
   50058                             }
   50059                             DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
   50060                             if (dt.Is(kDataTypeValueInvalid)) {
   50061                               UnallocatedA32(instr);
   50062                               return;
   50063                             }
   50064                             Alignment align =
   50065                                 Align_align_5_Decode((instr >> 4) & 0x3);
   50066                             if (dt.Is(kDataTypeValueInvalid) ||
   50067                                 align.Is(kBadAlignment)) {
   50068                               UnallocatedA32(instr);
   50069                               return;
   50070                             }
   50071                             unsigned first = ExtractDRegister(instr, 22, 12);
   50072                             unsigned length;
   50073                             SpacingType spacing = kSingle;
   50074                             switch ((instr >> 8) & 0xf) {
   50075                               default:
   50076                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
   50077                               case 0x7:
   50078                                 length = 1;
   50079                                 break;
   50080                               case 0xa:
   50081                                 length = 2;
   50082                                 break;
   50083                               case 0x6:
   50084                                 length = 3;
   50085                                 break;
   50086                               case 0x2:
   50087                                 length = 4;
   50088                                 break;
   50089                             }
   50090                             unsigned last = first + length - 1;
   50091                             TransferType transfer = kMultipleLanes;
   50092                             unsigned rn = (instr >> 16) & 0xf;
   50093                             // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
   50094                             vst1(al,
   50095                                  dt,
   50096                                  NeonRegisterList(DRegister(first),
   50097                                                   DRegister(last),
   50098                                                   spacing,
   50099                                                   transfer),
   50100                                  AlignedMemOperand(Register(rn),
   50101                                                    align,
   50102                                                    PostIndex));
   50103                             break;
   50104                           }
   50105                           case 0x00000300: {
   50106                             // 0xf400030d
   50107                             if (((instr & 0xe30) == 0x830)) {
   50108                               UnallocatedA32(instr);
   50109                               return;
   50110                             }
   50111                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
   50112                             if (dt.Is(kDataTypeValueInvalid)) {
   50113                               UnallocatedA32(instr);
   50114                               return;
   50115                             }
   50116                             Alignment align =
   50117                                 Align_align_2_Decode((instr >> 4) & 0x3);
   50118                             if (dt.Is(kDataTypeValueInvalid) ||
   50119                                 align.Is(kBadAlignment)) {
   50120                               UnallocatedA32(instr);
   50121                               return;
   50122                             }
   50123                             unsigned first = ExtractDRegister(instr, 22, 12);
   50124                             unsigned length;
   50125                             SpacingType spacing;
   50126                             switch ((instr >> 8) & 0xf) {
   50127                               default:
   50128                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
   50129                               case 0x8:
   50130                                 length = 2;
   50131                                 spacing = kSingle;
   50132                                 break;
   50133                               case 0x9:
   50134                                 length = 2;
   50135                                 spacing = kDouble;
   50136                                 break;
   50137                               case 0x3:
   50138                                 length = 4;
   50139                                 spacing = kSingle;
   50140                                 break;
   50141                             }
   50142                             unsigned last =
   50143                                 first +
   50144                                 (length - 1) * (spacing == kSingle ? 1 : 2);
   50145                             TransferType transfer = kMultipleLanes;
   50146                             unsigned rn = (instr >> 16) & 0xf;
   50147                             // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
   50148                             vst2(al,
   50149                                  dt,
   50150                                  NeonRegisterList(DRegister(first),
   50151                                                   DRegister(last),
   50152                                                   spacing,
   50153                                                   transfer),
   50154                                  AlignedMemOperand(Register(rn),
   50155                                                    align,
   50156                                                    PostIndex));
   50157                             break;
   50158                           }
   50159                           case 0x00000400: {
   50160                             // 0xf400040d
   50161                             if (((instr & 0x20) == 0x20)) {
   50162                               UnallocatedA32(instr);
   50163                               return;
   50164                             }
   50165                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
   50166                             if (dt.Is(kDataTypeValueInvalid)) {
   50167                               UnallocatedA32(instr);
   50168                               return;
   50169                             }
   50170                             Alignment align =
   50171                                 Align_align_3_Decode((instr >> 4) & 0x3);
   50172                             if (dt.Is(kDataTypeValueInvalid) ||
   50173                                 align.Is(kBadAlignment)) {
   50174                               UnallocatedA32(instr);
   50175                               return;
   50176                             }
   50177                             unsigned first = ExtractDRegister(instr, 22, 12);
   50178                             unsigned length;
   50179                             SpacingType spacing;
   50180                             switch ((instr >> 8) & 0xf) {
   50181                               default:
   50182                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
   50183                               case 0x4:
   50184                                 length = 3;
   50185                                 spacing = kSingle;
   50186                                 break;
   50187                               case 0x5:
   50188                                 length = 3;
   50189                                 spacing = kDouble;
   50190                                 break;
   50191                             }
   50192                             unsigned last =
   50193                                 first +
   50194                                 (length - 1) * (spacing == kSingle ? 1 : 2);
   50195                             TransferType transfer = kMultipleLanes;
   50196                             unsigned rn = (instr >> 16) & 0xf;
   50197                             // VST3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
   50198                             vst3(al,
   50199                                  dt,
   50200                                  NeonRegisterList(DRegister(first),
   50201                                                   DRegister(last),
   50202                                                   spacing,
   50203                                                   transfer),
   50204                                  AlignedMemOperand(Register(rn),
   50205                                                    align,
   50206                                                    PostIndex));
   50207                             break;
   50208                           }
   50209                           case 0x00000500: {
   50210                             // 0xf400050d
   50211                             if (((instr & 0x20) == 0x20)) {
   50212                               UnallocatedA32(instr);
   50213                               return;
   50214                             }
   50215                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
   50216                             if (dt.Is(kDataTypeValueInvalid)) {
   50217                               UnallocatedA32(instr);
   50218                               return;
   50219                             }
   50220                             Alignment align =
   50221                                 Align_align_3_Decode((instr >> 4) & 0x3);
   50222                             if (dt.Is(kDataTypeValueInvalid) ||
   50223                                 align.Is(kBadAlignment)) {
   50224                               UnallocatedA32(instr);
   50225                               return;
   50226                             }
   50227                             unsigned first = ExtractDRegister(instr, 22, 12);
   50228                             unsigned length;
   50229                             SpacingType spacing;
   50230                             switch ((instr >> 8) & 0xf) {
   50231                               default:
   50232                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
   50233                               case 0x4:
   50234                                 length = 3;
   50235                                 spacing = kSingle;
   50236                                 break;
   50237                               case 0x5:
   50238                                 length = 3;
   50239                                 spacing = kDouble;
   50240                                 break;
   50241                             }
   50242                             unsigned last =
   50243                                 first +
   50244                                 (length - 1) * (spacing == kSingle ? 1 : 2);
   50245                             TransferType transfer = kMultipleLanes;
   50246                             unsigned rn = (instr >> 16) & 0xf;
   50247                             // VST3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
   50248                             vst3(al,
   50249                                  dt,
   50250                                  NeonRegisterList(DRegister(first),
   50251                                                   DRegister(last),
   50252                                                   spacing,
   50253                                                   transfer),
   50254                                  AlignedMemOperand(Register(rn),
   50255                                                    align,
   50256                                                    PostIndex));
   50257                             break;
   50258                           }
   50259                           case 0x00000600: {
   50260                             // 0xf400060d
   50261                             if (((instr & 0xe20) == 0x620) ||
   50262                                 ((instr & 0xf30) == 0xa30)) {
   50263                               UnallocatedA32(instr);
   50264                               return;
   50265                             }
   50266                             DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
   50267                             if (dt.Is(kDataTypeValueInvalid)) {
   50268                               UnallocatedA32(instr);
   50269                               return;
   50270                             }
   50271                             Alignment align =
   50272                                 Align_align_5_Decode((instr >> 4) & 0x3);
   50273                             if (dt.Is(kDataTypeValueInvalid) ||
   50274                                 align.Is(kBadAlignment)) {
   50275                               UnallocatedA32(instr);
   50276                               return;
   50277                             }
   50278                             unsigned first = ExtractDRegister(instr, 22, 12);
   50279                             unsigned length;
   50280                             SpacingType spacing = kSingle;
   50281                             switch ((instr >> 8) & 0xf) {
   50282                               default:
   50283                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
   50284                               case 0x7:
   50285                                 length = 1;
   50286                                 break;
   50287                               case 0xa:
   50288                                 length = 2;
   50289                                 break;
   50290                               case 0x6:
   50291                                 length = 3;
   50292                                 break;
   50293                               case 0x2:
   50294                                 length = 4;
   50295                                 break;
   50296                             }
   50297                             unsigned last = first + length - 1;
   50298                             TransferType transfer = kMultipleLanes;
   50299                             unsigned rn = (instr >> 16) & 0xf;
   50300                             // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
   50301                             vst1(al,
   50302                                  dt,
   50303                                  NeonRegisterList(DRegister(first),
   50304                                                   DRegister(last),
   50305                                                   spacing,
   50306                                                   transfer),
   50307                                  AlignedMemOperand(Register(rn),
   50308                                                    align,
   50309                                                    PostIndex));
   50310                             break;
   50311                           }
   50312                           case 0x00000700: {
   50313                             // 0xf400070d
   50314                             if (((instr & 0xe20) == 0x620) ||
   50315                                 ((instr & 0xf30) == 0xa30)) {
   50316                               UnallocatedA32(instr);
   50317                               return;
   50318                             }
   50319                             DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
   50320                             if (dt.Is(kDataTypeValueInvalid)) {
   50321                               UnallocatedA32(instr);
   50322                               return;
   50323                             }
   50324                             Alignment align =
   50325                                 Align_align_5_Decode((instr >> 4) & 0x3);
   50326                             if (dt.Is(kDataTypeValueInvalid) ||
   50327                                 align.Is(kBadAlignment)) {
   50328                               UnallocatedA32(instr);
   50329                               return;
   50330                             }
   50331                             unsigned first = ExtractDRegister(instr, 22, 12);
   50332                             unsigned length;
   50333                             SpacingType spacing = kSingle;
   50334                             switch ((instr >> 8) & 0xf) {
   50335                               default:
   50336                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
   50337                               case 0x7:
   50338                                 length = 1;
   50339                                 break;
   50340                               case 0xa:
   50341                                 length = 2;
   50342                                 break;
   50343                               case 0x6:
   50344                                 length = 3;
   50345                                 break;
   50346                               case 0x2:
   50347                                 length = 4;
   50348                                 break;
   50349                             }
   50350                             unsigned last = first + length - 1;
   50351                             TransferType transfer = kMultipleLanes;
   50352                             unsigned rn = (instr >> 16) & 0xf;
   50353                             // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
   50354                             vst1(al,
   50355                                  dt,
   50356                                  NeonRegisterList(DRegister(first),
   50357                                                   DRegister(last),
   50358                                                   spacing,
   50359                                                   transfer),
   50360                                  AlignedMemOperand(Register(rn),
   50361                                                    align,
   50362                                                    PostIndex));
   50363                             break;
   50364                           }
   50365                           case 0x00000800: {
   50366                             // 0xf400080d
   50367                             if (((instr & 0xe30) == 0x830)) {
   50368                               UnallocatedA32(instr);
   50369                               return;
   50370                             }
   50371                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
   50372                             if (dt.Is(kDataTypeValueInvalid)) {
   50373                               UnallocatedA32(instr);
   50374                               return;
   50375                             }
   50376                             Alignment align =
   50377                                 Align_align_2_Decode((instr >> 4) & 0x3);
   50378                             if (dt.Is(kDataTypeValueInvalid) ||
   50379                                 align.Is(kBadAlignment)) {
   50380                               UnallocatedA32(instr);
   50381                               return;
   50382                             }
   50383                             unsigned first = ExtractDRegister(instr, 22, 12);
   50384                             unsigned length;
   50385                             SpacingType spacing;
   50386                             switch ((instr >> 8) & 0xf) {
   50387                               default:
   50388                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
   50389                               case 0x8:
   50390                                 length = 2;
   50391                                 spacing = kSingle;
   50392                                 break;
   50393                               case 0x9:
   50394                                 length = 2;
   50395                                 spacing = kDouble;
   50396                                 break;
   50397                               case 0x3:
   50398                                 length = 4;
   50399                                 spacing = kSingle;
   50400                                 break;
   50401                             }
   50402                             unsigned last =
   50403                                 first +
   50404                                 (length - 1) * (spacing == kSingle ? 1 : 2);
   50405                             TransferType transfer = kMultipleLanes;
   50406                             unsigned rn = (instr >> 16) & 0xf;
   50407                             // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
   50408                             vst2(al,
   50409                                  dt,
   50410                                  NeonRegisterList(DRegister(first),
   50411                                                   DRegister(last),
   50412                                                   spacing,
   50413                                                   transfer),
   50414                                  AlignedMemOperand(Register(rn),
   50415                                                    align,
   50416                                                    PostIndex));
   50417                             break;
   50418                           }
   50419                           case 0x00000900: {
   50420                             // 0xf400090d
   50421                             if (((instr & 0xe30) == 0x830)) {
   50422                               UnallocatedA32(instr);
   50423                               return;
   50424                             }
   50425                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
   50426                             if (dt.Is(kDataTypeValueInvalid)) {
   50427                               UnallocatedA32(instr);
   50428                               return;
   50429                             }
   50430                             Alignment align =
   50431                                 Align_align_2_Decode((instr >> 4) & 0x3);
   50432                             if (dt.Is(kDataTypeValueInvalid) ||
   50433                                 align.Is(kBadAlignment)) {
   50434                               UnallocatedA32(instr);
   50435                               return;
   50436                             }
   50437                             unsigned first = ExtractDRegister(instr, 22, 12);
   50438                             unsigned length;
   50439                             SpacingType spacing;
   50440                             switch ((instr >> 8) & 0xf) {
   50441                               default:
   50442                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
   50443                               case 0x8:
   50444                                 length = 2;
   50445                                 spacing = kSingle;
   50446                                 break;
   50447                               case 0x9:
   50448                                 length = 2;
   50449                                 spacing = kDouble;
   50450                                 break;
   50451                               case 0x3:
   50452                                 length = 4;
   50453                                 spacing = kSingle;
   50454                                 break;
   50455                             }
   50456                             unsigned last =
   50457                                 first +
   50458                                 (length - 1) * (spacing == kSingle ? 1 : 2);
   50459                             TransferType transfer = kMultipleLanes;
   50460                             unsigned rn = (instr >> 16) & 0xf;
   50461                             // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
   50462                             vst2(al,
   50463                                  dt,
   50464                                  NeonRegisterList(DRegister(first),
   50465                                                   DRegister(last),
   50466                                                   spacing,
   50467                                                   transfer),
   50468                                  AlignedMemOperand(Register(rn),
   50469                                                    align,
   50470                                                    PostIndex));
   50471                             break;
   50472                           }
   50473                           case 0x00000a00: {
   50474                             // 0xf4000a0d
   50475                             if (((instr & 0xe20) == 0x620) ||
   50476                                 ((instr & 0xf30) == 0xa30)) {
   50477                               UnallocatedA32(instr);
   50478                               return;
   50479                             }
   50480                             DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
   50481                             if (dt.Is(kDataTypeValueInvalid)) {
   50482                               UnallocatedA32(instr);
   50483                               return;
   50484                             }
   50485                             Alignment align =
   50486                                 Align_align_5_Decode((instr >> 4) & 0x3);
   50487                             if (dt.Is(kDataTypeValueInvalid) ||
   50488                                 align.Is(kBadAlignment)) {
   50489                               UnallocatedA32(instr);
   50490                               return;
   50491                             }
   50492                             unsigned first = ExtractDRegister(instr, 22, 12);
   50493                             unsigned length;
   50494                             SpacingType spacing = kSingle;
   50495                             switch ((instr >> 8) & 0xf) {
   50496                               default:
   50497                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
   50498                               case 0x7:
   50499                                 length = 1;
   50500                                 break;
   50501                               case 0xa:
   50502                                 length = 2;
   50503                                 break;
   50504                               case 0x6:
   50505                                 length = 3;
   50506                                 break;
   50507                               case 0x2:
   50508                                 length = 4;
   50509                                 break;
   50510                             }
   50511                             unsigned last = first + length - 1;
   50512                             TransferType transfer = kMultipleLanes;
   50513                             unsigned rn = (instr >> 16) & 0xf;
   50514                             // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
   50515                             vst1(al,
   50516                                  dt,
   50517                                  NeonRegisterList(DRegister(first),
   50518                                                   DRegister(last),
   50519                                                   spacing,
   50520                                                   transfer),
   50521                                  AlignedMemOperand(Register(rn),
   50522                                                    align,
   50523                                                    PostIndex));
   50524                             break;
   50525                           }
   50526                           default:
   50527                             UnallocatedA32(instr);
   50528                             break;
   50529                         }
   50530                         break;
   50531                       }
   50532                       case 0x00000002: {
   50533                         // 0xf400000f
   50534                         switch (instr & 0x00000f00) {
   50535                           case 0x00000000: {
   50536                             // 0xf400000d
   50537                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
   50538                             if (dt.Is(kDataTypeValueInvalid)) {
   50539                               UnallocatedA32(instr);
   50540                               return;
   50541                             }
   50542                             Alignment align =
   50543                                 Align_align_4_Decode((instr >> 4) & 0x3);
   50544                             if (dt.Is(kDataTypeValueInvalid) ||
   50545                                 align.Is(kBadAlignment)) {
   50546                               UnallocatedA32(instr);
   50547                               return;
   50548                             }
   50549                             unsigned first = ExtractDRegister(instr, 22, 12);
   50550                             unsigned length;
   50551                             SpacingType spacing;
   50552                             switch ((instr >> 8) & 0xf) {
   50553                               default:
   50554                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
   50555                               case 0x0:
   50556                                 length = 4;
   50557                                 spacing = kSingle;
   50558                                 break;
   50559                               case 0x1:
   50560                                 length = 4;
   50561                                 spacing = kDouble;
   50562                                 break;
   50563                             }
   50564                             unsigned last =
   50565                                 first +
   50566                                 (length - 1) * (spacing == kSingle ? 1 : 2);
   50567                             TransferType transfer = kMultipleLanes;
   50568                             unsigned rn = (instr >> 16) & 0xf;
   50569                             // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
   50570                             vst4(al,
   50571                                  dt,
   50572                                  NeonRegisterList(DRegister(first),
   50573                                                   DRegister(last),
   50574                                                   spacing,
   50575                                                   transfer),
   50576                                  AlignedMemOperand(Register(rn),
   50577                                                    align,
   50578                                                    Offset));
   50579                             break;
   50580                           }
   50581                           case 0x00000100: {
   50582                             // 0xf400010d
   50583                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
   50584                             if (dt.Is(kDataTypeValueInvalid)) {
   50585                               UnallocatedA32(instr);
   50586                               return;
   50587                             }
   50588                             Alignment align =
   50589                                 Align_align_4_Decode((instr >> 4) & 0x3);
   50590                             if (dt.Is(kDataTypeValueInvalid) ||
   50591                                 align.Is(kBadAlignment)) {
   50592                               UnallocatedA32(instr);
   50593                               return;
   50594                             }
   50595                             unsigned first = ExtractDRegister(instr, 22, 12);
   50596                             unsigned length;
   50597                             SpacingType spacing;
   50598                             switch ((instr >> 8) & 0xf) {
   50599                               default:
   50600                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
   50601                               case 0x0:
   50602                                 length = 4;
   50603                                 spacing = kSingle;
   50604                                 break;
   50605                               case 0x1:
   50606                                 length = 4;
   50607                                 spacing = kDouble;
   50608                                 break;
   50609                             }
   50610                             unsigned last =
   50611                                 first +
   50612                                 (length - 1) * (spacing == kSingle ? 1 : 2);
   50613                             TransferType transfer = kMultipleLanes;
   50614                             unsigned rn = (instr >> 16) & 0xf;
   50615                             // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
   50616                             vst4(al,
   50617                                  dt,
   50618                                  NeonRegisterList(DRegister(first),
   50619                                                   DRegister(last),
   50620                                                   spacing,
   50621                                                   transfer),
   50622                                  AlignedMemOperand(Register(rn),
   50623                                                    align,
   50624                                                    Offset));
   50625                             break;
   50626                           }
   50627                           case 0x00000200: {
   50628                             // 0xf400020d
   50629                             if (((instr & 0xe20) == 0x620) ||
   50630                                 ((instr & 0xf30) == 0xa30)) {
   50631                               UnallocatedA32(instr);
   50632                               return;
   50633                             }
   50634                             DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
   50635                             if (dt.Is(kDataTypeValueInvalid)) {
   50636                               UnallocatedA32(instr);
   50637                               return;
   50638                             }
   50639                             Alignment align =
   50640                                 Align_align_5_Decode((instr >> 4) & 0x3);
   50641                             if (dt.Is(kDataTypeValueInvalid) ||
   50642                                 align.Is(kBadAlignment)) {
   50643                               UnallocatedA32(instr);
   50644                               return;
   50645                             }
   50646                             unsigned first = ExtractDRegister(instr, 22, 12);
   50647                             unsigned length;
   50648                             SpacingType spacing = kSingle;
   50649                             switch ((instr >> 8) & 0xf) {
   50650                               default:
   50651                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
   50652                               case 0x7:
   50653                                 length = 1;
   50654                                 break;
   50655                               case 0xa:
   50656                                 length = 2;
   50657                                 break;
   50658                               case 0x6:
   50659                                 length = 3;
   50660                                 break;
   50661                               case 0x2:
   50662                                 length = 4;
   50663                                 break;
   50664                             }
   50665                             unsigned last = first + length - 1;
   50666                             TransferType transfer = kMultipleLanes;
   50667                             unsigned rn = (instr >> 16) & 0xf;
   50668                             // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
   50669                             vst1(al,
   50670                                  dt,
   50671                                  NeonRegisterList(DRegister(first),
   50672                                                   DRegister(last),
   50673                                                   spacing,
   50674                                                   transfer),
   50675                                  AlignedMemOperand(Register(rn),
   50676                                                    align,
   50677                                                    Offset));
   50678                             break;
   50679                           }
   50680                           case 0x00000300: {
   50681                             // 0xf400030d
   50682                             if (((instr & 0xe30) == 0x830)) {
   50683                               UnallocatedA32(instr);
   50684                               return;
   50685                             }
   50686                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
   50687                             if (dt.Is(kDataTypeValueInvalid)) {
   50688                               UnallocatedA32(instr);
   50689                               return;
   50690                             }
   50691                             Alignment align =
   50692                                 Align_align_2_Decode((instr >> 4) & 0x3);
   50693                             if (dt.Is(kDataTypeValueInvalid) ||
   50694                                 align.Is(kBadAlignment)) {
   50695                               UnallocatedA32(instr);
   50696                               return;
   50697                             }
   50698                             unsigned first = ExtractDRegister(instr, 22, 12);
   50699                             unsigned length;
   50700                             SpacingType spacing;
   50701                             switch ((instr >> 8) & 0xf) {
   50702                               default:
   50703                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
   50704                               case 0x8:
   50705                                 length = 2;
   50706                                 spacing = kSingle;
   50707                                 break;
   50708                               case 0x9:
   50709                                 length = 2;
   50710                                 spacing = kDouble;
   50711                                 break;
   50712                               case 0x3:
   50713                                 length = 4;
   50714                                 spacing = kSingle;
   50715                                 break;
   50716                             }
   50717                             unsigned last =
   50718                                 first +
   50719                                 (length - 1) * (spacing == kSingle ? 1 : 2);
   50720                             TransferType transfer = kMultipleLanes;
   50721                             unsigned rn = (instr >> 16) & 0xf;
   50722                             // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
   50723                             vst2(al,
   50724                                  dt,
   50725                                  NeonRegisterList(DRegister(first),
   50726                                                   DRegister(last),
   50727                                                   spacing,
   50728                                                   transfer),
   50729                                  AlignedMemOperand(Register(rn),
   50730                                                    align,
   50731                                                    Offset));
   50732                             break;
   50733                           }
   50734                           case 0x00000400: {
   50735                             // 0xf400040d
   50736                             if (((instr & 0x20) == 0x20)) {
   50737                               UnallocatedA32(instr);
   50738                               return;
   50739                             }
   50740                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
   50741                             if (dt.Is(kDataTypeValueInvalid)) {
   50742                               UnallocatedA32(instr);
   50743                               return;
   50744                             }
   50745                             Alignment align =
   50746                                 Align_align_3_Decode((instr >> 4) & 0x3);
   50747                             if (dt.Is(kDataTypeValueInvalid) ||
   50748                                 align.Is(kBadAlignment)) {
   50749                               UnallocatedA32(instr);
   50750                               return;
   50751                             }
   50752                             unsigned first = ExtractDRegister(instr, 22, 12);
   50753                             unsigned length;
   50754                             SpacingType spacing;
   50755                             switch ((instr >> 8) & 0xf) {
   50756                               default:
   50757                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
   50758                               case 0x4:
   50759                                 length = 3;
   50760                                 spacing = kSingle;
   50761                                 break;
   50762                               case 0x5:
   50763                                 length = 3;
   50764                                 spacing = kDouble;
   50765                                 break;
   50766                             }
   50767                             unsigned last =
   50768                                 first +
   50769                                 (length - 1) * (spacing == kSingle ? 1 : 2);
   50770                             TransferType transfer = kMultipleLanes;
   50771                             unsigned rn = (instr >> 16) & 0xf;
   50772                             // VST3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
   50773                             vst3(al,
   50774                                  dt,
   50775                                  NeonRegisterList(DRegister(first),
   50776                                                   DRegister(last),
   50777                                                   spacing,
   50778                                                   transfer),
   50779                                  AlignedMemOperand(Register(rn),
   50780                                                    align,
   50781                                                    Offset));
   50782                             break;
   50783                           }
   50784                           case 0x00000500: {
   50785                             // 0xf400050d
   50786                             if (((instr & 0x20) == 0x20)) {
   50787                               UnallocatedA32(instr);
   50788                               return;
   50789                             }
   50790                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
   50791                             if (dt.Is(kDataTypeValueInvalid)) {
   50792                               UnallocatedA32(instr);
   50793                               return;
   50794                             }
   50795                             Alignment align =
   50796                                 Align_align_3_Decode((instr >> 4) & 0x3);
   50797                             if (dt.Is(kDataTypeValueInvalid) ||
   50798                                 align.Is(kBadAlignment)) {
   50799                               UnallocatedA32(instr);
   50800                               return;
   50801                             }
   50802                             unsigned first = ExtractDRegister(instr, 22, 12);
   50803                             unsigned length;
   50804                             SpacingType spacing;
   50805                             switch ((instr >> 8) & 0xf) {
   50806                               default:
   50807                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
   50808                               case 0x4:
   50809                                 length = 3;
   50810                                 spacing = kSingle;
   50811                                 break;
   50812                               case 0x5:
   50813                                 length = 3;
   50814                                 spacing = kDouble;
   50815                                 break;
   50816                             }
   50817                             unsigned last =
   50818                                 first +
   50819                                 (length - 1) * (spacing == kSingle ? 1 : 2);
   50820                             TransferType transfer = kMultipleLanes;
   50821                             unsigned rn = (instr >> 16) & 0xf;
   50822                             // VST3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
   50823                             vst3(al,
   50824                                  dt,
   50825                                  NeonRegisterList(DRegister(first),
   50826                                                   DRegister(last),
   50827                                                   spacing,
   50828                                                   transfer),
   50829                                  AlignedMemOperand(Register(rn),
   50830                                                    align,
   50831                                                    Offset));
   50832                             break;
   50833                           }
   50834                           case 0x00000600: {
   50835                             // 0xf400060d
   50836                             if (((instr & 0xe20) == 0x620) ||
   50837                                 ((instr & 0xf30) == 0xa30)) {
   50838                               UnallocatedA32(instr);
   50839                               return;
   50840                             }
   50841                             DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
   50842                             if (dt.Is(kDataTypeValueInvalid)) {
   50843                               UnallocatedA32(instr);
   50844                               return;
   50845                             }
   50846                             Alignment align =
   50847                                 Align_align_5_Decode((instr >> 4) & 0x3);
   50848                             if (dt.Is(kDataTypeValueInvalid) ||
   50849                                 align.Is(kBadAlignment)) {
   50850                               UnallocatedA32(instr);
   50851                               return;
   50852                             }
   50853                             unsigned first = ExtractDRegister(instr, 22, 12);
   50854                             unsigned length;
   50855                             SpacingType spacing = kSingle;
   50856                             switch ((instr >> 8) & 0xf) {
   50857                               default:
   50858                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
   50859                               case 0x7:
   50860                                 length = 1;
   50861                                 break;
   50862                               case 0xa:
   50863                                 length = 2;
   50864                                 break;
   50865                               case 0x6:
   50866                                 length = 3;
   50867                                 break;
   50868                               case 0x2:
   50869                                 length = 4;
   50870                                 break;
   50871                             }
   50872                             unsigned last = first + length - 1;
   50873                             TransferType transfer = kMultipleLanes;
   50874                             unsigned rn = (instr >> 16) & 0xf;
   50875                             // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
   50876                             vst1(al,
   50877                                  dt,
   50878                                  NeonRegisterList(DRegister(first),
   50879                                                   DRegister(last),
   50880                                                   spacing,
   50881                                                   transfer),
   50882                                  AlignedMemOperand(Register(rn),
   50883                                                    align,
   50884                                                    Offset));
   50885                             break;
   50886                           }
   50887                           case 0x00000700: {
   50888                             // 0xf400070d
   50889                             if (((instr & 0xe20) == 0x620) ||
   50890                                 ((instr & 0xf30) == 0xa30)) {
   50891                               UnallocatedA32(instr);
   50892                               return;
   50893                             }
   50894                             DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
   50895                             if (dt.Is(kDataTypeValueInvalid)) {
   50896                               UnallocatedA32(instr);
   50897                               return;
   50898                             }
   50899                             Alignment align =
   50900                                 Align_align_5_Decode((instr >> 4) & 0x3);
   50901                             if (dt.Is(kDataTypeValueInvalid) ||
   50902                                 align.Is(kBadAlignment)) {
   50903                               UnallocatedA32(instr);
   50904                               return;
   50905                             }
   50906                             unsigned first = ExtractDRegister(instr, 22, 12);
   50907                             unsigned length;
   50908                             SpacingType spacing = kSingle;
   50909                             switch ((instr >> 8) & 0xf) {
   50910                               default:
   50911                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
   50912                               case 0x7:
   50913                                 length = 1;
   50914                                 break;
   50915                               case 0xa:
   50916                                 length = 2;
   50917                                 break;
   50918                               case 0x6:
   50919                                 length = 3;
   50920                                 break;
   50921                               case 0x2:
   50922                                 length = 4;
   50923                                 break;
   50924                             }
   50925                             unsigned last = first + length - 1;
   50926                             TransferType transfer = kMultipleLanes;
   50927                             unsigned rn = (instr >> 16) & 0xf;
   50928                             // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
   50929                             vst1(al,
   50930                                  dt,
   50931                                  NeonRegisterList(DRegister(first),
   50932                                                   DRegister(last),
   50933                                                   spacing,
   50934                                                   transfer),
   50935                                  AlignedMemOperand(Register(rn),
   50936                                                    align,
   50937                                                    Offset));
   50938                             break;
   50939                           }
   50940                           case 0x00000800: {
   50941                             // 0xf400080d
   50942                             if (((instr & 0xe30) == 0x830)) {
   50943                               UnallocatedA32(instr);
   50944                               return;
   50945                             }
   50946                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
   50947                             if (dt.Is(kDataTypeValueInvalid)) {
   50948                               UnallocatedA32(instr);
   50949                               return;
   50950                             }
   50951                             Alignment align =
   50952                                 Align_align_2_Decode((instr >> 4) & 0x3);
   50953                             if (dt.Is(kDataTypeValueInvalid) ||
   50954                                 align.Is(kBadAlignment)) {
   50955                               UnallocatedA32(instr);
   50956                               return;
   50957                             }
   50958                             unsigned first = ExtractDRegister(instr, 22, 12);
   50959                             unsigned length;
   50960                             SpacingType spacing;
   50961                             switch ((instr >> 8) & 0xf) {
   50962                               default:
   50963                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
   50964                               case 0x8:
   50965                                 length = 2;
   50966                                 spacing = kSingle;
   50967                                 break;
   50968                               case 0x9:
   50969                                 length = 2;
   50970                                 spacing = kDouble;
   50971                                 break;
   50972                               case 0x3:
   50973                                 length = 4;
   50974                                 spacing = kSingle;
   50975                                 break;
   50976                             }
   50977                             unsigned last =
   50978                                 first +
   50979                                 (length - 1) * (spacing == kSingle ? 1 : 2);
   50980                             TransferType transfer = kMultipleLanes;
   50981                             unsigned rn = (instr >> 16) & 0xf;
   50982                             // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
   50983                             vst2(al,
   50984                                  dt,
   50985                                  NeonRegisterList(DRegister(first),
   50986                                                   DRegister(last),
   50987                                                   spacing,
   50988                                                   transfer),
   50989                                  AlignedMemOperand(Register(rn),
   50990                                                    align,
   50991                                                    Offset));
   50992                             break;
   50993                           }
   50994                           case 0x00000900: {
   50995                             // 0xf400090d
   50996                             if (((instr & 0xe30) == 0x830)) {
   50997                               UnallocatedA32(instr);
   50998                               return;
   50999                             }
   51000                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
   51001                             if (dt.Is(kDataTypeValueInvalid)) {
   51002                               UnallocatedA32(instr);
   51003                               return;
   51004                             }
   51005                             Alignment align =
   51006                                 Align_align_2_Decode((instr >> 4) & 0x3);
   51007                             if (dt.Is(kDataTypeValueInvalid) ||
   51008                                 align.Is(kBadAlignment)) {
   51009                               UnallocatedA32(instr);
   51010                               return;
   51011                             }
   51012                             unsigned first = ExtractDRegister(instr, 22, 12);
   51013                             unsigned length;
   51014                             SpacingType spacing;
   51015                             switch ((instr >> 8) & 0xf) {
   51016                               default:
   51017                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
   51018                               case 0x8:
   51019                                 length = 2;
   51020                                 spacing = kSingle;
   51021                                 break;
   51022                               case 0x9:
   51023                                 length = 2;
   51024                                 spacing = kDouble;
   51025                                 break;
   51026                               case 0x3:
   51027                                 length = 4;
   51028                                 spacing = kSingle;
   51029                                 break;
   51030                             }
   51031                             unsigned last =
   51032                                 first +
   51033                                 (length - 1) * (spacing == kSingle ? 1 : 2);
   51034                             TransferType transfer = kMultipleLanes;
   51035                             unsigned rn = (instr >> 16) & 0xf;
   51036                             // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
   51037                             vst2(al,
   51038                                  dt,
   51039                                  NeonRegisterList(DRegister(first),
   51040                                                   DRegister(last),
   51041                                                   spacing,
   51042                                                   transfer),
   51043                                  AlignedMemOperand(Register(rn),
   51044                                                    align,
   51045                                                    Offset));
   51046                             break;
   51047                           }
   51048                           case 0x00000a00: {
   51049                             // 0xf4000a0d
   51050                             if (((instr & 0xe20) == 0x620) ||
   51051                                 ((instr & 0xf30) == 0xa30)) {
   51052                               UnallocatedA32(instr);
   51053                               return;
   51054                             }
   51055                             DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
   51056                             if (dt.Is(kDataTypeValueInvalid)) {
   51057                               UnallocatedA32(instr);
   51058                               return;
   51059                             }
   51060                             Alignment align =
   51061                                 Align_align_5_Decode((instr >> 4) & 0x3);
   51062                             if (dt.Is(kDataTypeValueInvalid) ||
   51063                                 align.Is(kBadAlignment)) {
   51064                               UnallocatedA32(instr);
   51065                               return;
   51066                             }
   51067                             unsigned first = ExtractDRegister(instr, 22, 12);
   51068                             unsigned length;
   51069                             SpacingType spacing = kSingle;
   51070                             switch ((instr >> 8) & 0xf) {
   51071                               default:
   51072                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
   51073                               case 0x7:
   51074                                 length = 1;
   51075                                 break;
   51076                               case 0xa:
   51077                                 length = 2;
   51078                                 break;
   51079                               case 0x6:
   51080                                 length = 3;
   51081                                 break;
   51082                               case 0x2:
   51083                                 length = 4;
   51084                                 break;
   51085                             }
   51086                             unsigned last = first + length - 1;
   51087                             TransferType transfer = kMultipleLanes;
   51088                             unsigned rn = (instr >> 16) & 0xf;
   51089                             // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
   51090                             vst1(al,
   51091                                  dt,
   51092                                  NeonRegisterList(DRegister(first),
   51093                                                   DRegister(last),
   51094                                                   spacing,
   51095                                                   transfer),
   51096                                  AlignedMemOperand(Register(rn),
   51097                                                    align,
   51098                                                    Offset));
   51099                             break;
   51100                           }
   51101                           default:
   51102                             UnallocatedA32(instr);
   51103                             break;
   51104                         }
   51105                         break;
   51106                       }
   51107                     }
   51108                     break;
   51109                   }
   51110                   default: {
   51111                     switch (instr & 0x00000f00) {
   51112                       case 0x00000000: {
   51113                         // 0xf4000000
   51114                         if (((instr & 0xd) == 0xd)) {
   51115                           UnallocatedA32(instr);
   51116                           return;
   51117                         }
   51118                         DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
   51119                         if (dt.Is(kDataTypeValueInvalid)) {
   51120                           UnallocatedA32(instr);
   51121                           return;
   51122                         }
   51123                         Alignment align =
   51124                             Align_align_4_Decode((instr >> 4) & 0x3);
   51125                         if (dt.Is(kDataTypeValueInvalid) ||
   51126                             align.Is(kBadAlignment)) {
   51127                           UnallocatedA32(instr);
   51128                           return;
   51129                         }
   51130                         unsigned first = ExtractDRegister(instr, 22, 12);
   51131                         unsigned length;
   51132                         SpacingType spacing;
   51133                         switch ((instr >> 8) & 0xf) {
   51134                           default:
   51135                             VIXL_UNREACHABLE_OR_FALLTHROUGH();
   51136                           case 0x0:
   51137                             length = 4;
   51138                             spacing = kSingle;
   51139                             break;
   51140                           case 0x1:
   51141                             length = 4;
   51142                             spacing = kDouble;
   51143                             break;
   51144                         }
   51145                         unsigned last =
   51146                             first + (length - 1) * (spacing == kSingle ? 1 : 2);
   51147                         TransferType transfer = kMultipleLanes;
   51148                         unsigned rn = (instr >> 16) & 0xf;
   51149                         unsigned rm = instr & 0xf;
   51150                         // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
   51151                         vst4(al,
   51152                              dt,
   51153                              NeonRegisterList(DRegister(first),
   51154                                               DRegister(last),
   51155                                               spacing,
   51156                                               transfer),
   51157                              AlignedMemOperand(Register(rn),
   51158                                                align,
   51159                                                Register(rm),
   51160                                                PostIndex));
   51161                         break;
   51162                       }
   51163                       case 0x00000100: {
   51164                         // 0xf4000100
   51165                         if (((instr & 0xd) == 0xd)) {
   51166                           UnallocatedA32(instr);
   51167                           return;
   51168                         }
   51169                         DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
   51170                         if (dt.Is(kDataTypeValueInvalid)) {
   51171                           UnallocatedA32(instr);
   51172                           return;
   51173                         }
   51174                         Alignment align =
   51175                             Align_align_4_Decode((instr >> 4) & 0x3);
   51176                         if (dt.Is(kDataTypeValueInvalid) ||
   51177                             align.Is(kBadAlignment)) {
   51178                           UnallocatedA32(instr);
   51179                           return;
   51180                         }
   51181                         unsigned first = ExtractDRegister(instr, 22, 12);
   51182                         unsigned length;
   51183                         SpacingType spacing;
   51184                         switch ((instr >> 8) & 0xf) {
   51185                           default:
   51186                             VIXL_UNREACHABLE_OR_FALLTHROUGH();
   51187                           case 0x0:
   51188                             length = 4;
   51189                             spacing = kSingle;
   51190                             break;
   51191                           case 0x1:
   51192                             length = 4;
   51193                             spacing = kDouble;
   51194                             break;
   51195                         }
   51196                         unsigned last =
   51197                             first + (length - 1) * (spacing == kSingle ? 1 : 2);
   51198                         TransferType transfer = kMultipleLanes;
   51199                         unsigned rn = (instr >> 16) & 0xf;
   51200                         unsigned rm = instr & 0xf;
   51201                         // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
   51202                         vst4(al,
   51203                              dt,
   51204                              NeonRegisterList(DRegister(first),
   51205                                               DRegister(last),
   51206                                               spacing,
   51207                                               transfer),
   51208                              AlignedMemOperand(Register(rn),
   51209                                                align,
   51210                                                Register(rm),
   51211                                                PostIndex));
   51212                         break;
   51213                       }
   51214                       case 0x00000200: {
   51215                         // 0xf4000200
   51216                         if (((instr & 0xd) == 0xd) ||
   51217                             ((instr & 0xe20) == 0x620) ||
   51218                             ((instr & 0xf30) == 0xa30)) {
   51219                           UnallocatedA32(instr);
   51220                           return;
   51221                         }
   51222                         DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
   51223                         if (dt.Is(kDataTypeValueInvalid)) {
   51224                           UnallocatedA32(instr);
   51225                           return;
   51226                         }
   51227                         Alignment align =
   51228                             Align_align_5_Decode((instr >> 4) & 0x3);
   51229                         if (dt.Is(kDataTypeValueInvalid) ||
   51230                             align.Is(kBadAlignment)) {
   51231                           UnallocatedA32(instr);
   51232                           return;
   51233                         }
   51234                         unsigned first = ExtractDRegister(instr, 22, 12);
   51235                         unsigned length;
   51236                         SpacingType spacing = kSingle;
   51237                         switch ((instr >> 8) & 0xf) {
   51238                           default:
   51239                             VIXL_UNREACHABLE_OR_FALLTHROUGH();
   51240                           case 0x7:
   51241                             length = 1;
   51242                             break;
   51243                           case 0xa:
   51244                             length = 2;
   51245                             break;
   51246                           case 0x6:
   51247                             length = 3;
   51248                             break;
   51249                           case 0x2:
   51250                             length = 4;
   51251                             break;
   51252                         }
   51253                         unsigned last = first + length - 1;
   51254                         TransferType transfer = kMultipleLanes;
   51255                         unsigned rn = (instr >> 16) & 0xf;
   51256                         unsigned rm = instr & 0xf;
   51257                         // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
   51258                         vst1(al,
   51259                              dt,
   51260                              NeonRegisterList(DRegister(first),
   51261                                               DRegister(last),
   51262                                               spacing,
   51263                                               transfer),
   51264                              AlignedMemOperand(Register(rn),
   51265                                                align,
   51266                                                Register(rm),
   51267                                                PostIndex));
   51268                         break;
   51269                       }
   51270                       case 0x00000300: {
   51271                         // 0xf4000300
   51272                         if (((instr & 0xd) == 0xd) ||
   51273                             ((instr & 0xe30) == 0x830)) {
   51274                           UnallocatedA32(instr);
   51275                           return;
   51276                         }
   51277                         DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
   51278                         if (dt.Is(kDataTypeValueInvalid)) {
   51279                           UnallocatedA32(instr);
   51280                           return;
   51281                         }
   51282                         Alignment align =
   51283                             Align_align_2_Decode((instr >> 4) & 0x3);
   51284                         if (dt.Is(kDataTypeValueInvalid) ||
   51285                             align.Is(kBadAlignment)) {
   51286                           UnallocatedA32(instr);
   51287                           return;
   51288                         }
   51289                         unsigned first = ExtractDRegister(instr, 22, 12);
   51290                         unsigned length;
   51291                         SpacingType spacing;
   51292                         switch ((instr >> 8) & 0xf) {
   51293                           default:
   51294                             VIXL_UNREACHABLE_OR_FALLTHROUGH();
   51295                           case 0x8:
   51296                             length = 2;
   51297                             spacing = kSingle;
   51298                             break;
   51299                           case 0x9:
   51300                             length = 2;
   51301                             spacing = kDouble;
   51302                             break;
   51303                           case 0x3:
   51304                             length = 4;
   51305                             spacing = kSingle;
   51306                             break;
   51307                         }
   51308                         unsigned last =
   51309                             first + (length - 1) * (spacing == kSingle ? 1 : 2);
   51310                         TransferType transfer = kMultipleLanes;
   51311                         unsigned rn = (instr >> 16) & 0xf;
   51312                         unsigned rm = instr & 0xf;
   51313                         // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
   51314                         vst2(al,
   51315                              dt,
   51316                              NeonRegisterList(DRegister(first),
   51317                                               DRegister(last),
   51318                                               spacing,
   51319                                               transfer),
   51320                              AlignedMemOperand(Register(rn),
   51321                                                align,
   51322                                                Register(rm),
   51323                                                PostIndex));
   51324                         break;
   51325                       }
   51326                       case 0x00000400: {
   51327                         // 0xf4000400
   51328                         if (((instr & 0xd) == 0xd) ||
   51329                             ((instr & 0x20) == 0x20)) {
   51330                           UnallocatedA32(instr);
   51331                           return;
   51332                         }
   51333                         DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
   51334                         if (dt.Is(kDataTypeValueInvalid)) {
   51335                           UnallocatedA32(instr);
   51336                           return;
   51337                         }
   51338                         Alignment align =
   51339                             Align_align_3_Decode((instr >> 4) & 0x3);
   51340                         if (dt.Is(kDataTypeValueInvalid) ||
   51341                             align.Is(kBadAlignment)) {
   51342                           UnallocatedA32(instr);
   51343                           return;
   51344                         }
   51345                         unsigned first = ExtractDRegister(instr, 22, 12);
   51346                         unsigned length;
   51347                         SpacingType spacing;
   51348                         switch ((instr >> 8) & 0xf) {
   51349                           default:
   51350                             VIXL_UNREACHABLE_OR_FALLTHROUGH();
   51351                           case 0x4:
   51352                             length = 3;
   51353                             spacing = kSingle;
   51354                             break;
   51355                           case 0x5:
   51356                             length = 3;
   51357                             spacing = kDouble;
   51358                             break;
   51359                         }
   51360                         unsigned last =
   51361                             first + (length - 1) * (spacing == kSingle ? 1 : 2);
   51362                         TransferType transfer = kMultipleLanes;
   51363                         unsigned rn = (instr >> 16) & 0xf;
   51364                         unsigned rm = instr & 0xf;
   51365                         // VST3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
   51366                         vst3(al,
   51367                              dt,
   51368                              NeonRegisterList(DRegister(first),
   51369                                               DRegister(last),
   51370                                               spacing,
   51371                                               transfer),
   51372                              AlignedMemOperand(Register(rn),
   51373                                                align,
   51374                                                Register(rm),
   51375                                                PostIndex));
   51376                         break;
   51377                       }
   51378                       case 0x00000500: {
   51379                         // 0xf4000500
   51380                         if (((instr & 0xd) == 0xd) ||
   51381                             ((instr & 0x20) == 0x20)) {
   51382                           UnallocatedA32(instr);
   51383                           return;
   51384                         }
   51385                         DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
   51386                         if (dt.Is(kDataTypeValueInvalid)) {
   51387                           UnallocatedA32(instr);
   51388                           return;
   51389                         }
   51390                         Alignment align =
   51391                             Align_align_3_Decode((instr >> 4) & 0x3);
   51392                         if (dt.Is(kDataTypeValueInvalid) ||
   51393                             align.Is(kBadAlignment)) {
   51394                           UnallocatedA32(instr);
   51395                           return;
   51396                         }
   51397                         unsigned first = ExtractDRegister(instr, 22, 12);
   51398                         unsigned length;
   51399                         SpacingType spacing;
   51400                         switch ((instr >> 8) & 0xf) {
   51401                           default:
   51402                             VIXL_UNREACHABLE_OR_FALLTHROUGH();
   51403                           case 0x4:
   51404                             length = 3;
   51405                             spacing = kSingle;
   51406                             break;
   51407                           case 0x5:
   51408                             length = 3;
   51409                             spacing = kDouble;
   51410                             break;
   51411                         }
   51412                         unsigned last =
   51413                             first + (length - 1) * (spacing == kSingle ? 1 : 2);
   51414                         TransferType transfer = kMultipleLanes;
   51415                         unsigned rn = (instr >> 16) & 0xf;
   51416                         unsigned rm = instr & 0xf;
   51417                         // VST3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
   51418                         vst3(al,
   51419                              dt,
   51420                              NeonRegisterList(DRegister(first),
   51421                                               DRegister(last),
   51422                                               spacing,
   51423                                               transfer),
   51424                              AlignedMemOperand(Register(rn),
   51425                                                align,
   51426                                                Register(rm),
   51427                                                PostIndex));
   51428                         break;
   51429                       }
   51430                       case 0x00000600: {
   51431                         // 0xf4000600
   51432                         if (((instr & 0xd) == 0xd) ||
   51433                             ((instr & 0xe20) == 0x620) ||
   51434                             ((instr & 0xf30) == 0xa30)) {
   51435                           UnallocatedA32(instr);
   51436                           return;
   51437                         }
   51438                         DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
   51439                         if (dt.Is(kDataTypeValueInvalid)) {
   51440                           UnallocatedA32(instr);
   51441                           return;
   51442                         }
   51443                         Alignment align =
   51444                             Align_align_5_Decode((instr >> 4) & 0x3);
   51445                         if (dt.Is(kDataTypeValueInvalid) ||
   51446                             align.Is(kBadAlignment)) {
   51447                           UnallocatedA32(instr);
   51448                           return;
   51449                         }
   51450                         unsigned first = ExtractDRegister(instr, 22, 12);
   51451                         unsigned length;
   51452                         SpacingType spacing = kSingle;
   51453                         switch ((instr >> 8) & 0xf) {
   51454                           default:
   51455                             VIXL_UNREACHABLE_OR_FALLTHROUGH();
   51456                           case 0x7:
   51457                             length = 1;
   51458                             break;
   51459                           case 0xa:
   51460                             length = 2;
   51461                             break;
   51462                           case 0x6:
   51463                             length = 3;
   51464                             break;
   51465                           case 0x2:
   51466                             length = 4;
   51467                             break;
   51468                         }
   51469                         unsigned last = first + length - 1;
   51470                         TransferType transfer = kMultipleLanes;
   51471                         unsigned rn = (instr >> 16) & 0xf;
   51472                         unsigned rm = instr & 0xf;
   51473                         // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
   51474                         vst1(al,
   51475                              dt,
   51476                              NeonRegisterList(DRegister(first),
   51477                                               DRegister(last),
   51478                                               spacing,
   51479                                               transfer),
   51480                              AlignedMemOperand(Register(rn),
   51481                                                align,
   51482                                                Register(rm),
   51483                                                PostIndex));
   51484                         break;
   51485                       }
   51486                       case 0x00000700: {
   51487                         // 0xf4000700
   51488                         if (((instr & 0xd) == 0xd) ||
   51489                             ((instr & 0xe20) == 0x620) ||
   51490                             ((instr & 0xf30) == 0xa30)) {
   51491                           UnallocatedA32(instr);
   51492                           return;
   51493                         }
   51494                         DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
   51495                         if (dt.Is(kDataTypeValueInvalid)) {
   51496                           UnallocatedA32(instr);
   51497                           return;
   51498                         }
   51499                         Alignment align =
   51500                             Align_align_5_Decode((instr >> 4) & 0x3);
   51501                         if (dt.Is(kDataTypeValueInvalid) ||
   51502                             align.Is(kBadAlignment)) {
   51503                           UnallocatedA32(instr);
   51504                           return;
   51505                         }
   51506                         unsigned first = ExtractDRegister(instr, 22, 12);
   51507                         unsigned length;
   51508                         SpacingType spacing = kSingle;
   51509                         switch ((instr >> 8) & 0xf) {
   51510                           default:
   51511                             VIXL_UNREACHABLE_OR_FALLTHROUGH();
   51512                           case 0x7:
   51513                             length = 1;
   51514                             break;
   51515                           case 0xa:
   51516                             length = 2;
   51517                             break;
   51518                           case 0x6:
   51519                             length = 3;
   51520                             break;
   51521                           case 0x2:
   51522                             length = 4;
   51523                             break;
   51524                         }
   51525                         unsigned last = first + length - 1;
   51526                         TransferType transfer = kMultipleLanes;
   51527                         unsigned rn = (instr >> 16) & 0xf;
   51528                         unsigned rm = instr & 0xf;
   51529                         // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
   51530                         vst1(al,
   51531                              dt,
   51532                              NeonRegisterList(DRegister(first),
   51533                                               DRegister(last),
   51534                                               spacing,
   51535                                               transfer),
   51536                              AlignedMemOperand(Register(rn),
   51537                                                align,
   51538                                                Register(rm),
   51539                                                PostIndex));
   51540                         break;
   51541                       }
   51542                       case 0x00000800: {
   51543                         // 0xf4000800
   51544                         if (((instr & 0xd) == 0xd) ||
   51545                             ((instr & 0xe30) == 0x830)) {
   51546                           UnallocatedA32(instr);
   51547                           return;
   51548                         }
   51549                         DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
   51550                         if (dt.Is(kDataTypeValueInvalid)) {
   51551                           UnallocatedA32(instr);
   51552                           return;
   51553                         }
   51554                         Alignment align =
   51555                             Align_align_2_Decode((instr >> 4) & 0x3);
   51556                         if (dt.Is(kDataTypeValueInvalid) ||
   51557                             align.Is(kBadAlignment)) {
   51558                           UnallocatedA32(instr);
   51559                           return;
   51560                         }
   51561                         unsigned first = ExtractDRegister(instr, 22, 12);
   51562                         unsigned length;
   51563                         SpacingType spacing;
   51564                         switch ((instr >> 8) & 0xf) {
   51565                           default:
   51566                             VIXL_UNREACHABLE_OR_FALLTHROUGH();
   51567                           case 0x8:
   51568                             length = 2;
   51569                             spacing = kSingle;
   51570                             break;
   51571                           case 0x9:
   51572                             length = 2;
   51573                             spacing = kDouble;
   51574                             break;
   51575                           case 0x3:
   51576                             length = 4;
   51577                             spacing = kSingle;
   51578                             break;
   51579                         }
   51580                         unsigned last =
   51581                             first + (length - 1) * (spacing == kSingle ? 1 : 2);
   51582                         TransferType transfer = kMultipleLanes;
   51583                         unsigned rn = (instr >> 16) & 0xf;
   51584                         unsigned rm = instr & 0xf;
   51585                         // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
   51586                         vst2(al,
   51587                              dt,
   51588                              NeonRegisterList(DRegister(first),
   51589                                               DRegister(last),
   51590                                               spacing,
   51591                                               transfer),
   51592                              AlignedMemOperand(Register(rn),
   51593                                                align,
   51594                                                Register(rm),
   51595                                                PostIndex));
   51596                         break;
   51597                       }
   51598                       case 0x00000900: {
   51599                         // 0xf4000900
   51600                         if (((instr & 0xd) == 0xd) ||
   51601                             ((instr & 0xe30) == 0x830)) {
   51602                           UnallocatedA32(instr);
   51603                           return;
   51604                         }
   51605                         DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
   51606                         if (dt.Is(kDataTypeValueInvalid)) {
   51607                           UnallocatedA32(instr);
   51608                           return;
   51609                         }
   51610                         Alignment align =
   51611                             Align_align_2_Decode((instr >> 4) & 0x3);
   51612                         if (dt.Is(kDataTypeValueInvalid) ||
   51613                             align.Is(kBadAlignment)) {
   51614                           UnallocatedA32(instr);
   51615                           return;
   51616                         }
   51617                         unsigned first = ExtractDRegister(instr, 22, 12);
   51618                         unsigned length;
   51619                         SpacingType spacing;
   51620                         switch ((instr >> 8) & 0xf) {
   51621                           default:
   51622                             VIXL_UNREACHABLE_OR_FALLTHROUGH();
   51623                           case 0x8:
   51624                             length = 2;
   51625                             spacing = kSingle;
   51626                             break;
   51627                           case 0x9:
   51628                             length = 2;
   51629                             spacing = kDouble;
   51630                             break;
   51631                           case 0x3:
   51632                             length = 4;
   51633                             spacing = kSingle;
   51634                             break;
   51635                         }
   51636                         unsigned last =
   51637                             first + (length - 1) * (spacing == kSingle ? 1 : 2);
   51638                         TransferType transfer = kMultipleLanes;
   51639                         unsigned rn = (instr >> 16) & 0xf;
   51640                         unsigned rm = instr & 0xf;
   51641                         // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
   51642                         vst2(al,
   51643                              dt,
   51644                              NeonRegisterList(DRegister(first),
   51645                                               DRegister(last),
   51646                                               spacing,
   51647                                               transfer),
   51648                              AlignedMemOperand(Register(rn),
   51649                                                align,
   51650                                                Register(rm),
   51651                                                PostIndex));
   51652                         break;
   51653                       }
   51654                       case 0x00000a00: {
   51655                         // 0xf4000a00
   51656                         if (((instr & 0xd) == 0xd) ||
   51657                             ((instr & 0xe20) == 0x620) ||
   51658                             ((instr & 0xf30) == 0xa30)) {
   51659                           UnallocatedA32(instr);
   51660                           return;
   51661                         }
   51662                         DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
   51663                         if (dt.Is(kDataTypeValueInvalid)) {
   51664                           UnallocatedA32(instr);
   51665                           return;
   51666                         }
   51667                         Alignment align =
   51668                             Align_align_5_Decode((instr >> 4) & 0x3);
   51669                         if (dt.Is(kDataTypeValueInvalid) ||
   51670                             align.Is(kBadAlignment)) {
   51671                           UnallocatedA32(instr);
   51672                           return;
   51673                         }
   51674                         unsigned first = ExtractDRegister(instr, 22, 12);
   51675                         unsigned length;
   51676                         SpacingType spacing = kSingle;
   51677                         switch ((instr >> 8) & 0xf) {
   51678                           default:
   51679                             VIXL_UNREACHABLE_OR_FALLTHROUGH();
   51680                           case 0x7:
   51681                             length = 1;
   51682                             break;
   51683                           case 0xa:
   51684                             length = 2;
   51685                             break;
   51686                           case 0x6:
   51687                             length = 3;
   51688                             break;
   51689                           case 0x2:
   51690                             length = 4;
   51691                             break;
   51692                         }
   51693                         unsigned last = first + length - 1;
   51694                         TransferType transfer = kMultipleLanes;
   51695                         unsigned rn = (instr >> 16) & 0xf;
   51696                         unsigned rm = instr & 0xf;
   51697                         // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
   51698                         vst1(al,
   51699                              dt,
   51700                              NeonRegisterList(DRegister(first),
   51701                                               DRegister(last),
   51702                                               spacing,
   51703                                               transfer),
   51704                              AlignedMemOperand(Register(rn),
   51705                                                align,
   51706                                                Register(rm),
   51707                                                PostIndex));
   51708                         break;
   51709                       }
   51710                       default:
   51711                         UnallocatedA32(instr);
   51712                         break;
   51713                     }
   51714                     break;
   51715                   }
   51716                 }
   51717                 break;
   51718               }
   51719               case 0x00800000: {
   51720                 // 0xf4800000
   51721                 switch (instr & 0x00000300) {
   51722                   case 0x00000000: {
   51723                     // 0xf4800000
   51724                     switch (instr & 0x00000c00) {
   51725                       case 0x00000c00: {
   51726                         // 0xf4800c00
   51727                         UnallocatedA32(instr);
   51728                         break;
   51729                       }
   51730                       default: {
   51731                         switch (instr & 0x0000000d) {
   51732                           case 0x0000000d: {
   51733                             // 0xf480000d
   51734                             switch (instr & 0x00000002) {
   51735                               case 0x00000000: {
   51736                                 // 0xf480000d
   51737                                 if (((instr & 0xc00) == 0xc00)) {
   51738                                   UnallocatedA32(instr);
   51739                                   return;
   51740                                 }
   51741                                 DataType dt =
   51742                                     Dt_size_7_Decode((instr >> 10) & 0x3);
   51743                                 if (dt.Is(kDataTypeValueInvalid)) {
   51744                                   UnallocatedA32(instr);
   51745                                   return;
   51746                                 }
   51747                                 DecodeNeonAndAlign decode_neon =
   51748                                     Align_index_align_1_Decode((instr >> 4) &
   51749                                                                    0xf,
   51750                                                                dt);
   51751                                 if (!decode_neon.IsValid()) {
   51752                                   UnallocatedA32(instr);
   51753                                   return;
   51754                                 }
   51755                                 Alignment align = decode_neon.GetAlign();
   51756                                 int lane = decode_neon.GetLane();
   51757                                 SpacingType spacing = decode_neon.GetSpacing();
   51758                                 unsigned first =
   51759                                     ExtractDRegister(instr, 22, 12);
   51760                                 unsigned length = 1;
   51761                                 unsigned last = first + length - 1;
   51762                                 unsigned rn = (instr >> 16) & 0xf;
   51763                                 // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
   51764                                 vst1(al,
   51765                                      dt,
   51766                                      NeonRegisterList(DRegister(first),
   51767                                                       DRegister(last),
   51768                                                       spacing,
   51769                                                       lane),
   51770                                      AlignedMemOperand(Register(rn),
   51771                                                        align,
   51772                                                        PostIndex));
   51773                                 break;
   51774                               }
   51775                               case 0x00000002: {
   51776                                 // 0xf480000f
   51777                                 if (((instr & 0xc00) == 0xc00)) {
   51778                                   UnallocatedA32(instr);
   51779                                   return;
   51780                                 }
   51781                                 DataType dt =
   51782                                     Dt_size_7_Decode((instr >> 10) & 0x3);
   51783                                 if (dt.Is(kDataTypeValueInvalid)) {
   51784                                   UnallocatedA32(instr);
   51785                                   return;
   51786                                 }
   51787                                 DecodeNeonAndAlign decode_neon =
   51788                                     Align_index_align_1_Decode((instr >> 4) &
   51789                                                                    0xf,
   51790                                                                dt);
   51791                                 if (!decode_neon.IsValid()) {
   51792                                   UnallocatedA32(instr);
   51793                                   return;
   51794                                 }
   51795                                 Alignment align = decode_neon.GetAlign();
   51796                                 int lane = decode_neon.GetLane();
   51797                                 SpacingType spacing = decode_neon.GetSpacing();
   51798                                 unsigned first =
   51799                                     ExtractDRegister(instr, 22, 12);
   51800                                 unsigned length = 1;
   51801                                 unsigned last = first + length - 1;
   51802                                 unsigned rn = (instr >> 16) & 0xf;
   51803                                 // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1 NOLINT(whitespace/line_length)
   51804                                 vst1(al,
   51805                                      dt,
   51806                                      NeonRegisterList(DRegister(first),
   51807                                                       DRegister(last),
   51808                                                       spacing,
   51809                                                       lane),
   51810                                      AlignedMemOperand(Register(rn),
   51811                                                        align,
   51812                                                        Offset));
   51813                                 break;
   51814                               }
   51815                             }
   51816                             break;
   51817                           }
   51818                           default: {
   51819                             if (((instr & 0xc00) == 0xc00) ||
   51820                                 ((instr & 0xd) == 0xd)) {
   51821                               UnallocatedA32(instr);
   51822                               return;
   51823                             }
   51824                             DataType dt = Dt_size_7_Decode((instr >> 10) & 0x3);
   51825                             if (dt.Is(kDataTypeValueInvalid)) {
   51826                               UnallocatedA32(instr);
   51827                               return;
   51828                             }
   51829                             DecodeNeonAndAlign decode_neon =
   51830                                 Align_index_align_1_Decode((instr >> 4) & 0xf,
   51831                                                            dt);
   51832                             if (!decode_neon.IsValid()) {
   51833                               UnallocatedA32(instr);
   51834                               return;
   51835                             }
   51836                             Alignment align = decode_neon.GetAlign();
   51837                             int lane = decode_neon.GetLane();
   51838                             SpacingType spacing = decode_neon.GetSpacing();
   51839                             unsigned first = ExtractDRegister(instr, 22, 12);
   51840                             unsigned length = 1;
   51841                             unsigned last = first + length - 1;
   51842                             unsigned rn = (instr >> 16) & 0xf;
   51843                             unsigned rm = instr & 0xf;
   51844                             // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
   51845                             vst1(al,
   51846                                  dt,
   51847                                  NeonRegisterList(DRegister(first),
   51848                                                   DRegister(last),
   51849                                                   spacing,
   51850                                                   lane),
   51851                                  AlignedMemOperand(Register(rn),
   51852                                                    align,
   51853                                                    Register(rm),
   51854                                                    PostIndex));
   51855                             break;
   51856                           }
   51857                         }
   51858                         break;
   51859                       }
   51860                     }
   51861                     break;
   51862                   }
   51863                   case 0x00000100: {
   51864                     // 0xf4800100
   51865                     switch (instr & 0x00000c00) {
   51866                       case 0x00000c00: {
   51867                         // 0xf4800d00
   51868                         UnallocatedA32(instr);
   51869                         break;
   51870                       }
   51871                       default: {
   51872                         switch (instr & 0x0000000d) {
   51873                           case 0x0000000d: {
   51874                             // 0xf480010d
   51875                             switch (instr & 0x00000002) {
   51876                               case 0x00000000: {
   51877                                 // 0xf480010d
   51878                                 if (((instr & 0xc00) == 0xc00)) {
   51879                                   UnallocatedA32(instr);
   51880                                   return;
   51881                                 }
   51882                                 DataType dt =
   51883                                     Dt_size_7_Decode((instr >> 10) & 0x3);
   51884                                 if (dt.Is(kDataTypeValueInvalid)) {
   51885                                   UnallocatedA32(instr);
   51886                                   return;
   51887                                 }
   51888                                 DecodeNeonAndAlign decode_neon =
   51889                                     Align_index_align_2_Decode((instr >> 4) &
   51890                                                                    0xf,
   51891                                                                dt);
   51892                                 if (!decode_neon.IsValid()) {
   51893                                   UnallocatedA32(instr);
   51894                                   return;
   51895                                 }
   51896                                 Alignment align = decode_neon.GetAlign();
   51897                                 int lane = decode_neon.GetLane();
   51898                                 SpacingType spacing = decode_neon.GetSpacing();
   51899                                 unsigned first =
   51900                                     ExtractDRegister(instr, 22, 12);
   51901                                 unsigned length = 2;
   51902                                 unsigned last =
   51903                                     first +
   51904                                     (length - 1) * (spacing == kSingle ? 1 : 2);
   51905                                 unsigned rn = (instr >> 16) & 0xf;
   51906                                 // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
   51907                                 vst2(al,
   51908                                      dt,
   51909                                      NeonRegisterList(DRegister(first),
   51910                                                       DRegister(last),
   51911                                                       spacing,
   51912                                                       lane),
   51913                                      AlignedMemOperand(Register(rn),
   51914                                                        align,
   51915                                                        PostIndex));
   51916                                 break;
   51917                               }
   51918                               case 0x00000002: {
   51919                                 // 0xf480010f
   51920                                 if (((instr & 0xc00) == 0xc00)) {
   51921                                   UnallocatedA32(instr);
   51922                                   return;
   51923                                 }
   51924                                 DataType dt =
   51925                                     Dt_size_7_Decode((instr >> 10) & 0x3);
   51926                                 if (dt.Is(kDataTypeValueInvalid)) {
   51927                                   UnallocatedA32(instr);
   51928                                   return;
   51929                                 }
   51930                                 DecodeNeonAndAlign decode_neon =
   51931                                     Align_index_align_2_Decode((instr >> 4) &
   51932                                                                    0xf,
   51933                                                                dt);
   51934                                 if (!decode_neon.IsValid()) {
   51935                                   UnallocatedA32(instr);
   51936                                   return;
   51937                                 }
   51938                                 Alignment align = decode_neon.GetAlign();
   51939                                 int lane = decode_neon.GetLane();
   51940                                 SpacingType spacing = decode_neon.GetSpacing();
   51941                                 unsigned first =
   51942                                     ExtractDRegister(instr, 22, 12);
   51943                                 unsigned length = 2;
   51944                                 unsigned last =
   51945                                     first +
   51946                                     (length - 1) * (spacing == kSingle ? 1 : 2);
   51947                                 unsigned rn = (instr >> 16) & 0xf;
   51948                                 // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1 NOLINT(whitespace/line_length)
   51949                                 vst2(al,
   51950                                      dt,
   51951                                      NeonRegisterList(DRegister(first),
   51952                                                       DRegister(last),
   51953                                                       spacing,
   51954                                                       lane),
   51955                                      AlignedMemOperand(Register(rn),
   51956                                                        align,
   51957                                                        Offset));
   51958                                 break;
   51959                               }
   51960                             }
   51961                             break;
   51962                           }
   51963                           default: {
   51964                             if (((instr & 0xc00) == 0xc00) ||
   51965                                 ((instr & 0xd) == 0xd)) {
   51966                               UnallocatedA32(instr);
   51967                               return;
   51968                             }
   51969                             DataType dt = Dt_size_7_Decode((instr >> 10) & 0x3);
   51970                             if (dt.Is(kDataTypeValueInvalid)) {
   51971                               UnallocatedA32(instr);
   51972                               return;
   51973                             }
   51974                             DecodeNeonAndAlign decode_neon =
   51975                                 Align_index_align_2_Decode((instr >> 4) & 0xf,
   51976                                                            dt);
   51977                             if (!decode_neon.IsValid()) {
   51978                               UnallocatedA32(instr);
   51979                               return;
   51980                             }
   51981                             Alignment align = decode_neon.GetAlign();
   51982                             int lane = decode_neon.GetLane();
   51983                             SpacingType spacing = decode_neon.GetSpacing();
   51984                             unsigned first = ExtractDRegister(instr, 22, 12);
   51985                             unsigned length = 2;
   51986                             unsigned last =
   51987                                 first +
   51988                                 (length - 1) * (spacing == kSingle ? 1 : 2);
   51989                             unsigned rn = (instr >> 16) & 0xf;
   51990                             unsigned rm = instr & 0xf;
   51991                             // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
   51992                             vst2(al,
   51993                                  dt,
   51994                                  NeonRegisterList(DRegister(first),
   51995                                                   DRegister(last),
   51996                                                   spacing,
   51997                                                   lane),
   51998                                  AlignedMemOperand(Register(rn),
   51999                                                    align,
   52000                                                    Register(rm),
   52001                                                    PostIndex));
   52002                             break;
   52003                           }
   52004                         }
   52005                         break;
   52006                       }
   52007                     }
   52008                     break;
   52009                   }
   52010                   case 0x00000200: {
   52011                     // 0xf4800200
   52012                     switch (instr & 0x00000c30) {
   52013                       case 0x00000010: {
   52014                         // 0xf4800210
   52015                         UnallocatedA32(instr);
   52016                         break;
   52017                       }
   52018                       case 0x00000030: {
   52019                         // 0xf4800230
   52020                         UnallocatedA32(instr);
   52021                         break;
   52022                       }
   52023                       case 0x00000410: {
   52024                         // 0xf4800610
   52025                         UnallocatedA32(instr);
   52026                         break;
   52027                       }
   52028                       case 0x00000430: {
   52029                         // 0xf4800630
   52030                         UnallocatedA32(instr);
   52031                         break;
   52032                       }
   52033                       case 0x00000810: {
   52034                         // 0xf4800a10
   52035                         UnallocatedA32(instr);
   52036                         break;
   52037                       }
   52038                       case 0x00000820: {
   52039                         // 0xf4800a20
   52040                         UnallocatedA32(instr);
   52041                         break;
   52042                       }
   52043                       case 0x00000830: {
   52044                         // 0xf4800a30
   52045                         UnallocatedA32(instr);
   52046                         break;
   52047                       }
   52048                       case 0x00000c00: {
   52049                         // 0xf4800e00
   52050                         UnallocatedA32(instr);
   52051                         break;
   52052                       }
   52053                       case 0x00000c10: {
   52054                         // 0xf4800e10
   52055                         UnallocatedA32(instr);
   52056                         break;
   52057                       }
   52058                       case 0x00000c20: {
   52059                         // 0xf4800e20
   52060                         UnallocatedA32(instr);
   52061                         break;
   52062                       }
   52063                       case 0x00000c30: {
   52064                         // 0xf4800e30
   52065                         UnallocatedA32(instr);
   52066                         break;
   52067                       }
   52068                       default: {
   52069                         switch (instr & 0x0000000d) {
   52070                           case 0x0000000d: {
   52071                             // 0xf480020d
   52072                             switch (instr & 0x00000002) {
   52073                               case 0x00000000: {
   52074                                 // 0xf480020d
   52075                                 if (((instr & 0xc00) == 0xc00) ||
   52076                                     ((instr & 0x810) == 0x10) ||
   52077                                     ((instr & 0xc30) == 0x810) ||
   52078                                     ((instr & 0xc30) == 0x820) ||
   52079                                     ((instr & 0xc30) == 0x830)) {
   52080                                   UnallocatedA32(instr);
   52081                                   return;
   52082                                 }
   52083                                 DataType dt =
   52084                                     Dt_size_7_Decode((instr >> 10) & 0x3);
   52085                                 if (dt.Is(kDataTypeValueInvalid)) {
   52086                                   UnallocatedA32(instr);
   52087                                   return;
   52088                                 }
   52089                                 DecodeNeon decode_neon =
   52090                                     Index_1_Decode((instr >> 4) & 0xf, dt);
   52091                                 if (!decode_neon.IsValid()) {
   52092                                   UnallocatedA32(instr);
   52093                                   return;
   52094                                 }
   52095                                 int lane = decode_neon.GetLane();
   52096                                 SpacingType spacing = decode_neon.GetSpacing();
   52097                                 unsigned first =
   52098                                     ExtractDRegister(instr, 22, 12);
   52099                                 unsigned length = 3;
   52100                                 unsigned last =
   52101                                     first +
   52102                                     (length - 1) * (spacing == kSingle ? 1 : 2);
   52103                                 unsigned rn = (instr >> 16) & 0xf;
   52104                                 // VST3{<c>}{<q>}.<dt> <list>, [<Rn>]! ; A1
   52105                                 vst3(al,
   52106                                      dt,
   52107                                      NeonRegisterList(DRegister(first),
   52108                                                       DRegister(last),
   52109                                                       spacing,
   52110                                                       lane),
   52111                                      MemOperand(Register(rn), PostIndex));
   52112                                 break;
   52113                               }
   52114                               case 0x00000002: {
   52115                                 // 0xf480020f
   52116                                 if (((instr & 0xc00) == 0xc00) ||
   52117                                     ((instr & 0x810) == 0x10) ||
   52118                                     ((instr & 0xc30) == 0x810) ||
   52119                                     ((instr & 0xc30) == 0x820) ||
   52120                                     ((instr & 0xc30) == 0x830)) {
   52121                                   UnallocatedA32(instr);
   52122                                   return;
   52123                                 }
   52124                                 DataType dt =
   52125                                     Dt_size_7_Decode((instr >> 10) & 0x3);
   52126                                 if (dt.Is(kDataTypeValueInvalid)) {
   52127                                   UnallocatedA32(instr);
   52128                                   return;
   52129                                 }
   52130                                 DecodeNeon decode_neon =
   52131                                     Index_1_Decode((instr >> 4) & 0xf, dt);
   52132                                 if (!decode_neon.IsValid()) {
   52133                                   UnallocatedA32(instr);
   52134                                   return;
   52135                                 }
   52136                                 int lane = decode_neon.GetLane();
   52137                                 SpacingType spacing = decode_neon.GetSpacing();
   52138                                 unsigned first =
   52139                                     ExtractDRegister(instr, 22, 12);
   52140                                 unsigned length = 3;
   52141                                 unsigned last =
   52142                                     first +
   52143                                     (length - 1) * (spacing == kSingle ? 1 : 2);
   52144                                 unsigned rn = (instr >> 16) & 0xf;
   52145                                 // VST3{<c>}{<q>}.<dt> <list>, [<Rn>] ; A1
   52146                                 vst3(al,
   52147                                      dt,
   52148                                      NeonRegisterList(DRegister(first),
   52149                                                       DRegister(last),
   52150                                                       spacing,
   52151                                                       lane),
   52152                                      MemOperand(Register(rn), Offset));
   52153                                 break;
   52154                               }
   52155                             }
   52156                             break;
   52157                           }
   52158                           default: {
   52159                             if (((instr & 0xc00) == 0xc00) ||
   52160                                 ((instr & 0xd) == 0xd) ||
   52161                                 ((instr & 0x810) == 0x10) ||
   52162                                 ((instr & 0xc30) == 0x810) ||
   52163                                 ((instr & 0xc30) == 0x820) ||
   52164                                 ((instr & 0xc30) == 0x830)) {
   52165                               UnallocatedA32(instr);
   52166                               return;
   52167                             }
   52168                             DataType dt = Dt_size_7_Decode((instr >> 10) & 0x3);
   52169                             if (dt.Is(kDataTypeValueInvalid)) {
   52170                               UnallocatedA32(instr);
   52171                               return;
   52172                             }
   52173                             DecodeNeon decode_neon =
   52174                                 Index_1_Decode((instr >> 4) & 0xf, dt);
   52175                             if (!decode_neon.IsValid()) {
   52176                               UnallocatedA32(instr);
   52177                               return;
   52178                             }
   52179                             int lane = decode_neon.GetLane();
   52180                             SpacingType spacing = decode_neon.GetSpacing();
   52181                             unsigned first = ExtractDRegister(instr, 22, 12);
   52182                             unsigned length = 3;
   52183                             unsigned last =
   52184                                 first +
   52185                                 (length - 1) * (spacing == kSingle ? 1 : 2);
   52186                             unsigned rn = (instr >> 16) & 0xf;
   52187                             Sign sign(plus);
   52188                             unsigned rm = instr & 0xf;
   52189                             // VST3{<c>}{<q>}.<dt> <list>, [<Rn>], #<Rm> ; A1
   52190                             vst3(al,
   52191                                  dt,
   52192                                  NeonRegisterList(DRegister(first),
   52193                                                   DRegister(last),
   52194                                                   spacing,
   52195                                                   lane),
   52196                                  MemOperand(Register(rn),
   52197                                             sign,
   52198                                             Register(rm),
   52199                                             PostIndex));
   52200                             break;
   52201                           }
   52202                         }
   52203                         break;
   52204                       }
   52205                     }
   52206                     break;
   52207                   }
   52208                   case 0x00000300: {
   52209                     // 0xf4800300
   52210                     switch (instr & 0x00000c00) {
   52211                       case 0x00000c00: {
   52212                         // 0xf4800f00
   52213                         UnallocatedA32(instr);
   52214                         break;
   52215                       }
   52216                       default: {
   52217                         switch (instr & 0x0000000d) {
   52218                           case 0x0000000d: {
   52219                             // 0xf480030d
   52220                             switch (instr & 0x00000002) {
   52221                               case 0x00000000: {
   52222                                 // 0xf480030d
   52223                                 if (((instr & 0xc00) == 0xc00)) {
   52224                                   UnallocatedA32(instr);
   52225                                   return;
   52226                                 }
   52227                                 DataType dt =
   52228                                     Dt_size_7_Decode((instr >> 10) & 0x3);
   52229                                 if (dt.Is(kDataTypeValueInvalid)) {
   52230                                   UnallocatedA32(instr);
   52231                                   return;
   52232                                 }
   52233                                 DecodeNeonAndAlign decode_neon =
   52234                                     Align_index_align_3_Decode((instr >> 4) &
   52235                                                                    0xf,
   52236                                                                dt);
   52237                                 if (!decode_neon.IsValid()) {
   52238                                   UnallocatedA32(instr);
   52239                                   return;
   52240                                 }
   52241                                 Alignment align = decode_neon.GetAlign();
   52242                                 int lane = decode_neon.GetLane();
   52243                                 SpacingType spacing = decode_neon.GetSpacing();
   52244                                 unsigned first =
   52245                                     ExtractDRegister(instr, 22, 12);
   52246                                 unsigned length = 4;
   52247                                 unsigned last =
   52248                                     first +
   52249                                     (length - 1) * (spacing == kSingle ? 1 : 2);
   52250                                 unsigned rn = (instr >> 16) & 0xf;
   52251                                 // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
   52252                                 vst4(al,
   52253                                      dt,
   52254                                      NeonRegisterList(DRegister(first),
   52255                                                       DRegister(last),
   52256                                                       spacing,
   52257                                                       lane),
   52258                                      AlignedMemOperand(Register(rn),
   52259                                                        align,
   52260                                                        PostIndex));
   52261                                 break;
   52262                               }
   52263                               case 0x00000002: {
   52264                                 // 0xf480030f
   52265                                 if (((instr & 0xc00) == 0xc00)) {
   52266                                   UnallocatedA32(instr);
   52267                                   return;
   52268                                 }
   52269                                 DataType dt =
   52270                                     Dt_size_7_Decode((instr >> 10) & 0x3);
   52271                                 if (dt.Is(kDataTypeValueInvalid)) {
   52272                                   UnallocatedA32(instr);
   52273                                   return;
   52274                                 }
   52275                                 DecodeNeonAndAlign decode_neon =
   52276                                     Align_index_align_3_Decode((instr >> 4) &
   52277                                                                    0xf,
   52278                                                                dt);
   52279                                 if (!decode_neon.IsValid()) {
   52280                                   UnallocatedA32(instr);
   52281                                   return;
   52282                                 }
   52283                                 Alignment align = decode_neon.GetAlign();
   52284                                 int lane = decode_neon.GetLane();
   52285                                 SpacingType spacing = decode_neon.GetSpacing();
   52286                                 unsigned first =
   52287                                     ExtractDRegister(instr, 22, 12);
   52288                                 unsigned length = 4;
   52289                                 unsigned last =
   52290                                     first +
   52291                                     (length - 1) * (spacing == kSingle ? 1 : 2);
   52292                                 unsigned rn = (instr >> 16) & 0xf;
   52293                                 // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1 NOLINT(whitespace/line_length)
   52294                                 vst4(al,
   52295                                      dt,
   52296                                      NeonRegisterList(DRegister(first),
   52297                                                       DRegister(last),
   52298                                                       spacing,
   52299                                                       lane),
   52300                                      AlignedMemOperand(Register(rn),
   52301                                                        align,
   52302                                                        Offset));
   52303                                 break;
   52304                               }
   52305                             }
   52306                             break;
   52307                           }
   52308                           default: {
   52309                             if (((instr & 0xc00) == 0xc00) ||
   52310                                 ((instr & 0xd) == 0xd)) {
   52311                               UnallocatedA32(instr);
   52312                               return;
   52313                             }
   52314                             DataType dt = Dt_size_7_Decode((instr >> 10) & 0x3);
   52315                             if (dt.Is(kDataTypeValueInvalid)) {
   52316                               UnallocatedA32(instr);
   52317                               return;
   52318                             }
   52319                             DecodeNeonAndAlign decode_neon =
   52320                                 Align_index_align_3_Decode((instr >> 4) & 0xf,
   52321                                                            dt);
   52322                             if (!decode_neon.IsValid()) {
   52323                               UnallocatedA32(instr);
   52324                               return;
   52325                             }
   52326                             Alignment align = decode_neon.GetAlign();
   52327                             int lane = decode_neon.GetLane();
   52328                             SpacingType spacing = decode_neon.GetSpacing();
   52329                             unsigned first = ExtractDRegister(instr, 22, 12);
   52330                             unsigned length = 4;
   52331                             unsigned last =
   52332                                 first +
   52333                                 (length - 1) * (spacing == kSingle ? 1 : 2);
   52334                             unsigned rn = (instr >> 16) & 0xf;
   52335                             unsigned rm = instr & 0xf;
   52336                             // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
   52337                             vst4(al,
   52338                                  dt,
   52339                                  NeonRegisterList(DRegister(first),
   52340                                                   DRegister(last),
   52341                                                   spacing,
   52342                                                   lane),
   52343                                  AlignedMemOperand(Register(rn),
   52344                                                    align,
   52345                                                    Register(rm),
   52346                                                    PostIndex));
   52347                             break;
   52348                           }
   52349                         }
   52350                         break;
   52351                       }
   52352                     }
   52353                     break;
   52354                   }
   52355                 }
   52356                 break;
   52357               }
   52358             }
   52359             break;
   52360           }
   52361           case 0x00100000: {
   52362             // 0xf4100000
   52363             switch (instr & 0x00400000) {
   52364               case 0x00400000: {
   52365                 // 0xf4500000
   52366                 switch (instr & 0x000f0000) {
   52367                   case 0x000f0000: {
   52368                     // 0xf45f0000
   52369                     uint32_t U = (instr >> 23) & 0x1;
   52370                     int32_t imm = instr & 0xfff;
   52371                     if (U == 0) imm = -imm;
   52372                     bool minus_zero = (imm == 0) && (U == 0);
   52373                     Location location(imm, kA32PcDelta);
   52374                     // PLI{<c>}{<q>} <label> ; A1
   52375                     if (minus_zero) {
   52376                       pli(al, MemOperand(pc, minus, 0));
   52377                     } else {
   52378                       pli(al, &location);
   52379                     }
   52380                     if (((instr & 0xff7ff000) != 0xf45ff000)) {
   52381                       UnpredictableA32(instr);
   52382                     }
   52383                     break;
   52384                   }
   52385                   default: {
   52386                     if (((instr & 0xf0000) == 0xf0000)) {
   52387                       UnallocatedA32(instr);
   52388                       return;
   52389                     }
   52390                     unsigned rn = (instr >> 16) & 0xf;
   52391                     Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
   52392                     int32_t offset = instr & 0xfff;
   52393                     // PLI{<c>}{<q>} [<Rn>{, #{+/-}<imm_3>}] ; A1
   52394                     pli(al, MemOperand(Register(rn), sign, offset, Offset));
   52395                     if (((instr & 0xff70f000) != 0xf450f000)) {
   52396                       UnpredictableA32(instr);
   52397                     }
   52398                     break;
   52399                   }
   52400                 }
   52401                 break;
   52402               }
   52403               default:
   52404                 UnallocatedA32(instr);
   52405                 break;
   52406             }
   52407             break;
   52408           }
   52409           case 0x00200000: {
   52410             // 0xf4200000
   52411             switch (instr & 0x00800000) {
   52412               case 0x00000000: {
   52413                 // 0xf4200000
   52414                 switch (instr & 0x0000000d) {
   52415                   case 0x0000000d: {
   52416                     // 0xf420000d
   52417                     switch (instr & 0x00000002) {
   52418                       case 0x00000000: {
   52419                         // 0xf420000d
   52420                         switch (instr & 0x00000f00) {
   52421                           case 0x00000000: {
   52422                             // 0xf420000d
   52423                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
   52424                             if (dt.Is(kDataTypeValueInvalid)) {
   52425                               UnallocatedA32(instr);
   52426                               return;
   52427                             }
   52428                             Alignment align =
   52429                                 Align_align_4_Decode((instr >> 4) & 0x3);
   52430                             if (dt.Is(kDataTypeValueInvalid) ||
   52431                                 align.Is(kBadAlignment)) {
   52432                               UnallocatedA32(instr);
   52433                               return;
   52434                             }
   52435                             unsigned first = ExtractDRegister(instr, 22, 12);
   52436                             unsigned length;
   52437                             SpacingType spacing;
   52438                             switch ((instr >> 8) & 0xf) {
   52439                               default:
   52440                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
   52441                               case 0x0:
   52442                                 length = 4;
   52443                                 spacing = kSingle;
   52444                                 break;
   52445                               case 0x1:
   52446                                 length = 4;
   52447                                 spacing = kDouble;
   52448                                 break;
   52449                             }
   52450                             unsigned last =
   52451                                 first +
   52452                                 (length - 1) * (spacing == kSingle ? 1 : 2);
   52453                             TransferType transfer = kMultipleLanes;
   52454                             unsigned rn = (instr >> 16) & 0xf;
   52455                             // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
   52456                             vld4(al,
   52457                                  dt,
   52458                                  NeonRegisterList(DRegister(first),
   52459                                                   DRegister(last),
   52460                                                   spacing,
   52461                                                   transfer),
   52462                                  AlignedMemOperand(Register(rn),
   52463                                                    align,
   52464                                                    PostIndex));
   52465                             break;
   52466                           }
   52467                           case 0x00000100: {
   52468                             // 0xf420010d
   52469                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
   52470                             if (dt.Is(kDataTypeValueInvalid)) {
   52471                               UnallocatedA32(instr);
   52472                               return;
   52473                             }
   52474                             Alignment align =
   52475                                 Align_align_4_Decode((instr >> 4) & 0x3);
   52476                             if (dt.Is(kDataTypeValueInvalid) ||
   52477                                 align.Is(kBadAlignment)) {
   52478                               UnallocatedA32(instr);
   52479                               return;
   52480                             }
   52481                             unsigned first = ExtractDRegister(instr, 22, 12);
   52482                             unsigned length;
   52483                             SpacingType spacing;
   52484                             switch ((instr >> 8) & 0xf) {
   52485                               default:
   52486                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
   52487                               case 0x0:
   52488                                 length = 4;
   52489                                 spacing = kSingle;
   52490                                 break;
   52491                               case 0x1:
   52492                                 length = 4;
   52493                                 spacing = kDouble;
   52494                                 break;
   52495                             }
   52496                             unsigned last =
   52497                                 first +
   52498                                 (length - 1) * (spacing == kSingle ? 1 : 2);
   52499                             TransferType transfer = kMultipleLanes;
   52500                             unsigned rn = (instr >> 16) & 0xf;
   52501                             // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
   52502                             vld4(al,
   52503                                  dt,
   52504                                  NeonRegisterList(DRegister(first),
   52505                                                   DRegister(last),
   52506                                                   spacing,
   52507                                                   transfer),
   52508                                  AlignedMemOperand(Register(rn),
   52509                                                    align,
   52510                                                    PostIndex));
   52511                             break;
   52512                           }
   52513                           case 0x00000200: {
   52514                             // 0xf420020d
   52515                             if (((instr & 0xe20) == 0x620) ||
   52516                                 ((instr & 0xf30) == 0xa30)) {
   52517                               UnallocatedA32(instr);
   52518                               return;
   52519                             }
   52520                             DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
   52521                             if (dt.Is(kDataTypeValueInvalid)) {
   52522                               UnallocatedA32(instr);
   52523                               return;
   52524                             }
   52525                             Alignment align =
   52526                                 Align_align_1_Decode((instr >> 4) & 0x3);
   52527                             if (dt.Is(kDataTypeValueInvalid) ||
   52528                                 align.Is(kBadAlignment)) {
   52529                               UnallocatedA32(instr);
   52530                               return;
   52531                             }
   52532                             unsigned first = ExtractDRegister(instr, 22, 12);
   52533                             unsigned length;
   52534                             SpacingType spacing = kSingle;
   52535                             switch ((instr >> 8) & 0xf) {
   52536                               default:
   52537                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
   52538                               case 0x7:
   52539                                 length = 1;
   52540                                 break;
   52541                               case 0xa:
   52542                                 length = 2;
   52543                                 break;
   52544                               case 0x6:
   52545                                 length = 3;
   52546                                 break;
   52547                               case 0x2:
   52548                                 length = 4;
   52549                                 break;
   52550                             }
   52551                             unsigned last = first + length - 1;
   52552                             TransferType transfer = kMultipleLanes;
   52553                             unsigned rn = (instr >> 16) & 0xf;
   52554                             // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
   52555                             vld1(al,
   52556                                  dt,
   52557                                  NeonRegisterList(DRegister(first),
   52558                                                   DRegister(last),
   52559                                                   spacing,
   52560                                                   transfer),
   52561                                  AlignedMemOperand(Register(rn),
   52562                                                    align,
   52563                                                    PostIndex));
   52564                             break;
   52565                           }
   52566                           case 0x00000300: {
   52567                             // 0xf420030d
   52568                             if (((instr & 0xe30) == 0x830)) {
   52569                               UnallocatedA32(instr);
   52570                               return;
   52571                             }
   52572                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
   52573                             if (dt.Is(kDataTypeValueInvalid)) {
   52574                               UnallocatedA32(instr);
   52575                               return;
   52576                             }
   52577                             Alignment align =
   52578                                 Align_align_2_Decode((instr >> 4) & 0x3);
   52579                             if (dt.Is(kDataTypeValueInvalid) ||
   52580                                 align.Is(kBadAlignment)) {
   52581                               UnallocatedA32(instr);
   52582                               return;
   52583                             }
   52584                             unsigned first = ExtractDRegister(instr, 22, 12);
   52585                             unsigned length;
   52586                             SpacingType spacing;
   52587                             switch ((instr >> 8) & 0xf) {
   52588                               default:
   52589                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
   52590                               case 0x8:
   52591                                 length = 2;
   52592                                 spacing = kSingle;
   52593                                 break;
   52594                               case 0x9:
   52595                                 length = 2;
   52596                                 spacing = kDouble;
   52597                                 break;
   52598                               case 0x3:
   52599                                 length = 4;
   52600                                 spacing = kSingle;
   52601                                 break;
   52602                             }
   52603                             unsigned last =
   52604                                 first +
   52605                                 (length - 1) * (spacing == kSingle ? 1 : 2);
   52606                             TransferType transfer = kMultipleLanes;
   52607                             unsigned rn = (instr >> 16) & 0xf;
   52608                             // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
   52609                             vld2(al,
   52610                                  dt,
   52611                                  NeonRegisterList(DRegister(first),
   52612                                                   DRegister(last),
   52613                                                   spacing,
   52614                                                   transfer),
   52615                                  AlignedMemOperand(Register(rn),
   52616                                                    align,
   52617                                                    PostIndex));
   52618                             break;
   52619                           }
   52620                           case 0x00000400: {
   52621                             // 0xf420040d
   52622                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
   52623                             if (dt.Is(kDataTypeValueInvalid)) {
   52624                               UnallocatedA32(instr);
   52625                               return;
   52626                             }
   52627                             Alignment align =
   52628                                 Align_align_3_Decode((instr >> 4) & 0x3);
   52629                             if (dt.Is(kDataTypeValueInvalid) ||
   52630                                 align.Is(kBadAlignment)) {
   52631                               UnallocatedA32(instr);
   52632                               return;
   52633                             }
   52634                             unsigned first = ExtractDRegister(instr, 22, 12);
   52635                             unsigned length;
   52636                             SpacingType spacing;
   52637                             switch ((instr >> 8) & 0xf) {
   52638                               default:
   52639                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
   52640                               case 0x4:
   52641                                 length = 3;
   52642                                 spacing = kSingle;
   52643                                 break;
   52644                               case 0x5:
   52645                                 length = 3;
   52646                                 spacing = kDouble;
   52647                                 break;
   52648                             }
   52649                             unsigned last =
   52650                                 first +
   52651                                 (length - 1) * (spacing == kSingle ? 1 : 2);
   52652                             TransferType transfer = kMultipleLanes;
   52653                             unsigned rn = (instr >> 16) & 0xf;
   52654                             // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
   52655                             vld3(al,
   52656                                  dt,
   52657                                  NeonRegisterList(DRegister(first),
   52658                                                   DRegister(last),
   52659                                                   spacing,
   52660                                                   transfer),
   52661                                  AlignedMemOperand(Register(rn),
   52662                                                    align,
   52663                                                    PostIndex));
   52664                             break;
   52665                           }
   52666                           case 0x00000500: {
   52667                             // 0xf420050d
   52668                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
   52669                             if (dt.Is(kDataTypeValueInvalid)) {
   52670                               UnallocatedA32(instr);
   52671                               return;
   52672                             }
   52673                             Alignment align =
   52674                                 Align_align_3_Decode((instr >> 4) & 0x3);
   52675                             if (dt.Is(kDataTypeValueInvalid) ||
   52676                                 align.Is(kBadAlignment)) {
   52677                               UnallocatedA32(instr);
   52678                               return;
   52679                             }
   52680                             unsigned first = ExtractDRegister(instr, 22, 12);
   52681                             unsigned length;
   52682                             SpacingType spacing;
   52683                             switch ((instr >> 8) & 0xf) {
   52684                               default:
   52685                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
   52686                               case 0x4:
   52687                                 length = 3;
   52688                                 spacing = kSingle;
   52689                                 break;
   52690                               case 0x5:
   52691                                 length = 3;
   52692                                 spacing = kDouble;
   52693                                 break;
   52694                             }
   52695                             unsigned last =
   52696                                 first +
   52697                                 (length - 1) * (spacing == kSingle ? 1 : 2);
   52698                             TransferType transfer = kMultipleLanes;
   52699                             unsigned rn = (instr >> 16) & 0xf;
   52700                             // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
   52701                             vld3(al,
   52702                                  dt,
   52703                                  NeonRegisterList(DRegister(first),
   52704                                                   DRegister(last),
   52705                                                   spacing,
   52706                                                   transfer),
   52707                                  AlignedMemOperand(Register(rn),
   52708                                                    align,
   52709                                                    PostIndex));
   52710                             break;
   52711                           }
   52712                           case 0x00000600: {
   52713                             // 0xf420060d
   52714                             if (((instr & 0xe20) == 0x620) ||
   52715                                 ((instr & 0xf30) == 0xa30)) {
   52716                               UnallocatedA32(instr);
   52717                               return;
   52718                             }
   52719                             DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
   52720                             if (dt.Is(kDataTypeValueInvalid)) {
   52721                               UnallocatedA32(instr);
   52722                               return;
   52723                             }
   52724                             Alignment align =
   52725                                 Align_align_1_Decode((instr >> 4) & 0x3);
   52726                             if (dt.Is(kDataTypeValueInvalid) ||
   52727                                 align.Is(kBadAlignment)) {
   52728                               UnallocatedA32(instr);
   52729                               return;
   52730                             }
   52731                             unsigned first = ExtractDRegister(instr, 22, 12);
   52732                             unsigned length;
   52733                             SpacingType spacing = kSingle;
   52734                             switch ((instr >> 8) & 0xf) {
   52735                               default:
   52736                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
   52737                               case 0x7:
   52738                                 length = 1;
   52739                                 break;
   52740                               case 0xa:
   52741                                 length = 2;
   52742                                 break;
   52743                               case 0x6:
   52744                                 length = 3;
   52745                                 break;
   52746                               case 0x2:
   52747                                 length = 4;
   52748                                 break;
   52749                             }
   52750                             unsigned last = first + length - 1;
   52751                             TransferType transfer = kMultipleLanes;
   52752                             unsigned rn = (instr >> 16) & 0xf;
   52753                             // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
   52754                             vld1(al,
   52755                                  dt,
   52756                                  NeonRegisterList(DRegister(first),
   52757                                                   DRegister(last),
   52758                                                   spacing,
   52759                                                   transfer),
   52760                                  AlignedMemOperand(Register(rn),
   52761                                                    align,
   52762                                                    PostIndex));
   52763                             break;
   52764                           }
   52765                           case 0x00000700: {
   52766                             // 0xf420070d
   52767                             if (((instr & 0xe20) == 0x620) ||
   52768                                 ((instr & 0xf30) == 0xa30)) {
   52769                               UnallocatedA32(instr);
   52770                               return;
   52771                             }
   52772                             DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
   52773                             if (dt.Is(kDataTypeValueInvalid)) {
   52774                               UnallocatedA32(instr);
   52775                               return;
   52776                             }
   52777                             Alignment align =
   52778                                 Align_align_1_Decode((instr >> 4) & 0x3);
   52779                             if (dt.Is(kDataTypeValueInvalid) ||
   52780                                 align.Is(kBadAlignment)) {
   52781                               UnallocatedA32(instr);
   52782                               return;
   52783                             }
   52784                             unsigned first = ExtractDRegister(instr, 22, 12);
   52785                             unsigned length;
   52786                             SpacingType spacing = kSingle;
   52787                             switch ((instr >> 8) & 0xf) {
   52788                               default:
   52789                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
   52790                               case 0x7:
   52791                                 length = 1;
   52792                                 break;
   52793                               case 0xa:
   52794                                 length = 2;
   52795                                 break;
   52796                               case 0x6:
   52797                                 length = 3;
   52798                                 break;
   52799                               case 0x2:
   52800                                 length = 4;
   52801                                 break;
   52802                             }
   52803                             unsigned last = first + length - 1;
   52804                             TransferType transfer = kMultipleLanes;
   52805                             unsigned rn = (instr >> 16) & 0xf;
   52806                             // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
   52807                             vld1(al,
   52808                                  dt,
   52809                                  NeonRegisterList(DRegister(first),
   52810                                                   DRegister(last),
   52811                                                   spacing,
   52812                                                   transfer),
   52813                                  AlignedMemOperand(Register(rn),
   52814                                                    align,
   52815                                                    PostIndex));
   52816                             break;
   52817                           }
   52818                           case 0x00000800: {
   52819                             // 0xf420080d
   52820                             if (((instr & 0xe30) == 0x830)) {
   52821                               UnallocatedA32(instr);
   52822                               return;
   52823                             }
   52824                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
   52825                             if (dt.Is(kDataTypeValueInvalid)) {
   52826                               UnallocatedA32(instr);
   52827                               return;
   52828                             }
   52829                             Alignment align =
   52830                                 Align_align_2_Decode((instr >> 4) & 0x3);
   52831                             if (dt.Is(kDataTypeValueInvalid) ||
   52832                                 align.Is(kBadAlignment)) {
   52833                               UnallocatedA32(instr);
   52834                               return;
   52835                             }
   52836                             unsigned first = ExtractDRegister(instr, 22, 12);
   52837                             unsigned length;
   52838                             SpacingType spacing;
   52839                             switch ((instr >> 8) & 0xf) {
   52840                               default:
   52841                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
   52842                               case 0x8:
   52843                                 length = 2;
   52844                                 spacing = kSingle;
   52845                                 break;
   52846                               case 0x9:
   52847                                 length = 2;
   52848                                 spacing = kDouble;
   52849                                 break;
   52850                               case 0x3:
   52851                                 length = 4;
   52852                                 spacing = kSingle;
   52853                                 break;
   52854                             }
   52855                             unsigned last =
   52856                                 first +
   52857                                 (length - 1) * (spacing == kSingle ? 1 : 2);
   52858                             TransferType transfer = kMultipleLanes;
   52859                             unsigned rn = (instr >> 16) & 0xf;
   52860                             // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
   52861                             vld2(al,
   52862                                  dt,
   52863                                  NeonRegisterList(DRegister(first),
   52864                                                   DRegister(last),
   52865                                                   spacing,
   52866                                                   transfer),
   52867                                  AlignedMemOperand(Register(rn),
   52868                                                    align,
   52869                                                    PostIndex));
   52870                             break;
   52871                           }
   52872                           case 0x00000900: {
   52873                             // 0xf420090d
   52874                             if (((instr & 0xe30) == 0x830)) {
   52875                               UnallocatedA32(instr);
   52876                               return;
   52877                             }
   52878                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
   52879                             if (dt.Is(kDataTypeValueInvalid)) {
   52880                               UnallocatedA32(instr);
   52881                               return;
   52882                             }
   52883                             Alignment align =
   52884                                 Align_align_2_Decode((instr >> 4) & 0x3);
   52885                             if (dt.Is(kDataTypeValueInvalid) ||
   52886                                 align.Is(kBadAlignment)) {
   52887                               UnallocatedA32(instr);
   52888                               return;
   52889                             }
   52890                             unsigned first = ExtractDRegister(instr, 22, 12);
   52891                             unsigned length;
   52892                             SpacingType spacing;
   52893                             switch ((instr >> 8) & 0xf) {
   52894                               default:
   52895                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
   52896                               case 0x8:
   52897                                 length = 2;
   52898                                 spacing = kSingle;
   52899                                 break;
   52900                               case 0x9:
   52901                                 length = 2;
   52902                                 spacing = kDouble;
   52903                                 break;
   52904                               case 0x3:
   52905                                 length = 4;
   52906                                 spacing = kSingle;
   52907                                 break;
   52908                             }
   52909                             unsigned last =
   52910                                 first +
   52911                                 (length - 1) * (spacing == kSingle ? 1 : 2);
   52912                             TransferType transfer = kMultipleLanes;
   52913                             unsigned rn = (instr >> 16) & 0xf;
   52914                             // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
   52915                             vld2(al,
   52916                                  dt,
   52917                                  NeonRegisterList(DRegister(first),
   52918                                                   DRegister(last),
   52919                                                   spacing,
   52920                                                   transfer),
   52921                                  AlignedMemOperand(Register(rn),
   52922                                                    align,
   52923                                                    PostIndex));
   52924                             break;
   52925                           }
   52926                           case 0x00000a00: {
   52927                             // 0xf4200a0d
   52928                             if (((instr & 0xe20) == 0x620) ||
   52929                                 ((instr & 0xf30) == 0xa30)) {
   52930                               UnallocatedA32(instr);
   52931                               return;
   52932                             }
   52933                             DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
   52934                             if (dt.Is(kDataTypeValueInvalid)) {
   52935                               UnallocatedA32(instr);
   52936                               return;
   52937                             }
   52938                             Alignment align =
   52939                                 Align_align_1_Decode((instr >> 4) & 0x3);
   52940                             if (dt.Is(kDataTypeValueInvalid) ||
   52941                                 align.Is(kBadAlignment)) {
   52942                               UnallocatedA32(instr);
   52943                               return;
   52944                             }
   52945                             unsigned first = ExtractDRegister(instr, 22, 12);
   52946                             unsigned length;
   52947                             SpacingType spacing = kSingle;
   52948                             switch ((instr >> 8) & 0xf) {
   52949                               default:
   52950                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
   52951                               case 0x7:
   52952                                 length = 1;
   52953                                 break;
   52954                               case 0xa:
   52955                                 length = 2;
   52956                                 break;
   52957                               case 0x6:
   52958                                 length = 3;
   52959                                 break;
   52960                               case 0x2:
   52961                                 length = 4;
   52962                                 break;
   52963                             }
   52964                             unsigned last = first + length - 1;
   52965                             TransferType transfer = kMultipleLanes;
   52966                             unsigned rn = (instr >> 16) & 0xf;
   52967                             // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
   52968                             vld1(al,
   52969                                  dt,
   52970                                  NeonRegisterList(DRegister(first),
   52971                                                   DRegister(last),
   52972                                                   spacing,
   52973                                                   transfer),
   52974                                  AlignedMemOperand(Register(rn),
   52975                                                    align,
   52976                                                    PostIndex));
   52977                             break;
   52978                           }
   52979                           default:
   52980                             UnallocatedA32(instr);
   52981                             break;
   52982                         }
   52983                         break;
   52984                       }
   52985                       case 0x00000002: {
   52986                         // 0xf420000f
   52987                         switch (instr & 0x00000f00) {
   52988                           case 0x00000000: {
   52989                             // 0xf420000d
   52990                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
   52991                             if (dt.Is(kDataTypeValueInvalid)) {
   52992                               UnallocatedA32(instr);
   52993                               return;
   52994                             }
   52995                             Alignment align =
   52996                                 Align_align_4_Decode((instr >> 4) & 0x3);
   52997                             if (dt.Is(kDataTypeValueInvalid) ||
   52998                                 align.Is(kBadAlignment)) {
   52999                               UnallocatedA32(instr);
   53000                               return;
   53001                             }
   53002                             unsigned first = ExtractDRegister(instr, 22, 12);
   53003                             unsigned length;
   53004                             SpacingType spacing;
   53005                             switch ((instr >> 8) & 0xf) {
   53006                               default:
   53007                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
   53008                               case 0x0:
   53009                                 length = 4;
   53010                                 spacing = kSingle;
   53011                                 break;
   53012                               case 0x1:
   53013                                 length = 4;
   53014                                 spacing = kDouble;
   53015                                 break;
   53016                             }
   53017                             unsigned last =
   53018                                 first +
   53019                                 (length - 1) * (spacing == kSingle ? 1 : 2);
   53020                             TransferType transfer = kMultipleLanes;
   53021                             unsigned rn = (instr >> 16) & 0xf;
   53022                             // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
   53023                             vld4(al,
   53024                                  dt,
   53025                                  NeonRegisterList(DRegister(first),
   53026                                                   DRegister(last),
   53027                                                   spacing,
   53028                                                   transfer),
   53029                                  AlignedMemOperand(Register(rn),
   53030                                                    align,
   53031                                                    Offset));
   53032                             break;
   53033                           }
   53034                           case 0x00000100: {
   53035                             // 0xf420010d
   53036                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
   53037                             if (dt.Is(kDataTypeValueInvalid)) {
   53038                               UnallocatedA32(instr);
   53039                               return;
   53040                             }
   53041                             Alignment align =
   53042                                 Align_align_4_Decode((instr >> 4) & 0x3);
   53043                             if (dt.Is(kDataTypeValueInvalid) ||
   53044                                 align.Is(kBadAlignment)) {
   53045                               UnallocatedA32(instr);
   53046                               return;
   53047                             }
   53048                             unsigned first = ExtractDRegister(instr, 22, 12);
   53049                             unsigned length;
   53050                             SpacingType spacing;
   53051                             switch ((instr >> 8) & 0xf) {
   53052                               default:
   53053                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
   53054                               case 0x0:
   53055                                 length = 4;
   53056                                 spacing = kSingle;
   53057                                 break;
   53058                               case 0x1:
   53059                                 length = 4;
   53060                                 spacing = kDouble;
   53061                                 break;
   53062                             }
   53063                             unsigned last =
   53064                                 first +
   53065                                 (length - 1) * (spacing == kSingle ? 1 : 2);
   53066                             TransferType transfer = kMultipleLanes;
   53067                             unsigned rn = (instr >> 16) & 0xf;
   53068                             // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
   53069                             vld4(al,
   53070                                  dt,
   53071                                  NeonRegisterList(DRegister(first),
   53072                                                   DRegister(last),
   53073                                                   spacing,
   53074                                                   transfer),
   53075                                  AlignedMemOperand(Register(rn),
   53076                                                    align,
   53077                                                    Offset));
   53078                             break;
   53079                           }
   53080                           case 0x00000200: {
   53081                             // 0xf420020d
   53082                             if (((instr & 0xe20) == 0x620) ||
   53083                                 ((instr & 0xf30) == 0xa30)) {
   53084                               UnallocatedA32(instr);
   53085                               return;
   53086                             }
   53087                             DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
   53088                             if (dt.Is(kDataTypeValueInvalid)) {
   53089                               UnallocatedA32(instr);
   53090                               return;
   53091                             }
   53092                             Alignment align =
   53093                                 Align_align_1_Decode((instr >> 4) & 0x3);
   53094                             if (dt.Is(kDataTypeValueInvalid) ||
   53095                                 align.Is(kBadAlignment)) {
   53096                               UnallocatedA32(instr);
   53097                               return;
   53098                             }
   53099                             unsigned first = ExtractDRegister(instr, 22, 12);
   53100                             unsigned length;
   53101                             SpacingType spacing = kSingle;
   53102                             switch ((instr >> 8) & 0xf) {
   53103                               default:
   53104                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
   53105                               case 0x7:
   53106                                 length = 1;
   53107                                 break;
   53108                               case 0xa:
   53109                                 length = 2;
   53110                                 break;
   53111                               case 0x6:
   53112                                 length = 3;
   53113                                 break;
   53114                               case 0x2:
   53115                                 length = 4;
   53116                                 break;
   53117                             }
   53118                             unsigned last = first + length - 1;
   53119                             TransferType transfer = kMultipleLanes;
   53120                             unsigned rn = (instr >> 16) & 0xf;
   53121                             // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
   53122                             vld1(al,
   53123                                  dt,
   53124                                  NeonRegisterList(DRegister(first),
   53125                                                   DRegister(last),
   53126                                                   spacing,
   53127                                                   transfer),
   53128                                  AlignedMemOperand(Register(rn),
   53129                                                    align,
   53130                                                    Offset));
   53131                             break;
   53132                           }
   53133                           case 0x00000300: {
   53134                             // 0xf420030d
   53135                             if (((instr & 0xe30) == 0x830)) {
   53136                               UnallocatedA32(instr);
   53137                               return;
   53138                             }
   53139                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
   53140                             if (dt.Is(kDataTypeValueInvalid)) {
   53141                               UnallocatedA32(instr);
   53142                               return;
   53143                             }
   53144                             Alignment align =
   53145                                 Align_align_2_Decode((instr >> 4) & 0x3);
   53146                             if (dt.Is(kDataTypeValueInvalid) ||
   53147                                 align.Is(kBadAlignment)) {
   53148                               UnallocatedA32(instr);
   53149                               return;
   53150                             }
   53151                             unsigned first = ExtractDRegister(instr, 22, 12);
   53152                             unsigned length;
   53153                             SpacingType spacing;
   53154                             switch ((instr >> 8) & 0xf) {
   53155                               default:
   53156                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
   53157                               case 0x8:
   53158                                 length = 2;
   53159                                 spacing = kSingle;
   53160                                 break;
   53161                               case 0x9:
   53162                                 length = 2;
   53163                                 spacing = kDouble;
   53164                                 break;
   53165                               case 0x3:
   53166                                 length = 4;
   53167                                 spacing = kSingle;
   53168                                 break;
   53169                             }
   53170                             unsigned last =
   53171                                 first +
   53172                                 (length - 1) * (spacing == kSingle ? 1 : 2);
   53173                             TransferType transfer = kMultipleLanes;
   53174                             unsigned rn = (instr >> 16) & 0xf;
   53175                             // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
   53176                             vld2(al,
   53177                                  dt,
   53178                                  NeonRegisterList(DRegister(first),
   53179                                                   DRegister(last),
   53180                                                   spacing,
   53181                                                   transfer),
   53182                                  AlignedMemOperand(Register(rn),
   53183                                                    align,
   53184                                                    Offset));
   53185                             break;
   53186                           }
   53187                           case 0x00000400: {
   53188                             // 0xf420040d
   53189                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
   53190                             if (dt.Is(kDataTypeValueInvalid)) {
   53191                               UnallocatedA32(instr);
   53192                               return;
   53193                             }
   53194                             Alignment align =
   53195                                 Align_align_3_Decode((instr >> 4) & 0x3);
   53196                             if (dt.Is(kDataTypeValueInvalid) ||
   53197                                 align.Is(kBadAlignment)) {
   53198                               UnallocatedA32(instr);
   53199                               return;
   53200                             }
   53201                             unsigned first = ExtractDRegister(instr, 22, 12);
   53202                             unsigned length;
   53203                             SpacingType spacing;
   53204                             switch ((instr >> 8) & 0xf) {
   53205                               default:
   53206                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
   53207                               case 0x4:
   53208                                 length = 3;
   53209                                 spacing = kSingle;
   53210                                 break;
   53211                               case 0x5:
   53212                                 length = 3;
   53213                                 spacing = kDouble;
   53214                                 break;
   53215                             }
   53216                             unsigned last =
   53217                                 first +
   53218                                 (length - 1) * (spacing == kSingle ? 1 : 2);
   53219                             TransferType transfer = kMultipleLanes;
   53220                             unsigned rn = (instr >> 16) & 0xf;
   53221                             // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
   53222                             vld3(al,
   53223                                  dt,
   53224                                  NeonRegisterList(DRegister(first),
   53225                                                   DRegister(last),
   53226                                                   spacing,
   53227                                                   transfer),
   53228                                  AlignedMemOperand(Register(rn),
   53229                                                    align,
   53230                                                    Offset));
   53231                             break;
   53232                           }
   53233                           case 0x00000500: {
   53234                             // 0xf420050d
   53235                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
   53236                             if (dt.Is(kDataTypeValueInvalid)) {
   53237                               UnallocatedA32(instr);
   53238                               return;
   53239                             }
   53240                             Alignment align =
   53241                                 Align_align_3_Decode((instr >> 4) & 0x3);
   53242                             if (dt.Is(kDataTypeValueInvalid) ||
   53243                                 align.Is(kBadAlignment)) {
   53244                               UnallocatedA32(instr);
   53245                               return;
   53246                             }
   53247                             unsigned first = ExtractDRegister(instr, 22, 12);
   53248                             unsigned length;
   53249                             SpacingType spacing;
   53250                             switch ((instr >> 8) & 0xf) {
   53251                               default:
   53252                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
   53253                               case 0x4:
   53254                                 length = 3;
   53255                                 spacing = kSingle;
   53256                                 break;
   53257                               case 0x5:
   53258                                 length = 3;
   53259                                 spacing = kDouble;
   53260                                 break;
   53261                             }
   53262                             unsigned last =
   53263                                 first +
   53264                                 (length - 1) * (spacing == kSingle ? 1 : 2);
   53265                             TransferType transfer = kMultipleLanes;
   53266                             unsigned rn = (instr >> 16) & 0xf;
   53267                             // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
   53268                             vld3(al,
   53269                                  dt,
   53270                                  NeonRegisterList(DRegister(first),
   53271                                                   DRegister(last),
   53272                                                   spacing,
   53273                                                   transfer),
   53274                                  AlignedMemOperand(Register(rn),
   53275                                                    align,
   53276                                                    Offset));
   53277                             break;
   53278                           }
   53279                           case 0x00000600: {
   53280                             // 0xf420060d
   53281                             if (((instr & 0xe20) == 0x620) ||
   53282                                 ((instr & 0xf30) == 0xa30)) {
   53283                               UnallocatedA32(instr);
   53284                               return;
   53285                             }
   53286                             DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
   53287                             if (dt.Is(kDataTypeValueInvalid)) {
   53288                               UnallocatedA32(instr);
   53289                               return;
   53290                             }
   53291                             Alignment align =
   53292                                 Align_align_1_Decode((instr >> 4) & 0x3);
   53293                             if (dt.Is(kDataTypeValueInvalid) ||
   53294                                 align.Is(kBadAlignment)) {
   53295                               UnallocatedA32(instr);
   53296                               return;
   53297                             }
   53298                             unsigned first = ExtractDRegister(instr, 22, 12);
   53299                             unsigned length;
   53300                             SpacingType spacing = kSingle;
   53301                             switch ((instr >> 8) & 0xf) {
   53302                               default:
   53303                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
   53304                               case 0x7:
   53305                                 length = 1;
   53306                                 break;
   53307                               case 0xa:
   53308                                 length = 2;
   53309                                 break;
   53310                               case 0x6:
   53311                                 length = 3;
   53312                                 break;
   53313                               case 0x2:
   53314                                 length = 4;
   53315                                 break;
   53316                             }
   53317                             unsigned last = first + length - 1;
   53318                             TransferType transfer = kMultipleLanes;
   53319                             unsigned rn = (instr >> 16) & 0xf;
   53320                             // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
   53321                             vld1(al,
   53322                                  dt,
   53323                                  NeonRegisterList(DRegister(first),
   53324                                                   DRegister(last),
   53325                                                   spacing,
   53326                                                   transfer),
   53327                                  AlignedMemOperand(Register(rn),
   53328                                                    align,
   53329                                                    Offset));
   53330                             break;
   53331                           }
   53332                           case 0x00000700: {
   53333                             // 0xf420070d
   53334                             if (((instr & 0xe20) == 0x620) ||
   53335                                 ((instr & 0xf30) == 0xa30)) {
   53336                               UnallocatedA32(instr);
   53337                               return;
   53338                             }
   53339                             DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
   53340                             if (dt.Is(kDataTypeValueInvalid)) {
   53341                               UnallocatedA32(instr);
   53342                               return;
   53343                             }
   53344                             Alignment align =
   53345                                 Align_align_1_Decode((instr >> 4) & 0x3);
   53346                             if (dt.Is(kDataTypeValueInvalid) ||
   53347                                 align.Is(kBadAlignment)) {
   53348                               UnallocatedA32(instr);
   53349                               return;
   53350                             }
   53351                             unsigned first = ExtractDRegister(instr, 22, 12);
   53352                             unsigned length;
   53353                             SpacingType spacing = kSingle;
   53354                             switch ((instr >> 8) & 0xf) {
   53355                               default:
   53356                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
   53357                               case 0x7:
   53358                                 length = 1;
   53359                                 break;
   53360                               case 0xa:
   53361                                 length = 2;
   53362                                 break;
   53363                               case 0x6:
   53364                                 length = 3;
   53365                                 break;
   53366                               case 0x2:
   53367                                 length = 4;
   53368                                 break;
   53369                             }
   53370                             unsigned last = first + length - 1;
   53371                             TransferType transfer = kMultipleLanes;
   53372                             unsigned rn = (instr >> 16) & 0xf;
   53373                             // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
   53374                             vld1(al,
   53375                                  dt,
   53376                                  NeonRegisterList(DRegister(first),
   53377                                                   DRegister(last),
   53378                                                   spacing,
   53379                                                   transfer),
   53380                                  AlignedMemOperand(Register(rn),
   53381                                                    align,
   53382                                                    Offset));
   53383                             break;
   53384                           }
   53385                           case 0x00000800: {
   53386                             // 0xf420080d
   53387                             if (((instr & 0xe30) == 0x830)) {
   53388                               UnallocatedA32(instr);
   53389                               return;
   53390                             }
   53391                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
   53392                             if (dt.Is(kDataTypeValueInvalid)) {
   53393                               UnallocatedA32(instr);
   53394                               return;
   53395                             }
   53396                             Alignment align =
   53397                                 Align_align_2_Decode((instr >> 4) & 0x3);
   53398                             if (dt.Is(kDataTypeValueInvalid) ||
   53399                                 align.Is(kBadAlignment)) {
   53400                               UnallocatedA32(instr);
   53401                               return;
   53402                             }
   53403                             unsigned first = ExtractDRegister(instr, 22, 12);
   53404                             unsigned length;
   53405                             SpacingType spacing;
   53406                             switch ((instr >> 8) & 0xf) {
   53407                               default:
   53408                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
   53409                               case 0x8:
   53410                                 length = 2;
   53411                                 spacing = kSingle;
   53412                                 break;
   53413                               case 0x9:
   53414                                 length = 2;
   53415                                 spacing = kDouble;
   53416                                 break;
   53417                               case 0x3:
   53418                                 length = 4;
   53419                                 spacing = kSingle;
   53420                                 break;
   53421                             }
   53422                             unsigned last =
   53423                                 first +
   53424                                 (length - 1) * (spacing == kSingle ? 1 : 2);
   53425                             TransferType transfer = kMultipleLanes;
   53426                             unsigned rn = (instr >> 16) & 0xf;
   53427                             // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
   53428                             vld2(al,
   53429                                  dt,
   53430                                  NeonRegisterList(DRegister(first),
   53431                                                   DRegister(last),
   53432                                                   spacing,
   53433                                                   transfer),
   53434                                  AlignedMemOperand(Register(rn),
   53435                                                    align,
   53436                                                    Offset));
   53437                             break;
   53438                           }
   53439                           case 0x00000900: {
   53440                             // 0xf420090d
   53441                             if (((instr & 0xe30) == 0x830)) {
   53442                               UnallocatedA32(instr);
   53443                               return;
   53444                             }
   53445                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
   53446                             if (dt.Is(kDataTypeValueInvalid)) {
   53447                               UnallocatedA32(instr);
   53448                               return;
   53449                             }
   53450                             Alignment align =
   53451                                 Align_align_2_Decode((instr >> 4) & 0x3);
   53452                             if (dt.Is(kDataTypeValueInvalid) ||
   53453                                 align.Is(kBadAlignment)) {
   53454                               UnallocatedA32(instr);
   53455                               return;
   53456                             }
   53457                             unsigned first = ExtractDRegister(instr, 22, 12);
   53458                             unsigned length;
   53459                             SpacingType spacing;
   53460                             switch ((instr >> 8) & 0xf) {
   53461                               default:
   53462                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
   53463                               case 0x8:
   53464                                 length = 2;
   53465                                 spacing = kSingle;
   53466                                 break;
   53467                               case 0x9:
   53468                                 length = 2;
   53469                                 spacing = kDouble;
   53470                                 break;
   53471                               case 0x3:
   53472                                 length = 4;
   53473                                 spacing = kSingle;
   53474                                 break;
   53475                             }
   53476                             unsigned last =
   53477                                 first +
   53478                                 (length - 1) * (spacing == kSingle ? 1 : 2);
   53479                             TransferType transfer = kMultipleLanes;
   53480                             unsigned rn = (instr >> 16) & 0xf;
   53481                             // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
   53482                             vld2(al,
   53483                                  dt,
   53484                                  NeonRegisterList(DRegister(first),
   53485                                                   DRegister(last),
   53486                                                   spacing,
   53487                                                   transfer),
   53488                                  AlignedMemOperand(Register(rn),
   53489                                                    align,
   53490                                                    Offset));
   53491                             break;
   53492                           }
   53493                           case 0x00000a00: {
   53494                             // 0xf4200a0d
   53495                             if (((instr & 0xe20) == 0x620) ||
   53496                                 ((instr & 0xf30) == 0xa30)) {
   53497                               UnallocatedA32(instr);
   53498                               return;
   53499                             }
   53500                             DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
   53501                             if (dt.Is(kDataTypeValueInvalid)) {
   53502                               UnallocatedA32(instr);
   53503                               return;
   53504                             }
   53505                             Alignment align =
   53506                                 Align_align_1_Decode((instr >> 4) & 0x3);
   53507                             if (dt.Is(kDataTypeValueInvalid) ||
   53508                                 align.Is(kBadAlignment)) {
   53509                               UnallocatedA32(instr);
   53510                               return;
   53511                             }
   53512                             unsigned first = ExtractDRegister(instr, 22, 12);
   53513                             unsigned length;
   53514                             SpacingType spacing = kSingle;
   53515                             switch ((instr >> 8) & 0xf) {
   53516                               default:
   53517                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
   53518                               case 0x7:
   53519                                 length = 1;
   53520                                 break;
   53521                               case 0xa:
   53522                                 length = 2;
   53523                                 break;
   53524                               case 0x6:
   53525                                 length = 3;
   53526                                 break;
   53527                               case 0x2:
   53528                                 length = 4;
   53529                                 break;
   53530                             }
   53531                             unsigned last = first + length - 1;
   53532                             TransferType transfer = kMultipleLanes;
   53533                             unsigned rn = (instr >> 16) & 0xf;
   53534                             // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
   53535                             vld1(al,
   53536                                  dt,
   53537                                  NeonRegisterList(DRegister(first),
   53538                                                   DRegister(last),
   53539                                                   spacing,
   53540                                                   transfer),
   53541                                  AlignedMemOperand(Register(rn),
   53542                                                    align,
   53543                                                    Offset));
   53544                             break;
   53545                           }
   53546                           default:
   53547                             UnallocatedA32(instr);
   53548                             break;
   53549                         }
   53550                         break;
   53551                       }
   53552                     }
   53553                     break;
   53554                   }
   53555                   default: {
   53556                     switch (instr & 0x00000f00) {
   53557                       case 0x00000000: {
   53558                         // 0xf4200000
   53559                         if (((instr & 0xd) == 0xd)) {
   53560                           UnallocatedA32(instr);
   53561                           return;
   53562                         }
   53563                         DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
   53564                         if (dt.Is(kDataTypeValueInvalid)) {
   53565                           UnallocatedA32(instr);
   53566                           return;
   53567                         }
   53568                         Alignment align =
   53569                             Align_align_4_Decode((instr >> 4) & 0x3);
   53570                         if (dt.Is(kDataTypeValueInvalid) ||
   53571                             align.Is(kBadAlignment)) {
   53572                           UnallocatedA32(instr);
   53573                           return;
   53574                         }
   53575                         unsigned first = ExtractDRegister(instr, 22, 12);
   53576                         unsigned length;
   53577                         SpacingType spacing;
   53578                         switch ((instr >> 8) & 0xf) {
   53579                           default:
   53580                             VIXL_UNREACHABLE_OR_FALLTHROUGH();
   53581                           case 0x0:
   53582                             length = 4;
   53583                             spacing = kSingle;
   53584                             break;
   53585                           case 0x1:
   53586                             length = 4;
   53587                             spacing = kDouble;
   53588                             break;
   53589                         }
   53590                         unsigned last =
   53591                             first + (length - 1) * (spacing == kSingle ? 1 : 2);
   53592                         TransferType transfer = kMultipleLanes;
   53593                         unsigned rn = (instr >> 16) & 0xf;
   53594                         unsigned rm = instr & 0xf;
   53595                         // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
   53596                         vld4(al,
   53597                              dt,
   53598                              NeonRegisterList(DRegister(first),
   53599                                               DRegister(last),
   53600                                               spacing,
   53601                                               transfer),
   53602                              AlignedMemOperand(Register(rn),
   53603                                                align,
   53604                                                Register(rm),
   53605                                                PostIndex));
   53606                         break;
   53607                       }
   53608                       case 0x00000100: {
   53609                         // 0xf4200100
   53610                         if (((instr & 0xd) == 0xd)) {
   53611                           UnallocatedA32(instr);
   53612                           return;
   53613                         }
   53614                         DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
   53615                         if (dt.Is(kDataTypeValueInvalid)) {
   53616                           UnallocatedA32(instr);
   53617                           return;
   53618                         }
   53619                         Alignment align =
   53620                             Align_align_4_Decode((instr >> 4) & 0x3);
   53621                         if (dt.Is(kDataTypeValueInvalid) ||
   53622                             align.Is(kBadAlignment)) {
   53623                           UnallocatedA32(instr);
   53624                           return;
   53625                         }
   53626                         unsigned first = ExtractDRegister(instr, 22, 12);
   53627                         unsigned length;
   53628                         SpacingType spacing;
   53629                         switch ((instr >> 8) & 0xf) {
   53630                           default:
   53631                             VIXL_UNREACHABLE_OR_FALLTHROUGH();
   53632                           case 0x0:
   53633                             length = 4;
   53634                             spacing = kSingle;
   53635                             break;
   53636                           case 0x1:
   53637                             length = 4;
   53638                             spacing = kDouble;
   53639                             break;
   53640                         }
   53641                         unsigned last =
   53642                             first + (length - 1) * (spacing == kSingle ? 1 : 2);
   53643                         TransferType transfer = kMultipleLanes;
   53644                         unsigned rn = (instr >> 16) & 0xf;
   53645                         unsigned rm = instr & 0xf;
   53646                         // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
   53647                         vld4(al,
   53648                              dt,
   53649                              NeonRegisterList(DRegister(first),
   53650                                               DRegister(last),
   53651                                               spacing,
   53652                                               transfer),
   53653                              AlignedMemOperand(Register(rn),
   53654                                                align,
   53655                                                Register(rm),
   53656                                                PostIndex));
   53657                         break;
   53658                       }
   53659                       case 0x00000200: {
   53660                         // 0xf4200200
   53661                         if (((instr & 0xd) == 0xd) ||
   53662                             ((instr & 0xe20) == 0x620) ||
   53663                             ((instr & 0xf30) == 0xa30)) {
   53664                           UnallocatedA32(instr);
   53665                           return;
   53666                         }
   53667                         DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
   53668                         if (dt.Is(kDataTypeValueInvalid)) {
   53669                           UnallocatedA32(instr);
   53670                           return;
   53671                         }
   53672                         Alignment align =
   53673                             Align_align_1_Decode((instr >> 4) & 0x3);
   53674                         if (dt.Is(kDataTypeValueInvalid) ||
   53675                             align.Is(kBadAlignment)) {
   53676                           UnallocatedA32(instr);
   53677                           return;
   53678                         }
   53679                         unsigned first = ExtractDRegister(instr, 22, 12);
   53680                         unsigned length;
   53681                         SpacingType spacing = kSingle;
   53682                         switch ((instr >> 8) & 0xf) {
   53683                           default:
   53684                             VIXL_UNREACHABLE_OR_FALLTHROUGH();
   53685                           case 0x7:
   53686                             length = 1;
   53687                             break;
   53688                           case 0xa:
   53689                             length = 2;
   53690                             break;
   53691                           case 0x6:
   53692                             length = 3;
   53693                             break;
   53694                           case 0x2:
   53695                             length = 4;
   53696                             break;
   53697                         }
   53698                         unsigned last = first + length - 1;
   53699                         TransferType transfer = kMultipleLanes;
   53700                         unsigned rn = (instr >> 16) & 0xf;
   53701                         unsigned rm = instr & 0xf;
   53702                         // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
   53703                         vld1(al,
   53704                              dt,
   53705                              NeonRegisterList(DRegister(first),
   53706                                               DRegister(last),
   53707                                               spacing,
   53708                                               transfer),
   53709                              AlignedMemOperand(Register(rn),
   53710                                                align,
   53711                                                Register(rm),
   53712                                                PostIndex));
   53713                         break;
   53714                       }
   53715                       case 0x00000300: {
   53716                         // 0xf4200300
   53717                         if (((instr & 0xd) == 0xd) ||
   53718                             ((instr & 0xe30) == 0x830)) {
   53719                           UnallocatedA32(instr);
   53720                           return;
   53721                         }
   53722                         DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
   53723                         if (dt.Is(kDataTypeValueInvalid)) {
   53724                           UnallocatedA32(instr);
   53725                           return;
   53726                         }
   53727                         Alignment align =
   53728                             Align_align_2_Decode((instr >> 4) & 0x3);
   53729                         if (dt.Is(kDataTypeValueInvalid) ||
   53730                             align.Is(kBadAlignment)) {
   53731                           UnallocatedA32(instr);
   53732                           return;
   53733                         }
   53734                         unsigned first = ExtractDRegister(instr, 22, 12);
   53735                         unsigned length;
   53736                         SpacingType spacing;
   53737                         switch ((instr >> 8) & 0xf) {
   53738                           default:
   53739                             VIXL_UNREACHABLE_OR_FALLTHROUGH();
   53740                           case 0x8:
   53741                             length = 2;
   53742                             spacing = kSingle;
   53743                             break;
   53744                           case 0x9:
   53745                             length = 2;
   53746                             spacing = kDouble;
   53747                             break;
   53748                           case 0x3:
   53749                             length = 4;
   53750                             spacing = kSingle;
   53751                             break;
   53752                         }
   53753                         unsigned last =
   53754                             first + (length - 1) * (spacing == kSingle ? 1 : 2);
   53755                         TransferType transfer = kMultipleLanes;
   53756                         unsigned rn = (instr >> 16) & 0xf;
   53757                         unsigned rm = instr & 0xf;
   53758                         // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
   53759                         vld2(al,
   53760                              dt,
   53761                              NeonRegisterList(DRegister(first),
   53762                                               DRegister(last),
   53763                                               spacing,
   53764                                               transfer),
   53765                              AlignedMemOperand(Register(rn),
   53766                                                align,
   53767                                                Register(rm),
   53768                                                PostIndex));
   53769                         break;
   53770                       }
   53771                       case 0x00000400: {
   53772                         // 0xf4200400
   53773                         if (((instr & 0xd) == 0xd)) {
   53774                           UnallocatedA32(instr);
   53775                           return;
   53776                         }
   53777                         DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
   53778                         if (dt.Is(kDataTypeValueInvalid)) {
   53779                           UnallocatedA32(instr);
   53780                           return;
   53781                         }
   53782                         Alignment align =
   53783                             Align_align_3_Decode((instr >> 4) & 0x3);
   53784                         if (dt.Is(kDataTypeValueInvalid) ||
   53785                             align.Is(kBadAlignment)) {
   53786                           UnallocatedA32(instr);
   53787                           return;
   53788                         }
   53789                         unsigned first = ExtractDRegister(instr, 22, 12);
   53790                         unsigned length;
   53791                         SpacingType spacing;
   53792                         switch ((instr >> 8) & 0xf) {
   53793                           default:
   53794                             VIXL_UNREACHABLE_OR_FALLTHROUGH();
   53795                           case 0x4:
   53796                             length = 3;
   53797                             spacing = kSingle;
   53798                             break;
   53799                           case 0x5:
   53800                             length = 3;
   53801                             spacing = kDouble;
   53802                             break;
   53803                         }
   53804                         unsigned last =
   53805                             first + (length - 1) * (spacing == kSingle ? 1 : 2);
   53806                         TransferType transfer = kMultipleLanes;
   53807                         unsigned rn = (instr >> 16) & 0xf;
   53808                         unsigned rm = instr & 0xf;
   53809                         // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
   53810                         vld3(al,
   53811                              dt,
   53812                              NeonRegisterList(DRegister(first),
   53813                                               DRegister(last),
   53814                                               spacing,
   53815                                               transfer),
   53816                              AlignedMemOperand(Register(rn),
   53817                                                align,
   53818                                                Register(rm),
   53819                                                PostIndex));
   53820                         break;
   53821                       }
   53822                       case 0x00000500: {
   53823                         // 0xf4200500
   53824                         if (((instr & 0xd) == 0xd)) {
   53825                           UnallocatedA32(instr);
   53826                           return;
   53827                         }
   53828                         DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
   53829                         if (dt.Is(kDataTypeValueInvalid)) {
   53830                           UnallocatedA32(instr);
   53831                           return;
   53832                         }
   53833                         Alignment align =
   53834                             Align_align_3_Decode((instr >> 4) & 0x3);
   53835                         if (dt.Is(kDataTypeValueInvalid) ||
   53836                             align.Is(kBadAlignment)) {
   53837                           UnallocatedA32(instr);
   53838                           return;
   53839                         }
   53840                         unsigned first = ExtractDRegister(instr, 22, 12);
   53841                         unsigned length;
   53842                         SpacingType spacing;
   53843                         switch ((instr >> 8) & 0xf) {
   53844                           default:
   53845                             VIXL_UNREACHABLE_OR_FALLTHROUGH();
   53846                           case 0x4:
   53847                             length = 3;
   53848                             spacing = kSingle;
   53849                             break;
   53850                           case 0x5:
   53851                             length = 3;
   53852                             spacing = kDouble;
   53853                             break;
   53854                         }
   53855                         unsigned last =
   53856                             first + (length - 1) * (spacing == kSingle ? 1 : 2);
   53857                         TransferType transfer = kMultipleLanes;
   53858                         unsigned rn = (instr >> 16) & 0xf;
   53859                         unsigned rm = instr & 0xf;
   53860                         // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
   53861                         vld3(al,
   53862                              dt,
   53863                              NeonRegisterList(DRegister(first),
   53864                                               DRegister(last),
   53865                                               spacing,
   53866                                               transfer),
   53867                              AlignedMemOperand(Register(rn),
   53868                                                align,
   53869                                                Register(rm),
   53870                                                PostIndex));
   53871                         break;
   53872                       }
   53873                       case 0x00000600: {
   53874                         // 0xf4200600
   53875                         if (((instr & 0xd) == 0xd) ||
   53876                             ((instr & 0xe20) == 0x620) ||
   53877                             ((instr & 0xf30) == 0xa30)) {
   53878                           UnallocatedA32(instr);
   53879                           return;
   53880                         }
   53881                         DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
   53882                         if (dt.Is(kDataTypeValueInvalid)) {
   53883                           UnallocatedA32(instr);
   53884                           return;
   53885                         }
   53886                         Alignment align =
   53887                             Align_align_1_Decode((instr >> 4) & 0x3);
   53888                         if (dt.Is(kDataTypeValueInvalid) ||
   53889                             align.Is(kBadAlignment)) {
   53890                           UnallocatedA32(instr);
   53891                           return;
   53892                         }
   53893                         unsigned first = ExtractDRegister(instr, 22, 12);
   53894                         unsigned length;
   53895                         SpacingType spacing = kSingle;
   53896                         switch ((instr >> 8) & 0xf) {
   53897                           default:
   53898                             VIXL_UNREACHABLE_OR_FALLTHROUGH();
   53899                           case 0x7:
   53900                             length = 1;
   53901                             break;
   53902                           case 0xa:
   53903                             length = 2;
   53904                             break;
   53905                           case 0x6:
   53906                             length = 3;
   53907                             break;
   53908                           case 0x2:
   53909                             length = 4;
   53910                             break;
   53911                         }
   53912                         unsigned last = first + length - 1;
   53913                         TransferType transfer = kMultipleLanes;
   53914                         unsigned rn = (instr >> 16) & 0xf;
   53915                         unsigned rm = instr & 0xf;
   53916                         // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
   53917                         vld1(al,
   53918                              dt,
   53919                              NeonRegisterList(DRegister(first),
   53920                                               DRegister(last),
   53921                                               spacing,
   53922                                               transfer),
   53923                              AlignedMemOperand(Register(rn),
   53924                                                align,
   53925                                                Register(rm),
   53926                                                PostIndex));
   53927                         break;
   53928                       }
   53929                       case 0x00000700: {
   53930                         // 0xf4200700
   53931                         if (((instr & 0xd) == 0xd) ||
   53932                             ((instr & 0xe20) == 0x620) ||
   53933                             ((instr & 0xf30) == 0xa30)) {
   53934                           UnallocatedA32(instr);
   53935                           return;
   53936                         }
   53937                         DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
   53938                         if (dt.Is(kDataTypeValueInvalid)) {
   53939                           UnallocatedA32(instr);
   53940                           return;
   53941                         }
   53942                         Alignment align =
   53943                             Align_align_1_Decode((instr >> 4) & 0x3);
   53944                         if (dt.Is(kDataTypeValueInvalid) ||
   53945                             align.Is(kBadAlignment)) {
   53946                           UnallocatedA32(instr);
   53947                           return;
   53948                         }
   53949                         unsigned first = ExtractDRegister(instr, 22, 12);
   53950                         unsigned length;
   53951                         SpacingType spacing = kSingle;
   53952                         switch ((instr >> 8) & 0xf) {
   53953                           default:
   53954                             VIXL_UNREACHABLE_OR_FALLTHROUGH();
   53955                           case 0x7:
   53956                             length = 1;
   53957                             break;
   53958                           case 0xa:
   53959                             length = 2;
   53960                             break;
   53961                           case 0x6:
   53962                             length = 3;
   53963                             break;
   53964                           case 0x2:
   53965                             length = 4;
   53966                             break;
   53967                         }
   53968                         unsigned last = first + length - 1;
   53969                         TransferType transfer = kMultipleLanes;
   53970                         unsigned rn = (instr >> 16) & 0xf;
   53971                         unsigned rm = instr & 0xf;
   53972                         // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
   53973                         vld1(al,
   53974                              dt,
   53975                              NeonRegisterList(DRegister(first),
   53976                                               DRegister(last),
   53977                                               spacing,
   53978                                               transfer),
   53979                              AlignedMemOperand(Register(rn),
   53980                                                align,
   53981                                                Register(rm),
   53982                                                PostIndex));
   53983                         break;
   53984                       }
   53985                       case 0x00000800: {
   53986                         // 0xf4200800
   53987                         if (((instr & 0xd) == 0xd) ||
   53988                             ((instr & 0xe30) == 0x830)) {
   53989                           UnallocatedA32(instr);
   53990                           return;
   53991                         }
   53992                         DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
   53993                         if (dt.Is(kDataTypeValueInvalid)) {
   53994                           UnallocatedA32(instr);
   53995                           return;
   53996                         }
   53997                         Alignment align =
   53998                             Align_align_2_Decode((instr >> 4) & 0x3);
   53999                         if (dt.Is(kDataTypeValueInvalid) ||
   54000                             align.Is(kBadAlignment)) {
   54001                           UnallocatedA32(instr);
   54002                           return;
   54003                         }
   54004                         unsigned first = ExtractDRegister(instr, 22, 12);
   54005                         unsigned length;
   54006                         SpacingType spacing;
   54007                         switch ((instr >> 8) & 0xf) {
   54008                           default:
   54009                             VIXL_UNREACHABLE_OR_FALLTHROUGH();
   54010                           case 0x8:
   54011                             length = 2;
   54012                             spacing = kSingle;
   54013                             break;
   54014                           case 0x9:
   54015                             length = 2;
   54016                             spacing = kDouble;
   54017                             break;
   54018                           case 0x3:
   54019                             length = 4;
   54020                             spacing = kSingle;
   54021                             break;
   54022                         }
   54023                         unsigned last =
   54024                             first + (length - 1) * (spacing == kSingle ? 1 : 2);
   54025                         TransferType transfer = kMultipleLanes;
   54026                         unsigned rn = (instr >> 16) & 0xf;
   54027                         unsigned rm = instr & 0xf;
   54028                         // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
   54029                         vld2(al,
   54030                              dt,
   54031                              NeonRegisterList(DRegister(first),
   54032                                               DRegister(last),
   54033                                               spacing,
   54034                                               transfer),
   54035                              AlignedMemOperand(Register(rn),
   54036                                                align,
   54037                                                Register(rm),
   54038                                                PostIndex));
   54039                         break;
   54040                       }
   54041                       case 0x00000900: {
   54042                         // 0xf4200900
   54043                         if (((instr & 0xd) == 0xd) ||
   54044                             ((instr & 0xe30) == 0x830)) {
   54045                           UnallocatedA32(instr);
   54046                           return;
   54047                         }
   54048                         DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
   54049                         if (dt.Is(kDataTypeValueInvalid)) {
   54050                           UnallocatedA32(instr);
   54051                           return;
   54052                         }
   54053                         Alignment align =
   54054                             Align_align_2_Decode((instr >> 4) & 0x3);
   54055                         if (dt.Is(kDataTypeValueInvalid) ||
   54056                             align.Is(kBadAlignment)) {
   54057                           UnallocatedA32(instr);
   54058                           return;
   54059                         }
   54060                         unsigned first = ExtractDRegister(instr, 22, 12);
   54061                         unsigned length;
   54062                         SpacingType spacing;
   54063                         switch ((instr >> 8) & 0xf) {
   54064                           default:
   54065                             VIXL_UNREACHABLE_OR_FALLTHROUGH();
   54066                           case 0x8:
   54067                             length = 2;
   54068                             spacing = kSingle;
   54069                             break;
   54070                           case 0x9:
   54071                             length = 2;
   54072                             spacing = kDouble;
   54073                             break;
   54074                           case 0x3:
   54075                             length = 4;
   54076                             spacing = kSingle;
   54077                             break;
   54078                         }
   54079                         unsigned last =
   54080                             first + (length - 1) * (spacing == kSingle ? 1 : 2);
   54081                         TransferType transfer = kMultipleLanes;
   54082                         unsigned rn = (instr >> 16) & 0xf;
   54083                         unsigned rm = instr & 0xf;
   54084                         // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
   54085                         vld2(al,
   54086                              dt,
   54087                              NeonRegisterList(DRegister(first),
   54088                                               DRegister(last),
   54089                                               spacing,
   54090                                               transfer),
   54091                              AlignedMemOperand(Register(rn),
   54092                                                align,
   54093                                                Register(rm),
   54094                                                PostIndex));
   54095                         break;
   54096                       }
   54097                       case 0x00000a00: {
   54098                         // 0xf4200a00
   54099                         if (((instr & 0xd) == 0xd) ||
   54100                             ((instr & 0xe20) == 0x620) ||
   54101                             ((instr & 0xf30) == 0xa30)) {
   54102                           UnallocatedA32(instr);
   54103                           return;
   54104                         }
   54105                         DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
   54106                         if (dt.Is(kDataTypeValueInvalid)) {
   54107                           UnallocatedA32(instr);
   54108                           return;
   54109                         }
   54110                         Alignment align =
   54111                             Align_align_1_Decode((instr >> 4) & 0x3);
   54112                         if (dt.Is(kDataTypeValueInvalid) ||
   54113                             align.Is(kBadAlignment)) {
   54114                           UnallocatedA32(instr);
   54115                           return;
   54116                         }
   54117                         unsigned first = ExtractDRegister(instr, 22, 12);
   54118                         unsigned length;
   54119                         SpacingType spacing = kSingle;
   54120                         switch ((instr >> 8) & 0xf) {
   54121                           default:
   54122                             VIXL_UNREACHABLE_OR_FALLTHROUGH();
   54123                           case 0x7:
   54124                             length = 1;
   54125                             break;
   54126                           case 0xa:
   54127                             length = 2;
   54128                             break;
   54129                           case 0x6:
   54130                             length = 3;
   54131                             break;
   54132                           case 0x2:
   54133                             length = 4;
   54134                             break;
   54135                         }
   54136                         unsigned last = first + length - 1;
   54137                         TransferType transfer = kMultipleLanes;
   54138                         unsigned rn = (instr >> 16) & 0xf;
   54139                         unsigned rm = instr & 0xf;
   54140                         // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
   54141                         vld1(al,
   54142                              dt,
   54143                              NeonRegisterList(DRegister(first),
   54144                                               DRegister(last),
   54145                                               spacing,
   54146                                               transfer),
   54147                              AlignedMemOperand(Register(rn),
   54148                                                align,
   54149                                                Register(rm),
   54150                                                PostIndex));
   54151                         break;
   54152                       }
   54153                       default:
   54154                         UnallocatedA32(instr);
   54155                         break;
   54156                     }
   54157                     break;
   54158                   }
   54159                 }
   54160                 break;
   54161               }
   54162               case 0x00800000: {
   54163                 // 0xf4a00000
   54164                 switch (instr & 0x00000300) {
   54165                   case 0x00000000: {
   54166                     // 0xf4a00000
   54167                     switch (instr & 0x00000c00) {
   54168                       case 0x00000c00: {
   54169                         // 0xf4a00c00
   54170                         switch (instr & 0x0000000d) {
   54171                           case 0x0000000d: {
   54172                             // 0xf4a00c0d
   54173                             switch (instr & 0x00000002) {
   54174                               case 0x00000000: {
   54175                                 // 0xf4a00c0d
   54176                                 DataType dt =
   54177                                     Dt_size_7_Decode((instr >> 6) & 0x3);
   54178                                 if (dt.Is(kDataTypeValueInvalid)) {
   54179                                   UnallocatedA32(instr);
   54180                                   return;
   54181                                 }
   54182                                 Alignment align =
   54183                                     Align_a_1_Decode((instr >> 4) & 0x1, dt);
   54184                                 if (dt.Is(kDataTypeValueInvalid) ||
   54185                                     align.Is(kBadAlignment)) {
   54186                                   UnallocatedA32(instr);
   54187                                   return;
   54188                                 }
   54189                                 unsigned first =
   54190                                     ExtractDRegister(instr, 22, 12);
   54191                                 unsigned length;
   54192                                 SpacingType spacing = kSingle;
   54193                                 switch ((instr >> 5) & 0x1) {
   54194                                   default:
   54195                                     VIXL_UNREACHABLE_OR_FALLTHROUGH();
   54196                                   case 0x0:
   54197                                     length = 1;
   54198                                     break;
   54199                                   case 0x1:
   54200                                     length = 2;
   54201                                     break;
   54202                                 }
   54203                                 unsigned last = first + length - 1;
   54204                                 TransferType transfer = kAllLanes;
   54205                                 unsigned rn = (instr >> 16) & 0xf;
   54206                                 // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
   54207                                 vld1(al,
   54208                                      dt,
   54209                                      NeonRegisterList(DRegister(first),
   54210                                                       DRegister(last),
   54211                                                       spacing,
   54212                                                       transfer),
   54213                                      AlignedMemOperand(Register(rn),
   54214                                                        align,
   54215                                                        PostIndex));
   54216                                 break;
   54217                               }
   54218                               case 0x00000002: {
   54219                                 // 0xf4a00c0f
   54220                                 DataType dt =
   54221                                     Dt_size_7_Decode((instr >> 6) & 0x3);
   54222                                 if (dt.Is(kDataTypeValueInvalid)) {
   54223                                   UnallocatedA32(instr);
   54224                                   return;
   54225                                 }
   54226                                 Alignment align =
   54227                                     Align_a_1_Decode((instr >> 4) & 0x1, dt);
   54228                                 if (dt.Is(kDataTypeValueInvalid) ||
   54229                                     align.Is(kBadAlignment)) {
   54230                                   UnallocatedA32(instr);
   54231                                   return;
   54232                                 }
   54233                                 unsigned first =
   54234                                     ExtractDRegister(instr, 22, 12);
   54235                                 unsigned length;
   54236                                 SpacingType spacing = kSingle;
   54237                                 switch ((instr >> 5) & 0x1) {
   54238                                   default:
   54239                                     VIXL_UNREACHABLE_OR_FALLTHROUGH();
   54240                                   case 0x0:
   54241                                     length = 1;
   54242                                     break;
   54243                                   case 0x1:
   54244                                     length = 2;
   54245                                     break;
   54246                                 }
   54247                                 unsigned last = first + length - 1;
   54248                                 TransferType transfer = kAllLanes;
   54249                                 unsigned rn = (instr >> 16) & 0xf;
   54250                                 // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1 NOLINT(whitespace/line_length)
   54251                                 vld1(al,
   54252                                      dt,
   54253                                      NeonRegisterList(DRegister(first),
   54254                                                       DRegister(last),
   54255                                                       spacing,
   54256                                                       transfer),
   54257                                      AlignedMemOperand(Register(rn),
   54258                                                        align,
   54259                                                        Offset));
   54260                                 break;
   54261                               }
   54262                             }
   54263                             break;
   54264                           }
   54265                           default: {
   54266                             if (((instr & 0xd) == 0xd)) {
   54267                               UnallocatedA32(instr);
   54268                               return;
   54269                             }
   54270                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
   54271                             if (dt.Is(kDataTypeValueInvalid)) {
   54272                               UnallocatedA32(instr);
   54273                               return;
   54274                             }
   54275                             Alignment align =
   54276                                 Align_a_1_Decode((instr >> 4) & 0x1, dt);
   54277                             if (dt.Is(kDataTypeValueInvalid) ||
   54278                                 align.Is(kBadAlignment)) {
   54279                               UnallocatedA32(instr);
   54280                               return;
   54281                             }
   54282                             unsigned first = ExtractDRegister(instr, 22, 12);
   54283                             unsigned length;
   54284                             SpacingType spacing = kSingle;
   54285                             switch ((instr >> 5) & 0x1) {
   54286                               default:
   54287                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
   54288                               case 0x0:
   54289                                 length = 1;
   54290                                 break;
   54291                               case 0x1:
   54292                                 length = 2;
   54293                                 break;
   54294                             }
   54295                             unsigned last = first + length - 1;
   54296                             TransferType transfer = kAllLanes;
   54297                             unsigned rn = (instr >> 16) & 0xf;
   54298                             unsigned rm = instr & 0xf;
   54299                             // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
   54300                             vld1(al,
   54301                                  dt,
   54302                                  NeonRegisterList(DRegister(first),
   54303                                                   DRegister(last),
   54304                                                   spacing,
   54305                                                   transfer),
   54306                                  AlignedMemOperand(Register(rn),
   54307                                                    align,
   54308                                                    Register(rm),
   54309                                                    PostIndex));
   54310                             break;
   54311                           }
   54312                         }
   54313                         break;
   54314                       }
   54315                       default: {
   54316                         switch (instr & 0x0000000d) {
   54317                           case 0x0000000d: {
   54318                             // 0xf4a0000d
   54319                             switch (instr & 0x00000002) {
   54320                               case 0x00000000: {
   54321                                 // 0xf4a0000d
   54322                                 if (((instr & 0xc00) == 0xc00)) {
   54323                                   UnallocatedA32(instr);
   54324                                   return;
   54325                                 }
   54326                                 DataType dt =
   54327                                     Dt_size_7_Decode((instr >> 10) & 0x3);
   54328                                 if (dt.Is(kDataTypeValueInvalid)) {
   54329                                   UnallocatedA32(instr);
   54330                                   return;
   54331                                 }
   54332                                 DecodeNeonAndAlign decode_neon =
   54333                                     Align_index_align_1_Decode((instr >> 4) &
   54334                                                                    0xf,
   54335                                                                dt);
   54336                                 if (!decode_neon.IsValid()) {
   54337                                   UnallocatedA32(instr);
   54338                                   return;
   54339                                 }
   54340                                 Alignment align = decode_neon.GetAlign();
   54341                                 int lane = decode_neon.GetLane();
   54342                                 SpacingType spacing = decode_neon.GetSpacing();
   54343                                 unsigned first =
   54344                                     ExtractDRegister(instr, 22, 12);
   54345                                 unsigned length = 1;
   54346                                 unsigned last = first + length - 1;
   54347                                 unsigned rn = (instr >> 16) & 0xf;
   54348                                 // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
   54349                                 vld1(al,
   54350                                      dt,
   54351                                      NeonRegisterList(DRegister(first),
   54352                                                       DRegister(last),
   54353                                                       spacing,
   54354                                                       lane),
   54355                                      AlignedMemOperand(Register(rn),
   54356                                                        align,
   54357                                                        PostIndex));
   54358                                 break;
   54359                               }
   54360                               case 0x00000002: {
   54361                                 // 0xf4a0000f
   54362                                 if (((instr & 0xc00) == 0xc00)) {
   54363                                   UnallocatedA32(instr);
   54364                                   return;
   54365                                 }
   54366                                 DataType dt =
   54367                                     Dt_size_7_Decode((instr >> 10) & 0x3);
   54368                                 if (dt.Is(kDataTypeValueInvalid)) {
   54369                                   UnallocatedA32(instr);
   54370                                   return;
   54371                                 }
   54372                                 DecodeNeonAndAlign decode_neon =
   54373                                     Align_index_align_1_Decode((instr >> 4) &
   54374                                                                    0xf,
   54375                                                                dt);
   54376                                 if (!decode_neon.IsValid()) {
   54377                                   UnallocatedA32(instr);
   54378                                   return;
   54379                                 }
   54380                                 Alignment align = decode_neon.GetAlign();
   54381                                 int lane = decode_neon.GetLane();
   54382                                 SpacingType spacing = decode_neon.GetSpacing();
   54383                                 unsigned first =
   54384                                     ExtractDRegister(instr, 22, 12);
   54385                                 unsigned length = 1;
   54386                                 unsigned last = first + length - 1;
   54387                                 unsigned rn = (instr >> 16) & 0xf;
   54388                                 // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1 NOLINT(whitespace/line_length)
   54389                                 vld1(al,
   54390                                      dt,
   54391                                      NeonRegisterList(DRegister(first),
   54392                                                       DRegister(last),
   54393                                                       spacing,
   54394                                                       lane),
   54395                                      AlignedMemOperand(Register(rn),
   54396                                                        align,
   54397                                                        Offset));
   54398                                 break;
   54399                               }
   54400                             }
   54401                             break;
   54402                           }
   54403                           default: {
   54404                             if (((instr & 0xc00) == 0xc00) ||
   54405                                 ((instr & 0xd) == 0xd)) {
   54406                               UnallocatedA32(instr);
   54407                               return;
   54408                             }
   54409                             DataType dt = Dt_size_7_Decode((instr >> 10) & 0x3);
   54410                             if (dt.Is(kDataTypeValueInvalid)) {
   54411                               UnallocatedA32(instr);
   54412                               return;
   54413                             }
   54414                             DecodeNeonAndAlign decode_neon =
   54415                                 Align_index_align_1_Decode((instr >> 4) & 0xf,
   54416                                                            dt);
   54417                             if (!decode_neon.IsValid()) {
   54418                               UnallocatedA32(instr);
   54419                               return;
   54420                             }
   54421                             Alignment align = decode_neon.GetAlign();
   54422                             int lane = decode_neon.GetLane();
   54423                             SpacingType spacing = decode_neon.GetSpacing();
   54424                             unsigned first = ExtractDRegister(instr, 22, 12);
   54425                             unsigned length = 1;
   54426                             unsigned last = first + length - 1;
   54427                             unsigned rn = (instr >> 16) & 0xf;
   54428                             unsigned rm = instr & 0xf;
   54429                             // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
   54430                             vld1(al,
   54431                                  dt,
   54432                                  NeonRegisterList(DRegister(first),
   54433                                                   DRegister(last),
   54434                                                   spacing,
   54435                                                   lane),
   54436                                  AlignedMemOperand(Register(rn),
   54437                                                    align,
   54438                                                    Register(rm),
   54439                                                    PostIndex));
   54440                             break;
   54441                           }
   54442                         }
   54443                         break;
   54444                       }
   54445                     }
   54446                     break;
   54447                   }
   54448                   case 0x00000100: {
   54449                     // 0xf4a00100
   54450                     switch (instr & 0x00000c00) {
   54451                       case 0x00000c00: {
   54452                         // 0xf4a00d00
   54453                         switch (instr & 0x0000000d) {
   54454                           case 0x0000000d: {
   54455                             // 0xf4a00d0d
   54456                             switch (instr & 0x00000002) {
   54457                               case 0x00000000: {
   54458                                 // 0xf4a00d0d
   54459                                 DataType dt =
   54460                                     Dt_size_7_Decode((instr >> 6) & 0x3);
   54461                                 if (dt.Is(kDataTypeValueInvalid)) {
   54462                                   UnallocatedA32(instr);
   54463                                   return;
   54464                                 }
   54465                                 Alignment align =
   54466                                     Align_a_2_Decode((instr >> 4) & 0x1, dt);
   54467                                 if (dt.Is(kDataTypeValueInvalid) ||
   54468                                     align.Is(kBadAlignment)) {
   54469                                   UnallocatedA32(instr);
   54470                                   return;
   54471                                 }
   54472                                 unsigned first =
   54473                                     ExtractDRegister(instr, 22, 12);
   54474                                 unsigned length;
   54475                                 SpacingType spacing;
   54476                                 switch ((instr >> 5) & 0x1) {
   54477                                   default:
   54478                                     VIXL_UNREACHABLE_OR_FALLTHROUGH();
   54479                                   case 0x0:
   54480                                     length = 2;
   54481                                     spacing = kSingle;
   54482                                     break;
   54483                                   case 0x1:
   54484                                     length = 2;
   54485                                     spacing = kDouble;
   54486                                     break;
   54487                                 }
   54488                                 unsigned last =
   54489                                     first +
   54490                                     (length - 1) * (spacing == kSingle ? 1 : 2);
   54491                                 TransferType transfer = kAllLanes;
   54492                                 unsigned rn = (instr >> 16) & 0xf;
   54493                                 // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
   54494                                 vld2(al,
   54495                                      dt,
   54496                                      NeonRegisterList(DRegister(first),
   54497                                                       DRegister(last),
   54498                                                       spacing,
   54499                                                       transfer),
   54500                                      AlignedMemOperand(Register(rn),
   54501                                                        align,
   54502                                                        PostIndex));
   54503                                 break;
   54504                               }
   54505                               case 0x00000002: {
   54506                                 // 0xf4a00d0f
   54507                                 DataType dt =
   54508                                     Dt_size_7_Decode((instr >> 6) & 0x3);
   54509                                 if (dt.Is(kDataTypeValueInvalid)) {
   54510                                   UnallocatedA32(instr);
   54511                                   return;
   54512                                 }
   54513                                 Alignment align =
   54514                                     Align_a_2_Decode((instr >> 4) & 0x1, dt);
   54515                                 if (dt.Is(kDataTypeValueInvalid) ||
   54516                                     align.Is(kBadAlignment)) {
   54517                                   UnallocatedA32(instr);
   54518                                   return;
   54519                                 }
   54520                                 unsigned first =
   54521                                     ExtractDRegister(instr, 22, 12);
   54522                                 unsigned length;
   54523                                 SpacingType spacing;
   54524                                 switch ((instr >> 5) & 0x1) {
   54525                                   default:
   54526                                     VIXL_UNREACHABLE_OR_FALLTHROUGH();
   54527                                   case 0x0:
   54528                                     length = 2;
   54529                                     spacing = kSingle;
   54530                                     break;
   54531                                   case 0x1:
   54532                                     length = 2;
   54533                                     spacing = kDouble;
   54534                                     break;
   54535                                 }
   54536                                 unsigned last =
   54537                                     first +
   54538                                     (length - 1) * (spacing == kSingle ? 1 : 2);
   54539                                 TransferType transfer = kAllLanes;
   54540                                 unsigned rn = (instr >> 16) & 0xf;
   54541                                 // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1 NOLINT(whitespace/line_length)
   54542                                 vld2(al,
   54543                                      dt,
   54544                                      NeonRegisterList(DRegister(first),
   54545                                                       DRegister(last),
   54546                                                       spacing,
   54547                                                       transfer),
   54548                                      AlignedMemOperand(Register(rn),
   54549                                                        align,
   54550                                                        Offset));
   54551                                 break;
   54552                               }
   54553                             }
   54554                             break;
   54555                           }
   54556                           default: {
   54557                             if (((instr & 0xd) == 0xd)) {
   54558                               UnallocatedA32(instr);
   54559                               return;
   54560                             }
   54561                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
   54562                             if (dt.Is(kDataTypeValueInvalid)) {
   54563                               UnallocatedA32(instr);
   54564                               return;
   54565                             }
   54566                             Alignment align =
   54567                                 Align_a_2_Decode((instr >> 4) & 0x1, dt);
   54568                             if (dt.Is(kDataTypeValueInvalid) ||
   54569                                 align.Is(kBadAlignment)) {
   54570                               UnallocatedA32(instr);
   54571                               return;
   54572                             }
   54573                             unsigned first = ExtractDRegister(instr, 22, 12);
   54574                             unsigned length;
   54575                             SpacingType spacing;
   54576                             switch ((instr >> 5) & 0x1) {
   54577                               default:
   54578                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
   54579                               case 0x0:
   54580                                 length = 2;
   54581                                 spacing = kSingle;
   54582                                 break;
   54583                               case 0x1:
   54584                                 length = 2;
   54585                                 spacing = kDouble;
   54586                                 break;
   54587                             }
   54588                             unsigned last =
   54589                                 first +
   54590                                 (length - 1) * (spacing == kSingle ? 1 : 2);
   54591                             TransferType transfer = kAllLanes;
   54592                             unsigned rn = (instr >> 16) & 0xf;
   54593                             unsigned rm = instr & 0xf;
   54594                             // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
   54595                             vld2(al,
   54596                                  dt,
   54597                                  NeonRegisterList(DRegister(first),
   54598                                                   DRegister(last),
   54599                                                   spacing,
   54600                                                   transfer),
   54601                                  AlignedMemOperand(Register(rn),
   54602                                                    align,
   54603                                                    Register(rm),
   54604                                                    PostIndex));
   54605                             break;
   54606                           }
   54607                         }
   54608                         break;
   54609                       }
   54610                       default: {
   54611                         switch (instr & 0x0000000d) {
   54612                           case 0x0000000d: {
   54613                             // 0xf4a0010d
   54614                             switch (instr & 0x00000002) {
   54615                               case 0x00000000: {
   54616                                 // 0xf4a0010d
   54617                                 if (((instr & 0xc00) == 0xc00)) {
   54618                                   UnallocatedA32(instr);
   54619                                   return;
   54620                                 }
   54621                                 DataType dt =
   54622                                     Dt_size_7_Decode((instr >> 10) & 0x3);
   54623                                 if (dt.Is(kDataTypeValueInvalid)) {
   54624                                   UnallocatedA32(instr);
   54625                                   return;
   54626                                 }
   54627                                 DecodeNeonAndAlign decode_neon =
   54628                                     Align_index_align_2_Decode((instr >> 4) &
   54629                                                                    0xf,
   54630                                                                dt);
   54631                                 if (!decode_neon.IsValid()) {
   54632                                   UnallocatedA32(instr);
   54633                                   return;
   54634                                 }
   54635                                 Alignment align = decode_neon.GetAlign();
   54636                                 int lane = decode_neon.GetLane();
   54637                                 SpacingType spacing = decode_neon.GetSpacing();
   54638                                 unsigned first =
   54639                                     ExtractDRegister(instr, 22, 12);
   54640                                 unsigned length = 2;
   54641                                 unsigned last =
   54642                                     first +
   54643                                     (length - 1) * (spacing == kSingle ? 1 : 2);
   54644                                 unsigned rn = (instr >> 16) & 0xf;
   54645                                 // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
   54646                                 vld2(al,
   54647                                      dt,
   54648                                      NeonRegisterList(DRegister(first),
   54649                                                       DRegister(last),
   54650                                                       spacing,
   54651                                                       lane),
   54652                                      AlignedMemOperand(Register(rn),
   54653                                                        align,
   54654                                                        PostIndex));
   54655                                 break;
   54656                               }
   54657                               case 0x00000002: {
   54658                                 // 0xf4a0010f
   54659                                 if (((instr & 0xc00) == 0xc00)) {
   54660                                   UnallocatedA32(instr);
   54661                                   return;
   54662                                 }
   54663                                 DataType dt =
   54664                                     Dt_size_7_Decode((instr >> 10) & 0x3);
   54665                                 if (dt.Is(kDataTypeValueInvalid)) {
   54666                                   UnallocatedA32(instr);
   54667                                   return;
   54668                                 }
   54669                                 DecodeNeonAndAlign decode_neon =
   54670                                     Align_index_align_2_Decode((instr >> 4) &
   54671                                                                    0xf,
   54672                                                                dt);
   54673                                 if (!decode_neon.IsValid()) {
   54674                                   UnallocatedA32(instr);
   54675                                   return;
   54676                                 }
   54677                                 Alignment align = decode_neon.GetAlign();
   54678                                 int lane = decode_neon.GetLane();
   54679                                 SpacingType spacing = decode_neon.GetSpacing();
   54680                                 unsigned first =
   54681                                     ExtractDRegister(instr, 22, 12);
   54682                                 unsigned length = 2;
   54683                                 unsigned last =
   54684                                     first +
   54685                                     (length - 1) * (spacing == kSingle ? 1 : 2);
   54686                                 unsigned rn = (instr >> 16) & 0xf;
   54687                                 // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1 NOLINT(whitespace/line_length)
   54688                                 vld2(al,
   54689                                      dt,
   54690                                      NeonRegisterList(DRegister(first),
   54691                                                       DRegister(last),
   54692                                                       spacing,
   54693                                                       lane),
   54694                                      AlignedMemOperand(Register(rn),
   54695                                                        align,
   54696                                                        Offset));
   54697                                 break;
   54698                               }
   54699                             }
   54700                             break;
   54701                           }
   54702                           default: {
   54703                             if (((instr & 0xc00) == 0xc00) ||
   54704                                 ((instr & 0xd) == 0xd)) {
   54705                               UnallocatedA32(instr);
   54706                               return;
   54707                             }
   54708                             DataType dt = Dt_size_7_Decode((instr >> 10) & 0x3);
   54709                             if (dt.Is(kDataTypeValueInvalid)) {
   54710                               UnallocatedA32(instr);
   54711                               return;
   54712                             }
   54713                             DecodeNeonAndAlign decode_neon =
   54714                                 Align_index_align_2_Decode((instr >> 4) & 0xf,
   54715                                                            dt);
   54716                             if (!decode_neon.IsValid()) {
   54717                               UnallocatedA32(instr);
   54718                               return;
   54719                             }
   54720                             Alignment align = decode_neon.GetAlign();
   54721                             int lane = decode_neon.GetLane();
   54722                             SpacingType spacing = decode_neon.GetSpacing();
   54723                             unsigned first = ExtractDRegister(instr, 22, 12);
   54724                             unsigned length = 2;
   54725                             unsigned last =
   54726                                 first +
   54727                                 (length - 1) * (spacing == kSingle ? 1 : 2);
   54728                             unsigned rn = (instr >> 16) & 0xf;
   54729                             unsigned rm = instr & 0xf;
   54730                             // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
   54731                             vld2(al,
   54732                                  dt,
   54733                                  NeonRegisterList(DRegister(first),
   54734                                                   DRegister(last),
   54735                                                   spacing,
   54736                                                   lane),
   54737                                  AlignedMemOperand(Register(rn),
   54738                                                    align,
   54739                                                    Register(rm),
   54740                                                    PostIndex));
   54741                             break;
   54742                           }
   54743                         }
   54744                         break;
   54745                       }
   54746                     }
   54747                     break;
   54748                   }
   54749                   case 0x00000200: {
   54750                     // 0xf4a00200
   54751                     switch (instr & 0x00000c00) {
   54752                       case 0x00000c00: {
   54753                         // 0xf4a00e00
   54754                         switch (instr & 0x00000010) {
   54755                           case 0x00000000: {
   54756                             // 0xf4a00e00
   54757                             switch (instr & 0x0000000d) {
   54758                               case 0x0000000d: {
   54759                                 // 0xf4a00e0d
   54760                                 switch (instr & 0x00000002) {
   54761                                   case 0x00000000: {
   54762                                     // 0xf4a00e0d
   54763                                     DataType dt =
   54764                                         Dt_size_7_Decode((instr >> 6) & 0x3);
   54765                                     if (dt.Is(kDataTypeValueInvalid)) {
   54766                                       UnallocatedA32(instr);
   54767                                       return;
   54768                                     }
   54769                                     unsigned first =
   54770                                         ExtractDRegister(instr, 22, 12);
   54771                                     unsigned length;
   54772                                     SpacingType spacing;
   54773                                     switch ((instr >> 5) & 0x1) {
   54774                                       default:
   54775                                         VIXL_UNREACHABLE_OR_FALLTHROUGH();
   54776                                       case 0x0:
   54777                                         length = 3;
   54778                                         spacing = kSingle;
   54779                                         break;
   54780                                       case 0x1:
   54781                                         length = 3;
   54782                                         spacing = kDouble;
   54783                                         break;
   54784                                     }
   54785                                     unsigned last =
   54786                                         first +
   54787                                         (length - 1) *
   54788                                             (spacing == kSingle ? 1 : 2);
   54789                                     TransferType transfer = kAllLanes;
   54790                                     unsigned rn = (instr >> 16) & 0xf;
   54791                                     // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>]! ; A1
   54792                                     vld3(al,
   54793                                          dt,
   54794                                          NeonRegisterList(DRegister(first),
   54795                                                           DRegister(last),
   54796                                                           spacing,
   54797                                                           transfer),
   54798                                          MemOperand(Register(rn), PostIndex));
   54799                                     break;
   54800                                   }
   54801                                   case 0x00000002: {
   54802                                     // 0xf4a00e0f
   54803                                     DataType dt =
   54804                                         Dt_size_7_Decode((instr >> 6) & 0x3);
   54805                                     if (dt.Is(kDataTypeValueInvalid)) {
   54806                                       UnallocatedA32(instr);
   54807                                       return;
   54808                                     }
   54809                                     unsigned first =
   54810                                         ExtractDRegister(instr, 22, 12);
   54811                                     unsigned length;
   54812                                     SpacingType spacing;
   54813                                     switch ((instr >> 5) & 0x1) {
   54814                                       default:
   54815                                         VIXL_UNREACHABLE_OR_FALLTHROUGH();
   54816                                       case 0x0:
   54817                                         length = 3;
   54818                                         spacing = kSingle;
   54819                                         break;
   54820                                       case 0x1:
   54821                                         length = 3;
   54822                                         spacing = kDouble;
   54823                                         break;
   54824                                     }
   54825                                     unsigned last =
   54826                                         first +
   54827                                         (length - 1) *
   54828                                             (spacing == kSingle ? 1 : 2);
   54829                                     TransferType transfer = kAllLanes;
   54830                                     unsigned rn = (instr >> 16) & 0xf;
   54831                                     // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>] ; A1
   54832                                     vld3(al,
   54833                                          dt,
   54834                                          NeonRegisterList(DRegister(first),
   54835                                                           DRegister(last),
   54836                                                           spacing,
   54837                                                           transfer),
   54838                                          MemOperand(Register(rn), Offset));
   54839                                     break;
   54840                                   }
   54841                                 }
   54842                                 break;
   54843                               }
   54844                               default: {
   54845                                 if (((instr & 0xd) == 0xd)) {
   54846                                   UnallocatedA32(instr);
   54847                                   return;
   54848                                 }
   54849                                 DataType dt =
   54850                                     Dt_size_7_Decode((instr >> 6) & 0x3);
   54851                                 if (dt.Is(kDataTypeValueInvalid)) {
   54852                                   UnallocatedA32(instr);
   54853                                   return;
   54854                                 }
   54855                                 unsigned first =
   54856                                     ExtractDRegister(instr, 22, 12);
   54857                                 unsigned length;
   54858                                 SpacingType spacing;
   54859                                 switch ((instr >> 5) & 0x1) {
   54860                                   default:
   54861                                     VIXL_UNREACHABLE_OR_FALLTHROUGH();
   54862                                   case 0x0:
   54863                                     length = 3;
   54864                                     spacing = kSingle;
   54865                                     break;
   54866                                   case 0x1:
   54867                                     length = 3;
   54868                                     spacing = kDouble;
   54869                                     break;
   54870                                 }
   54871                                 unsigned last =
   54872                                     first +
   54873                                     (length - 1) * (spacing == kSingle ? 1 : 2);
   54874                                 TransferType transfer = kAllLanes;
   54875                                 unsigned rn = (instr >> 16) & 0xf;
   54876                                 Sign sign(plus);
   54877                                 unsigned rm = instr & 0xf;
   54878                                 // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>], #<Rm> ; A1 NOLINT(whitespace/line_length)
   54879                                 vld3(al,
   54880                                      dt,
   54881                                      NeonRegisterList(DRegister(first),
   54882                                                       DRegister(last),
   54883                                                       spacing,
   54884                                                       transfer),
   54885                                      MemOperand(Register(rn),
   54886                                                 sign,
   54887                                                 Register(rm),
   54888                                                 PostIndex));
   54889                                 break;
   54890                               }
   54891                             }
   54892                             break;
   54893                           }
   54894                           default:
   54895                             UnallocatedA32(instr);
   54896                             break;
   54897                         }
   54898                         break;
   54899                       }
   54900                       default: {
   54901                         switch (instr & 0x0000000d) {
   54902                           case 0x0000000d: {
   54903                             // 0xf4a0020d
   54904                             switch (instr & 0x00000002) {
   54905                               case 0x00000000: {
   54906                                 // 0xf4a0020d
   54907                                 if (((instr & 0xc00) == 0xc00)) {
   54908                                   UnallocatedA32(instr);
   54909                                   return;
   54910                                 }
   54911                                 DataType dt =
   54912                                     Dt_size_7_Decode((instr >> 10) & 0x3);
   54913                                 if (dt.Is(kDataTypeValueInvalid)) {
   54914                                   UnallocatedA32(instr);
   54915                                   return;
   54916                                 }
   54917                                 DecodeNeon decode_neon =
   54918                                     Index_1_Decode((instr >> 4) & 0xf, dt);
   54919                                 if (!decode_neon.IsValid()) {
   54920                                   UnallocatedA32(instr);
   54921                                   return;
   54922                                 }
   54923                                 int lane = decode_neon.GetLane();
   54924                                 SpacingType spacing = decode_neon.GetSpacing();
   54925                                 unsigned first =
   54926                                     ExtractDRegister(instr, 22, 12);
   54927                                 unsigned length = 3;
   54928                                 unsigned last =
   54929                                     first +
   54930                                     (length - 1) * (spacing == kSingle ? 1 : 2);
   54931                                 unsigned rn = (instr >> 16) & 0xf;
   54932                                 // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>]! ; A1
   54933                                 vld3(al,
   54934                                      dt,
   54935                                      NeonRegisterList(DRegister(first),
   54936                                                       DRegister(last),
   54937                                                       spacing,
   54938                                                       lane),
   54939                                      MemOperand(Register(rn), PostIndex));
   54940                                 break;
   54941                               }
   54942                               case 0x00000002: {
   54943                                 // 0xf4a0020f
   54944                                 if (((instr & 0xc00) == 0xc00)) {
   54945                                   UnallocatedA32(instr);
   54946                                   return;
   54947                                 }
   54948                                 DataType dt =
   54949                                     Dt_size_7_Decode((instr >> 10) & 0x3);
   54950                                 if (dt.Is(kDataTypeValueInvalid)) {
   54951                                   UnallocatedA32(instr);
   54952                                   return;
   54953                                 }
   54954                                 DecodeNeon decode_neon =
   54955                                     Index_1_Decode((instr >> 4) & 0xf, dt);
   54956                                 if (!decode_neon.IsValid()) {
   54957                                   UnallocatedA32(instr);
   54958                                   return;
   54959                                 }
   54960                                 int lane = decode_neon.GetLane();
   54961                                 SpacingType spacing = decode_neon.GetSpacing();
   54962                                 unsigned first =
   54963                                     ExtractDRegister(instr, 22, 12);
   54964                                 unsigned length = 3;
   54965                                 unsigned last =
   54966                                     first +
   54967                                     (length - 1) * (spacing == kSingle ? 1 : 2);
   54968                                 unsigned rn = (instr >> 16) & 0xf;
   54969                                 // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>] ; A1
   54970                                 vld3(al,
   54971                                      dt,
   54972                                      NeonRegisterList(DRegister(first),
   54973                                                       DRegister(last),
   54974                                                       spacing,
   54975                                                       lane),
   54976                                      MemOperand(Register(rn), Offset));
   54977                                 break;
   54978                               }
   54979                             }
   54980                             break;
   54981                           }
   54982                           default: {
   54983                             if (((instr & 0xc00) == 0xc00) ||
   54984                                 ((instr & 0xd) == 0xd)) {
   54985                               UnallocatedA32(instr);
   54986                               return;
   54987                             }
   54988                             DataType dt = Dt_size_7_Decode((instr >> 10) & 0x3);
   54989                             if (dt.Is(kDataTypeValueInvalid)) {
   54990                               UnallocatedA32(instr);
   54991                               return;
   54992                             }
   54993                             DecodeNeon decode_neon =
   54994                                 Index_1_Decode((instr >> 4) & 0xf, dt);
   54995                             if (!decode_neon.IsValid()) {
   54996                               UnallocatedA32(instr);
   54997                               return;
   54998                             }
   54999                             int lane = decode_neon.GetLane();
   55000                             SpacingType spacing = decode_neon.GetSpacing();
   55001                             unsigned first = ExtractDRegister(instr, 22, 12);
   55002                             unsigned length = 3;
   55003                             unsigned last =
   55004                                 first +
   55005                                 (length - 1) * (spacing == kSingle ? 1 : 2);
   55006                             unsigned rn = (instr >> 16) & 0xf;
   55007                             Sign sign(plus);
   55008                             unsigned rm = instr & 0xf;
   55009                             // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>], #<Rm> ; A1
   55010                             vld3(al,
   55011                                  dt,
   55012                                  NeonRegisterList(DRegister(first),
   55013                                                   DRegister(last),
   55014                                                   spacing,
   55015                                                   lane),
   55016                                  MemOperand(Register(rn),
   55017                                             sign,
   55018                                             Register(rm),
   55019                                             PostIndex));
   55020                             break;
   55021                           }
   55022                         }
   55023                         break;
   55024                       }
   55025                     }
   55026                     break;
   55027                   }
   55028                   case 0x00000300: {
   55029                     // 0xf4a00300
   55030                     switch (instr & 0x00000c00) {
   55031                       case 0x00000c00: {
   55032                         // 0xf4a00f00
   55033                         switch (instr & 0x0000000d) {
   55034                           case 0x0000000d: {
   55035                             // 0xf4a00f0d
   55036                             switch (instr & 0x00000002) {
   55037                               case 0x00000000: {
   55038                                 // 0xf4a00f0d
   55039                                 DataType dt =
   55040                                     Dt_size_8_Decode((instr >> 6) & 0x3);
   55041                                 if (dt.Is(kDataTypeValueInvalid)) {
   55042                                   UnallocatedA32(instr);
   55043                                   return;
   55044                                 }
   55045                                 Alignment align =
   55046                                     Align_a_3_Decode((instr >> 4) & 0x1,
   55047                                                      dt,
   55048                                                      (instr >> 6) & 0x3);
   55049                                 if (dt.Is(kDataTypeValueInvalid) ||
   55050                                     align.Is(kBadAlignment)) {
   55051                                   UnallocatedA32(instr);
   55052                                   return;
   55053                                 }
   55054                                 unsigned first =
   55055                                     ExtractDRegister(instr, 22, 12);
   55056                                 unsigned length;
   55057                                 SpacingType spacing;
   55058                                 switch ((instr >> 5) & 0x1) {
   55059                                   default:
   55060                                     VIXL_UNREACHABLE_OR_FALLTHROUGH();
   55061                                   case 0x0:
   55062                                     length = 4;
   55063                                     spacing = kSingle;
   55064                                     break;
   55065                                   case 0x1:
   55066                                     length = 4;
   55067                                     spacing = kDouble;
   55068                                     break;
   55069                                 }
   55070                                 unsigned last =
   55071                                     first +
   55072                                     (length - 1) * (spacing == kSingle ? 1 : 2);
   55073                                 TransferType transfer = kAllLanes;
   55074                                 unsigned rn = (instr >> 16) & 0xf;
   55075                                 // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
   55076                                 vld4(al,
   55077                                      dt,
   55078                                      NeonRegisterList(DRegister(first),
   55079                                                       DRegister(last),
   55080                                                       spacing,
   55081                                                       transfer),
   55082                                      AlignedMemOperand(Register(rn),
   55083                                                        align,
   55084                                                        PostIndex));
   55085                                 break;
   55086                               }
   55087                               case 0x00000002: {
   55088                                 // 0xf4a00f0f
   55089                                 DataType dt =
   55090                                     Dt_size_8_Decode((instr >> 6) & 0x3);
   55091                                 if (dt.Is(kDataTypeValueInvalid)) {
   55092                                   UnallocatedA32(instr);
   55093                                   return;
   55094                                 }
   55095                                 Alignment align =
   55096                                     Align_a_3_Decode((instr >> 4) & 0x1,
   55097                                                      dt,
   55098                                                      (instr >> 6) & 0x3);
   55099                                 if (dt.Is(kDataTypeValueInvalid) ||
   55100                                     align.Is(kBadAlignment)) {
   55101                                   UnallocatedA32(instr);
   55102                                   return;
   55103                                 }
   55104                                 unsigned first =
   55105                                     ExtractDRegister(instr, 22, 12);
   55106                                 unsigned length;
   55107                                 SpacingType spacing;
   55108                                 switch ((instr >> 5) & 0x1) {
   55109                                   default:
   55110                                     VIXL_UNREACHABLE_OR_FALLTHROUGH();
   55111                                   case 0x0:
   55112                                     length = 4;
   55113                                     spacing = kSingle;
   55114                                     break;
   55115                                   case 0x1:
   55116                                     length = 4;
   55117                                     spacing = kDouble;
   55118                                     break;
   55119                                 }
   55120                                 unsigned last =
   55121                                     first +
   55122                                     (length - 1) * (spacing == kSingle ? 1 : 2);
   55123                                 TransferType transfer = kAllLanes;
   55124                                 unsigned rn = (instr >> 16) & 0xf;
   55125                                 // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1 NOLINT(whitespace/line_length)
   55126                                 vld4(al,
   55127                                      dt,
   55128                                      NeonRegisterList(DRegister(first),
   55129                                                       DRegister(last),
   55130                                                       spacing,
   55131                                                       transfer),
   55132                                      AlignedMemOperand(Register(rn),
   55133                                                        align,
   55134                                                        Offset));
   55135                                 break;
   55136                               }
   55137                             }
   55138                             break;
   55139                           }
   55140                           default: {
   55141                             if (((instr & 0xd) == 0xd)) {
   55142                               UnallocatedA32(instr);
   55143                               return;
   55144                             }
   55145                             DataType dt = Dt_size_8_Decode((instr >> 6) & 0x3);
   55146                             if (dt.Is(kDataTypeValueInvalid)) {
   55147                               UnallocatedA32(instr);
   55148                               return;
   55149                             }
   55150                             Alignment align =
   55151                                 Align_a_3_Decode((instr >> 4) & 0x1,
   55152                                                  dt,
   55153                                                  (instr >> 6) & 0x3);
   55154                             if (dt.Is(kDataTypeValueInvalid) ||
   55155                                 align.Is(kBadAlignment)) {
   55156                               UnallocatedA32(instr);
   55157                               return;
   55158                             }
   55159                             unsigned first = ExtractDRegister(instr, 22, 12);
   55160                             unsigned length;
   55161                             SpacingType spacing;
   55162                             switch ((instr >> 5) & 0x1) {
   55163                               default:
   55164                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
   55165                               case 0x0:
   55166                                 length = 4;
   55167                                 spacing = kSingle;
   55168                                 break;
   55169                               case 0x1:
   55170                                 length = 4;
   55171                                 spacing = kDouble;
   55172                                 break;
   55173                             }
   55174                             unsigned last =
   55175                                 first +
   55176                                 (length - 1) * (spacing == kSingle ? 1 : 2);
   55177                             TransferType transfer = kAllLanes;
   55178                             unsigned rn = (instr >> 16) & 0xf;
   55179                             unsigned rm = instr & 0xf;
   55180                             // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
   55181                             vld4(al,
   55182                                  dt,
   55183                                  NeonRegisterList(DRegister(first),
   55184                                                   DRegister(last),
   55185                                                   spacing,
   55186                                                   transfer),
   55187                                  AlignedMemOperand(Register(rn),
   55188                                                    align,
   55189                                                    Register(rm),
   55190                                                    PostIndex));
   55191                             break;
   55192                           }
   55193                         }
   55194                         break;
   55195                       }
   55196                       default: {
   55197                         switch (instr & 0x0000000d) {
   55198                           case 0x0000000d: {
   55199                             // 0xf4a0030d
   55200                             switch (instr & 0x00000002) {
   55201                               case 0x00000000: {
   55202                                 // 0xf4a0030d
   55203                                 if (((instr & 0xc00) == 0xc00)) {
   55204                                   UnallocatedA32(instr);
   55205                                   return;
   55206                                 }
   55207                                 DataType dt =
   55208                                     Dt_size_7_Decode((instr >> 10) & 0x3);
   55209                                 if (dt.Is(kDataTypeValueInvalid)) {
   55210                                   UnallocatedA32(instr);
   55211                                   return;
   55212                                 }
   55213                                 DecodeNeonAndAlign decode_neon =
   55214                                     Align_index_align_3_Decode((instr >> 4) &
   55215                                                                    0xf,
   55216                                                                dt);
   55217                                 if (!decode_neon.IsValid()) {
   55218                                   UnallocatedA32(instr);
   55219                                   return;
   55220                                 }
   55221                                 Alignment align = decode_neon.GetAlign();
   55222                                 int lane = decode_neon.GetLane();
   55223                                 SpacingType spacing = decode_neon.GetSpacing();
   55224                                 unsigned first =
   55225                                     ExtractDRegister(instr, 22, 12);
   55226                                 unsigned length = 4;
   55227                                 unsigned last =
   55228                                     first +
   55229                                     (length - 1) * (spacing == kSingle ? 1 : 2);
   55230                                 unsigned rn = (instr >> 16) & 0xf;
   55231                                 // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
   55232                                 vld4(al,
   55233                                      dt,
   55234                                      NeonRegisterList(DRegister(first),
   55235                                                       DRegister(last),
   55236                                                       spacing,
   55237                                                       lane),
   55238                                      AlignedMemOperand(Register(rn),
   55239                                                        align,
   55240                                                        PostIndex));
   55241                                 break;
   55242                               }
   55243                               case 0x00000002: {
   55244                                 // 0xf4a0030f
   55245                                 if (((instr & 0xc00) == 0xc00)) {
   55246                                   UnallocatedA32(instr);
   55247                                   return;
   55248                                 }
   55249                                 DataType dt =
   55250                                     Dt_size_7_Decode((instr >> 10) & 0x3);
   55251                                 if (dt.Is(kDataTypeValueInvalid)) {
   55252                                   UnallocatedA32(instr);
   55253                                   return;
   55254                                 }
   55255                                 DecodeNeonAndAlign decode_neon =
   55256                                     Align_index_align_3_Decode((instr >> 4) &
   55257                                                                    0xf,
   55258                                                                dt);
   55259                                 if (!decode_neon.IsValid()) {
   55260                                   UnallocatedA32(instr);
   55261                                   return;
   55262                                 }
   55263                                 Alignment align = decode_neon.GetAlign();
   55264                                 int lane = decode_neon.GetLane();
   55265                                 SpacingType spacing = decode_neon.GetSpacing();
   55266                                 unsigned first =
   55267                                     ExtractDRegister(instr, 22, 12);
   55268                                 unsigned length = 4;
   55269                                 unsigned last =
   55270                                     first +
   55271                                     (length - 1) * (spacing == kSingle ? 1 : 2);
   55272                                 unsigned rn = (instr >> 16) & 0xf;
   55273                                 // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1 NOLINT(whitespace/line_length)
   55274                                 vld4(al,
   55275                                      dt,
   55276                                      NeonRegisterList(DRegister(first),
   55277                                                       DRegister(last),
   55278                                                       spacing,
   55279                                                       lane),
   55280                                      AlignedMemOperand(Register(rn),
   55281                                                        align,
   55282                                                        Offset));
   55283                                 break;
   55284                               }
   55285                             }
   55286                             break;
   55287                           }
   55288                           default: {
   55289                             if (((instr & 0xc00) == 0xc00) ||
   55290                                 ((instr & 0xd) == 0xd)) {
   55291                               UnallocatedA32(instr);
   55292                               return;
   55293                             }
   55294                             DataType dt = Dt_size_7_Decode((instr >> 10) & 0x3);
   55295                             if (dt.Is(kDataTypeValueInvalid)) {
   55296                               UnallocatedA32(instr);
   55297                               return;
   55298                             }
   55299                             DecodeNeonAndAlign decode_neon =
   55300                                 Align_index_align_3_Decode((instr >> 4) & 0xf,
   55301                                                            dt);
   55302                             if (!decode_neon.IsValid()) {
   55303                               UnallocatedA32(instr);
   55304                               return;
   55305                             }
   55306                             Alignment align = decode_neon.GetAlign();
   55307                             int lane = decode_neon.GetLane();
   55308                             SpacingType spacing = decode_neon.GetSpacing();
   55309                             unsigned first = ExtractDRegister(instr, 22, 12);
   55310                             unsigned length = 4;
   55311                             unsigned last =
   55312                                 first +
   55313                                 (length - 1) * (spacing == kSingle ? 1 : 2);
   55314                             unsigned rn = (instr >> 16) & 0xf;
   55315                             unsigned rm = instr & 0xf;
   55316                             // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
   55317                             vld4(al,
   55318                                  dt,
   55319                                  NeonRegisterList(DRegister(first),
   55320                                                   DRegister(last),
   55321                                                   spacing,
   55322                                                   lane),
   55323                                  AlignedMemOperand(Register(rn),
   55324                                                    align,
   55325                                                    Register(rm),
   55326                                                    PostIndex));
   55327                             break;
   55328                           }
   55329                         }
   55330                         break;
   55331                       }
   55332                     }
   55333                     break;
   55334                   }
   55335                 }
   55336                 break;
   55337               }
   55338             }
   55339             break;
   55340           }
   55341           case 0x01100000: {
   55342             // 0xf5100000
   55343             switch (instr & 0x000f0000) {
   55344               case 0x000f0000: {
   55345                 // 0xf51f0000
   55346                 uint32_t U = (instr >> 23) & 0x1;
   55347                 int32_t imm = instr & 0xfff;
   55348                 if (U == 0) imm = -imm;
   55349                 bool minus_zero = (imm == 0) && (U == 0);
   55350                 Location location(imm, kA32PcDelta);
   55351                 // PLD{<c>}{<q>} <label> ; A1
   55352                 if (minus_zero) {
   55353                   pld(al, MemOperand(pc, minus, 0));
   55354                 } else {
   55355                   pld(al, &location);
   55356                 }
   55357                 if (((instr & 0xff7ff000) != 0xf55ff000)) {
   55358                   UnpredictableA32(instr);
   55359                 }
   55360                 break;
   55361               }
   55362               default: {
   55363                 switch (instr & 0x00400000) {
   55364                   case 0x00000000: {
   55365                     // 0xf5100000
   55366                     if (((instr & 0xf0000) == 0xf0000)) {
   55367                       UnallocatedA32(instr);
   55368                       return;
   55369                     }
   55370                     unsigned rn = (instr >> 16) & 0xf;
   55371                     Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
   55372                     int32_t offset = instr & 0xfff;
   55373                     // PLDW{<c>}{<q>} [<Rn>{, #{+/-}<imm_2>}] ; A1
   55374                     pldw(al, MemOperand(Register(rn), sign, offset, Offset));
   55375                     if (((instr & 0xff70f000) != 0xf510f000)) {
   55376                       UnpredictableA32(instr);
   55377                     }
   55378                     break;
   55379                   }
   55380                   case 0x00400000: {
   55381                     // 0xf5500000
   55382                     if (((instr & 0xf0000) == 0xf0000)) {
   55383                       UnallocatedA32(instr);
   55384                       return;
   55385                     }
   55386                     unsigned rn = (instr >> 16) & 0xf;
   55387                     Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
   55388                     int32_t offset = instr & 0xfff;
   55389                     // PLD{<c>}{<q>} [<Rn>{, #{+/-}<imm_2>}] ; A1
   55390                     pld(al, MemOperand(Register(rn), sign, offset, Offset));
   55391                     if (((instr & 0xff70f000) != 0xf550f000)) {
   55392                       UnpredictableA32(instr);
   55393                     }
   55394                     break;
   55395                   }
   55396                 }
   55397                 break;
   55398               }
   55399             }
   55400             break;
   55401           }
   55402           case 0x01300000: {
   55403             // 0xf5300000
   55404             switch (instr & 0x00c000f0) {
   55405               case 0x00400010: {
   55406                 // 0xf5700010
   55407                 // CLREX{<c>}{<q>} ; A1
   55408                 clrex(al);
   55409                 if (((instr & 0xffffffff) != 0xf57ff01f)) {
   55410                   UnpredictableA32(instr);
   55411                 }
   55412                 break;
   55413               }
   55414               case 0x00400040: {
   55415                 // 0xf5700040
   55416                 MemoryBarrier option(instr & 0xf);
   55417                 // DSB{<c>}{<q>} {<option>} ; A1
   55418                 dsb(al, option);
   55419                 if (((instr & 0xfffffff0) != 0xf57ff040)) {
   55420                   UnpredictableA32(instr);
   55421                 }
   55422                 break;
   55423               }
   55424               case 0x00400050: {
   55425                 // 0xf5700050
   55426                 MemoryBarrier option(instr & 0xf);
   55427                 // DMB{<c>}{<q>} {<option>} ; A1
   55428                 dmb(al, option);
   55429                 if (((instr & 0xfffffff0) != 0xf57ff050)) {
   55430                   UnpredictableA32(instr);
   55431                 }
   55432                 break;
   55433               }
   55434               case 0x00400060: {
   55435                 // 0xf5700060
   55436                 MemoryBarrier option(instr & 0xf);
   55437                 // ISB{<c>}{<q>} {<option>} ; A1
   55438                 isb(al, option);
   55439                 if (((instr & 0xfffffff0) != 0xf57ff060)) {
   55440                   UnpredictableA32(instr);
   55441                 }
   55442                 break;
   55443               }
   55444               default:
   55445                 UnallocatedA32(instr);
   55446                 break;
   55447             }
   55448             break;
   55449           }
   55450           default:
   55451             UnallocatedA32(instr);
   55452             break;
   55453         }
   55454         break;
   55455       }
   55456       case 0x06000000: {
   55457         // 0xf6000000
   55458         switch (instr & 0x01700010) {
   55459           case 0x00500000: {
   55460             // 0xf6500000
   55461             switch (instr & 0x00000fe0) {
   55462               case 0x00000060: {
   55463                 // 0xf6500060
   55464                 unsigned rn = (instr >> 16) & 0xf;
   55465                 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
   55466                 unsigned rm = instr & 0xf;
   55467                 Shift shift = RRX;
   55468                 uint32_t amount = 0;
   55469                 AddrMode addrmode = Offset;
   55470                 // PLI{<c>}{<q>} [<Rn>, {+/-}<Rm>, RRX] ; A1
   55471                 pli(al,
   55472                     MemOperand(Register(rn),
   55473                                sign,
   55474                                Register(rm),
   55475                                shift,
   55476                                amount,
   55477                                addrmode));
   55478                 if (((instr & 0xff70fff0) != 0xf650f060)) {
   55479                   UnpredictableA32(instr);
   55480                 }
   55481                 break;
   55482               }
   55483               default: {
   55484                 if (((instr & 0xfe0) == 0x60)) {
   55485                   UnallocatedA32(instr);
   55486                   return;
   55487                 }
   55488                 unsigned rn = (instr >> 16) & 0xf;
   55489                 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
   55490                 unsigned rm = instr & 0xf;
   55491                 ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
   55492                                                     (instr >> 7) & 0x1f);
   55493                 Shift shift = shift_operand.GetShift();
   55494                 uint32_t amount = shift_operand.GetAmount();
   55495                 AddrMode addrmode = Offset;
   55496                 // PLI{<c>}{<q>} [<Rn>, {+/-}<Rm>{, <shift> #<amount_1>}] ; A1
   55497                 pli(al,
   55498                     MemOperand(Register(rn),
   55499                                sign,
   55500                                Register(rm),
   55501                                shift,
   55502                                amount,
   55503                                addrmode));
   55504                 if (((instr & 0xff70f010) != 0xf650f000)) {
   55505                   UnpredictableA32(instr);
   55506                 }
   55507                 break;
   55508               }
   55509             }
   55510             break;
   55511           }
   55512           case 0x01100000: {
   55513             // 0xf7100000
   55514             switch (instr & 0x00000fe0) {
   55515               case 0x00000060: {
   55516                 // 0xf7100060
   55517                 unsigned rn = (instr >> 16) & 0xf;
   55518                 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
   55519                 unsigned rm = instr & 0xf;
   55520                 Shift shift = RRX;
   55521                 uint32_t amount = 0;
   55522                 AddrMode addrmode = Offset;
   55523                 // PLDW{<c>}{<q>} [<Rn>, {+/-}<Rm>, RRX] ; A1
   55524                 pldw(al,
   55525                      MemOperand(Register(rn),
   55526                                 sign,
   55527                                 Register(rm),
   55528                                 shift,
   55529                                 amount,
   55530                                 addrmode));
   55531                 if (((instr & 0xff70fff0) != 0xf710f060)) {
   55532                   UnpredictableA32(instr);
   55533                 }
   55534                 break;
   55535               }
   55536               default: {
   55537                 if (((instr & 0xfe0) == 0x60)) {
   55538                   UnallocatedA32(instr);
   55539                   return;
   55540                 }
   55541                 unsigned rn = (instr >> 16) & 0xf;
   55542                 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
   55543                 unsigned rm = instr & 0xf;
   55544                 ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
   55545                                                     (instr >> 7) & 0x1f);
   55546                 Shift shift = shift_operand.GetShift();
   55547                 uint32_t amount = shift_operand.GetAmount();
   55548                 AddrMode addrmode = Offset;
   55549                 // PLDW{<c>}{<q>} [<Rn>, {+/-}<Rm>{, <shift> #<amount_1>}] ; A1
   55550                 pldw(al,
   55551                      MemOperand(Register(rn),
   55552                                 sign,
   55553                                 Register(rm),
   55554                                 shift,
   55555                                 amount,
   55556                                 addrmode));
   55557                 if (((instr & 0xff70f010) != 0xf710f000)) {
   55558                   UnpredictableA32(instr);
   55559                 }
   55560                 break;
   55561               }
   55562             }
   55563             break;
   55564           }
   55565           case 0x01500000: {
   55566             // 0xf7500000
   55567             switch (instr & 0x00000fe0) {
   55568               case 0x00000060: {
   55569                 // 0xf7500060
   55570                 unsigned rn = (instr >> 16) & 0xf;
   55571                 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
   55572                 unsigned rm = instr & 0xf;
   55573                 Shift shift = RRX;
   55574                 uint32_t amount = 0;
   55575                 AddrMode addrmode = Offset;
   55576                 // PLD{<c>}{<q>} [<Rn>, {+/-}<Rm>, RRX] ; A1
   55577                 pld(al,
   55578                     MemOperand(Register(rn),
   55579                                sign,
   55580                                Register(rm),
   55581                                shift,
   55582                                amount,
   55583                                addrmode));
   55584                 if (((instr & 0xff70fff0) != 0xf750f060)) {
   55585                   UnpredictableA32(instr);
   55586                 }
   55587                 break;
   55588               }
   55589               default: {
   55590                 if (((instr & 0xfe0) == 0x60)) {
   55591                   UnallocatedA32(instr);
   55592                   return;
   55593                 }
   55594                 unsigned rn = (instr >> 16) & 0xf;
   55595                 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
   55596                 unsigned rm = instr & 0xf;
   55597                 ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
   55598                                                     (instr >> 7) & 0x1f);
   55599                 Shift shift = shift_operand.GetShift();
   55600                 uint32_t amount = shift_operand.GetAmount();
   55601                 AddrMode addrmode = Offset;
   55602                 // PLD{<c>}{<q>} [<Rn>, {+/-}<Rm>{, <shift> #<amount_1>}] ; A1
   55603                 pld(al,
   55604                     MemOperand(Register(rn),
   55605                                sign,
   55606                                Register(rm),
   55607                                shift,
   55608                                amount,
   55609                                addrmode));
   55610                 if (((instr & 0xff70f010) != 0xf750f000)) {
   55611                   UnpredictableA32(instr);
   55612                 }
   55613                 break;
   55614               }
   55615             }
   55616             break;
   55617           }
   55618           default:
   55619             UnallocatedA32(instr);
   55620             break;
   55621         }
   55622         break;
   55623       }
   55624       case 0x08000000: {
   55625         // 0xf8000000
   55626         switch (instr & 0x01d00000) {
   55627           case 0x00100000: {
   55628             // 0xf8100000
   55629             UnimplementedA32("RFEDA", instr);
   55630             break;
   55631           }
   55632           case 0x00400000: {
   55633             // 0xf8400000
   55634             UnimplementedA32("SRSDA", instr);
   55635             break;
   55636           }
   55637           case 0x00900000: {
   55638             // 0xf8900000
   55639             UnimplementedA32("RFE{IA}", instr);
   55640             break;
   55641           }
   55642           case 0x00c00000: {
   55643             // 0xf8c00000
   55644             UnimplementedA32("SRS{IA}", instr);
   55645             break;
   55646           }
   55647           case 0x01100000: {
   55648             // 0xf9100000
   55649             UnimplementedA32("RFEDB", instr);
   55650             break;
   55651           }
   55652           case 0x01400000: {
   55653             // 0xf9400000
   55654             UnimplementedA32("SRSDB", instr);
   55655             break;
   55656           }
   55657           case 0x01900000: {
   55658             // 0xf9900000
   55659             UnimplementedA32("RFEIB", instr);
   55660             break;
   55661           }
   55662           case 0x01c00000: {
   55663             // 0xf9c00000
   55664             UnimplementedA32("SRSIB", instr);
   55665             break;
   55666           }
   55667           default:
   55668             UnallocatedA32(instr);
   55669             break;
   55670         }
   55671         break;
   55672       }
   55673       case 0x0a000000: {
   55674         // 0xfa000000
   55675         int32_t imm = SignExtend<int32_t>(((instr >> 24) & 0x1) |
   55676                                               ((instr << 1) & 0x1fffffe),
   55677                                           25)
   55678                       << 1;
   55679         Location location(imm, kA32PcDelta);
   55680         // BLX{<c>}{<q>} <label> ; A2
   55681         blx(al, &location);
   55682         break;
   55683       }
   55684       case 0x0c000000: {
   55685         // 0xfc000000
   55686         switch (instr & 0x01300000) {
   55687           case 0x00000000: {
   55688             // 0xfc000000
   55689             switch (instr & 0x00800000) {
   55690               case 0x00000000: {
   55691                 // 0xfc000000
   55692                 if ((instr & 0x00400000) == 0x00400000) {
   55693                   if (((instr & 0xe00) == 0xa00)) {
   55694                     UnallocatedA32(instr);
   55695                     return;
   55696                   }
   55697                   UnimplementedA32("MCRR2", instr);
   55698                 } else {
   55699                   UnallocatedA32(instr);
   55700                 }
   55701                 break;
   55702               }
   55703               case 0x00800000: {
   55704                 // 0xfc800000
   55705                 if (((instr & 0xe00) == 0xa00)) {
   55706                   UnallocatedA32(instr);
   55707                   return;
   55708                 }
   55709                 UnimplementedA32("STC2", instr);
   55710                 break;
   55711               }
   55712             }
   55713             break;
   55714           }
   55715           case 0x00100000: {
   55716             // 0xfc100000
   55717             switch (instr & 0x00800000) {
   55718               case 0x00000000: {
   55719                 // 0xfc100000
   55720                 if ((instr & 0x00400000) == 0x00400000) {
   55721                   if (((instr & 0xe00) == 0xa00)) {
   55722                     UnallocatedA32(instr);
   55723                     return;
   55724                   }
   55725                   UnimplementedA32("MRRC2", instr);
   55726                 } else {
   55727                   UnallocatedA32(instr);
   55728                 }
   55729                 break;
   55730               }
   55731               case 0x00800000: {
   55732                 // 0xfc900000
   55733                 switch (instr & 0x00000e00) {
   55734                   case 0x00000a00: {
   55735                     // 0xfc900a00
   55736                     UnallocatedA32(instr);
   55737                     break;
   55738                   }
   55739                   default: {
   55740                     switch (instr & 0x000f0000) {
   55741                       case 0x000f0000: {
   55742                         // 0xfc9f0000
   55743                         if (((instr & 0xe00) == 0xa00)) {
   55744                           UnallocatedA32(instr);
   55745                           return;
   55746                         }
   55747                         UnimplementedA32("LDC2", instr);
   55748                         break;
   55749                       }
   55750                       default: {
   55751                         if (((instr & 0xf0000) == 0xf0000) ||
   55752                             ((instr & 0xe00) == 0xa00)) {
   55753                           UnallocatedA32(instr);
   55754                           return;
   55755                         }
   55756                         UnimplementedA32("LDC2", instr);
   55757                         break;
   55758                       }
   55759                     }
   55760                     break;
   55761                   }
   55762                 }
   55763                 break;
   55764               }
   55765             }
   55766             break;
   55767           }
   55768           case 0x00200000: {
   55769             // 0xfc200000
   55770             if (((instr & 0xe00) == 0xa00)) {
   55771               UnallocatedA32(instr);
   55772               return;
   55773             }
   55774             UnimplementedA32("STC2", instr);
   55775             break;
   55776           }
   55777           case 0x00300000: {
   55778             // 0xfc300000
   55779             if (((instr & 0xf0000) == 0xf0000) || ((instr & 0xe00) == 0xa00)) {
   55780               UnallocatedA32(instr);
   55781               return;
   55782             }
   55783             UnimplementedA32("LDC2", instr);
   55784             break;
   55785           }
   55786           case 0x01000000: {
   55787             // 0xfd000000
   55788             if (((instr & 0xe00) == 0xa00)) {
   55789               UnallocatedA32(instr);
   55790               return;
   55791             }
   55792             UnimplementedA32("STC2", instr);
   55793             break;
   55794           }
   55795           case 0x01100000: {
   55796             // 0xfd100000
   55797             switch (instr & 0x00000e00) {
   55798               case 0x00000a00: {
   55799                 // 0xfd100a00
   55800                 UnallocatedA32(instr);
   55801                 break;
   55802               }
   55803               default: {
   55804                 switch (instr & 0x000f0000) {
   55805                   case 0x000f0000: {
   55806                     // 0xfd1f0000
   55807                     if (((instr & 0xe00) == 0xa00)) {
   55808                       UnallocatedA32(instr);
   55809                       return;
   55810                     }
   55811                     UnimplementedA32("LDC2", instr);
   55812                     break;
   55813                   }
   55814                   default: {
   55815                     if (((instr & 0xf0000) == 0xf0000) ||
   55816                         ((instr & 0xe00) == 0xa00)) {
   55817                       UnallocatedA32(instr);
   55818                       return;
   55819                     }
   55820                     UnimplementedA32("LDC2", instr);
   55821                     break;
   55822                   }
   55823                 }
   55824                 break;
   55825               }
   55826             }
   55827             break;
   55828           }
   55829           case 0x01200000: {
   55830             // 0xfd200000
   55831             if (((instr & 0xe00) == 0xa00)) {
   55832               UnallocatedA32(instr);
   55833               return;
   55834             }
   55835             UnimplementedA32("STC2", instr);
   55836             break;
   55837           }
   55838           case 0x01300000: {
   55839             // 0xfd300000
   55840             if (((instr & 0xf0000) == 0xf0000) || ((instr & 0xe00) == 0xa00)) {
   55841               UnallocatedA32(instr);
   55842               return;
   55843             }
   55844             UnimplementedA32("LDC2", instr);
   55845             break;
   55846           }
   55847         }
   55848         break;
   55849       }
   55850       case 0x0e000000: {
   55851         // 0xfe000000
   55852         switch (instr & 0x01000010) {
   55853           case 0x00000000: {
   55854             // 0xfe000000
   55855             switch (instr & 0x00000e00) {
   55856               case 0x00000a00: {
   55857                 // 0xfe000a00
   55858                 switch (instr & 0x00b00140) {
   55859                   case 0x00000000: {
   55860                     // 0xfe000a00
   55861                     unsigned rd = ExtractSRegister(instr, 22, 12);
   55862                     unsigned rn = ExtractSRegister(instr, 7, 16);
   55863                     unsigned rm = ExtractSRegister(instr, 5, 0);
   55864                     // VSELEQ.F32 <Sd>, <Sn>, <Sm> ; A1
   55865                     vseleq(F32, SRegister(rd), SRegister(rn), SRegister(rm));
   55866                     break;
   55867                   }
   55868                   case 0x00000100: {
   55869                     // 0xfe000b00
   55870                     unsigned rd = ExtractDRegister(instr, 22, 12);
   55871                     unsigned rn = ExtractDRegister(instr, 7, 16);
   55872                     unsigned rm = ExtractDRegister(instr, 5, 0);
   55873                     // VSELEQ.F64 <Dd>, <Dn>, <Dm> ; A1
   55874                     vseleq(F64, DRegister(rd), DRegister(rn), DRegister(rm));
   55875                     break;
   55876                   }
   55877                   case 0x00100000: {
   55878                     // 0xfe100a00
   55879                     unsigned rd = ExtractSRegister(instr, 22, 12);
   55880                     unsigned rn = ExtractSRegister(instr, 7, 16);
   55881                     unsigned rm = ExtractSRegister(instr, 5, 0);
   55882                     // VSELVS.F32 <Sd>, <Sn>, <Sm> ; A1
   55883                     vselvs(F32, SRegister(rd), SRegister(rn), SRegister(rm));
   55884                     break;
   55885                   }
   55886                   case 0x00100100: {
   55887                     // 0xfe100b00
   55888                     unsigned rd = ExtractDRegister(instr, 22, 12);
   55889                     unsigned rn = ExtractDRegister(instr, 7, 16);
   55890                     unsigned rm = ExtractDRegister(instr, 5, 0);
   55891                     // VSELVS.F64 <Dd>, <Dn>, <Dm> ; A1
   55892                     vselvs(F64, DRegister(rd), DRegister(rn), DRegister(rm));
   55893                     break;
   55894                   }
   55895                   case 0x00200000: {
   55896                     // 0xfe200a00
   55897                     unsigned rd = ExtractSRegister(instr, 22, 12);
   55898                     unsigned rn = ExtractSRegister(instr, 7, 16);
   55899                     unsigned rm = ExtractSRegister(instr, 5, 0);
   55900                     // VSELGE.F32 <Sd>, <Sn>, <Sm> ; A1
   55901                     vselge(F32, SRegister(rd), SRegister(rn), SRegister(rm));
   55902                     break;
   55903                   }
   55904                   case 0x00200100: {
   55905                     // 0xfe200b00
   55906                     unsigned rd = ExtractDRegister(instr, 22, 12);
   55907                     unsigned rn = ExtractDRegister(instr, 7, 16);
   55908                     unsigned rm = ExtractDRegister(instr, 5, 0);
   55909                     // VSELGE.F64 <Dd>, <Dn>, <Dm> ; A1
   55910                     vselge(F64, DRegister(rd), DRegister(rn), DRegister(rm));
   55911                     break;
   55912                   }
   55913                   case 0x00300000: {
   55914                     // 0xfe300a00
   55915                     unsigned rd = ExtractSRegister(instr, 22, 12);
   55916                     unsigned rn = ExtractSRegister(instr, 7, 16);
   55917                     unsigned rm = ExtractSRegister(instr, 5, 0);
   55918                     // VSELGT.F32 <Sd>, <Sn>, <Sm> ; A1
   55919                     vselgt(F32, SRegister(rd), SRegister(rn), SRegister(rm));
   55920                     break;
   55921                   }
   55922                   case 0x00300100: {
   55923                     // 0xfe300b00
   55924                     unsigned rd = ExtractDRegister(instr, 22, 12);
   55925                     unsigned rn = ExtractDRegister(instr, 7, 16);
   55926                     unsigned rm = ExtractDRegister(instr, 5, 0);
   55927                     // VSELGT.F64 <Dd>, <Dn>, <Dm> ; A1
   55928                     vselgt(F64, DRegister(rd), DRegister(rn), DRegister(rm));
   55929                     break;
   55930                   }
   55931                   case 0x00800000: {
   55932                     // 0xfe800a00
   55933                     unsigned rd = ExtractSRegister(instr, 22, 12);
   55934                     unsigned rn = ExtractSRegister(instr, 7, 16);
   55935                     unsigned rm = ExtractSRegister(instr, 5, 0);
   55936                     // VMAXNM{<q>}.F32 <Sd>, <Sn>, <Sm> ; A2
   55937                     vmaxnm(F32, SRegister(rd), SRegister(rn), SRegister(rm));
   55938                     break;
   55939                   }
   55940                   case 0x00800040: {
   55941                     // 0xfe800a40
   55942                     unsigned rd = ExtractSRegister(instr, 22, 12);
   55943                     unsigned rn = ExtractSRegister(instr, 7, 16);
   55944                     unsigned rm = ExtractSRegister(instr, 5, 0);
   55945                     // VMINNM{<q>}.F32 <Sd>, <Sn>, <Sm> ; A2
   55946                     vminnm(F32, SRegister(rd), SRegister(rn), SRegister(rm));
   55947                     break;
   55948                   }
   55949                   case 0x00800100: {
   55950                     // 0xfe800b00
   55951                     unsigned rd = ExtractDRegister(instr, 22, 12);
   55952                     unsigned rn = ExtractDRegister(instr, 7, 16);
   55953                     unsigned rm = ExtractDRegister(instr, 5, 0);
   55954                     // VMAXNM{<q>}.F64 <Dd>, <Dn>, <Dm> ; A2
   55955                     vmaxnm(F64, DRegister(rd), DRegister(rn), DRegister(rm));
   55956                     break;
   55957                   }
   55958                   case 0x00800140: {
   55959                     // 0xfe800b40
   55960                     unsigned rd = ExtractDRegister(instr, 22, 12);
   55961                     unsigned rn = ExtractDRegister(instr, 7, 16);
   55962                     unsigned rm = ExtractDRegister(instr, 5, 0);
   55963                     // VMINNM{<q>}.F64 <Dd>, <Dn>, <Dm> ; A2
   55964                     vminnm(F64, DRegister(rd), DRegister(rn), DRegister(rm));
   55965                     break;
   55966                   }
   55967                   case 0x00b00040: {
   55968                     // 0xfeb00a40
   55969                     switch (instr & 0x000f0000) {
   55970                       case 0x00080000: {
   55971                         // 0xfeb80a40
   55972                         if ((instr & 0x00000080) == 0x00000000) {
   55973                           unsigned rd = ExtractSRegister(instr, 22, 12);
   55974                           unsigned rm = ExtractSRegister(instr, 5, 0);
   55975                           // VRINTA{<q>}.F32.F32 <Sd>, <Sm> ; A1
   55976                           vrinta(F32, F32, SRegister(rd), SRegister(rm));
   55977                         } else {
   55978                           UnallocatedA32(instr);
   55979                         }
   55980                         break;
   55981                       }
   55982                       case 0x00090000: {
   55983                         // 0xfeb90a40
   55984                         if ((instr & 0x00000080) == 0x00000000) {
   55985                           unsigned rd = ExtractSRegister(instr, 22, 12);
   55986                           unsigned rm = ExtractSRegister(instr, 5, 0);
   55987                           // VRINTN{<q>}.F32.F32 <Sd>, <Sm> ; A1
   55988                           vrintn(F32, F32, SRegister(rd), SRegister(rm));
   55989                         } else {
   55990                           UnallocatedA32(instr);
   55991                         }
   55992                         break;
   55993                       }
   55994                       case 0x000a0000: {
   55995                         // 0xfeba0a40
   55996                         if ((instr & 0x00000080) == 0x00000000) {
   55997                           unsigned rd = ExtractSRegister(instr, 22, 12);
   55998                           unsigned rm = ExtractSRegister(instr, 5, 0);
   55999                           // VRINTP{<q>}.F32.F32 <Sd>, <Sm> ; A1
   56000                           vrintp(F32, F32, SRegister(rd), SRegister(rm));
   56001                         } else {
   56002                           UnallocatedA32(instr);
   56003                         }
   56004                         break;
   56005                       }
   56006                       case 0x000b0000: {
   56007                         // 0xfebb0a40
   56008                         if ((instr & 0x00000080) == 0x00000000) {
   56009                           unsigned rd = ExtractSRegister(instr, 22, 12);
   56010                           unsigned rm = ExtractSRegister(instr, 5, 0);
   56011                           // VRINTM{<q>}.F32.F32 <Sd>, <Sm> ; A1
   56012                           vrintm(F32, F32, SRegister(rd), SRegister(rm));
   56013                         } else {
   56014                           UnallocatedA32(instr);
   56015                         }
   56016                         break;
   56017                       }
   56018                       case 0x000c0000: {
   56019                         // 0xfebc0a40
   56020                         DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
   56021                         if (dt.Is(kDataTypeValueInvalid)) {
   56022                           UnallocatedA32(instr);
   56023                           return;
   56024                         }
   56025                         unsigned rd = ExtractSRegister(instr, 22, 12);
   56026                         unsigned rm = ExtractSRegister(instr, 5, 0);
   56027                         // VCVTA{<q>}.<dt>.F32 <Sd>, <Sm> ; A1
   56028                         vcvta(dt, F32, SRegister(rd), SRegister(rm));
   56029                         break;
   56030                       }
   56031                       case 0x000d0000: {
   56032                         // 0xfebd0a40
   56033                         DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
   56034                         if (dt.Is(kDataTypeValueInvalid)) {
   56035                           UnallocatedA32(instr);
   56036                           return;
   56037                         }
   56038                         unsigned rd = ExtractSRegister(instr, 22, 12);
   56039                         unsigned rm = ExtractSRegister(instr, 5, 0);
   56040                         // VCVTN{<q>}.<dt>.F32 <Sd>, <Sm> ; A1
   56041                         vcvtn(dt, F32, SRegister(rd), SRegister(rm));
   56042                         break;
   56043                       }
   56044                       case 0x000e0000: {
   56045                         // 0xfebe0a40
   56046                         DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
   56047                         if (dt.Is(kDataTypeValueInvalid)) {
   56048                           UnallocatedA32(instr);
   56049                           return;
   56050                         }
   56051                         unsigned rd = ExtractSRegister(instr, 22, 12);
   56052                         unsigned rm = ExtractSRegister(instr, 5, 0);
   56053                         // VCVTP{<q>}.<dt>.F32 <Sd>, <Sm> ; A1
   56054                         vcvtp(dt, F32, SRegister(rd), SRegister(rm));
   56055                         break;
   56056                       }
   56057                       case 0x000f0000: {
   56058                         // 0xfebf0a40
   56059                         DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
   56060                         if (dt.Is(kDataTypeValueInvalid)) {
   56061                           UnallocatedA32(instr);
   56062                           return;
   56063                         }
   56064                         unsigned rd = ExtractSRegister(instr, 22, 12);
   56065                         unsigned rm = ExtractSRegister(instr, 5, 0);
   56066                         // VCVTM{<q>}.<dt>.F32 <Sd>, <Sm> ; A1
   56067                         vcvtm(dt, F32, SRegister(rd), SRegister(rm));
   56068                         break;
   56069                       }
   56070                       default:
   56071                         UnallocatedA32(instr);
   56072                         break;
   56073                     }
   56074                     break;
   56075                   }
   56076                   case 0x00b00140: {
   56077                     // 0xfeb00b40
   56078                     switch (instr & 0x000f0000) {
   56079                       case 0x00080000: {
   56080                         // 0xfeb80b40
   56081                         if ((instr & 0x00000080) == 0x00000000) {
   56082                           unsigned rd = ExtractDRegister(instr, 22, 12);
   56083                           unsigned rm = ExtractDRegister(instr, 5, 0);
   56084                           // VRINTA{<q>}.F64.F64 <Dd>, <Dm> ; A1
   56085                           vrinta(F64, F64, DRegister(rd), DRegister(rm));
   56086                         } else {
   56087                           UnallocatedA32(instr);
   56088                         }
   56089                         break;
   56090                       }
   56091                       case 0x00090000: {
   56092                         // 0xfeb90b40
   56093                         if ((instr & 0x00000080) == 0x00000000) {
   56094                           unsigned rd = ExtractDRegister(instr, 22, 12);
   56095                           unsigned rm = ExtractDRegister(instr, 5, 0);
   56096                           // VRINTN{<q>}.F64.F64 <Dd>, <Dm> ; A1
   56097                           vrintn(F64, F64, DRegister(rd), DRegister(rm));
   56098                         } else {
   56099                           UnallocatedA32(instr);
   56100                         }
   56101                         break;
   56102                       }
   56103                       case 0x000a0000: {
   56104                         // 0xfeba0b40
   56105                         if ((instr & 0x00000080) == 0x00000000) {
   56106                           unsigned rd = ExtractDRegister(instr, 22, 12);
   56107                           unsigned rm = ExtractDRegister(instr, 5, 0);
   56108                           // VRINTP{<q>}.F64.F64 <Dd>, <Dm> ; A1
   56109                           vrintp(F64, F64, DRegister(rd), DRegister(rm));
   56110                         } else {
   56111                           UnallocatedA32(instr);
   56112                         }
   56113                         break;
   56114                       }
   56115                       case 0x000b0000: {
   56116                         // 0xfebb0b40
   56117                         if ((instr & 0x00000080) == 0x00000000) {
   56118                           unsigned rd = ExtractDRegister(instr, 22, 12);
   56119                           unsigned rm = ExtractDRegister(instr, 5, 0);
   56120                           // VRINTM{<q>}.F64.F64 <Dd>, <Dm> ; A1
   56121                           vrintm(F64, F64, DRegister(rd), DRegister(rm));
   56122                         } else {
   56123                           UnallocatedA32(instr);
   56124                         }
   56125                         break;
   56126                       }
   56127                       case 0x000c0000: {
   56128                         // 0xfebc0b40
   56129                         DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
   56130                         if (dt.Is(kDataTypeValueInvalid)) {
   56131                           UnallocatedA32(instr);
   56132                           return;
   56133                         }
   56134                         unsigned rd = ExtractSRegister(instr, 22, 12);
   56135                         unsigned rm = ExtractDRegister(instr, 5, 0);
   56136                         // VCVTA{<q>}.<dt>.F64 <Sd>, <Dm> ; A1
   56137                         vcvta(dt, F64, SRegister(rd), DRegister(rm));
   56138                         break;
   56139                       }
   56140                       case 0x000d0000: {
   56141                         // 0xfebd0b40
   56142                         DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
   56143                         if (dt.Is(kDataTypeValueInvalid)) {
   56144                           UnallocatedA32(instr);
   56145                           return;
   56146                         }
   56147                         unsigned rd = ExtractSRegister(instr, 22, 12);
   56148                         unsigned rm = ExtractDRegister(instr, 5, 0);
   56149                         // VCVTN{<q>}.<dt>.F64 <Sd>, <Dm> ; A1
   56150                         vcvtn(dt, F64, SRegister(rd), DRegister(rm));
   56151                         break;
   56152                       }
   56153                       case 0x000e0000: {
   56154                         // 0xfebe0b40
   56155                         DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
   56156                         if (dt.Is(kDataTypeValueInvalid)) {
   56157                           UnallocatedA32(instr);
   56158                           return;
   56159                         }
   56160                         unsigned rd = ExtractSRegister(instr, 22, 12);
   56161                         unsigned rm = ExtractDRegister(instr, 5, 0);
   56162                         // VCVTP{<q>}.<dt>.F64 <Sd>, <Dm> ; A1
   56163                         vcvtp(dt, F64, SRegister(rd), DRegister(rm));
   56164                         break;
   56165                       }
   56166                       case 0x000f0000: {
   56167                         // 0xfebf0b40
   56168                         DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
   56169                         if (dt.Is(kDataTypeValueInvalid)) {
   56170                           UnallocatedA32(instr);
   56171                           return;
   56172                         }
   56173                         unsigned rd = ExtractSRegister(instr, 22, 12);
   56174                         unsigned rm = ExtractDRegister(instr, 5, 0);
   56175                         // VCVTM{<q>}.<dt>.F64 <Sd>, <Dm> ; A1
   56176                         vcvtm(dt, F64, SRegister(rd), DRegister(rm));
   56177                         break;
   56178                       }
   56179                       default:
   56180                         UnallocatedA32(instr);
   56181                         break;
   56182                     }
   56183                     break;
   56184                   }
   56185                   default:
   56186                     UnallocatedA32(instr);
   56187                     break;
   56188                 }
   56189                 break;
   56190               }
   56191               default: {
   56192                 if (((instr & 0xe00) == 0xa00)) {
   56193                   UnallocatedA32(instr);
   56194                   return;
   56195                 }
   56196                 UnimplementedA32("CDP2", instr);
   56197                 break;
   56198               }
   56199             }
   56200             break;
   56201           }
   56202           case 0x00000010: {
   56203             // 0xfe000010
   56204             switch (instr & 0x00100000) {
   56205               case 0x00000000: {
   56206                 // 0xfe000010
   56207                 if (((instr & 0xe00) == 0xa00)) {
   56208                   UnallocatedA32(instr);
   56209                   return;
   56210                 }
   56211                 UnimplementedA32("MCR2", instr);
   56212                 break;
   56213               }
   56214               case 0x00100000: {
   56215                 // 0xfe100010
   56216                 if (((instr & 0xe00) == 0xa00)) {
   56217                   UnallocatedA32(instr);
   56218                   return;
   56219                 }
   56220                 UnimplementedA32("MRC2", instr);
   56221                 break;
   56222               }
   56223             }
   56224             break;
   56225           }
   56226           default:
   56227             UnallocatedA32(instr);
   56228             break;
   56229         }
   56230         break;
   56231       }
   56232     }
   56233   } else {
   56234     switch (instr & 0x0e000000) {
   56235       case 0x00000000: {
   56236         // 0x00000000
   56237         switch (instr & 0x00100010) {
   56238           case 0x00000000: {
   56239             // 0x00000000
   56240             switch (instr & 0x01a00000) {
   56241               case 0x00000000: {
   56242                 // 0x00000000
   56243                 switch (instr & 0x00400000) {
   56244                   case 0x00000000: {
   56245                     // 0x00000000
   56246                     switch (instr & 0x00000fe0) {
   56247                       case 0x00000060: {
   56248                         // 0x00000060
   56249                         if (((instr & 0xf0000000) == 0xf0000000)) {
   56250                           UnallocatedA32(instr);
   56251                           return;
   56252                         }
   56253                         Condition condition((instr >> 28) & 0xf);
   56254                         unsigned rd = (instr >> 12) & 0xf;
   56255                         unsigned rn = (instr >> 16) & 0xf;
   56256                         unsigned rm = instr & 0xf;
   56257                         // AND{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
   56258                         and_(condition,
   56259                              Best,
   56260                              Register(rd),
   56261                              Register(rn),
   56262                              Operand(Register(rm), RRX));
   56263                         break;
   56264                       }
   56265                       default: {
   56266                         if (((instr & 0xf0000000) == 0xf0000000) ||
   56267                             ((instr & 0xfe0) == 0x60)) {
   56268                           UnallocatedA32(instr);
   56269                           return;
   56270                         }
   56271                         Condition condition((instr >> 28) & 0xf);
   56272                         unsigned rd = (instr >> 12) & 0xf;
   56273                         unsigned rn = (instr >> 16) & 0xf;
   56274                         unsigned rm = instr & 0xf;
   56275                         ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
   56276                                                             (instr >> 7) &
   56277                                                                 0x1f);
   56278                         // AND{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
   56279                         and_(condition,
   56280                              Best,
   56281                              Register(rd),
   56282                              Register(rn),
   56283                              Operand(Register(rm),
   56284                                      shift_operand.GetType(),
   56285                                      shift_operand.GetAmount()));
   56286                         break;
   56287                       }
   56288                     }
   56289                     break;
   56290                   }
   56291                   case 0x00400000: {
   56292                     // 0x00400000
   56293                     switch (instr & 0x000f0000) {
   56294                       case 0x000d0000: {
   56295                         // 0x004d0000
   56296                         switch (instr & 0x00000fe0) {
   56297                           case 0x00000060: {
   56298                             // 0x004d0060
   56299                             if (((instr & 0xf0000000) == 0xf0000000)) {
   56300                               UnallocatedA32(instr);
   56301                               return;
   56302                             }
   56303                             Condition condition((instr >> 28) & 0xf);
   56304                             unsigned rd = (instr >> 12) & 0xf;
   56305                             unsigned rm = instr & 0xf;
   56306                             // SUB{<c>}{<q>} {<Rd>}, SP, <Rm>, RRX ; A1
   56307                             sub(condition,
   56308                                 Best,
   56309                                 Register(rd),
   56310                                 sp,
   56311                                 Operand(Register(rm), RRX));
   56312                             break;
   56313                           }
   56314                           default: {
   56315                             if (((instr & 0xf0000000) == 0xf0000000) ||
   56316                                 ((instr & 0xfe0) == 0x60)) {
   56317                               UnallocatedA32(instr);
   56318                               return;
   56319                             }
   56320                             Condition condition((instr >> 28) & 0xf);
   56321                             unsigned rd = (instr >> 12) & 0xf;
   56322                             unsigned rm = instr & 0xf;
   56323                             ImmediateShiftOperand shift_operand((instr >> 5) &
   56324                                                                     0x3,
   56325                                                                 (instr >> 7) &
   56326                                                                     0x1f);
   56327                             // SUB{<c>}{<q>} {<Rd>}, SP, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
   56328                             sub(condition,
   56329                                 Best,
   56330                                 Register(rd),
   56331                                 sp,
   56332                                 Operand(Register(rm),
   56333                                         shift_operand.GetType(),
   56334                                         shift_operand.GetAmount()));
   56335                             break;
   56336                           }
   56337                         }
   56338                         break;
   56339                       }
   56340                       default: {
   56341                         switch (instr & 0x00000fe0) {
   56342                           case 0x00000060: {
   56343                             // 0x00400060
   56344                             if (((instr & 0xf0000000) == 0xf0000000) ||
   56345                                 ((instr & 0xf0000) == 0xd0000)) {
   56346                               UnallocatedA32(instr);
   56347                               return;
   56348                             }
   56349                             Condition condition((instr >> 28) & 0xf);
   56350                             unsigned rd = (instr >> 12) & 0xf;
   56351                             unsigned rn = (instr >> 16) & 0xf;
   56352                             unsigned rm = instr & 0xf;
   56353                             // SUB{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
   56354                             sub(condition,
   56355                                 Best,
   56356                                 Register(rd),
   56357                                 Register(rn),
   56358                                 Operand(Register(rm), RRX));
   56359                             break;
   56360                           }
   56361                           default: {
   56362                             if (((instr & 0xf0000000) == 0xf0000000) ||
   56363                                 ((instr & 0xf0000) == 0xd0000) ||
   56364                                 ((instr & 0xfe0) == 0x60)) {
   56365                               UnallocatedA32(instr);
   56366                               return;
   56367                             }
   56368                             Condition condition((instr >> 28) & 0xf);
   56369                             unsigned rd = (instr >> 12) & 0xf;
   56370                             unsigned rn = (instr >> 16) & 0xf;
   56371                             unsigned rm = instr & 0xf;
   56372                             ImmediateShiftOperand shift_operand((instr >> 5) &
   56373                                                                     0x3,
   56374                                                                 (instr >> 7) &
   56375                                                                     0x1f);
   56376                             // SUB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
   56377                             sub(condition,
   56378                                 Best,
   56379                                 Register(rd),
   56380                                 Register(rn),
   56381                                 Operand(Register(rm),
   56382                                         shift_operand.GetType(),
   56383                                         shift_operand.GetAmount()));
   56384                             break;
   56385                           }
   56386                         }
   56387                         break;
   56388                       }
   56389                     }
   56390                     break;
   56391                   }
   56392                 }
   56393                 break;
   56394               }
   56395               case 0x00200000: {
   56396                 // 0x00200000
   56397                 switch (instr & 0x00400000) {
   56398                   case 0x00000000: {
   56399                     // 0x00200000
   56400                     switch (instr & 0x00000fe0) {
   56401                       case 0x00000060: {
   56402                         // 0x00200060
   56403                         if (((instr & 0xf0000000) == 0xf0000000)) {
   56404                           UnallocatedA32(instr);
   56405                           return;
   56406                         }
   56407                         Condition condition((instr >> 28) & 0xf);
   56408                         unsigned rd = (instr >> 12) & 0xf;
   56409                         unsigned rn = (instr >> 16) & 0xf;
   56410                         unsigned rm = instr & 0xf;
   56411                         // EOR{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
   56412                         eor(condition,
   56413                             Best,
   56414                             Register(rd),
   56415                             Register(rn),
   56416                             Operand(Register(rm), RRX));
   56417                         break;
   56418                       }
   56419                       default: {
   56420                         if (((instr & 0xf0000000) == 0xf0000000) ||
   56421                             ((instr & 0xfe0) == 0x60)) {
   56422                           UnallocatedA32(instr);
   56423                           return;
   56424                         }
   56425                         Condition condition((instr >> 28) & 0xf);
   56426                         unsigned rd = (instr >> 12) & 0xf;
   56427                         unsigned rn = (instr >> 16) & 0xf;
   56428                         unsigned rm = instr & 0xf;
   56429                         ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
   56430                                                             (instr >> 7) &
   56431                                                                 0x1f);
   56432                         // EOR{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
   56433                         eor(condition,
   56434                             Best,
   56435                             Register(rd),
   56436                             Register(rn),
   56437                             Operand(Register(rm),
   56438                                     shift_operand.GetType(),
   56439                                     shift_operand.GetAmount()));
   56440                         break;
   56441                       }
   56442                     }
   56443                     break;
   56444                   }
   56445                   case 0x00400000: {
   56446                     // 0x00600000
   56447                     switch (instr & 0x00000fe0) {
   56448                       case 0x00000060: {
   56449                         // 0x00600060
   56450                         if (((instr & 0xf0000000) == 0xf0000000)) {
   56451                           UnallocatedA32(instr);
   56452                           return;
   56453                         }
   56454                         Condition condition((instr >> 28) & 0xf);
   56455                         unsigned rd = (instr >> 12) & 0xf;
   56456                         unsigned rn = (instr >> 16) & 0xf;
   56457                         unsigned rm = instr & 0xf;
   56458                         // RSB{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
   56459                         rsb(condition,
   56460                             Best,
   56461                             Register(rd),
   56462                             Register(rn),
   56463                             Operand(Register(rm), RRX));
   56464                         break;
   56465                       }
   56466                       default: {
   56467                         if (((instr & 0xf0000000) == 0xf0000000) ||
   56468                             ((instr & 0xfe0) == 0x60)) {
   56469                           UnallocatedA32(instr);
   56470                           return;
   56471                         }
   56472                         Condition condition((instr >> 28) & 0xf);
   56473                         unsigned rd = (instr >> 12) & 0xf;
   56474                         unsigned rn = (instr >> 16) & 0xf;
   56475                         unsigned rm = instr & 0xf;
   56476                         ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
   56477                                                             (instr >> 7) &
   56478                                                                 0x1f);
   56479                         // RSB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
   56480                         rsb(condition,
   56481                             Best,
   56482                             Register(rd),
   56483                             Register(rn),
   56484                             Operand(Register(rm),
   56485                                     shift_operand.GetType(),
   56486                                     shift_operand.GetAmount()));
   56487                         break;
   56488                       }
   56489                     }
   56490                     break;
   56491                   }
   56492                 }
   56493                 break;
   56494               }
   56495               case 0x00800000: {
   56496                 // 0x00800000
   56497                 switch (instr & 0x00400000) {
   56498                   case 0x00000000: {
   56499                     // 0x00800000
   56500                     switch (instr & 0x000f0000) {
   56501                       case 0x000d0000: {
   56502                         // 0x008d0000
   56503                         switch (instr & 0x00000fe0) {
   56504                           case 0x00000060: {
   56505                             // 0x008d0060
   56506                             if (((instr & 0xf0000000) == 0xf0000000)) {
   56507                               UnallocatedA32(instr);
   56508                               return;
   56509                             }
   56510                             Condition condition((instr >> 28) & 0xf);
   56511                             unsigned rd = (instr >> 12) & 0xf;
   56512                             unsigned rm = instr & 0xf;
   56513                             // ADD{<c>}{<q>} {<Rd>}, SP, <Rm>, RRX ; A1
   56514                             add(condition,
   56515                                 Best,
   56516                                 Register(rd),
   56517                                 sp,
   56518                                 Operand(Register(rm), RRX));
   56519                             break;
   56520                           }
   56521                           default: {
   56522                             if (((instr & 0xf0000000) == 0xf0000000) ||
   56523                                 ((instr & 0xfe0) == 0x60)) {
   56524                               UnallocatedA32(instr);
   56525                               return;
   56526                             }
   56527                             Condition condition((instr >> 28) & 0xf);
   56528                             unsigned rd = (instr >> 12) & 0xf;
   56529                             unsigned rm = instr & 0xf;
   56530                             ImmediateShiftOperand shift_operand((instr >> 5) &
   56531                                                                     0x3,
   56532                                                                 (instr >> 7) &
   56533                                                                     0x1f);
   56534                             // ADD{<c>}{<q>} {<Rd>}, SP, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
   56535                             add(condition,
   56536                                 Best,
   56537                                 Register(rd),
   56538                                 sp,
   56539                                 Operand(Register(rm),
   56540                                         shift_operand.GetType(),
   56541                                         shift_operand.GetAmount()));
   56542                             break;
   56543                           }
   56544                         }
   56545                         break;
   56546                       }
   56547                       default: {
   56548                         switch (instr & 0x00000fe0) {
   56549                           case 0x00000060: {
   56550                             // 0x00800060
   56551                             if (((instr & 0xf0000000) == 0xf0000000) ||
   56552                                 ((instr & 0xf0000) == 0xd0000)) {
   56553                               UnallocatedA32(instr);
   56554                               return;
   56555                             }
   56556                             Condition condition((instr >> 28) & 0xf);
   56557                             unsigned rd = (instr >> 12) & 0xf;
   56558                             unsigned rn = (instr >> 16) & 0xf;
   56559                             unsigned rm = instr & 0xf;
   56560                             // ADD{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
   56561                             add(condition,
   56562                                 Best,
   56563                                 Register(rd),
   56564                                 Register(rn),
   56565                                 Operand(Register(rm), RRX));
   56566                             break;
   56567                           }
   56568                           default: {
   56569                             if (((instr & 0xf0000000) == 0xf0000000) ||
   56570                                 ((instr & 0xf0000) == 0xd0000) ||
   56571                                 ((instr & 0xfe0) == 0x60)) {
   56572                               UnallocatedA32(instr);
   56573                               return;
   56574                             }
   56575                             Condition condition((instr >> 28) & 0xf);
   56576                             unsigned rd = (instr >> 12) & 0xf;
   56577                             unsigned rn = (instr >> 16) & 0xf;
   56578                             unsigned rm = instr & 0xf;
   56579                             ImmediateShiftOperand shift_operand((instr >> 5) &
   56580                                                                     0x3,
   56581                                                                 (instr >> 7) &
   56582                                                                     0x1f);
   56583                             // ADD{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
   56584                             add(condition,
   56585                                 Best,
   56586                                 Register(rd),
   56587                                 Register(rn),
   56588                                 Operand(Register(rm),
   56589                                         shift_operand.GetType(),
   56590                                         shift_operand.GetAmount()));
   56591                             break;
   56592                           }
   56593                         }
   56594                         break;
   56595                       }
   56596                     }
   56597                     break;
   56598                   }
   56599                   case 0x00400000: {
   56600                     // 0x00c00000
   56601                     switch (instr & 0x00000fe0) {
   56602                       case 0x00000060: {
   56603                         // 0x00c00060
   56604                         if (((instr & 0xf0000000) == 0xf0000000)) {
   56605                           UnallocatedA32(instr);
   56606                           return;
   56607                         }
   56608                         Condition condition((instr >> 28) & 0xf);
   56609                         unsigned rd = (instr >> 12) & 0xf;
   56610                         unsigned rn = (instr >> 16) & 0xf;
   56611                         unsigned rm = instr & 0xf;
   56612                         // SBC{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
   56613                         sbc(condition,
   56614                             Best,
   56615                             Register(rd),
   56616                             Register(rn),
   56617                             Operand(Register(rm), RRX));
   56618                         break;
   56619                       }
   56620                       default: {
   56621                         if (((instr & 0xf0000000) == 0xf0000000) ||
   56622                             ((instr & 0xfe0) == 0x60)) {
   56623                           UnallocatedA32(instr);
   56624                           return;
   56625                         }
   56626                         Condition condition((instr >> 28) & 0xf);
   56627                         unsigned rd = (instr >> 12) & 0xf;
   56628                         unsigned rn = (instr >> 16) & 0xf;
   56629                         unsigned rm = instr & 0xf;
   56630                         ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
   56631                                                             (instr >> 7) &
   56632                                                                 0x1f);
   56633                         // SBC{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
   56634                         sbc(condition,
   56635                             Best,
   56636                             Register(rd),
   56637                             Register(rn),
   56638                             Operand(Register(rm),
   56639                                     shift_operand.GetType(),
   56640                                     shift_operand.GetAmount()));
   56641                         break;
   56642                       }
   56643                     }
   56644                     break;
   56645                   }
   56646                 }
   56647                 break;
   56648               }
   56649               case 0x00a00000: {
   56650                 // 0x00a00000
   56651                 switch (instr & 0x00400000) {
   56652                   case 0x00000000: {
   56653                     // 0x00a00000
   56654                     switch (instr & 0x00000fe0) {
   56655                       case 0x00000060: {
   56656                         // 0x00a00060
   56657                         if (((instr & 0xf0000000) == 0xf0000000)) {
   56658                           UnallocatedA32(instr);
   56659                           return;
   56660                         }
   56661                         Condition condition((instr >> 28) & 0xf);
   56662                         unsigned rd = (instr >> 12) & 0xf;
   56663                         unsigned rn = (instr >> 16) & 0xf;
   56664                         unsigned rm = instr & 0xf;
   56665                         // ADC{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
   56666                         adc(condition,
   56667                             Best,
   56668                             Register(rd),
   56669                             Register(rn),
   56670                             Operand(Register(rm), RRX));
   56671                         break;
   56672                       }
   56673                       default: {
   56674                         if (((instr & 0xf0000000) == 0xf0000000) ||
   56675                             ((instr & 0xfe0) == 0x60)) {
   56676                           UnallocatedA32(instr);
   56677                           return;
   56678                         }
   56679                         Condition condition((instr >> 28) & 0xf);
   56680                         unsigned rd = (instr >> 12) & 0xf;
   56681                         unsigned rn = (instr >> 16) & 0xf;
   56682                         unsigned rm = instr & 0xf;
   56683                         ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
   56684                                                             (instr >> 7) &
   56685                                                                 0x1f);
   56686                         // ADC{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
   56687                         adc(condition,
   56688                             Best,
   56689                             Register(rd),
   56690                             Register(rn),
   56691                             Operand(Register(rm),
   56692                                     shift_operand.GetType(),
   56693                                     shift_operand.GetAmount()));
   56694                         break;
   56695                       }
   56696                     }
   56697                     break;
   56698                   }
   56699                   case 0x00400000: {
   56700                     // 0x00e00000
   56701                     switch (instr & 0x00000fe0) {
   56702                       case 0x00000060: {
   56703                         // 0x00e00060
   56704                         if (((instr & 0xf0000000) == 0xf0000000)) {
   56705                           UnallocatedA32(instr);
   56706                           return;
   56707                         }
   56708                         Condition condition((instr >> 28) & 0xf);
   56709                         unsigned rd = (instr >> 12) & 0xf;
   56710                         unsigned rn = (instr >> 16) & 0xf;
   56711                         unsigned rm = instr & 0xf;
   56712                         // RSC{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
   56713                         rsc(condition,
   56714                             Register(rd),
   56715                             Register(rn),
   56716                             Operand(Register(rm), RRX));
   56717                         break;
   56718                       }
   56719                       default: {
   56720                         if (((instr & 0xf0000000) == 0xf0000000) ||
   56721                             ((instr & 0xfe0) == 0x60)) {
   56722                           UnallocatedA32(instr);
   56723                           return;
   56724                         }
   56725                         Condition condition((instr >> 28) & 0xf);
   56726                         unsigned rd = (instr >> 12) & 0xf;
   56727                         unsigned rn = (instr >> 16) & 0xf;
   56728                         unsigned rm = instr & 0xf;
   56729                         ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
   56730                                                             (instr >> 7) &
   56731                                                                 0x1f);
   56732                         // RSC{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
   56733                         rsc(condition,
   56734                             Register(rd),
   56735                             Register(rn),
   56736                             Operand(Register(rm),
   56737                                     shift_operand.GetType(),
   56738                                     shift_operand.GetAmount()));
   56739                         break;
   56740                       }
   56741                     }
   56742                     break;
   56743                   }
   56744                 }
   56745                 break;
   56746               }
   56747               case 0x01000000: {
   56748                 // 0x01000000
   56749                 switch (instr & 0x000000e0) {
   56750                   case 0x00000000: {
   56751                     // 0x01000000
   56752                     switch (instr & 0x00000200) {
   56753                       case 0x00000000: {
   56754                         // 0x01000000
   56755                         if (((instr & 0xf0000000) == 0xf0000000)) {
   56756                           UnallocatedA32(instr);
   56757                           return;
   56758                         }
   56759                         Condition condition((instr >> 28) & 0xf);
   56760                         unsigned rd = (instr >> 12) & 0xf;
   56761                         unsigned spec_reg = (instr >> 22) & 0x1;
   56762                         // MRS{<c>}{<q>} <Rd>, <spec_reg> ; A1
   56763                         mrs(condition, Register(rd), SpecialRegister(spec_reg));
   56764                         if (((instr & 0xfbf0fff) != 0x10f0000)) {
   56765                           UnpredictableA32(instr);
   56766                         }
   56767                         break;
   56768                       }
   56769                       case 0x00000200: {
   56770                         // 0x01000200
   56771                         if (((instr & 0xf0000000) == 0xf0000000)) {
   56772                           UnallocatedA32(instr);
   56773                           return;
   56774                         }
   56775                         UnimplementedA32("MRS", instr);
   56776                         break;
   56777                       }
   56778                     }
   56779                     break;
   56780                   }
   56781                   case 0x00000040: {
   56782                     // 0x01000040
   56783                     switch (instr & 0x00400200) {
   56784                       case 0x00000000: {
   56785                         // 0x01000040
   56786                         if (((instr & 0xf0000000) == 0xf0000000)) {
   56787                           UnallocatedA32(instr);
   56788                           return;
   56789                         }
   56790                         unsigned rd = (instr >> 12) & 0xf;
   56791                         unsigned rn = (instr >> 16) & 0xf;
   56792                         unsigned rm = instr & 0xf;
   56793                         // CRC32B{<q>} <Rd>, <Rn>, <Rm> ; A1
   56794                         crc32b(al, Register(rd), Register(rn), Register(rm));
   56795                         if (((instr & 0xff00ff0) != 0x1000040)) {
   56796                           UnpredictableA32(instr);
   56797                         }
   56798                         break;
   56799                       }
   56800                       case 0x00000200: {
   56801                         // 0x01000240
   56802                         if (((instr & 0xf0000000) == 0xf0000000)) {
   56803                           UnallocatedA32(instr);
   56804                           return;
   56805                         }
   56806                         unsigned rd = (instr >> 12) & 0xf;
   56807                         unsigned rn = (instr >> 16) & 0xf;
   56808                         unsigned rm = instr & 0xf;
   56809                         // CRC32CB{<q>} <Rd>, <Rn>, <Rm> ; A1
   56810                         crc32cb(al, Register(rd), Register(rn), Register(rm));
   56811                         if (((instr & 0xff00ff0) != 0x1000240)) {
   56812                           UnpredictableA32(instr);
   56813                         }
   56814                         break;
   56815                       }
   56816                       case 0x00400000: {
   56817                         // 0x01400040
   56818                         if (((instr & 0xf0000000) == 0xf0000000)) {
   56819                           UnallocatedA32(instr);
   56820                           return;
   56821                         }
   56822                         unsigned rd = (instr >> 12) & 0xf;
   56823                         unsigned rn = (instr >> 16) & 0xf;
   56824                         unsigned rm = instr & 0xf;
   56825                         // CRC32W{<q>} <Rd>, <Rn>, <Rm> ; A1
   56826                         crc32w(al, Register(rd), Register(rn), Register(rm));
   56827                         if (((instr & 0xff00ff0) != 0x1400040)) {
   56828                           UnpredictableA32(instr);
   56829                         }
   56830                         break;
   56831                       }
   56832                       case 0x00400200: {
   56833                         // 0x01400240
   56834                         if (((instr & 0xf0000000) == 0xf0000000)) {
   56835                           UnallocatedA32(instr);
   56836                           return;
   56837                         }
   56838                         unsigned rd = (instr >> 12) & 0xf;
   56839                         unsigned rn = (instr >> 16) & 0xf;
   56840                         unsigned rm = instr & 0xf;
   56841                         // CRC32CW{<q>} <Rd>, <Rn>, <Rm> ; A1
   56842                         crc32cw(al, Register(rd), Register(rn), Register(rm));
   56843                         if (((instr & 0xff00ff0) != 0x1400240)) {
   56844                           UnpredictableA32(instr);
   56845                         }
   56846                         break;
   56847                       }
   56848                     }
   56849                     break;
   56850                   }
   56851                   case 0x00000080: {
   56852                     // 0x01000080
   56853                     switch (instr & 0x00400000) {
   56854                       case 0x00000000: {
   56855                         // 0x01000080
   56856                         if (((instr & 0xf0000000) == 0xf0000000)) {
   56857                           UnallocatedA32(instr);
   56858                           return;
   56859                         }
   56860                         Condition condition((instr >> 28) & 0xf);
   56861                         unsigned rd = (instr >> 16) & 0xf;
   56862                         unsigned rn = instr & 0xf;
   56863                         unsigned rm = (instr >> 8) & 0xf;
   56864                         unsigned ra = (instr >> 12) & 0xf;
   56865                         // SMLABB{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
   56866                         smlabb(condition,
   56867                                Register(rd),
   56868                                Register(rn),
   56869                                Register(rm),
   56870                                Register(ra));
   56871                         break;
   56872                       }
   56873                       case 0x00400000: {
   56874                         // 0x01400080
   56875                         if (((instr & 0xf0000000) == 0xf0000000)) {
   56876                           UnallocatedA32(instr);
   56877                           return;
   56878                         }
   56879                         Condition condition((instr >> 28) & 0xf);
   56880                         unsigned rdlo = (instr >> 12) & 0xf;
   56881                         unsigned rdhi = (instr >> 16) & 0xf;
   56882                         unsigned rn = instr & 0xf;
   56883                         unsigned rm = (instr >> 8) & 0xf;
   56884                         // SMLALBB{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
   56885                         smlalbb(condition,
   56886                                 Register(rdlo),
   56887                                 Register(rdhi),
   56888                                 Register(rn),
   56889                                 Register(rm));
   56890                         break;
   56891                       }
   56892                     }
   56893                     break;
   56894                   }
   56895                   case 0x000000a0: {
   56896                     // 0x010000a0
   56897                     switch (instr & 0x00400000) {
   56898                       case 0x00000000: {
   56899                         // 0x010000a0
   56900                         if (((instr & 0xf0000000) == 0xf0000000)) {
   56901                           UnallocatedA32(instr);
   56902                           return;
   56903                         }
   56904                         Condition condition((instr >> 28) & 0xf);
   56905                         unsigned rd = (instr >> 16) & 0xf;
   56906                         unsigned rn = instr & 0xf;
   56907                         unsigned rm = (instr >> 8) & 0xf;
   56908                         unsigned ra = (instr >> 12) & 0xf;
   56909                         // SMLATB{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
   56910                         smlatb(condition,
   56911                                Register(rd),
   56912                                Register(rn),
   56913                                Register(rm),
   56914                                Register(ra));
   56915                         break;
   56916                       }
   56917                       case 0x00400000: {
   56918                         // 0x014000a0
   56919                         if (((instr & 0xf0000000) == 0xf0000000)) {
   56920                           UnallocatedA32(instr);
   56921                           return;
   56922                         }
   56923                         Condition condition((instr >> 28) & 0xf);
   56924                         unsigned rdlo = (instr >> 12) & 0xf;
   56925                         unsigned rdhi = (instr >> 16) & 0xf;
   56926                         unsigned rn = instr & 0xf;
   56927                         unsigned rm = (instr >> 8) & 0xf;
   56928                         // SMLALTB{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
   56929                         smlaltb(condition,
   56930                                 Register(rdlo),
   56931                                 Register(rdhi),
   56932                                 Register(rn),
   56933                                 Register(rm));
   56934                         break;
   56935                       }
   56936                     }
   56937                     break;
   56938                   }
   56939                   case 0x000000c0: {
   56940                     // 0x010000c0
   56941                     switch (instr & 0x00400000) {
   56942                       case 0x00000000: {
   56943                         // 0x010000c0
   56944                         if (((instr & 0xf0000000) == 0xf0000000)) {
   56945                           UnallocatedA32(instr);
   56946                           return;
   56947                         }
   56948                         Condition condition((instr >> 28) & 0xf);
   56949                         unsigned rd = (instr >> 16) & 0xf;
   56950                         unsigned rn = instr & 0xf;
   56951                         unsigned rm = (instr >> 8) & 0xf;
   56952                         unsigned ra = (instr >> 12) & 0xf;
   56953                         // SMLABT{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
   56954                         smlabt(condition,
   56955                                Register(rd),
   56956                                Register(rn),
   56957                                Register(rm),
   56958                                Register(ra));
   56959                         break;
   56960                       }
   56961                       case 0x00400000: {
   56962                         // 0x014000c0
   56963                         if (((instr & 0xf0000000) == 0xf0000000)) {
   56964                           UnallocatedA32(instr);
   56965                           return;
   56966                         }
   56967                         Condition condition((instr >> 28) & 0xf);
   56968                         unsigned rdlo = (instr >> 12) & 0xf;
   56969                         unsigned rdhi = (instr >> 16) & 0xf;
   56970                         unsigned rn = instr & 0xf;
   56971                         unsigned rm = (instr >> 8) & 0xf;
   56972                         // SMLALBT{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
   56973                         smlalbt(condition,
   56974                                 Register(rdlo),
   56975                                 Register(rdhi),
   56976                                 Register(rn),
   56977                                 Register(rm));
   56978                         break;
   56979                       }
   56980                     }
   56981                     break;
   56982                   }
   56983                   case 0x000000e0: {
   56984                     // 0x010000e0
   56985                     switch (instr & 0x00400000) {
   56986                       case 0x00000000: {
   56987                         // 0x010000e0
   56988                         if (((instr & 0xf0000000) == 0xf0000000)) {
   56989                           UnallocatedA32(instr);
   56990                           return;
   56991                         }
   56992                         Condition condition((instr >> 28) & 0xf);
   56993                         unsigned rd = (instr >> 16) & 0xf;
   56994                         unsigned rn = instr & 0xf;
   56995                         unsigned rm = (instr >> 8) & 0xf;
   56996                         unsigned ra = (instr >> 12) & 0xf;
   56997                         // SMLATT{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
   56998                         smlatt(condition,
   56999                                Register(rd),
   57000                                Register(rn),
   57001                                Register(rm),
   57002                                Register(ra));
   57003                         break;
   57004                       }
   57005                       case 0x00400000: {
   57006                         // 0x014000e0
   57007                         if (((instr & 0xf0000000) == 0xf0000000)) {
   57008                           UnallocatedA32(instr);
   57009                           return;
   57010                         }
   57011                         Condition condition((instr >> 28) & 0xf);
   57012                         unsigned rdlo = (instr >> 12) & 0xf;
   57013                         unsigned rdhi = (instr >> 16) & 0xf;
   57014                         unsigned rn = instr & 0xf;
   57015                         unsigned rm = (instr >> 8) & 0xf;
   57016                         // SMLALTT{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
   57017                         smlaltt(condition,
   57018                                 Register(rdlo),
   57019                                 Register(rdhi),
   57020                                 Register(rn),
   57021                                 Register(rm));
   57022                         break;
   57023                       }
   57024                     }
   57025                     break;
   57026                   }
   57027                   default:
   57028                     UnallocatedA32(instr);
   57029                     break;
   57030                 }
   57031                 break;
   57032               }
   57033               case 0x01200000: {
   57034                 // 0x01200000
   57035                 switch (instr & 0x000000e0) {
   57036                   case 0x00000000: {
   57037                     // 0x01200000
   57038                     switch (instr & 0x00000200) {
   57039                       case 0x00000000: {
   57040                         // 0x01200000
   57041                         if (((instr & 0xf0000000) == 0xf0000000)) {
   57042                           UnallocatedA32(instr);
   57043                           return;
   57044                         }
   57045                         Condition condition((instr >> 28) & 0xf);
   57046                         unsigned spec_reg =
   57047                             ((instr >> 16) & 0xf) | ((instr >> 18) & 0x10);
   57048                         unsigned rn = instr & 0xf;
   57049                         // MSR{<c>}{<q>} <spec_reg>, <Rn> ; A1
   57050                         msr(condition,
   57051                             MaskedSpecialRegister(spec_reg),
   57052                             Register(rn));
   57053                         if (((instr & 0xfb0fff0) != 0x120f000)) {
   57054                           UnpredictableA32(instr);
   57055                         }
   57056                         break;
   57057                       }
   57058                       case 0x00000200: {
   57059                         // 0x01200200
   57060                         if (((instr & 0xf0000000) == 0xf0000000)) {
   57061                           UnallocatedA32(instr);
   57062                           return;
   57063                         }
   57064                         UnimplementedA32("MSR", instr);
   57065                         break;
   57066                       }
   57067                     }
   57068                     break;
   57069                   }
   57070                   case 0x00000020: {
   57071                     // 0x01200020
   57072                     if ((instr & 0x00400000) == 0x00000000) {
   57073                       if (((instr & 0xf0000000) == 0xf0000000)) {
   57074                         UnallocatedA32(instr);
   57075                         return;
   57076                       }
   57077                       Condition condition((instr >> 28) & 0xf);
   57078                       unsigned rm = instr & 0xf;
   57079                       // BXJ{<c>}{<q>} <Rm> ; A1
   57080                       bxj(condition, Register(rm));
   57081                       if (((instr & 0xffffff0) != 0x12fff20)) {
   57082                         UnpredictableA32(instr);
   57083                       }
   57084                     } else {
   57085                       UnallocatedA32(instr);
   57086                     }
   57087                     break;
   57088                   }
   57089                   case 0x00000040: {
   57090                     // 0x01200040
   57091                     switch (instr & 0x00400200) {
   57092                       case 0x00000000: {
   57093                         // 0x01200040
   57094                         if (((instr & 0xf0000000) == 0xf0000000)) {
   57095                           UnallocatedA32(instr);
   57096                           return;
   57097                         }
   57098                         unsigned rd = (instr >> 12) & 0xf;
   57099                         unsigned rn = (instr >> 16) & 0xf;
   57100                         unsigned rm = instr & 0xf;
   57101                         // CRC32H{<q>} <Rd>, <Rn>, <Rm> ; A1
   57102                         crc32h(al, Register(rd), Register(rn), Register(rm));
   57103                         if (((instr & 0xff00ff0) != 0x1200040)) {
   57104                           UnpredictableA32(instr);
   57105                         }
   57106                         break;
   57107                       }
   57108                       case 0x00000200: {
   57109                         // 0x01200240
   57110                         if (((instr & 0xf0000000) == 0xf0000000)) {
   57111                           UnallocatedA32(instr);
   57112                           return;
   57113                         }
   57114                         unsigned rd = (instr >> 12) & 0xf;
   57115                         unsigned rn = (instr >> 16) & 0xf;
   57116                         unsigned rm = instr & 0xf;
   57117                         // CRC32CH{<q>} <Rd>, <Rn>, <Rm> ; A1
   57118                         crc32ch(al, Register(rd), Register(rn), Register(rm));
   57119                         if (((instr & 0xff00ff0) != 0x1200240)) {
   57120                           UnpredictableA32(instr);
   57121                         }
   57122                         break;
   57123                       }
   57124                       default:
   57125                         UnallocatedA32(instr);
   57126                         break;
   57127                     }
   57128                     break;
   57129                   }
   57130                   case 0x00000060: {
   57131                     // 0x01200060
   57132                     if ((instr & 0x00400000) == 0x00400000) {
   57133                       if (((instr & 0xf0000000) == 0xf0000000)) {
   57134                         UnallocatedA32(instr);
   57135                         return;
   57136                       }
   57137                       UnimplementedA32("ERET", instr);
   57138                     } else {
   57139                       UnallocatedA32(instr);
   57140                     }
   57141                     break;
   57142                   }
   57143                   case 0x00000080: {
   57144                     // 0x01200080
   57145                     switch (instr & 0x00400000) {
   57146                       case 0x00000000: {
   57147                         // 0x01200080
   57148                         if (((instr & 0xf0000000) == 0xf0000000)) {
   57149                           UnallocatedA32(instr);
   57150                           return;
   57151                         }
   57152                         Condition condition((instr >> 28) & 0xf);
   57153                         unsigned rd = (instr >> 16) & 0xf;
   57154                         unsigned rn = instr & 0xf;
   57155                         unsigned rm = (instr >> 8) & 0xf;
   57156                         unsigned ra = (instr >> 12) & 0xf;
   57157                         // SMLAWB{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
   57158                         smlawb(condition,
   57159                                Register(rd),
   57160                                Register(rn),
   57161                                Register(rm),
   57162                                Register(ra));
   57163                         break;
   57164                       }
   57165                       case 0x00400000: {
   57166                         // 0x01600080
   57167                         if (((instr & 0xf0000000) == 0xf0000000)) {
   57168                           UnallocatedA32(instr);
   57169                           return;
   57170                         }
   57171                         Condition condition((instr >> 28) & 0xf);
   57172                         unsigned rd = (instr >> 16) & 0xf;
   57173                         unsigned rn = instr & 0xf;
   57174                         unsigned rm = (instr >> 8) & 0xf;
   57175                         // SMULBB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
   57176                         smulbb(condition,
   57177                                Register(rd),
   57178                                Register(rn),
   57179                                Register(rm));
   57180                         if (((instr & 0xff0f0f0) != 0x1600080)) {
   57181                           UnpredictableA32(instr);
   57182                         }
   57183                         break;
   57184                       }
   57185                     }
   57186                     break;
   57187                   }
   57188                   case 0x000000a0: {
   57189                     // 0x012000a0
   57190                     switch (instr & 0x00400000) {
   57191                       case 0x00000000: {
   57192                         // 0x012000a0
   57193                         if (((instr & 0xf0000000) == 0xf0000000)) {
   57194                           UnallocatedA32(instr);
   57195                           return;
   57196                         }
   57197                         Condition condition((instr >> 28) & 0xf);
   57198                         unsigned rd = (instr >> 16) & 0xf;
   57199                         unsigned rn = instr & 0xf;
   57200                         unsigned rm = (instr >> 8) & 0xf;
   57201                         // SMULWB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
   57202                         smulwb(condition,
   57203                                Register(rd),
   57204                                Register(rn),
   57205                                Register(rm));
   57206                         if (((instr & 0xff0f0f0) != 0x12000a0)) {
   57207                           UnpredictableA32(instr);
   57208                         }
   57209                         break;
   57210                       }
   57211                       case 0x00400000: {
   57212                         // 0x016000a0
   57213                         if (((instr & 0xf0000000) == 0xf0000000)) {
   57214                           UnallocatedA32(instr);
   57215                           return;
   57216                         }
   57217                         Condition condition((instr >> 28) & 0xf);
   57218                         unsigned rd = (instr >> 16) & 0xf;
   57219                         unsigned rn = instr & 0xf;
   57220                         unsigned rm = (instr >> 8) & 0xf;
   57221                         // SMULTB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
   57222                         smultb(condition,
   57223                                Register(rd),
   57224                                Register(rn),
   57225                                Register(rm));
   57226                         if (((instr & 0xff0f0f0) != 0x16000a0)) {
   57227                           UnpredictableA32(instr);
   57228                         }
   57229                         break;
   57230                       }
   57231                     }
   57232                     break;
   57233                   }
   57234                   case 0x000000c0: {
   57235                     // 0x012000c0
   57236                     switch (instr & 0x00400000) {
   57237                       case 0x00000000: {
   57238                         // 0x012000c0
   57239                         if (((instr & 0xf0000000) == 0xf0000000)) {
   57240                           UnallocatedA32(instr);
   57241                           return;
   57242                         }
   57243                         Condition condition((instr >> 28) & 0xf);
   57244                         unsigned rd = (instr >> 16) & 0xf;
   57245                         unsigned rn = instr & 0xf;
   57246                         unsigned rm = (instr >> 8) & 0xf;
   57247                         unsigned ra = (instr >> 12) & 0xf;
   57248                         // SMLAWT{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
   57249                         smlawt(condition,
   57250                                Register(rd),
   57251                                Register(rn),
   57252                                Register(rm),
   57253                                Register(ra));
   57254                         break;
   57255                       }
   57256                       case 0x00400000: {
   57257                         // 0x016000c0
   57258                         if (((instr & 0xf0000000) == 0xf0000000)) {
   57259                           UnallocatedA32(instr);
   57260                           return;
   57261                         }
   57262                         Condition condition((instr >> 28) & 0xf);
   57263                         unsigned rd = (instr >> 16) & 0xf;
   57264                         unsigned rn = instr & 0xf;
   57265                         unsigned rm = (instr >> 8) & 0xf;
   57266                         // SMULBT{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
   57267                         smulbt(condition,
   57268                                Register(rd),
   57269                                Register(rn),
   57270                                Register(rm));
   57271                         if (((instr & 0xff0f0f0) != 0x16000c0)) {
   57272                           UnpredictableA32(instr);
   57273                         }
   57274                         break;
   57275                       }
   57276                     }
   57277                     break;
   57278                   }
   57279                   case 0x000000e0: {
   57280                     // 0x012000e0
   57281                     switch (instr & 0x00400000) {
   57282                       case 0x00000000: {
   57283                         // 0x012000e0
   57284                         if (((instr & 0xf0000000) == 0xf0000000)) {
   57285                           UnallocatedA32(instr);
   57286                           return;
   57287                         }
   57288                         Condition condition((instr >> 28) & 0xf);
   57289                         unsigned rd = (instr >> 16) & 0xf;
   57290                         unsigned rn = instr & 0xf;
   57291                         unsigned rm = (instr >> 8) & 0xf;
   57292                         // SMULWT{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
   57293                         smulwt(condition,
   57294                                Register(rd),
   57295                                Register(rn),
   57296                                Register(rm));
   57297                         if (((instr & 0xff0f0f0) != 0x12000e0)) {
   57298                           UnpredictableA32(instr);
   57299                         }
   57300                         break;
   57301                       }
   57302                       case 0x00400000: {
   57303                         // 0x016000e0
   57304                         if (((instr & 0xf0000000) == 0xf0000000)) {
   57305                           UnallocatedA32(instr);
   57306                           return;
   57307                         }
   57308                         Condition condition((instr >> 28) & 0xf);
   57309                         unsigned rd = (instr >> 16) & 0xf;
   57310                         unsigned rn = instr & 0xf;
   57311                         unsigned rm = (instr >> 8) & 0xf;
   57312                         // SMULTT{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
   57313                         smultt(condition,
   57314                                Register(rd),
   57315                                Register(rn),
   57316                                Register(rm));
   57317                         if (((instr & 0xff0f0f0) != 0x16000e0)) {
   57318                           UnpredictableA32(instr);
   57319                         }
   57320                         break;
   57321                       }
   57322                     }
   57323                     break;
   57324                   }
   57325                 }
   57326                 break;
   57327               }
   57328               case 0x01800000: {
   57329                 // 0x01800000
   57330                 switch (instr & 0x00400000) {
   57331                   case 0x00000000: {
   57332                     // 0x01800000
   57333                     switch (instr & 0x00000fe0) {
   57334                       case 0x00000060: {
   57335                         // 0x01800060
   57336                         if (((instr & 0xf0000000) == 0xf0000000)) {
   57337                           UnallocatedA32(instr);
   57338                           return;
   57339                         }
   57340                         Condition condition((instr >> 28) & 0xf);
   57341                         unsigned rd = (instr >> 12) & 0xf;
   57342                         unsigned rn = (instr >> 16) & 0xf;
   57343                         unsigned rm = instr & 0xf;
   57344                         // ORR{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
   57345                         orr(condition,
   57346                             Best,
   57347                             Register(rd),
   57348                             Register(rn),
   57349                             Operand(Register(rm), RRX));
   57350                         break;
   57351                       }
   57352                       default: {
   57353                         if (((instr & 0xf0000000) == 0xf0000000) ||
   57354                             ((instr & 0xfe0) == 0x60)) {
   57355                           UnallocatedA32(instr);
   57356                           return;
   57357                         }
   57358                         Condition condition((instr >> 28) & 0xf);
   57359                         unsigned rd = (instr >> 12) & 0xf;
   57360                         unsigned rn = (instr >> 16) & 0xf;
   57361                         unsigned rm = instr & 0xf;
   57362                         ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
   57363                                                             (instr >> 7) &
   57364                                                                 0x1f);
   57365                         // ORR{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
   57366                         orr(condition,
   57367                             Best,
   57368                             Register(rd),
   57369                             Register(rn),
   57370                             Operand(Register(rm),
   57371                                     shift_operand.GetType(),
   57372                                     shift_operand.GetAmount()));
   57373                         break;
   57374                       }
   57375                     }
   57376                     break;
   57377                   }
   57378                   case 0x00400000: {
   57379                     // 0x01c00000
   57380                     switch (instr & 0x00000fe0) {
   57381                       case 0x00000060: {
   57382                         // 0x01c00060
   57383                         if (((instr & 0xf0000000) == 0xf0000000)) {
   57384                           UnallocatedA32(instr);
   57385                           return;
   57386                         }
   57387                         Condition condition((instr >> 28) & 0xf);
   57388                         unsigned rd = (instr >> 12) & 0xf;
   57389                         unsigned rn = (instr >> 16) & 0xf;
   57390                         unsigned rm = instr & 0xf;
   57391                         // BIC{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
   57392                         bic(condition,
   57393                             Best,
   57394                             Register(rd),
   57395                             Register(rn),
   57396                             Operand(Register(rm), RRX));
   57397                         break;
   57398                       }
   57399                       default: {
   57400                         if (((instr & 0xf0000000) == 0xf0000000) ||
   57401                             ((instr & 0xfe0) == 0x60)) {
   57402                           UnallocatedA32(instr);
   57403                           return;
   57404                         }
   57405                         Condition condition((instr >> 28) & 0xf);
   57406                         unsigned rd = (instr >> 12) & 0xf;
   57407                         unsigned rn = (instr >> 16) & 0xf;
   57408                         unsigned rm = instr & 0xf;
   57409                         ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
   57410                                                             (instr >> 7) &
   57411                                                                 0x1f);
   57412                         // BIC{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
   57413                         bic(condition,
   57414                             Best,
   57415                             Register(rd),
   57416                             Register(rn),
   57417                             Operand(Register(rm),
   57418                                     shift_operand.GetType(),
   57419                                     shift_operand.GetAmount()));
   57420                         break;
   57421                       }
   57422                     }
   57423                     break;
   57424                   }
   57425                 }
   57426                 break;
   57427               }
   57428               case 0x01a00000: {
   57429                 // 0x01a00000
   57430                 switch (instr & 0x00400000) {
   57431                   case 0x00000000: {
   57432                     // 0x01a00000
   57433                     switch (instr & 0x00000fe0) {
   57434                       case 0x00000060: {
   57435                         // 0x01a00060
   57436                         if (((instr & 0xf0000000) == 0xf0000000)) {
   57437                           UnallocatedA32(instr);
   57438                           return;
   57439                         }
   57440                         if (((instr & 0xf0000000) != 0xf0000000)) {
   57441                           Condition condition((instr >> 28) & 0xf);
   57442                           unsigned rd = (instr >> 12) & 0xf;
   57443                           unsigned rm = instr & 0xf;
   57444                           // RRX{<c>}{<q>} {<Rd>}, <Rm> ; A1
   57445                           rrx(condition, Register(rd), Register(rm));
   57446                           if (((instr & 0xfff0ff0) != 0x1a00060)) {
   57447                             UnpredictableA32(instr);
   57448                           }
   57449                           return;
   57450                         }
   57451                         Condition condition((instr >> 28) & 0xf);
   57452                         unsigned rd = (instr >> 12) & 0xf;
   57453                         unsigned rm = instr & 0xf;
   57454                         // MOV{<c>}{<q>} <Rd>, <Rm>, RRX ; A1
   57455                         mov(condition,
   57456                             Best,
   57457                             Register(rd),
   57458                             Operand(Register(rm), RRX));
   57459                         if (((instr & 0xfff0ff0) != 0x1a00060)) {
   57460                           UnpredictableA32(instr);
   57461                         }
   57462                         break;
   57463                       }
   57464                       default: {
   57465                         if (((instr & 0xf0000000) == 0xf0000000) ||
   57466                             ((instr & 0xfe0) == 0x60)) {
   57467                           UnallocatedA32(instr);
   57468                           return;
   57469                         }
   57470                         if (((Uint32((instr >> 5)) & Uint32(0x3)) ==
   57471                              Uint32(0x2)) &&
   57472                             ((instr & 0xf0000000) != 0xf0000000)) {
   57473                           Condition condition((instr >> 28) & 0xf);
   57474                           unsigned rd = (instr >> 12) & 0xf;
   57475                           unsigned rm = instr & 0xf;
   57476                           uint32_t amount = (instr >> 7) & 0x1f;
   57477                           if (amount == 0) amount = 32;
   57478                           // ASR{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; A1
   57479                           asr(condition,
   57480                               Best,
   57481                               Register(rd),
   57482                               Register(rm),
   57483                               amount);
   57484                           if (((instr & 0xfff0070) != 0x1a00040)) {
   57485                             UnpredictableA32(instr);
   57486                           }
   57487                           return;
   57488                         }
   57489                         if (((Uint32((instr >> 5)) & Uint32(0x3)) ==
   57490                              Uint32(0x0)) &&
   57491                             ((instr & 0xf0000000) != 0xf0000000) &&
   57492                             ((instr & 0x00000f80) != 0x00000000)) {
   57493                           Condition condition((instr >> 28) & 0xf);
   57494                           unsigned rd = (instr >> 12) & 0xf;
   57495                           unsigned rm = instr & 0xf;
   57496                           uint32_t amount = (instr >> 7) & 0x1f;
   57497                           // LSL{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; A1
   57498                           lsl(condition,
   57499                               Best,
   57500                               Register(rd),
   57501                               Register(rm),
   57502                               amount);
   57503                           if (((instr & 0xfff0070) != 0x1a00000)) {
   57504                             UnpredictableA32(instr);
   57505                           }
   57506                           return;
   57507                         }
   57508                         if (((Uint32((instr >> 5)) & Uint32(0x3)) ==
   57509                              Uint32(0x1)) &&
   57510                             ((instr & 0xf0000000) != 0xf0000000)) {
   57511                           Condition condition((instr >> 28) & 0xf);
   57512                           unsigned rd = (instr >> 12) & 0xf;
   57513                           unsigned rm = instr & 0xf;
   57514                           uint32_t amount = (instr >> 7) & 0x1f;
   57515                           if (amount == 0) amount = 32;
   57516                           // LSR{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; A1
   57517                           lsr(condition,
   57518                               Best,
   57519                               Register(rd),
   57520                               Register(rm),
   57521                               amount);
   57522                           if (((instr & 0xfff0070) != 0x1a00020)) {
   57523                             UnpredictableA32(instr);
   57524                           }
   57525                           return;
   57526                         }
   57527                         if (((Uint32((instr >> 5)) & Uint32(0x3)) ==
   57528                              Uint32(0x3)) &&
   57529                             ((instr & 0xf0000000) != 0xf0000000) &&
   57530                             ((instr & 0x00000f80) != 0x00000000)) {
   57531                           Condition condition((instr >> 28) & 0xf);
   57532                           unsigned rd = (instr >> 12) & 0xf;
   57533                           unsigned rm = instr & 0xf;
   57534                           uint32_t amount = (instr >> 7) & 0x1f;
   57535                           // ROR{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; A1
   57536                           ror(condition,
   57537                               Best,
   57538                               Register(rd),
   57539                               Register(rm),
   57540                               amount);
   57541                           if (((instr & 0xfff0070) != 0x1a00060)) {
   57542                             UnpredictableA32(instr);
   57543                           }
   57544                           return;
   57545                         }
   57546                         Condition condition((instr >> 28) & 0xf);
   57547                         unsigned rd = (instr >> 12) & 0xf;
   57548                         unsigned rm = instr & 0xf;
   57549                         ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
   57550                                                             (instr >> 7) &
   57551                                                                 0x1f);
   57552                         // MOV{<c>}{<q>} <Rd>, <Rm> {, <shift> #<amount> } ; A1
   57553                         mov(condition,
   57554                             Best,
   57555                             Register(rd),
   57556                             Operand(Register(rm),
   57557                                     shift_operand.GetType(),
   57558                                     shift_operand.GetAmount()));
   57559                         if (((instr & 0xfff0010) != 0x1a00000)) {
   57560                           UnpredictableA32(instr);
   57561                         }
   57562                         break;
   57563                       }
   57564                     }
   57565                     break;
   57566                   }
   57567                   case 0x00400000: {
   57568                     // 0x01e00000
   57569                     switch (instr & 0x00000fe0) {
   57570                       case 0x00000060: {
   57571                         // 0x01e00060
   57572                         if (((instr & 0xf0000000) == 0xf0000000)) {
   57573                           UnallocatedA32(instr);
   57574                           return;
   57575                         }
   57576                         Condition condition((instr >> 28) & 0xf);
   57577                         unsigned rd = (instr >> 12) & 0xf;
   57578                         unsigned rm = instr & 0xf;
   57579                         // MVN{<c>}{<q>} <Rd>, <Rm>, RRX ; A1
   57580                         mvn(condition,
   57581                             Best,
   57582                             Register(rd),
   57583                             Operand(Register(rm), RRX));
   57584                         if (((instr & 0xfff0ff0) != 0x1e00060)) {
   57585                           UnpredictableA32(instr);
   57586                         }
   57587                         break;
   57588                       }
   57589                       default: {
   57590                         if (((instr & 0xf0000000) == 0xf0000000) ||
   57591                             ((instr & 0xfe0) == 0x60)) {
   57592                           UnallocatedA32(instr);
   57593                           return;
   57594                         }
   57595                         Condition condition((instr >> 28) & 0xf);
   57596                         unsigned rd = (instr >> 12) & 0xf;
   57597                         unsigned rm = instr & 0xf;
   57598                         ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
   57599                                                             (instr >> 7) &
   57600                                                                 0x1f);
   57601                         // MVN{<c>}{<q>} <Rd>, <Rm> {, <shift> #<amount> } ; A1
   57602                         mvn(condition,
   57603                             Best,
   57604                             Register(rd),
   57605                             Operand(Register(rm),
   57606                                     shift_operand.GetType(),
   57607                                     shift_operand.GetAmount()));
   57608                         if (((instr & 0xfff0010) != 0x1e00000)) {
   57609                           UnpredictableA32(instr);
   57610                         }
   57611                         break;
   57612                       }
   57613                     }
   57614                     break;
   57615                   }
   57616                 }
   57617                 break;
   57618               }
   57619             }
   57620             break;
   57621           }
   57622           case 0x00000010: {
   57623             // 0x00000010
   57624             switch (instr & 0x00400080) {
   57625               case 0x00000000: {
   57626                 // 0x00000010
   57627                 switch (instr & 0x01a00000) {
   57628                   case 0x00000000: {
   57629                     // 0x00000010
   57630                     if (((instr & 0xf0000000) == 0xf0000000)) {
   57631                       UnallocatedA32(instr);
   57632                       return;
   57633                     }
   57634                     Condition condition((instr >> 28) & 0xf);
   57635                     unsigned rd = (instr >> 12) & 0xf;
   57636                     unsigned rn = (instr >> 16) & 0xf;
   57637                     unsigned rm = instr & 0xf;
   57638                     Shift shift((instr >> 5) & 0x3);
   57639                     unsigned rs = (instr >> 8) & 0xf;
   57640                     // AND{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
   57641                     and_(condition,
   57642                          Best,
   57643                          Register(rd),
   57644                          Register(rn),
   57645                          Operand(Register(rm), shift.GetType(), Register(rs)));
   57646                     break;
   57647                   }
   57648                   case 0x00200000: {
   57649                     // 0x00200010
   57650                     if (((instr & 0xf0000000) == 0xf0000000)) {
   57651                       UnallocatedA32(instr);
   57652                       return;
   57653                     }
   57654                     Condition condition((instr >> 28) & 0xf);
   57655                     unsigned rd = (instr >> 12) & 0xf;
   57656                     unsigned rn = (instr >> 16) & 0xf;
   57657                     unsigned rm = instr & 0xf;
   57658                     Shift shift((instr >> 5) & 0x3);
   57659                     unsigned rs = (instr >> 8) & 0xf;
   57660                     // EOR{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
   57661                     eor(condition,
   57662                         Best,
   57663                         Register(rd),
   57664                         Register(rn),
   57665                         Operand(Register(rm), shift.GetType(), Register(rs)));
   57666                     break;
   57667                   }
   57668                   case 0x00800000: {
   57669                     // 0x00800010
   57670                     if (((instr & 0xf0000000) == 0xf0000000)) {
   57671                       UnallocatedA32(instr);
   57672                       return;
   57673                     }
   57674                     Condition condition((instr >> 28) & 0xf);
   57675                     unsigned rd = (instr >> 12) & 0xf;
   57676                     unsigned rn = (instr >> 16) & 0xf;
   57677                     unsigned rm = instr & 0xf;
   57678                     Shift shift((instr >> 5) & 0x3);
   57679                     unsigned rs = (instr >> 8) & 0xf;
   57680                     // ADD{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
   57681                     add(condition,
   57682                         Best,
   57683                         Register(rd),
   57684                         Register(rn),
   57685                         Operand(Register(rm), shift.GetType(), Register(rs)));
   57686                     break;
   57687                   }
   57688                   case 0x00a00000: {
   57689                     // 0x00a00010
   57690                     if (((instr & 0xf0000000) == 0xf0000000)) {
   57691                       UnallocatedA32(instr);
   57692                       return;
   57693                     }
   57694                     Condition condition((instr >> 28) & 0xf);
   57695                     unsigned rd = (instr >> 12) & 0xf;
   57696                     unsigned rn = (instr >> 16) & 0xf;
   57697                     unsigned rm = instr & 0xf;
   57698                     Shift shift((instr >> 5) & 0x3);
   57699                     unsigned rs = (instr >> 8) & 0xf;
   57700                     // ADC{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
   57701                     adc(condition,
   57702                         Best,
   57703                         Register(rd),
   57704                         Register(rn),
   57705                         Operand(Register(rm), shift.GetType(), Register(rs)));
   57706                     break;
   57707                   }
   57708                   case 0x01000000: {
   57709                     // 0x01000010
   57710                     switch (instr & 0x00000060) {
   57711                       case 0x00000040: {
   57712                         // 0x01000050
   57713                         if (((instr & 0xf0000000) == 0xf0000000)) {
   57714                           UnallocatedA32(instr);
   57715                           return;
   57716                         }
   57717                         Condition condition((instr >> 28) & 0xf);
   57718                         unsigned rd = (instr >> 12) & 0xf;
   57719                         unsigned rm = instr & 0xf;
   57720                         unsigned rn = (instr >> 16) & 0xf;
   57721                         // QADD{<c>}{<q>} {<Rd>}, <Rm>, <Rn> ; A1
   57722                         qadd(condition,
   57723                              Register(rd),
   57724                              Register(rm),
   57725                              Register(rn));
   57726                         if (((instr & 0xff00ff0) != 0x1000050)) {
   57727                           UnpredictableA32(instr);
   57728                         }
   57729                         break;
   57730                       }
   57731                       case 0x00000060: {
   57732                         // 0x01000070
   57733                         if (((instr & 0xf0000000) == 0xf0000000)) {
   57734                           UnallocatedA32(instr);
   57735                           return;
   57736                         }
   57737                         uint32_t imm = (instr & 0xf) | ((instr >> 4) & 0xfff0);
   57738                         // HLT{<q>} {#}<imm> ; A1
   57739                         hlt(al, imm);
   57740                         break;
   57741                       }
   57742                       default:
   57743                         UnallocatedA32(instr);
   57744                         break;
   57745                     }
   57746                     break;
   57747                   }
   57748                   case 0x01200000: {
   57749                     // 0x01200010
   57750                     switch (instr & 0x00000060) {
   57751                       case 0x00000000: {
   57752                         // 0x01200010
   57753                         if (((instr & 0xf0000000) == 0xf0000000)) {
   57754                           UnallocatedA32(instr);
   57755                           return;
   57756                         }
   57757                         Condition condition((instr >> 28) & 0xf);
   57758                         unsigned rm = instr & 0xf;
   57759                         // BX{<c>}{<q>} <Rm> ; A1
   57760                         bx(condition, Register(rm));
   57761                         if (((instr & 0xffffff0) != 0x12fff10)) {
   57762                           UnpredictableA32(instr);
   57763                         }
   57764                         break;
   57765                       }
   57766                       case 0x00000020: {
   57767                         // 0x01200030
   57768                         if (((instr & 0xf0000000) == 0xf0000000)) {
   57769                           UnallocatedA32(instr);
   57770                           return;
   57771                         }
   57772                         Condition condition((instr >> 28) & 0xf);
   57773                         unsigned rm = instr & 0xf;
   57774                         // BLX{<c>}{<q>} <Rm> ; A1
   57775                         blx(condition, Register(rm));
   57776                         if (((instr & 0xffffff0) != 0x12fff30)) {
   57777                           UnpredictableA32(instr);
   57778                         }
   57779                         break;
   57780                       }
   57781                       case 0x00000040: {
   57782                         // 0x01200050
   57783                         if (((instr & 0xf0000000) == 0xf0000000)) {
   57784                           UnallocatedA32(instr);
   57785                           return;
   57786                         }
   57787                         Condition condition((instr >> 28) & 0xf);
   57788                         unsigned rd = (instr >> 12) & 0xf;
   57789                         unsigned rm = instr & 0xf;
   57790                         unsigned rn = (instr >> 16) & 0xf;
   57791                         // QSUB{<c>}{<q>} {<Rd>}, <Rm>, <Rn> ; A1
   57792                         qsub(condition,
   57793                              Register(rd),
   57794                              Register(rm),
   57795                              Register(rn));
   57796                         if (((instr & 0xff00ff0) != 0x1200050)) {
   57797                           UnpredictableA32(instr);
   57798                         }
   57799                         break;
   57800                       }
   57801                       case 0x00000060: {
   57802                         // 0x01200070
   57803                         if (((instr & 0xf0000000) == 0xf0000000)) {
   57804                           UnallocatedA32(instr);
   57805                           return;
   57806                         }
   57807                         uint32_t imm = (instr & 0xf) | ((instr >> 4) & 0xfff0);
   57808                         // BKPT{<q>} {#}<imm> ; A1
   57809                         bkpt(al, imm);
   57810                         break;
   57811                       }
   57812                     }
   57813                     break;
   57814                   }
   57815                   case 0x01800000: {
   57816                     // 0x01800010
   57817                     if (((instr & 0xf0000000) == 0xf0000000)) {
   57818                       UnallocatedA32(instr);
   57819                       return;
   57820                     }
   57821                     Condition condition((instr >> 28) & 0xf);
   57822                     unsigned rd = (instr >> 12) & 0xf;
   57823                     unsigned rn = (instr >> 16) & 0xf;
   57824                     unsigned rm = instr & 0xf;
   57825                     Shift shift((instr >> 5) & 0x3);
   57826                     unsigned rs = (instr >> 8) & 0xf;
   57827                     // ORR{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
   57828                     orr(condition,
   57829                         Best,
   57830                         Register(rd),
   57831                         Register(rn),
   57832                         Operand(Register(rm), shift.GetType(), Register(rs)));
   57833                     break;
   57834                   }
   57835                   case 0x01a00000: {
   57836                     // 0x01a00010
   57837                     if (((instr & 0xf0000000) == 0xf0000000)) {
   57838                       UnallocatedA32(instr);
   57839                       return;
   57840                     }
   57841                     if (((Uint32((instr >> 5)) & Uint32(0x3)) == Uint32(0x2)) &&
   57842                         ((instr & 0xf0000000) != 0xf0000000)) {
   57843                       Condition condition((instr >> 28) & 0xf);
   57844                       unsigned rd = (instr >> 12) & 0xf;
   57845                       unsigned rm = instr & 0xf;
   57846                       unsigned rs = (instr >> 8) & 0xf;
   57847                       // ASR{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; A1
   57848                       asr(condition,
   57849                           Best,
   57850                           Register(rd),
   57851                           Register(rm),
   57852                           Register(rs));
   57853                       if (((instr & 0xfff00f0) != 0x1a00050)) {
   57854                         UnpredictableA32(instr);
   57855                       }
   57856                       return;
   57857                     }
   57858                     if (((Uint32((instr >> 5)) & Uint32(0x3)) == Uint32(0x0)) &&
   57859                         ((instr & 0xf0000000) != 0xf0000000)) {
   57860                       Condition condition((instr >> 28) & 0xf);
   57861                       unsigned rd = (instr >> 12) & 0xf;
   57862                       unsigned rm = instr & 0xf;
   57863                       unsigned rs = (instr >> 8) & 0xf;
   57864                       // LSL{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; A1
   57865                       lsl(condition,
   57866                           Best,
   57867                           Register(rd),
   57868                           Register(rm),
   57869                           Register(rs));
   57870                       if (((instr & 0xfff00f0) != 0x1a00010)) {
   57871                         UnpredictableA32(instr);
   57872                       }
   57873                       return;
   57874                     }
   57875                     if (((Uint32((instr >> 5)) & Uint32(0x3)) == Uint32(0x1)) &&
   57876                         ((instr & 0xf0000000) != 0xf0000000)) {
   57877                       Condition condition((instr >> 28) & 0xf);
   57878                       unsigned rd = (instr >> 12) & 0xf;
   57879                       unsigned rm = instr & 0xf;
   57880                       unsigned rs = (instr >> 8) & 0xf;
   57881                       // LSR{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; A1
   57882                       lsr(condition,
   57883                           Best,
   57884                           Register(rd),
   57885                           Register(rm),
   57886                           Register(rs));
   57887                       if (((instr & 0xfff00f0) != 0x1a00030)) {
   57888                         UnpredictableA32(instr);
   57889                       }
   57890                       return;
   57891                     }
   57892                     if (((Uint32((instr >> 5)) & Uint32(0x3)) == Uint32(0x3)) &&
   57893                         ((instr & 0xf0000000) != 0xf0000000)) {
   57894                       Condition condition((instr >> 28) & 0xf);
   57895                       unsigned rd = (instr >> 12) & 0xf;
   57896                       unsigned rm = instr & 0xf;
   57897                       unsigned rs = (instr >> 8) & 0xf;
   57898                       // ROR{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; A1
   57899                       ror(condition,
   57900                           Best,
   57901                           Register(rd),
   57902                           Register(rm),
   57903                           Register(rs));
   57904                       if (((instr & 0xfff00f0) != 0x1a00070)) {
   57905                         UnpredictableA32(instr);
   57906                       }
   57907                       return;
   57908                     }
   57909                     Condition condition((instr >> 28) & 0xf);
   57910                     unsigned rd = (instr >> 12) & 0xf;
   57911                     unsigned rm = instr & 0xf;
   57912                     Shift shift((instr >> 5) & 0x3);
   57913                     unsigned rs = (instr >> 8) & 0xf;
   57914                     // MOV{<c>}{<q>} <Rd>, <Rm>, <shift> <Rs> ; A1
   57915                     mov(condition,
   57916                         Best,
   57917                         Register(rd),
   57918                         Operand(Register(rm), shift.GetType(), Register(rs)));
   57919                     if (((instr & 0xfff0090) != 0x1a00010)) {
   57920                       UnpredictableA32(instr);
   57921                     }
   57922                     break;
   57923                   }
   57924                 }
   57925                 break;
   57926               }
   57927               case 0x00000080: {
   57928                 // 0x00000090
   57929                 switch (instr & 0x01200060) {
   57930                   case 0x00000000: {
   57931                     // 0x00000090
   57932                     switch (instr & 0x00800000) {
   57933                       case 0x00000000: {
   57934                         // 0x00000090
   57935                         if (((instr & 0xf0000000) == 0xf0000000)) {
   57936                           UnallocatedA32(instr);
   57937                           return;
   57938                         }
   57939                         Condition condition((instr >> 28) & 0xf);
   57940                         unsigned rd = (instr >> 16) & 0xf;
   57941                         unsigned rn = instr & 0xf;
   57942                         unsigned rm = (instr >> 8) & 0xf;
   57943                         // MUL{<c>}{<q>} <Rd>, <Rn>, {<Rm>} ; A1
   57944                         mul(condition,
   57945                             Best,
   57946                             Register(rd),
   57947                             Register(rn),
   57948                             Register(rm));
   57949                         if (((instr & 0xff0f0f0) != 0x90)) {
   57950                           UnpredictableA32(instr);
   57951                         }
   57952                         break;
   57953                       }
   57954                       case 0x00800000: {
   57955                         // 0x00800090
   57956                         if (((instr & 0xf0000000) == 0xf0000000)) {
   57957                           UnallocatedA32(instr);
   57958                           return;
   57959                         }
   57960                         Condition condition((instr >> 28) & 0xf);
   57961                         unsigned rdlo = (instr >> 12) & 0xf;
   57962                         unsigned rdhi = (instr >> 16) & 0xf;
   57963                         unsigned rn = instr & 0xf;
   57964                         unsigned rm = (instr >> 8) & 0xf;
   57965                         // UMULL{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
   57966                         umull(condition,
   57967                               Register(rdlo),
   57968                               Register(rdhi),
   57969                               Register(rn),
   57970                               Register(rm));
   57971                         break;
   57972                       }
   57973                     }
   57974                     break;
   57975                   }
   57976                   case 0x00000020: {
   57977                     // 0x000000b0
   57978                     if (((instr & 0xf0000000) == 0xf0000000)) {
   57979                       UnallocatedA32(instr);
   57980                       return;
   57981                     }
   57982                     Condition condition((instr >> 28) & 0xf);
   57983                     unsigned rt = (instr >> 12) & 0xf;
   57984                     unsigned rn = (instr >> 16) & 0xf;
   57985                     Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
   57986                     unsigned rm = instr & 0xf;
   57987                     // STRH{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<Rm> ; A1
   57988                     strh(condition,
   57989                          Best,
   57990                          Register(rt),
   57991                          MemOperand(Register(rn),
   57992                                     sign,
   57993                                     Register(rm),
   57994                                     PostIndex));
   57995                     if (((instr & 0xf700ff0) != 0xb0)) {
   57996                       UnpredictableA32(instr);
   57997                     }
   57998                     break;
   57999                   }
   58000                   case 0x00000040: {
   58001                     // 0x000000d0
   58002                     if (((instr & 0xf0000000) == 0xf0000000)) {
   58003                       UnallocatedA32(instr);
   58004                       return;
   58005                     }
   58006                     Condition condition((instr >> 28) & 0xf);
   58007                     unsigned rt = (instr >> 12) & 0xf;
   58008                     unsigned rn = (instr >> 16) & 0xf;
   58009                     Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
   58010                     unsigned rm = instr & 0xf;
   58011                     // LDRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>], #{+/-}<Rm> ; A1
   58012                     ldrd(condition,
   58013                          Register(rt),
   58014                          Register(rt + 1),
   58015                          MemOperand(Register(rn),
   58016                                     sign,
   58017                                     Register(rm),
   58018                                     PostIndex));
   58019                     if (((instr & 0xf700ff0) != 0xd0)) {
   58020                       UnpredictableA32(instr);
   58021                     }
   58022                     break;
   58023                   }
   58024                   case 0x00000060: {
   58025                     // 0x000000f0
   58026                     if (((instr & 0xf0000000) == 0xf0000000)) {
   58027                       UnallocatedA32(instr);
   58028                       return;
   58029                     }
   58030                     Condition condition((instr >> 28) & 0xf);
   58031                     unsigned rt = (instr >> 12) & 0xf;
   58032                     unsigned rn = (instr >> 16) & 0xf;
   58033                     Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
   58034                     unsigned rm = instr & 0xf;
   58035                     // STRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>], #{+/-}<Rm> ; A1
   58036                     strd(condition,
   58037                          Register(rt),
   58038                          Register(rt + 1),
   58039                          MemOperand(Register(rn),
   58040                                     sign,
   58041                                     Register(rm),
   58042                                     PostIndex));
   58043                     if (((instr & 0xf700ff0) != 0xf0)) {
   58044                       UnpredictableA32(instr);
   58045                     }
   58046                     break;
   58047                   }
   58048                   case 0x00200000: {
   58049                     // 0x00200090
   58050                     switch (instr & 0x00800000) {
   58051                       case 0x00000000: {
   58052                         // 0x00200090
   58053                         if (((instr & 0xf0000000) == 0xf0000000)) {
   58054                           UnallocatedA32(instr);
   58055                           return;
   58056                         }
   58057                         Condition condition((instr >> 28) & 0xf);
   58058                         unsigned rd = (instr >> 16) & 0xf;
   58059                         unsigned rn = instr & 0xf;
   58060                         unsigned rm = (instr >> 8) & 0xf;
   58061                         unsigned ra = (instr >> 12) & 0xf;
   58062                         // MLA{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
   58063                         mla(condition,
   58064                             Register(rd),
   58065                             Register(rn),
   58066                             Register(rm),
   58067                             Register(ra));
   58068                         break;
   58069                       }
   58070                       case 0x00800000: {
   58071                         // 0x00a00090
   58072                         if (((instr & 0xf0000000) == 0xf0000000)) {
   58073                           UnallocatedA32(instr);
   58074                           return;
   58075                         }
   58076                         Condition condition((instr >> 28) & 0xf);
   58077                         unsigned rdlo = (instr >> 12) & 0xf;
   58078                         unsigned rdhi = (instr >> 16) & 0xf;
   58079                         unsigned rn = instr & 0xf;
   58080                         unsigned rm = (instr >> 8) & 0xf;
   58081                         // UMLAL{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
   58082                         umlal(condition,
   58083                               Register(rdlo),
   58084                               Register(rdhi),
   58085                               Register(rn),
   58086                               Register(rm));
   58087                         break;
   58088                       }
   58089                     }
   58090                     break;
   58091                   }
   58092                   case 0x00200020: {
   58093                     // 0x002000b0
   58094                     if (((instr & 0xf0000000) == 0xf0000000)) {
   58095                       UnallocatedA32(instr);
   58096                       return;
   58097                     }
   58098                     UnimplementedA32("STRHT", instr);
   58099                     break;
   58100                   }
   58101                   case 0x01000000: {
   58102                     // 0x01000090
   58103                     switch (instr & 0x00800300) {
   58104                       case 0x00800000: {
   58105                         // 0x01800090
   58106                         if (((instr & 0xf0000000) == 0xf0000000)) {
   58107                           UnallocatedA32(instr);
   58108                           return;
   58109                         }
   58110                         Condition condition((instr >> 28) & 0xf);
   58111                         unsigned rt = instr & 0xf;
   58112                         unsigned rn = (instr >> 16) & 0xf;
   58113                         // STL{<c>}{<q>} <Rt>, [<Rn>] ; A1
   58114                         stl(condition,
   58115                             Register(rt),
   58116                             MemOperand(Register(rn), Offset));
   58117                         if (((instr & 0xff0fff0) != 0x180fc90)) {
   58118                           UnpredictableA32(instr);
   58119                         }
   58120                         break;
   58121                       }
   58122                       case 0x00800200: {
   58123                         // 0x01800290
   58124                         if (((instr & 0xf0000000) == 0xf0000000)) {
   58125                           UnallocatedA32(instr);
   58126                           return;
   58127                         }
   58128                         Condition condition((instr >> 28) & 0xf);
   58129                         unsigned rd = (instr >> 12) & 0xf;
   58130                         unsigned rt = instr & 0xf;
   58131                         unsigned rn = (instr >> 16) & 0xf;
   58132                         // STLEX{<c>}{<q>} <Rd>, <Rt>, [<Rn>] ; A1
   58133                         stlex(condition,
   58134                               Register(rd),
   58135                               Register(rt),
   58136                               MemOperand(Register(rn), Offset));
   58137                         if (((instr & 0xff00ff0) != 0x1800e90)) {
   58138                           UnpredictableA32(instr);
   58139                         }
   58140                         break;
   58141                       }
   58142                       case 0x00800300: {
   58143                         // 0x01800390
   58144                         if (((instr & 0xf0000000) == 0xf0000000)) {
   58145                           UnallocatedA32(instr);
   58146                           return;
   58147                         }
   58148                         Condition condition((instr >> 28) & 0xf);
   58149                         unsigned rd = (instr >> 12) & 0xf;
   58150                         unsigned rt = instr & 0xf;
   58151                         unsigned rn = (instr >> 16) & 0xf;
   58152                         // STREX{<c>}{<q>} <Rd>, <Rt>, [<Rn>{, #<imm_1>}] ; A1
   58153                         strex(condition,
   58154                               Register(rd),
   58155                               Register(rt),
   58156                               MemOperand(Register(rn), plus, 0, Offset));
   58157                         if (((instr & 0xff00ff0) != 0x1800f90)) {
   58158                           UnpredictableA32(instr);
   58159                         }
   58160                         break;
   58161                       }
   58162                       default:
   58163                         UnallocatedA32(instr);
   58164                         break;
   58165                     }
   58166                     break;
   58167                   }
   58168                   case 0x01000020: {
   58169                     // 0x010000b0
   58170                     if (((instr & 0xf0000000) == 0xf0000000)) {
   58171                       UnallocatedA32(instr);
   58172                       return;
   58173                     }
   58174                     Condition condition((instr >> 28) & 0xf);
   58175                     unsigned rt = (instr >> 12) & 0xf;
   58176                     unsigned rn = (instr >> 16) & 0xf;
   58177                     Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
   58178                     unsigned rm = instr & 0xf;
   58179                     AddrMode addrmode = Offset;
   58180                     // STRH{<c>}{<q>} <Rt>, [<Rn>, #{+/-}<Rm>] ; A1
   58181                     strh(condition,
   58182                          Best,
   58183                          Register(rt),
   58184                          MemOperand(Register(rn),
   58185                                     sign,
   58186                                     Register(rm),
   58187                                     addrmode));
   58188                     if (((instr & 0xf700ff0) != 0x10000b0)) {
   58189                       UnpredictableA32(instr);
   58190                     }
   58191                     break;
   58192                   }
   58193                   case 0x01000040: {
   58194                     // 0x010000d0
   58195                     if (((instr & 0xf0000000) == 0xf0000000)) {
   58196                       UnallocatedA32(instr);
   58197                       return;
   58198                     }
   58199                     Condition condition((instr >> 28) & 0xf);
   58200                     unsigned rt = (instr >> 12) & 0xf;
   58201                     unsigned rn = (instr >> 16) & 0xf;
   58202                     Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
   58203                     unsigned rm = instr & 0xf;
   58204                     AddrMode addrmode = Offset;
   58205                     // LDRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>, #{+/-}<Rm>] ; A1
   58206                     ldrd(condition,
   58207                          Register(rt),
   58208                          Register(rt + 1),
   58209                          MemOperand(Register(rn),
   58210                                     sign,
   58211                                     Register(rm),
   58212                                     addrmode));
   58213                     if (((instr & 0xf700ff0) != 0x10000d0)) {
   58214                       UnpredictableA32(instr);
   58215                     }
   58216                     break;
   58217                   }
   58218                   case 0x01000060: {
   58219                     // 0x010000f0
   58220                     if (((instr & 0xf0000000) == 0xf0000000)) {
   58221                       UnallocatedA32(instr);
   58222                       return;
   58223                     }
   58224                     Condition condition((instr >> 28) & 0xf);
   58225                     unsigned rt = (instr >> 12) & 0xf;
   58226                     unsigned rn = (instr >> 16) & 0xf;
   58227                     Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
   58228                     unsigned rm = instr & 0xf;
   58229                     AddrMode addrmode = Offset;
   58230                     // STRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>, #{+/-}<Rm>] ; A1
   58231                     strd(condition,
   58232                          Register(rt),
   58233                          Register(rt + 1),
   58234                          MemOperand(Register(rn),
   58235                                     sign,
   58236                                     Register(rm),
   58237                                     addrmode));
   58238                     if (((instr & 0xf700ff0) != 0x10000f0)) {
   58239                       UnpredictableA32(instr);
   58240                     }
   58241                     break;
   58242                   }
   58243                   case 0x01200000: {
   58244                     // 0x01200090
   58245                     switch (instr & 0x00800300) {
   58246                       case 0x00800200: {
   58247                         // 0x01a00290
   58248                         if (((instr & 0xf0000000) == 0xf0000000)) {
   58249                           UnallocatedA32(instr);
   58250                           return;
   58251                         }
   58252                         Condition condition((instr >> 28) & 0xf);
   58253                         unsigned rd = (instr >> 12) & 0xf;
   58254                         unsigned rt = instr & 0xf;
   58255                         unsigned rn = (instr >> 16) & 0xf;
   58256                         // STLEXD{<c>}{<q>} <Rd>, <Rt>, <Rt2>, [<Rn>] ; A1
   58257                         stlexd(condition,
   58258                                Register(rd),
   58259                                Register(rt),
   58260                                Register(rt + 1),
   58261                                MemOperand(Register(rn), Offset));
   58262                         if (((instr & 0xff00ff0) != 0x1a00e90)) {
   58263                           UnpredictableA32(instr);
   58264                         }
   58265                         break;
   58266                       }
   58267                       case 0x00800300: {
   58268                         // 0x01a00390
   58269                         if (((instr & 0xf0000000) == 0xf0000000)) {
   58270                           UnallocatedA32(instr);
   58271                           return;
   58272                         }
   58273                         Condition condition((instr >> 28) & 0xf);
   58274                         unsigned rd = (instr >> 12) & 0xf;
   58275                         unsigned rt = instr & 0xf;
   58276                         unsigned rn = (instr >> 16) & 0xf;
   58277                         // STREXD{<c>}{<q>} <Rd>, <Rt>, <Rt2>, [<Rn>] ; A1
   58278                         strexd(condition,
   58279                                Register(rd),
   58280                                Register(rt),
   58281                                Register(rt + 1),
   58282                                MemOperand(Register(rn), Offset));
   58283                         if (((instr & 0xff00ff0) != 0x1a00f90)) {
   58284                           UnpredictableA32(instr);
   58285                         }
   58286                         break;
   58287                       }
   58288                       default:
   58289                         UnallocatedA32(instr);
   58290                         break;
   58291                     }
   58292                     break;
   58293                   }
   58294                   case 0x01200020: {
   58295                     // 0x012000b0
   58296                     if (((instr & 0xf0000000) == 0xf0000000)) {
   58297                       UnallocatedA32(instr);
   58298                       return;
   58299                     }
   58300                     Condition condition((instr >> 28) & 0xf);
   58301                     unsigned rt = (instr >> 12) & 0xf;
   58302                     unsigned rn = (instr >> 16) & 0xf;
   58303                     Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
   58304                     unsigned rm = instr & 0xf;
   58305                     AddrMode addrmode = PreIndex;
   58306                     // STRH{<c>}{<q>} <Rt>, [<Rn>, #{+/-}<Rm>]! ; A1
   58307                     strh(condition,
   58308                          Best,
   58309                          Register(rt),
   58310                          MemOperand(Register(rn),
   58311                                     sign,
   58312                                     Register(rm),
   58313                                     addrmode));
   58314                     if (((instr & 0xf700ff0) != 0x12000b0)) {
   58315                       UnpredictableA32(instr);
   58316                     }
   58317                     break;
   58318                   }
   58319                   case 0x01200040: {
   58320                     // 0x012000d0
   58321                     if (((instr & 0xf0000000) == 0xf0000000)) {
   58322                       UnallocatedA32(instr);
   58323                       return;
   58324                     }
   58325                     Condition condition((instr >> 28) & 0xf);
   58326                     unsigned rt = (instr >> 12) & 0xf;
   58327                     unsigned rn = (instr >> 16) & 0xf;
   58328                     Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
   58329                     unsigned rm = instr & 0xf;
   58330                     AddrMode addrmode = PreIndex;
   58331                     // LDRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>, #{+/-}<Rm>]! ; A1
   58332                     ldrd(condition,
   58333                          Register(rt),
   58334                          Register(rt + 1),
   58335                          MemOperand(Register(rn),
   58336                                     sign,
   58337                                     Register(rm),
   58338                                     addrmode));
   58339                     if (((instr & 0xf700ff0) != 0x12000d0)) {
   58340                       UnpredictableA32(instr);
   58341                     }
   58342                     break;
   58343                   }
   58344                   case 0x01200060: {
   58345                     // 0x012000f0
   58346                     if (((instr & 0xf0000000) == 0xf0000000)) {
   58347                       UnallocatedA32(instr);
   58348                       return;
   58349                     }
   58350                     Condition condition((instr >> 28) & 0xf);
   58351                     unsigned rt = (instr >> 12) & 0xf;
   58352                     unsigned rn = (instr >> 16) & 0xf;
   58353                     Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
   58354                     unsigned rm = instr & 0xf;
   58355                     AddrMode addrmode = PreIndex;
   58356                     // STRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>, #{+/-}<Rm>]! ; A1
   58357                     strd(condition,
   58358                          Register(rt),
   58359                          Register(rt + 1),
   58360                          MemOperand(Register(rn),
   58361                                     sign,
   58362                                     Register(rm),
   58363                                     addrmode));
   58364                     if (((instr & 0xf700ff0) != 0x12000f0)) {
   58365                       UnpredictableA32(instr);
   58366                     }
   58367                     break;
   58368                   }
   58369                   default:
   58370                     UnallocatedA32(instr);
   58371                     break;
   58372                 }
   58373                 break;
   58374               }
   58375               case 0x00400000: {
   58376                 // 0x00400010
   58377                 switch (instr & 0x01a00000) {
   58378                   case 0x00000000: {
   58379                     // 0x00400010
   58380                     if (((instr & 0xf0000000) == 0xf0000000)) {
   58381                       UnallocatedA32(instr);
   58382                       return;
   58383                     }
   58384                     Condition condition((instr >> 28) & 0xf);
   58385                     unsigned rd = (instr >> 12) & 0xf;
   58386                     unsigned rn = (instr >> 16) & 0xf;
   58387                     unsigned rm = instr & 0xf;
   58388                     Shift shift((instr >> 5) & 0x3);
   58389                     unsigned rs = (instr >> 8) & 0xf;
   58390                     // SUB{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
   58391                     sub(condition,
   58392                         Best,
   58393                         Register(rd),
   58394                         Register(rn),
   58395                         Operand(Register(rm), shift.GetType(), Register(rs)));
   58396                     break;
   58397                   }
   58398                   case 0x00200000: {
   58399                     // 0x00600010
   58400                     if (((instr & 0xf0000000) == 0xf0000000)) {
   58401                       UnallocatedA32(instr);
   58402                       return;
   58403                     }
   58404                     Condition condition((instr >> 28) & 0xf);
   58405                     unsigned rd = (instr >> 12) & 0xf;
   58406                     unsigned rn = (instr >> 16) & 0xf;
   58407                     unsigned rm = instr & 0xf;
   58408                     Shift shift((instr >> 5) & 0x3);
   58409                     unsigned rs = (instr >> 8) & 0xf;
   58410                     // RSB{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
   58411                     rsb(condition,
   58412                         Best,
   58413                         Register(rd),
   58414                         Register(rn),
   58415                         Operand(Register(rm), shift.GetType(), Register(rs)));
   58416                     break;
   58417                   }
   58418                   case 0x00800000: {
   58419                     // 0x00c00010
   58420                     if (((instr & 0xf0000000) == 0xf0000000)) {
   58421                       UnallocatedA32(instr);
   58422                       return;
   58423                     }
   58424                     Condition condition((instr >> 28) & 0xf);
   58425                     unsigned rd = (instr >> 12) & 0xf;
   58426                     unsigned rn = (instr >> 16) & 0xf;
   58427                     unsigned rm = instr & 0xf;
   58428                     Shift shift((instr >> 5) & 0x3);
   58429                     unsigned rs = (instr >> 8) & 0xf;
   58430                     // SBC{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
   58431                     sbc(condition,
   58432                         Best,
   58433                         Register(rd),
   58434                         Register(rn),
   58435                         Operand(Register(rm), shift.GetType(), Register(rs)));
   58436                     break;
   58437                   }
   58438                   case 0x00a00000: {
   58439                     // 0x00e00010
   58440                     if (((instr & 0xf0000000) == 0xf0000000)) {
   58441                       UnallocatedA32(instr);
   58442                       return;
   58443                     }
   58444                     Condition condition((instr >> 28) & 0xf);
   58445                     unsigned rd = (instr >> 12) & 0xf;
   58446                     unsigned rn = (instr >> 16) & 0xf;
   58447                     unsigned rm = instr & 0xf;
   58448                     Shift shift((instr >> 5) & 0x3);
   58449                     unsigned rs = (instr >> 8) & 0xf;
   58450                     // RSC{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
   58451                     rsc(condition,
   58452                         Register(rd),
   58453                         Register(rn),
   58454                         Operand(Register(rm), shift.GetType(), Register(rs)));
   58455                     break;
   58456                   }
   58457                   case 0x01000000: {
   58458                     // 0x01400010
   58459                     switch (instr & 0x00000060) {
   58460                       case 0x00000040: {
   58461                         // 0x01400050
   58462                         if (((instr & 0xf0000000) == 0xf0000000)) {
   58463                           UnallocatedA32(instr);
   58464                           return;
   58465                         }
   58466                         Condition condition((instr >> 28) & 0xf);
   58467                         unsigned rd = (instr >> 12) & 0xf;
   58468                         unsigned rm = instr & 0xf;
   58469                         unsigned rn = (instr >> 16) & 0xf;
   58470                         // QDADD{<c>}{<q>} {<Rd>}, <Rm>, <Rn> ; A1
   58471                         qdadd(condition,
   58472                               Register(rd),
   58473                               Register(rm),
   58474                               Register(rn));
   58475                         if (((instr & 0xff00ff0) != 0x1400050)) {
   58476                           UnpredictableA32(instr);
   58477                         }
   58478                         break;
   58479                       }
   58480                       case 0x00000060: {
   58481                         // 0x01400070
   58482                         if (((instr & 0xf0000000) == 0xf0000000)) {
   58483                           UnallocatedA32(instr);
   58484                           return;
   58485                         }
   58486                         uint32_t imm = (instr & 0xf) | ((instr >> 4) & 0xfff0);
   58487                         // HVC{<q>} {#}<imm16> ; A1
   58488                         hvc(al, imm);
   58489                         break;
   58490                       }
   58491                       default:
   58492                         UnallocatedA32(instr);
   58493                         break;
   58494                     }
   58495                     break;
   58496                   }
   58497                   case 0x01200000: {
   58498                     // 0x01600010
   58499                     switch (instr & 0x00000060) {
   58500                       case 0x00000000: {
   58501                         // 0x01600010
   58502                         if (((instr & 0xf0000000) == 0xf0000000)) {
   58503                           UnallocatedA32(instr);
   58504                           return;
   58505                         }
   58506                         Condition condition((instr >> 28) & 0xf);
   58507                         unsigned rd = (instr >> 12) & 0xf;
   58508                         unsigned rm = instr & 0xf;
   58509                         // CLZ{<c>}{<q>} <Rd>, <Rm> ; A1
   58510                         clz(condition, Register(rd), Register(rm));
   58511                         if (((instr & 0xfff0ff0) != 0x16f0f10)) {
   58512                           UnpredictableA32(instr);
   58513                         }
   58514                         break;
   58515                       }
   58516                       case 0x00000040: {
   58517                         // 0x01600050
   58518                         if (((instr & 0xf0000000) == 0xf0000000)) {
   58519                           UnallocatedA32(instr);
   58520                           return;
   58521                         }
   58522                         Condition condition((instr >> 28) & 0xf);
   58523                         unsigned rd = (instr >> 12) & 0xf;
   58524                         unsigned rm = instr & 0xf;
   58525                         unsigned rn = (instr >> 16) & 0xf;
   58526                         // QDSUB{<c>}{<q>} {<Rd>}, <Rm>, <Rn> ; A1
   58527                         qdsub(condition,
   58528                               Register(rd),
   58529                               Register(rm),
   58530                               Register(rn));
   58531                         if (((instr & 0xff00ff0) != 0x1600050)) {
   58532                           UnpredictableA32(instr);
   58533                         }
   58534                         break;
   58535                       }
   58536                       case 0x00000060: {
   58537                         // 0x01600070
   58538                         if (((instr & 0xf0000000) == 0xf0000000)) {
   58539                           UnallocatedA32(instr);
   58540                           return;
   58541                         }
   58542                         UnimplementedA32("SMC", instr);
   58543                         break;
   58544                       }
   58545                       default:
   58546                         UnallocatedA32(instr);
   58547                         break;
   58548                     }
   58549                     break;
   58550                   }
   58551                   case 0x01800000: {
   58552                     // 0x01c00010
   58553                     if (((instr & 0xf0000000) == 0xf0000000)) {
   58554                       UnallocatedA32(instr);
   58555                       return;
   58556                     }
   58557                     Condition condition((instr >> 28) & 0xf);
   58558                     unsigned rd = (instr >> 12) & 0xf;
   58559                     unsigned rn = (instr >> 16) & 0xf;
   58560                     unsigned rm = instr & 0xf;
   58561                     Shift shift((instr >> 5) & 0x3);
   58562                     unsigned rs = (instr >> 8) & 0xf;
   58563                     // BIC{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
   58564                     bic(condition,
   58565                         Best,
   58566                         Register(rd),
   58567                         Register(rn),
   58568                         Operand(Register(rm), shift.GetType(), Register(rs)));
   58569                     break;
   58570                   }
   58571                   case 0x01a00000: {
   58572                     // 0x01e00010
   58573                     if (((instr & 0xf0000000) == 0xf0000000)) {
   58574                       UnallocatedA32(instr);
   58575                       return;
   58576                     }
   58577                     Condition condition((instr >> 28) & 0xf);
   58578                     unsigned rd = (instr >> 12) & 0xf;
   58579                     unsigned rm = instr & 0xf;
   58580                     Shift shift((instr >> 5) & 0x3);
   58581                     unsigned rs = (instr >> 8) & 0xf;
   58582                     // MVN{<c>}{<q>} <Rd>, <Rm>, <shift> <Rs> ; A1
   58583                     mvn(condition,
   58584                         Best,
   58585                         Register(rd),
   58586                         Operand(Register(rm), shift.GetType(), Register(rs)));
   58587                     if (((instr & 0xfff0090) != 0x1e00010)) {
   58588                       UnpredictableA32(instr);
   58589                     }
   58590                     break;
   58591                   }
   58592                 }
   58593                 break;
   58594               }
   58595               case 0x00400080: {
   58596                 // 0x00400090
   58597                 switch (instr & 0x00000060) {
   58598                   case 0x00000000: {
   58599                     // 0x00400090
   58600                     switch (instr & 0x01a00000) {
   58601                       case 0x00000000: {
   58602                         // 0x00400090
   58603                         if (((instr & 0xf0000000) == 0xf0000000)) {
   58604                           UnallocatedA32(instr);
   58605                           return;
   58606                         }
   58607                         Condition condition((instr >> 28) & 0xf);
   58608                         unsigned rdlo = (instr >> 12) & 0xf;
   58609                         unsigned rdhi = (instr >> 16) & 0xf;
   58610                         unsigned rn = instr & 0xf;
   58611                         unsigned rm = (instr >> 8) & 0xf;
   58612                         // UMAAL{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
   58613                         umaal(condition,
   58614                               Register(rdlo),
   58615                               Register(rdhi),
   58616                               Register(rn),
   58617                               Register(rm));
   58618                         break;
   58619                       }
   58620                       case 0x00200000: {
   58621                         // 0x00600090
   58622                         if (((instr & 0xf0000000) == 0xf0000000)) {
   58623                           UnallocatedA32(instr);
   58624                           return;
   58625                         }
   58626                         Condition condition((instr >> 28) & 0xf);
   58627                         unsigned rd = (instr >> 16) & 0xf;
   58628                         unsigned rn = instr & 0xf;
   58629                         unsigned rm = (instr >> 8) & 0xf;
   58630                         unsigned ra = (instr >> 12) & 0xf;
   58631                         // MLS{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
   58632                         mls(condition,
   58633                             Register(rd),
   58634                             Register(rn),
   58635                             Register(rm),
   58636                             Register(ra));
   58637                         break;
   58638                       }
   58639                       case 0x00800000: {
   58640                         // 0x00c00090
   58641                         if (((instr & 0xf0000000) == 0xf0000000)) {
   58642                           UnallocatedA32(instr);
   58643                           return;
   58644                         }
   58645                         Condition condition((instr >> 28) & 0xf);
   58646                         unsigned rdlo = (instr >> 12) & 0xf;
   58647                         unsigned rdhi = (instr >> 16) & 0xf;
   58648                         unsigned rn = instr & 0xf;
   58649                         unsigned rm = (instr >> 8) & 0xf;
   58650                         // SMULL{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
   58651                         smull(condition,
   58652                               Register(rdlo),
   58653                               Register(rdhi),
   58654                               Register(rn),
   58655                               Register(rm));
   58656                         break;
   58657                       }
   58658                       case 0x00a00000: {
   58659                         // 0x00e00090
   58660                         if (((instr & 0xf0000000) == 0xf0000000)) {
   58661                           UnallocatedA32(instr);
   58662                           return;
   58663                         }
   58664                         Condition condition((instr >> 28) & 0xf);
   58665                         unsigned rdlo = (instr >> 12) & 0xf;
   58666                         unsigned rdhi = (instr >> 16) & 0xf;
   58667                         unsigned rn = instr & 0xf;
   58668                         unsigned rm = (instr >> 8) & 0xf;
   58669                         // SMLAL{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
   58670                         smlal(condition,
   58671                               Register(rdlo),
   58672                               Register(rdhi),
   58673                               Register(rn),
   58674                               Register(rm));
   58675                         break;
   58676                       }
   58677                       case 0x01800000: {
   58678                         // 0x01c00090
   58679                         switch (instr & 0x00000300) {
   58680                           case 0x00000000: {
   58681                             // 0x01c00090
   58682                             if (((instr & 0xf0000000) == 0xf0000000)) {
   58683                               UnallocatedA32(instr);
   58684                               return;
   58685                             }
   58686                             Condition condition((instr >> 28) & 0xf);
   58687                             unsigned rt = instr & 0xf;
   58688                             unsigned rn = (instr >> 16) & 0xf;
   58689                             // STLB{<c>}{<q>} <Rt>, [<Rn>] ; A1
   58690                             stlb(condition,
   58691                                  Register(rt),
   58692                                  MemOperand(Register(rn), Offset));
   58693                             if (((instr & 0xff0fff0) != 0x1c0fc90)) {
   58694                               UnpredictableA32(instr);
   58695                             }
   58696                             break;
   58697                           }
   58698                           case 0x00000200: {
   58699                             // 0x01c00290
   58700                             if (((instr & 0xf0000000) == 0xf0000000)) {
   58701                               UnallocatedA32(instr);
   58702                               return;
   58703                             }
   58704                             Condition condition((instr >> 28) & 0xf);
   58705                             unsigned rd = (instr >> 12) & 0xf;
   58706                             unsigned rt = instr & 0xf;
   58707                             unsigned rn = (instr >> 16) & 0xf;
   58708                             // STLEXB{<c>}{<q>} <Rd>, <Rt>, [<Rn>] ; A1
   58709                             stlexb(condition,
   58710                                    Register(rd),
   58711                                    Register(rt),
   58712                                    MemOperand(Register(rn), Offset));
   58713                             if (((instr & 0xff00ff0) != 0x1c00e90)) {
   58714                               UnpredictableA32(instr);
   58715                             }
   58716                             break;
   58717                           }
   58718                           case 0x00000300: {
   58719                             // 0x01c00390
   58720                             if (((instr & 0xf0000000) == 0xf0000000)) {
   58721                               UnallocatedA32(instr);
   58722                               return;
   58723                             }
   58724                             Condition condition((instr >> 28) & 0xf);
   58725                             unsigned rd = (instr >> 12) & 0xf;
   58726                             unsigned rt = instr & 0xf;
   58727                             unsigned rn = (instr >> 16) & 0xf;
   58728                             // STREXB{<c>}{<q>} <Rd>, <Rt>, [<Rn>] ; A1
   58729                             strexb(condition,
   58730                                    Register(rd),
   58731                                    Register(rt),
   58732                                    MemOperand(Register(rn), Offset));
   58733                             if (((instr & 0xff00ff0) != 0x1c00f90)) {
   58734                               UnpredictableA32(instr);
   58735                             }
   58736                             break;
   58737                           }
   58738                           default:
   58739                             UnallocatedA32(instr);
   58740                             break;
   58741                         }
   58742                         break;
   58743                       }
   58744                       case 0x01a00000: {
   58745                         // 0x01e00090
   58746                         switch (instr & 0x00000300) {
   58747                           case 0x00000000: {
   58748                             // 0x01e00090
   58749                             if (((instr & 0xf0000000) == 0xf0000000)) {
   58750                               UnallocatedA32(instr);
   58751                               return;
   58752                             }
   58753                             Condition condition((instr >> 28) & 0xf);
   58754                             unsigned rt = instr & 0xf;
   58755                             unsigned rn = (instr >> 16) & 0xf;
   58756                             // STLH{<c>}{<q>} <Rt>, [<Rn>] ; A1
   58757                             stlh(condition,
   58758                                  Register(rt),
   58759                                  MemOperand(Register(rn), Offset));
   58760                             if (((instr & 0xff0fff0) != 0x1e0fc90)) {
   58761                               UnpredictableA32(instr);
   58762                             }
   58763                             break;
   58764                           }
   58765                           case 0x00000200: {
   58766                             // 0x01e00290
   58767                             if (((instr & 0xf0000000) == 0xf0000000)) {
   58768                               UnallocatedA32(instr);
   58769                               return;
   58770                             }
   58771                             Condition condition((instr >> 28) & 0xf);
   58772                             unsigned rd = (instr >> 12) & 0xf;
   58773                             unsigned rt = instr & 0xf;
   58774                             unsigned rn = (instr >> 16) & 0xf;
   58775                             // STLEXH{<c>}{<q>} <Rd>, <Rt>, [<Rn>] ; A1
   58776                             stlexh(condition,
   58777                                    Register(rd),
   58778                                    Register(rt),
   58779                                    MemOperand(Register(rn), Offset));
   58780                             if (((instr & 0xff00ff0) != 0x1e00e90)) {
   58781                               UnpredictableA32(instr);
   58782                             }
   58783                             break;
   58784                           }
   58785                           case 0x00000300: {
   58786                             // 0x01e00390
   58787                             if (((instr & 0xf0000000) == 0xf0000000)) {
   58788                               UnallocatedA32(instr);
   58789                               return;
   58790                             }
   58791                             Condition condition((instr >> 28) & 0xf);
   58792                             unsigned rd = (instr >> 12) & 0xf;
   58793                             unsigned rt = instr & 0xf;
   58794                             unsigned rn = (instr >> 16) & 0xf;
   58795                             // STREXH{<c>}{<q>} <Rd>, <Rt>, [<Rn>] ; A1
   58796                             strexh(condition,
   58797                                    Register(rd),
   58798                                    Register(rt),
   58799                                    MemOperand(Register(rn), Offset));
   58800                             if (((instr & 0xff00ff0) != 0x1e00f90)) {
   58801                               UnpredictableA32(instr);
   58802                             }
   58803                             break;
   58804                           }
   58805                           default:
   58806                             UnallocatedA32(instr);
   58807                             break;
   58808                         }
   58809                         break;
   58810                       }
   58811                       default:
   58812                         UnallocatedA32(instr);
   58813                         break;
   58814                     }
   58815                     break;
   58816                   }
   58817                   case 0x00000020: {
   58818                     // 0x004000b0
   58819                     switch (instr & 0x01200000) {
   58820                       case 0x00000000: {
   58821                         // 0x004000b0
   58822                         if (((instr & 0xf0000000) == 0xf0000000)) {
   58823                           UnallocatedA32(instr);
   58824                           return;
   58825                         }
   58826                         Condition condition((instr >> 28) & 0xf);
   58827                         unsigned rt = (instr >> 12) & 0xf;
   58828                         unsigned rn = (instr >> 16) & 0xf;
   58829                         Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
   58830                         int32_t offset = (instr & 0xf) | ((instr >> 4) & 0xf0);
   58831                         // STRH{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_3> ; A1
   58832                         strh(condition,
   58833                              Best,
   58834                              Register(rt),
   58835                              MemOperand(Register(rn), sign, offset, PostIndex));
   58836                         break;
   58837                       }
   58838                       case 0x00200000: {
   58839                         // 0x006000b0
   58840                         if (((instr & 0xf0000000) == 0xf0000000)) {
   58841                           UnallocatedA32(instr);
   58842                           return;
   58843                         }
   58844                         UnimplementedA32("STRHT", instr);
   58845                         break;
   58846                       }
   58847                       case 0x01000000: {
   58848                         // 0x014000b0
   58849                         if (((instr & 0xf0000000) == 0xf0000000)) {
   58850                           UnallocatedA32(instr);
   58851                           return;
   58852                         }
   58853                         Condition condition((instr >> 28) & 0xf);
   58854                         unsigned rt = (instr >> 12) & 0xf;
   58855                         unsigned rn = (instr >> 16) & 0xf;
   58856                         Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
   58857                         int32_t offset = (instr & 0xf) | ((instr >> 4) & 0xf0);
   58858                         // STRH{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_3>}] ; A1
   58859                         strh(condition,
   58860                              Best,
   58861                              Register(rt),
   58862                              MemOperand(Register(rn), sign, offset, Offset));
   58863                         break;
   58864                       }
   58865                       case 0x01200000: {
   58866                         // 0x016000b0
   58867                         if (((instr & 0xf0000000) == 0xf0000000)) {
   58868                           UnallocatedA32(instr);
   58869                           return;
   58870                         }
   58871                         Condition condition((instr >> 28) & 0xf);
   58872                         unsigned rt = (instr >> 12) & 0xf;
   58873                         unsigned rn = (instr >> 16) & 0xf;
   58874                         Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
   58875                         int32_t offset = (instr & 0xf) | ((instr >> 4) & 0xf0);
   58876                         // STRH{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_3>}]! ; A1
   58877                         strh(condition,
   58878                              Best,
   58879                              Register(rt),
   58880                              MemOperand(Register(rn), sign, offset, PreIndex));
   58881                         break;
   58882                       }
   58883                     }
   58884                     break;
   58885                   }
   58886                   case 0x00000040: {
   58887                     // 0x004000d0
   58888                     switch (instr & 0x000f0000) {
   58889                       case 0x000f0000: {
   58890                         // 0x004f00d0
   58891                         if (((instr & 0xf0000000) == 0xf0000000)) {
   58892                           UnallocatedA32(instr);
   58893                           return;
   58894                         }
   58895                         Condition condition((instr >> 28) & 0xf);
   58896                         unsigned rt = (instr >> 12) & 0xf;
   58897                         uint32_t U = (instr >> 23) & 0x1;
   58898                         int32_t imm = (instr & 0xf) | ((instr >> 4) & 0xf0);
   58899                         if (U == 0) imm = -imm;
   58900                         bool minus_zero = (imm == 0) && (U == 0);
   58901                         Location location(imm, kA32PcDelta);
   58902                         // LDRD{<c>}{<q>} <Rt>, <Rt2>, <label> ; A1
   58903                         if (minus_zero) {
   58904                           ldrd(condition,
   58905                                Register(rt),
   58906                                Register(rt + 1),
   58907                                MemOperand(pc, minus, 0));
   58908                         } else {
   58909                           ldrd(condition,
   58910                                Register(rt),
   58911                                Register(rt + 1),
   58912                                &location);
   58913                         }
   58914                         if (((instr & 0xf7f00f0) != 0x14f00d0)) {
   58915                           UnpredictableA32(instr);
   58916                         }
   58917                         break;
   58918                       }
   58919                       default: {
   58920                         switch (instr & 0x01200000) {
   58921                           case 0x00000000: {
   58922                             // 0x004000d0
   58923                             if (((instr & 0xf0000000) == 0xf0000000) ||
   58924                                 ((instr & 0xf0000) == 0xf0000)) {
   58925                               UnallocatedA32(instr);
   58926                               return;
   58927                             }
   58928                             Condition condition((instr >> 28) & 0xf);
   58929                             unsigned rt = (instr >> 12) & 0xf;
   58930                             unsigned rn = (instr >> 16) & 0xf;
   58931                             Sign sign((((instr >> 23) & 0x1) == 0) ? minus
   58932                                                                    : plus);
   58933                             int32_t offset =
   58934                                 (instr & 0xf) | ((instr >> 4) & 0xf0);
   58935                             // LDRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>], #{+/-}<imm_1> ; A1 NOLINT(whitespace/line_length)
   58936                             ldrd(condition,
   58937                                  Register(rt),
   58938                                  Register(rt + 1),
   58939                                  MemOperand(Register(rn),
   58940                                             sign,
   58941                                             offset,
   58942                                             PostIndex));
   58943                             break;
   58944                           }
   58945                           case 0x01000000: {
   58946                             // 0x014000d0
   58947                             if (((instr & 0xf0000000) == 0xf0000000) ||
   58948                                 ((instr & 0xf0000) == 0xf0000)) {
   58949                               UnallocatedA32(instr);
   58950                               return;
   58951                             }
   58952                             Condition condition((instr >> 28) & 0xf);
   58953                             unsigned rt = (instr >> 12) & 0xf;
   58954                             unsigned rn = (instr >> 16) & 0xf;
   58955                             Sign sign((((instr >> 23) & 0x1) == 0) ? minus
   58956                                                                    : plus);
   58957                             int32_t offset =
   58958                                 (instr & 0xf) | ((instr >> 4) & 0xf0);
   58959                             // LDRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>{, #{+/-}<imm_1>}] ; A1 NOLINT(whitespace/line_length)
   58960                             ldrd(condition,
   58961                                  Register(rt),
   58962                                  Register(rt + 1),
   58963                                  MemOperand(Register(rn),
   58964                                             sign,
   58965                                             offset,
   58966                                             Offset));
   58967                             break;
   58968                           }
   58969                           case 0x01200000: {
   58970                             // 0x016000d0
   58971                             if (((instr & 0xf0000000) == 0xf0000000) ||
   58972                                 ((instr & 0xf0000) == 0xf0000)) {
   58973                               UnallocatedA32(instr);
   58974                               return;
   58975                             }
   58976                             Condition condition((instr >> 28) & 0xf);
   58977                             unsigned rt = (instr >> 12) & 0xf;
   58978                             unsigned rn = (instr >> 16) & 0xf;
   58979                             Sign sign((((instr >> 23) & 0x1) == 0) ? minus
   58980                                                                    : plus);
   58981                             int32_t offset =
   58982                                 (instr & 0xf) | ((instr >> 4) & 0xf0);
   58983                             // LDRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>{, #{+/-}<imm_1>}]! ; A1 NOLINT(whitespace/line_length)
   58984                             ldrd(condition,
   58985                                  Register(rt),
   58986                                  Register(rt + 1),
   58987                                  MemOperand(Register(rn),
   58988                                             sign,
   58989                                             offset,
   58990                                             PreIndex));
   58991                             break;
   58992                           }
   58993                           default:
   58994                             UnallocatedA32(instr);
   58995                             break;
   58996                         }
   58997                         break;
   58998                       }
   58999                     }
   59000                     break;
   59001                   }
   59002                   case 0x00000060: {
   59003                     // 0x004000f0
   59004                     switch (instr & 0x01200000) {
   59005                       case 0x00000000: {
   59006                         // 0x004000f0
   59007                         if (((instr & 0xf0000000) == 0xf0000000)) {
   59008                           UnallocatedA32(instr);
   59009                           return;
   59010                         }
   59011                         Condition condition((instr >> 28) & 0xf);
   59012                         unsigned rt = (instr >> 12) & 0xf;
   59013                         unsigned rn = (instr >> 16) & 0xf;
   59014                         Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
   59015                         int32_t offset = (instr & 0xf) | ((instr >> 4) & 0xf0);
   59016                         // STRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>], #{+/-}<imm_1> ; A1 NOLINT(whitespace/line_length)
   59017                         strd(condition,
   59018                              Register(rt),
   59019                              Register(rt + 1),
   59020                              MemOperand(Register(rn), sign, offset, PostIndex));
   59021                         break;
   59022                       }
   59023                       case 0x01000000: {
   59024                         // 0x014000f0
   59025                         if (((instr & 0xf0000000) == 0xf0000000)) {
   59026                           UnallocatedA32(instr);
   59027                           return;
   59028                         }
   59029                         Condition condition((instr >> 28) & 0xf);
   59030                         unsigned rt = (instr >> 12) & 0xf;
   59031                         unsigned rn = (instr >> 16) & 0xf;
   59032                         Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
   59033                         int32_t offset = (instr & 0xf) | ((instr >> 4) & 0xf0);
   59034                         // STRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>{, #{+/-}<imm_1>}] ; A1 NOLINT(whitespace/line_length)
   59035                         strd(condition,
   59036                              Register(rt),
   59037                              Register(rt + 1),
   59038                              MemOperand(Register(rn), sign, offset, Offset));
   59039                         break;
   59040                       }
   59041                       case 0x01200000: {
   59042                         // 0x016000f0
   59043                         if (((instr & 0xf0000000) == 0xf0000000)) {
   59044                           UnallocatedA32(instr);
   59045                           return;
   59046                         }
   59047                         Condition condition((instr >> 28) & 0xf);
   59048                         unsigned rt = (instr >> 12) & 0xf;
   59049                         unsigned rn = (instr >> 16) & 0xf;
   59050                         Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
   59051                         int32_t offset = (instr & 0xf) | ((instr >> 4) & 0xf0);
   59052                         // STRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>{, #{+/-}<imm_1>}]! ; A1 NOLINT(whitespace/line_length)
   59053                         strd(condition,
   59054                              Register(rt),
   59055                              Register(rt + 1),
   59056                              MemOperand(Register(rn), sign, offset, PreIndex));
   59057                         break;
   59058                       }
   59059                       default:
   59060                         UnallocatedA32(instr);
   59061                         break;
   59062                     }
   59063                     break;
   59064                   }
   59065                 }
   59066                 break;
   59067               }
   59068             }
   59069             break;
   59070           }
   59071           case 0x00100000: {
   59072             // 0x00100000
   59073             switch (instr & 0x01e00000) {
   59074               case 0x00000000: {
   59075                 // 0x00100000
   59076                 switch (instr & 0x00000fe0) {
   59077                   case 0x00000060: {
   59078                     // 0x00100060
   59079                     if (((instr & 0xf0000000) == 0xf0000000)) {
   59080                       UnallocatedA32(instr);
   59081                       return;
   59082                     }
   59083                     Condition condition((instr >> 28) & 0xf);
   59084                     unsigned rd = (instr >> 12) & 0xf;
   59085                     unsigned rn = (instr >> 16) & 0xf;
   59086                     unsigned rm = instr & 0xf;
   59087                     // ANDS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
   59088                     ands(condition,
   59089                          Best,
   59090                          Register(rd),
   59091                          Register(rn),
   59092                          Operand(Register(rm), RRX));
   59093                     break;
   59094                   }
   59095                   default: {
   59096                     if (((instr & 0xf0000000) == 0xf0000000) ||
   59097                         ((instr & 0xfe0) == 0x60)) {
   59098                       UnallocatedA32(instr);
   59099                       return;
   59100                     }
   59101                     Condition condition((instr >> 28) & 0xf);
   59102                     unsigned rd = (instr >> 12) & 0xf;
   59103                     unsigned rn = (instr >> 16) & 0xf;
   59104                     unsigned rm = instr & 0xf;
   59105                     ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
   59106                                                         (instr >> 7) & 0x1f);
   59107                     // ANDS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
   59108                     ands(condition,
   59109                          Best,
   59110                          Register(rd),
   59111                          Register(rn),
   59112                          Operand(Register(rm),
   59113                                  shift_operand.GetType(),
   59114                                  shift_operand.GetAmount()));
   59115                     break;
   59116                   }
   59117                 }
   59118                 break;
   59119               }
   59120               case 0x00200000: {
   59121                 // 0x00300000
   59122                 switch (instr & 0x00000fe0) {
   59123                   case 0x00000060: {
   59124                     // 0x00300060
   59125                     if (((instr & 0xf0000000) == 0xf0000000)) {
   59126                       UnallocatedA32(instr);
   59127                       return;
   59128                     }
   59129                     Condition condition((instr >> 28) & 0xf);
   59130                     unsigned rd = (instr >> 12) & 0xf;
   59131                     unsigned rn = (instr >> 16) & 0xf;
   59132                     unsigned rm = instr & 0xf;
   59133                     // EORS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
   59134                     eors(condition,
   59135                          Best,
   59136                          Register(rd),
   59137                          Register(rn),
   59138                          Operand(Register(rm), RRX));
   59139                     break;
   59140                   }
   59141                   default: {
   59142                     if (((instr & 0xf0000000) == 0xf0000000) ||
   59143                         ((instr & 0xfe0) == 0x60)) {
   59144                       UnallocatedA32(instr);
   59145                       return;
   59146                     }
   59147                     Condition condition((instr >> 28) & 0xf);
   59148                     unsigned rd = (instr >> 12) & 0xf;
   59149                     unsigned rn = (instr >> 16) & 0xf;
   59150                     unsigned rm = instr & 0xf;
   59151                     ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
   59152                                                         (instr >> 7) & 0x1f);
   59153                     // EORS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
   59154                     eors(condition,
   59155                          Best,
   59156                          Register(rd),
   59157                          Register(rn),
   59158                          Operand(Register(rm),
   59159                                  shift_operand.GetType(),
   59160                                  shift_operand.GetAmount()));
   59161                     break;
   59162                   }
   59163                 }
   59164                 break;
   59165               }
   59166               case 0x00400000: {
   59167                 // 0x00500000
   59168                 switch (instr & 0x000f0000) {
   59169                   case 0x000d0000: {
   59170                     // 0x005d0000
   59171                     switch (instr & 0x00000fe0) {
   59172                       case 0x00000060: {
   59173                         // 0x005d0060
   59174                         if (((instr & 0xf0000000) == 0xf0000000)) {
   59175                           UnallocatedA32(instr);
   59176                           return;
   59177                         }
   59178                         Condition condition((instr >> 28) & 0xf);
   59179                         unsigned rd = (instr >> 12) & 0xf;
   59180                         unsigned rm = instr & 0xf;
   59181                         // SUBS{<c>}{<q>} {<Rd>}, SP, <Rm>, RRX ; A1
   59182                         subs(condition,
   59183                              Best,
   59184                              Register(rd),
   59185                              sp,
   59186                              Operand(Register(rm), RRX));
   59187                         break;
   59188                       }
   59189                       default: {
   59190                         if (((instr & 0xf0000000) == 0xf0000000) ||
   59191                             ((instr & 0xfe0) == 0x60)) {
   59192                           UnallocatedA32(instr);
   59193                           return;
   59194                         }
   59195                         Condition condition((instr >> 28) & 0xf);
   59196                         unsigned rd = (instr >> 12) & 0xf;
   59197                         unsigned rm = instr & 0xf;
   59198                         ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
   59199                                                             (instr >> 7) &
   59200                                                                 0x1f);
   59201                         // SUBS{<c>}{<q>} {<Rd>}, SP, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
   59202                         subs(condition,
   59203                              Best,
   59204                              Register(rd),
   59205                              sp,
   59206                              Operand(Register(rm),
   59207                                      shift_operand.GetType(),
   59208                                      shift_operand.GetAmount()));
   59209                         break;
   59210                       }
   59211                     }
   59212                     break;
   59213                   }
   59214                   default: {
   59215                     switch (instr & 0x00000fe0) {
   59216                       case 0x00000060: {
   59217                         // 0x00500060
   59218                         if (((instr & 0xf0000000) == 0xf0000000) ||
   59219                             ((instr & 0xf0000) == 0xd0000)) {
   59220                           UnallocatedA32(instr);
   59221                           return;
   59222                         }
   59223                         Condition condition((instr >> 28) & 0xf);
   59224                         unsigned rd = (instr >> 12) & 0xf;
   59225                         unsigned rn = (instr >> 16) & 0xf;
   59226                         unsigned rm = instr & 0xf;
   59227                         // SUBS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
   59228                         subs(condition,
   59229                              Best,
   59230                              Register(rd),
   59231                              Register(rn),
   59232                              Operand(Register(rm), RRX));
   59233                         break;
   59234                       }
   59235                       default: {
   59236                         if (((instr & 0xf0000000) == 0xf0000000) ||
   59237                             ((instr & 0xf0000) == 0xd0000) ||
   59238                             ((instr & 0xfe0) == 0x60)) {
   59239                           UnallocatedA32(instr);
   59240                           return;
   59241                         }
   59242                         Condition condition((instr >> 28) & 0xf);
   59243                         unsigned rd = (instr >> 12) & 0xf;
   59244                         unsigned rn = (instr >> 16) & 0xf;
   59245                         unsigned rm = instr & 0xf;
   59246                         ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
   59247                                                             (instr >> 7) &
   59248                                                                 0x1f);
   59249                         // SUBS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
   59250                         subs(condition,
   59251                              Best,
   59252                              Register(rd),
   59253                              Register(rn),
   59254                              Operand(Register(rm),
   59255                                      shift_operand.GetType(),
   59256                                      shift_operand.GetAmount()));
   59257                         break;
   59258                       }
   59259                     }
   59260                     break;
   59261                   }
   59262                 }
   59263                 break;
   59264               }
   59265               case 0x00600000: {
   59266                 // 0x00700000
   59267                 switch (instr & 0x00000fe0) {
   59268                   case 0x00000060: {
   59269                     // 0x00700060
   59270                     if (((instr & 0xf0000000) == 0xf0000000)) {
   59271                       UnallocatedA32(instr);
   59272                       return;
   59273                     }
   59274                     Condition condition((instr >> 28) & 0xf);
   59275                     unsigned rd = (instr >> 12) & 0xf;
   59276                     unsigned rn = (instr >> 16) & 0xf;
   59277                     unsigned rm = instr & 0xf;
   59278                     // RSBS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
   59279                     rsbs(condition,
   59280                          Best,
   59281                          Register(rd),
   59282                          Register(rn),
   59283                          Operand(Register(rm), RRX));
   59284                     break;
   59285                   }
   59286                   default: {
   59287                     if (((instr & 0xf0000000) == 0xf0000000) ||
   59288                         ((instr & 0xfe0) == 0x60)) {
   59289                       UnallocatedA32(instr);
   59290                       return;
   59291                     }
   59292                     Condition condition((instr >> 28) & 0xf);
   59293                     unsigned rd = (instr >> 12) & 0xf;
   59294                     unsigned rn = (instr >> 16) & 0xf;
   59295                     unsigned rm = instr & 0xf;
   59296                     ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
   59297                                                         (instr >> 7) & 0x1f);
   59298                     // RSBS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
   59299                     rsbs(condition,
   59300                          Best,
   59301                          Register(rd),
   59302                          Register(rn),
   59303                          Operand(Register(rm),
   59304                                  shift_operand.GetType(),
   59305                                  shift_operand.GetAmount()));
   59306                     break;
   59307                   }
   59308                 }
   59309                 break;
   59310               }
   59311               case 0x00800000: {
   59312                 // 0x00900000
   59313                 switch (instr & 0x000f0000) {
   59314                   case 0x000d0000: {
   59315                     // 0x009d0000
   59316                     switch (instr & 0x00000fe0) {
   59317                       case 0x00000060: {
   59318                         // 0x009d0060
   59319                         if (((instr & 0xf0000000) == 0xf0000000)) {
   59320                           UnallocatedA32(instr);
   59321                           return;
   59322                         }
   59323                         Condition condition((instr >> 28) & 0xf);
   59324                         unsigned rd = (instr >> 12) & 0xf;
   59325                         unsigned rm = instr & 0xf;
   59326                         // ADDS{<c>}{<q>} {<Rd>}, SP, <Rm>, RRX ; A1
   59327                         adds(condition,
   59328                              Best,
   59329                              Register(rd),
   59330                              sp,
   59331                              Operand(Register(rm), RRX));
   59332                         break;
   59333                       }
   59334                       default: {
   59335                         if (((instr & 0xf0000000) == 0xf0000000) ||
   59336                             ((instr & 0xfe0) == 0x60)) {
   59337                           UnallocatedA32(instr);
   59338                           return;
   59339                         }
   59340                         Condition condition((instr >> 28) & 0xf);
   59341                         unsigned rd = (instr >> 12) & 0xf;
   59342                         unsigned rm = instr & 0xf;
   59343                         ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
   59344                                                             (instr >> 7) &
   59345                                                                 0x1f);
   59346                         // ADDS{<c>}{<q>} {<Rd>}, SP, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
   59347                         adds(condition,
   59348                              Best,
   59349                              Register(rd),
   59350                              sp,
   59351                              Operand(Register(rm),
   59352                                      shift_operand.GetType(),
   59353                                      shift_operand.GetAmount()));
   59354                         break;
   59355                       }
   59356                     }
   59357                     break;
   59358                   }
   59359                   default: {
   59360                     switch (instr & 0x00000fe0) {
   59361                       case 0x00000060: {
   59362                         // 0x00900060
   59363                         if (((instr & 0xf0000000) == 0xf0000000) ||
   59364                             ((instr & 0xf0000) == 0xd0000)) {
   59365                           UnallocatedA32(instr);
   59366                           return;
   59367                         }
   59368                         Condition condition((instr >> 28) & 0xf);
   59369                         unsigned rd = (instr >> 12) & 0xf;
   59370                         unsigned rn = (instr >> 16) & 0xf;
   59371                         unsigned rm = instr & 0xf;
   59372                         // ADDS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
   59373                         adds(condition,
   59374                              Best,
   59375                              Register(rd),
   59376                              Register(rn),
   59377                              Operand(Register(rm), RRX));
   59378                         break;
   59379                       }
   59380                       default: {
   59381                         if (((instr & 0xf0000000) == 0xf0000000) ||
   59382                             ((instr & 0xf0000) == 0xd0000) ||
   59383                             ((instr & 0xfe0) == 0x60)) {
   59384                           UnallocatedA32(instr);
   59385                           return;
   59386                         }
   59387                         Condition condition((instr >> 28) & 0xf);
   59388                         unsigned rd = (instr >> 12) & 0xf;
   59389                         unsigned rn = (instr >> 16) & 0xf;
   59390                         unsigned rm = instr & 0xf;
   59391                         ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
   59392                                                             (instr >> 7) &
   59393                                                                 0x1f);
   59394                         // ADDS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
   59395                         adds(condition,
   59396                              Best,
   59397                              Register(rd),
   59398                              Register(rn),
   59399                              Operand(Register(rm),
   59400                                      shift_operand.GetType(),
   59401                                      shift_operand.GetAmount()));
   59402                         break;
   59403                       }
   59404                     }
   59405                     break;
   59406                   }
   59407                 }
   59408                 break;
   59409               }
   59410               case 0x00a00000: {
   59411                 // 0x00b00000
   59412                 switch (instr & 0x00000fe0) {
   59413                   case 0x00000060: {
   59414                     // 0x00b00060
   59415                     if (((instr & 0xf0000000) == 0xf0000000)) {
   59416                       UnallocatedA32(instr);
   59417                       return;
   59418                     }
   59419                     Condition condition((instr >> 28) & 0xf);
   59420                     unsigned rd = (instr >> 12) & 0xf;
   59421                     unsigned rn = (instr >> 16) & 0xf;
   59422                     unsigned rm = instr & 0xf;
   59423                     // ADCS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
   59424                     adcs(condition,
   59425                          Best,
   59426                          Register(rd),
   59427                          Register(rn),
   59428                          Operand(Register(rm), RRX));
   59429                     break;
   59430                   }
   59431                   default: {
   59432                     if (((instr & 0xf0000000) == 0xf0000000) ||
   59433                         ((instr & 0xfe0) == 0x60)) {
   59434                       UnallocatedA32(instr);
   59435                       return;
   59436                     }
   59437                     Condition condition((instr >> 28) & 0xf);
   59438                     unsigned rd = (instr >> 12) & 0xf;
   59439                     unsigned rn = (instr >> 16) & 0xf;
   59440                     unsigned rm = instr & 0xf;
   59441                     ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
   59442                                                         (instr >> 7) & 0x1f);
   59443                     // ADCS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
   59444                     adcs(condition,
   59445                          Best,
   59446                          Register(rd),
   59447                          Register(rn),
   59448                          Operand(Register(rm),
   59449                                  shift_operand.GetType(),
   59450                                  shift_operand.GetAmount()));
   59451                     break;
   59452                   }
   59453                 }
   59454                 break;
   59455               }
   59456               case 0x00c00000: {
   59457                 // 0x00d00000
   59458                 switch (instr & 0x00000fe0) {
   59459                   case 0x00000060: {
   59460                     // 0x00d00060
   59461                     if (((instr & 0xf0000000) == 0xf0000000)) {
   59462                       UnallocatedA32(instr);
   59463                       return;
   59464                     }
   59465                     Condition condition((instr >> 28) & 0xf);
   59466                     unsigned rd = (instr >> 12) & 0xf;
   59467                     unsigned rn = (instr >> 16) & 0xf;
   59468                     unsigned rm = instr & 0xf;
   59469                     // SBCS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
   59470                     sbcs(condition,
   59471                          Best,
   59472                          Register(rd),
   59473                          Register(rn),
   59474                          Operand(Register(rm), RRX));
   59475                     break;
   59476                   }
   59477                   default: {
   59478                     if (((instr & 0xf0000000) == 0xf0000000) ||
   59479                         ((instr & 0xfe0) == 0x60)) {
   59480                       UnallocatedA32(instr);
   59481                       return;
   59482                     }
   59483                     Condition condition((instr >> 28) & 0xf);
   59484                     unsigned rd = (instr >> 12) & 0xf;
   59485                     unsigned rn = (instr >> 16) & 0xf;
   59486                     unsigned rm = instr & 0xf;
   59487                     ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
   59488                                                         (instr >> 7) & 0x1f);
   59489                     // SBCS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
   59490                     sbcs(condition,
   59491                          Best,
   59492                          Register(rd),
   59493                          Register(rn),
   59494                          Operand(Register(rm),
   59495                                  shift_operand.GetType(),
   59496                                  shift_operand.GetAmount()));
   59497                     break;
   59498                   }
   59499                 }
   59500                 break;
   59501               }
   59502               case 0x00e00000: {
   59503                 // 0x00f00000
   59504                 switch (instr & 0x00000fe0) {
   59505                   case 0x00000060: {
   59506                     // 0x00f00060
   59507                     if (((instr & 0xf0000000) == 0xf0000000)) {
   59508                       UnallocatedA32(instr);
   59509                       return;
   59510                     }
   59511                     Condition condition((instr >> 28) & 0xf);
   59512                     unsigned rd = (instr >> 12) & 0xf;
   59513                     unsigned rn = (instr >> 16) & 0xf;
   59514                     unsigned rm = instr & 0xf;
   59515                     // RSCS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
   59516                     rscs(condition,
   59517                          Register(rd),
   59518                          Register(rn),
   59519                          Operand(Register(rm), RRX));
   59520                     break;
   59521                   }
   59522                   default: {
   59523                     if (((instr & 0xf0000000) == 0xf0000000) ||
   59524                         ((instr & 0xfe0) == 0x60)) {
   59525                       UnallocatedA32(instr);
   59526                       return;
   59527                     }
   59528                     Condition condition((instr >> 28) & 0xf);
   59529                     unsigned rd = (instr >> 12) & 0xf;
   59530                     unsigned rn = (instr >> 16) & 0xf;
   59531                     unsigned rm = instr & 0xf;
   59532                     ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
   59533                                                         (instr >> 7) & 0x1f);
   59534                     // RSCS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
   59535                     rscs(condition,
   59536                          Register(rd),
   59537                          Register(rn),
   59538                          Operand(Register(rm),
   59539                                  shift_operand.GetType(),
   59540                                  shift_operand.GetAmount()));
   59541                     break;
   59542                   }
   59543                 }
   59544                 break;
   59545               }
   59546               case 0x01000000: {
   59547                 // 0x01100000
   59548                 switch (instr & 0x00000fe0) {
   59549                   case 0x00000060: {
   59550                     // 0x01100060
   59551                     if (((instr & 0xf0000000) == 0xf0000000)) {
   59552                       UnallocatedA32(instr);
   59553                       return;
   59554                     }
   59555                     Condition condition((instr >> 28) & 0xf);
   59556                     unsigned rn = (instr >> 16) & 0xf;
   59557                     unsigned rm = instr & 0xf;
   59558                     // TST{<c>}{<q>} <Rn>, <Rm>, RRX ; A1
   59559                     tst(condition,
   59560                         Best,
   59561                         Register(rn),
   59562                         Operand(Register(rm), RRX));
   59563                     if (((instr & 0xff0fff0) != 0x1100060)) {
   59564                       UnpredictableA32(instr);
   59565                     }
   59566                     break;
   59567                   }
   59568                   default: {
   59569                     if (((instr & 0xf0000000) == 0xf0000000) ||
   59570                         ((instr & 0xfe0) == 0x60)) {
   59571                       UnallocatedA32(instr);
   59572                       return;
   59573                     }
   59574                     Condition condition((instr >> 28) & 0xf);
   59575                     unsigned rn = (instr >> 16) & 0xf;
   59576                     unsigned rm = instr & 0xf;
   59577                     ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
   59578                                                         (instr >> 7) & 0x1f);
   59579                     // TST{<c>}{<q>} <Rn>, <Rm> {, <shift> #<amount> } ; A1
   59580                     tst(condition,
   59581                         Best,
   59582                         Register(rn),
   59583                         Operand(Register(rm),
   59584                                 shift_operand.GetType(),
   59585                                 shift_operand.GetAmount()));
   59586                     if (((instr & 0xff0f010) != 0x1100000)) {
   59587                       UnpredictableA32(instr);
   59588                     }
   59589                     break;
   59590                   }
   59591                 }
   59592                 break;
   59593               }
   59594               case 0x01200000: {
   59595                 // 0x01300000
   59596                 switch (instr & 0x00000fe0) {
   59597                   case 0x00000060: {
   59598                     // 0x01300060
   59599                     if (((instr & 0xf0000000) == 0xf0000000)) {
   59600                       UnallocatedA32(instr);
   59601                       return;
   59602                     }
   59603                     Condition condition((instr >> 28) & 0xf);
   59604                     unsigned rn = (instr >> 16) & 0xf;
   59605                     unsigned rm = instr & 0xf;
   59606                     // TEQ{<c>}{<q>} <Rn>, <Rm>, RRX ; A1
   59607                     teq(condition, Register(rn), Operand(Register(rm), RRX));
   59608                     if (((instr & 0xff0fff0) != 0x1300060)) {
   59609                       UnpredictableA32(instr);
   59610                     }
   59611                     break;
   59612                   }
   59613                   default: {
   59614                     if (((instr & 0xf0000000) == 0xf0000000) ||
   59615                         ((instr & 0xfe0) == 0x60)) {
   59616                       UnallocatedA32(instr);
   59617                       return;
   59618                     }
   59619                     Condition condition((instr >> 28) & 0xf);
   59620                     unsigned rn = (instr >> 16) & 0xf;
   59621                     unsigned rm = instr & 0xf;
   59622                     ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
   59623                                                         (instr >> 7) & 0x1f);
   59624                     // TEQ{<c>}{<q>} <Rn>, <Rm> {, <shift> #<amount> } ; A1
   59625                     teq(condition,
   59626                         Register(rn),
   59627                         Operand(Register(rm),
   59628                                 shift_operand.GetType(),
   59629                                 shift_operand.GetAmount()));
   59630                     if (((instr & 0xff0f010) != 0x1300000)) {
   59631                       UnpredictableA32(instr);
   59632                     }
   59633                     break;
   59634                   }
   59635                 }
   59636                 break;
   59637               }
   59638               case 0x01400000: {
   59639                 // 0x01500000
   59640                 switch (instr & 0x00000fe0) {
   59641                   case 0x00000060: {
   59642                     // 0x01500060
   59643                     if (((instr & 0xf0000000) == 0xf0000000)) {
   59644                       UnallocatedA32(instr);
   59645                       return;
   59646                     }
   59647                     Condition condition((instr >> 28) & 0xf);
   59648                     unsigned rn = (instr >> 16) & 0xf;
   59649                     unsigned rm = instr & 0xf;
   59650                     // CMP{<c>}{<q>} <Rn>, <Rm>, RRX ; A1
   59651                     cmp(condition,
   59652                         Best,
   59653                         Register(rn),
   59654                         Operand(Register(rm), RRX));
   59655                     if (((instr & 0xff0fff0) != 0x1500060)) {
   59656                       UnpredictableA32(instr);
   59657                     }
   59658                     break;
   59659                   }
   59660                   default: {
   59661                     if (((instr & 0xf0000000) == 0xf0000000) ||
   59662                         ((instr & 0xfe0) == 0x60)) {
   59663                       UnallocatedA32(instr);
   59664                       return;
   59665                     }
   59666                     Condition condition((instr >> 28) & 0xf);
   59667                     unsigned rn = (instr >> 16) & 0xf;
   59668                     unsigned rm = instr & 0xf;
   59669                     ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
   59670                                                         (instr >> 7) & 0x1f);
   59671                     // CMP{<c>}{<q>} <Rn>, <Rm> {, <shift> #<amount> } ; A1
   59672                     cmp(condition,
   59673                         Best,
   59674                         Register(rn),
   59675                         Operand(Register(rm),
   59676                                 shift_operand.GetType(),
   59677                                 shift_operand.GetAmount()));
   59678                     if (((instr & 0xff0f010) != 0x1500000)) {
   59679                       UnpredictableA32(instr);
   59680                     }
   59681                     break;
   59682                   }
   59683                 }
   59684                 break;
   59685               }
   59686               case 0x01600000: {
   59687                 // 0x01700000
   59688                 switch (instr & 0x00000fe0) {
   59689                   case 0x00000060: {
   59690                     // 0x01700060
   59691                     if (((instr & 0xf0000000) == 0xf0000000)) {
   59692                       UnallocatedA32(instr);
   59693                       return;
   59694                     }
   59695                     Condition condition((instr >> 28) & 0xf);
   59696                     unsigned rn = (instr >> 16) & 0xf;
   59697                     unsigned rm = instr & 0xf;
   59698                     // CMN{<c>}{<q>} <Rn>, <Rm>, RRX ; A1
   59699                     cmn(condition,
   59700                         Best,
   59701                         Register(rn),
   59702                         Operand(Register(rm), RRX));
   59703                     if (((instr & 0xff0fff0) != 0x1700060)) {
   59704                       UnpredictableA32(instr);
   59705                     }
   59706                     break;
   59707                   }
   59708                   default: {
   59709                     if (((instr & 0xf0000000) == 0xf0000000) ||
   59710                         ((instr & 0xfe0) == 0x60)) {
   59711                       UnallocatedA32(instr);
   59712                       return;
   59713                     }
   59714                     Condition condition((instr >> 28) & 0xf);
   59715                     unsigned rn = (instr >> 16) & 0xf;
   59716                     unsigned rm = instr & 0xf;
   59717                     ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
   59718                                                         (instr >> 7) & 0x1f);
   59719                     // CMN{<c>}{<q>} <Rn>, <Rm> {, <shift> #<amount> } ; A1
   59720                     cmn(condition,
   59721                         Best,
   59722                         Register(rn),
   59723                         Operand(Register(rm),
   59724                                 shift_operand.GetType(),
   59725                                 shift_operand.GetAmount()));
   59726                     if (((instr & 0xff0f010) != 0x1700000)) {
   59727                       UnpredictableA32(instr);
   59728                     }
   59729                     break;
   59730                   }
   59731                 }
   59732                 break;
   59733               }
   59734               case 0x01800000: {
   59735                 // 0x01900000
   59736                 switch (instr & 0x00000fe0) {
   59737                   case 0x00000060: {
   59738                     // 0x01900060
   59739                     if (((instr & 0xf0000000) == 0xf0000000)) {
   59740                       UnallocatedA32(instr);
   59741                       return;
   59742                     }
   59743                     Condition condition((instr >> 28) & 0xf);
   59744                     unsigned rd = (instr >> 12) & 0xf;
   59745                     unsigned rn = (instr >> 16) & 0xf;
   59746                     unsigned rm = instr & 0xf;
   59747                     // ORRS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
   59748                     orrs(condition,
   59749                          Best,
   59750                          Register(rd),
   59751                          Register(rn),
   59752                          Operand(Register(rm), RRX));
   59753                     break;
   59754                   }
   59755                   default: {
   59756                     if (((instr & 0xf0000000) == 0xf0000000) ||
   59757                         ((instr & 0xfe0) == 0x60)) {
   59758                       UnallocatedA32(instr);
   59759                       return;
   59760                     }
   59761                     Condition condition((instr >> 28) & 0xf);
   59762                     unsigned rd = (instr >> 12) & 0xf;
   59763                     unsigned rn = (instr >> 16) & 0xf;
   59764                     unsigned rm = instr & 0xf;
   59765                     ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
   59766                                                         (instr >> 7) & 0x1f);
   59767                     // ORRS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
   59768                     orrs(condition,
   59769                          Best,
   59770                          Register(rd),
   59771                          Register(rn),
   59772                          Operand(Register(rm),
   59773                                  shift_operand.GetType(),
   59774                                  shift_operand.GetAmount()));
   59775                     break;
   59776                   }
   59777                 }
   59778                 break;
   59779               }
   59780               case 0x01a00000: {
   59781                 // 0x01b00000
   59782                 switch (instr & 0x00000fe0) {
   59783                   case 0x00000060: {
   59784                     // 0x01b00060
   59785                     if (((instr & 0xf0000000) == 0xf0000000)) {
   59786                       UnallocatedA32(instr);
   59787                       return;
   59788                     }
   59789                     if (((instr & 0xf0000000) != 0xf0000000)) {
   59790                       Condition condition((instr >> 28) & 0xf);
   59791                       unsigned rd = (instr >> 12) & 0xf;
   59792                       unsigned rm = instr & 0xf;
   59793                       // RRXS{<c>}{<q>} {<Rd>}, <Rm> ; A1
   59794                       rrxs(condition, Register(rd), Register(rm));
   59795                       if (((instr & 0xfff0ff0) != 0x1b00060)) {
   59796                         UnpredictableA32(instr);
   59797                       }
   59798                       return;
   59799                     }
   59800                     Condition condition((instr >> 28) & 0xf);
   59801                     unsigned rd = (instr >> 12) & 0xf;
   59802                     unsigned rm = instr & 0xf;
   59803                     // MOVS{<c>}{<q>} <Rd>, <Rm>, RRX ; A1
   59804                     movs(condition,
   59805                          Best,
   59806                          Register(rd),
   59807                          Operand(Register(rm), RRX));
   59808                     if (((instr & 0xfff0ff0) != 0x1b00060)) {
   59809                       UnpredictableA32(instr);
   59810                     }
   59811                     break;
   59812                   }
   59813                   default: {
   59814                     if (((instr & 0xf0000000) == 0xf0000000) ||
   59815                         ((instr & 0xfe0) == 0x60)) {
   59816                       UnallocatedA32(instr);
   59817                       return;
   59818                     }
   59819                     if (((Uint32((instr >> 5)) & Uint32(0x3)) == Uint32(0x2)) &&
   59820                         ((instr & 0xf0000000) != 0xf0000000)) {
   59821                       Condition condition((instr >> 28) & 0xf);
   59822                       unsigned rd = (instr >> 12) & 0xf;
   59823                       unsigned rm = instr & 0xf;
   59824                       uint32_t amount = (instr >> 7) & 0x1f;
   59825                       if (amount == 0) amount = 32;
   59826                       // ASRS{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; A1
   59827                       asrs(condition, Best, Register(rd), Register(rm), amount);
   59828                       if (((instr & 0xfff0070) != 0x1b00040)) {
   59829                         UnpredictableA32(instr);
   59830                       }
   59831                       return;
   59832                     }
   59833                     if (((Uint32((instr >> 5)) & Uint32(0x3)) == Uint32(0x0)) &&
   59834                         ((instr & 0xf0000000) != 0xf0000000) &&
   59835                         ((instr & 0x00000f80) != 0x00000000)) {
   59836                       Condition condition((instr >> 28) & 0xf);
   59837                       unsigned rd = (instr >> 12) & 0xf;
   59838                       unsigned rm = instr & 0xf;
   59839                       uint32_t amount = (instr >> 7) & 0x1f;
   59840                       // LSLS{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; A1
   59841                       lsls(condition, Best, Register(rd), Register(rm), amount);
   59842                       if (((instr & 0xfff0070) != 0x1b00000)) {
   59843                         UnpredictableA32(instr);
   59844                       }
   59845                       return;
   59846                     }
   59847                     if (((Uint32((instr >> 5)) & Uint32(0x3)) == Uint32(0x1)) &&
   59848                         ((instr & 0xf0000000) != 0xf0000000)) {
   59849                       Condition condition((instr >> 28) & 0xf);
   59850                       unsigned rd = (instr >> 12) & 0xf;
   59851                       unsigned rm = instr & 0xf;
   59852                       uint32_t amount = (instr >> 7) & 0x1f;
   59853                       if (amount == 0) amount = 32;
   59854                       // LSRS{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; A1
   59855                       lsrs(condition, Best, Register(rd), Register(rm), amount);
   59856                       if (((instr & 0xfff0070) != 0x1b00020)) {
   59857                         UnpredictableA32(instr);
   59858                       }
   59859                       return;
   59860                     }
   59861                     if (((Uint32((instr >> 5)) & Uint32(0x3)) == Uint32(0x3)) &&
   59862                         ((instr & 0xf0000000) != 0xf0000000) &&
   59863                         ((instr & 0x00000f80) != 0x00000000)) {
   59864                       Condition condition((instr >> 28) & 0xf);
   59865                       unsigned rd = (instr >> 12) & 0xf;
   59866                       unsigned rm = instr & 0xf;
   59867                       uint32_t amount = (instr >> 7) & 0x1f;
   59868                       // RORS{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; A1
   59869                       rors(condition, Best, Register(rd), Register(rm), amount);
   59870                       if (((instr & 0xfff0070) != 0x1b00060)) {
   59871                         UnpredictableA32(instr);
   59872                       }
   59873                       return;
   59874                     }
   59875                     Condition condition((instr >> 28) & 0xf);
   59876                     unsigned rd = (instr >> 12) & 0xf;
   59877                     unsigned rm = instr & 0xf;
   59878                     ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
   59879                                                         (instr >> 7) & 0x1f);
   59880                     // MOVS{<c>}{<q>} <Rd>, <Rm> {, <shift> #<amount> } ; A1
   59881                     movs(condition,
   59882                          Best,
   59883                          Register(rd),
   59884                          Operand(Register(rm),
   59885                                  shift_operand.GetType(),
   59886                                  shift_operand.GetAmount()));
   59887                     if (((instr & 0xfff0010) != 0x1b00000)) {
   59888                       UnpredictableA32(instr);
   59889                     }
   59890                     break;
   59891                   }
   59892                 }
   59893                 break;
   59894               }
   59895               case 0x01c00000: {
   59896                 // 0x01d00000
   59897                 switch (instr & 0x00000fe0) {
   59898                   case 0x00000060: {
   59899                     // 0x01d00060
   59900                     if (((instr & 0xf0000000) == 0xf0000000)) {
   59901                       UnallocatedA32(instr);
   59902                       return;
   59903                     }
   59904                     Condition condition((instr >> 28) & 0xf);
   59905                     unsigned rd = (instr >> 12) & 0xf;
   59906                     unsigned rn = (instr >> 16) & 0xf;
   59907                     unsigned rm = instr & 0xf;
   59908                     // BICS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
   59909                     bics(condition,
   59910                          Best,
   59911                          Register(rd),
   59912                          Register(rn),
   59913                          Operand(Register(rm), RRX));
   59914                     break;
   59915                   }
   59916                   default: {
   59917                     if (((instr & 0xf0000000) == 0xf0000000) ||
   59918                         ((instr & 0xfe0) == 0x60)) {
   59919                       UnallocatedA32(instr);
   59920                       return;
   59921                     }
   59922                     Condition condition((instr >> 28) & 0xf);
   59923                     unsigned rd = (instr >> 12) & 0xf;
   59924                     unsigned rn = (instr >> 16) & 0xf;
   59925                     unsigned rm = instr & 0xf;
   59926                     ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
   59927                                                         (instr >> 7) & 0x1f);
   59928                     // BICS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
   59929                     bics(condition,
   59930                          Best,
   59931                          Register(rd),
   59932                          Register(rn),
   59933                          Operand(Register(rm),
   59934                                  shift_operand.GetType(),
   59935                                  shift_operand.GetAmount()));
   59936                     break;
   59937                   }
   59938                 }
   59939                 break;
   59940               }
   59941               case 0x01e00000: {
   59942                 // 0x01f00000
   59943                 switch (instr & 0x00000fe0) {
   59944                   case 0x00000060: {
   59945                     // 0x01f00060
   59946                     if (((instr & 0xf0000000) == 0xf0000000)) {
   59947                       UnallocatedA32(instr);
   59948                       return;
   59949                     }
   59950                     Condition condition((instr >> 28) & 0xf);
   59951                     unsigned rd = (instr >> 12) & 0xf;
   59952                     unsigned rm = instr & 0xf;
   59953                     // MVNS{<c>}{<q>} <Rd>, <Rm>, RRX ; A1
   59954                     mvns(condition,
   59955                          Best,
   59956                          Register(rd),
   59957                          Operand(Register(rm), RRX));
   59958                     if (((instr & 0xfff0ff0) != 0x1f00060)) {
   59959                       UnpredictableA32(instr);
   59960                     }
   59961                     break;
   59962                   }
   59963                   default: {
   59964                     if (((instr & 0xf0000000) == 0xf0000000) ||
   59965                         ((instr & 0xfe0) == 0x60)) {
   59966                       UnallocatedA32(instr);
   59967                       return;
   59968                     }
   59969                     Condition condition((instr >> 28) & 0xf);
   59970                     unsigned rd = (instr >> 12) & 0xf;
   59971                     unsigned rm = instr & 0xf;
   59972                     ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
   59973                                                         (instr >> 7) & 0x1f);
   59974                     // MVNS{<c>}{<q>} <Rd>, <Rm> {, <shift> #<amount> } ; A1
   59975                     mvns(condition,
   59976                          Best,
   59977                          Register(rd),
   59978                          Operand(Register(rm),
   59979                                  shift_operand.GetType(),
   59980                                  shift_operand.GetAmount()));
   59981                     if (((instr & 0xfff0010) != 0x1f00000)) {
   59982                       UnpredictableA32(instr);
   59983                     }
   59984                     break;
   59985                   }
   59986                 }
   59987                 break;
   59988               }
   59989             }
   59990             break;
   59991           }
   59992           case 0x00100010: {
   59993             // 0x00100010
   59994             switch (instr & 0x00400080) {
   59995               case 0x00000000: {
   59996                 // 0x00100010
   59997                 switch (instr & 0x01a00000) {
   59998                   case 0x00000000: {
   59999                     // 0x00100010
   60000                     if (((instr & 0xf0000000) == 0xf0000000)) {
   60001                       UnallocatedA32(instr);
   60002                       return;
   60003                     }
   60004                     Condition condition((instr >> 28) & 0xf);
   60005                     unsigned rd = (instr >> 12) & 0xf;
   60006                     unsigned rn = (instr >> 16) & 0xf;
   60007                     unsigned rm = instr & 0xf;
   60008                     Shift shift((instr >> 5) & 0x3);
   60009                     unsigned rs = (instr >> 8) & 0xf;
   60010                     // ANDS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
   60011                     ands(condition,
   60012                          Best,
   60013                          Register(rd),
   60014                          Register(rn),
   60015                          Operand(Register(rm), shift.GetType(), Register(rs)));
   60016                     break;
   60017                   }
   60018                   case 0x00200000: {
   60019                     // 0x00300010
   60020                     if (((instr & 0xf0000000) == 0xf0000000)) {
   60021                       UnallocatedA32(instr);
   60022                       return;
   60023                     }
   60024                     Condition condition((instr >> 28) & 0xf);
   60025                     unsigned rd = (instr >> 12) & 0xf;
   60026                     unsigned rn = (instr >> 16) & 0xf;
   60027                     unsigned rm = instr & 0xf;
   60028                     Shift shift((instr >> 5) & 0x3);
   60029                     unsigned rs = (instr >> 8) & 0xf;
   60030                     // EORS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
   60031                     eors(condition,
   60032                          Best,
   60033                          Register(rd),
   60034                          Register(rn),
   60035                          Operand(Register(rm), shift.GetType(), Register(rs)));
   60036                     break;
   60037                   }
   60038                   case 0x00800000: {
   60039                     // 0x00900010
   60040                     if (((instr & 0xf0000000) == 0xf0000000)) {
   60041                       UnallocatedA32(instr);
   60042                       return;
   60043                     }
   60044                     Condition condition((instr >> 28) & 0xf);
   60045                     unsigned rd = (instr >> 12) & 0xf;
   60046                     unsigned rn = (instr >> 16) & 0xf;
   60047                     unsigned rm = instr & 0xf;
   60048                     Shift shift((instr >> 5) & 0x3);
   60049                     unsigned rs = (instr >> 8) & 0xf;
   60050                     // ADDS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
   60051                     adds(condition,
   60052                          Best,
   60053                          Register(rd),
   60054                          Register(rn),
   60055                          Operand(Register(rm), shift.GetType(), Register(rs)));
   60056                     break;
   60057                   }
   60058                   case 0x00a00000: {
   60059                     // 0x00b00010
   60060                     if (((instr & 0xf0000000) == 0xf0000000)) {
   60061                       UnallocatedA32(instr);
   60062                       return;
   60063                     }
   60064                     Condition condition((instr >> 28) & 0xf);
   60065                     unsigned rd = (instr >> 12) & 0xf;
   60066                     unsigned rn = (instr >> 16) & 0xf;
   60067                     unsigned rm = instr & 0xf;
   60068                     Shift shift((instr >> 5) & 0x3);
   60069                     unsigned rs = (instr >> 8) & 0xf;
   60070                     // ADCS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
   60071                     adcs(condition,
   60072                          Best,
   60073                          Register(rd),
   60074                          Register(rn),
   60075                          Operand(Register(rm), shift.GetType(), Register(rs)));
   60076                     break;
   60077                   }
   60078                   case 0x01000000: {
   60079                     // 0x01100010
   60080                     if (((instr & 0xf0000000) == 0xf0000000)) {
   60081                       UnallocatedA32(instr);
   60082                       return;
   60083                     }
   60084                     Condition condition((instr >> 28) & 0xf);
   60085                     unsigned rn = (instr >> 16) & 0xf;
   60086                     unsigned rm = instr & 0xf;
   60087                     Shift shift((instr >> 5) & 0x3);
   60088                     unsigned rs = (instr >> 8) & 0xf;
   60089                     // TST{<c>}{<q>} <Rn>, <Rm>, <shift> <Rs> ; A1
   60090                     tst(condition,
   60091                         Best,
   60092                         Register(rn),
   60093                         Operand(Register(rm), shift.GetType(), Register(rs)));
   60094                     if (((instr & 0xff0f090) != 0x1100010)) {
   60095                       UnpredictableA32(instr);
   60096                     }
   60097                     break;
   60098                   }
   60099                   case 0x01200000: {
   60100                     // 0x01300010
   60101                     if (((instr & 0xf0000000) == 0xf0000000)) {
   60102                       UnallocatedA32(instr);
   60103                       return;
   60104                     }
   60105                     Condition condition((instr >> 28) & 0xf);
   60106                     unsigned rn = (instr >> 16) & 0xf;
   60107                     unsigned rm = instr & 0xf;
   60108                     Shift shift((instr >> 5) & 0x3);
   60109                     unsigned rs = (instr >> 8) & 0xf;
   60110                     // TEQ{<c>}{<q>} <Rn>, <Rm>, <shift> <Rs> ; A1
   60111                     teq(condition,
   60112                         Register(rn),
   60113                         Operand(Register(rm), shift.GetType(), Register(rs)));
   60114                     if (((instr & 0xff0f090) != 0x1300010)) {
   60115                       UnpredictableA32(instr);
   60116                     }
   60117                     break;
   60118                   }
   60119                   case 0x01800000: {
   60120                     // 0x01900010
   60121                     if (((instr & 0xf0000000) == 0xf0000000)) {
   60122                       UnallocatedA32(instr);
   60123                       return;
   60124                     }
   60125                     Condition condition((instr >> 28) & 0xf);
   60126                     unsigned rd = (instr >> 12) & 0xf;
   60127                     unsigned rn = (instr >> 16) & 0xf;
   60128                     unsigned rm = instr & 0xf;
   60129                     Shift shift((instr >> 5) & 0x3);
   60130                     unsigned rs = (instr >> 8) & 0xf;
   60131                     // ORRS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
   60132                     orrs(condition,
   60133                          Best,
   60134                          Register(rd),
   60135                          Register(rn),
   60136                          Operand(Register(rm), shift.GetType(), Register(rs)));
   60137                     break;
   60138                   }
   60139                   case 0x01a00000: {
   60140                     // 0x01b00010
   60141                     if (((instr & 0xf0000000) == 0xf0000000)) {
   60142                       UnallocatedA32(instr);
   60143                       return;
   60144                     }
   60145                     if (((Uint32((instr >> 5)) & Uint32(0x3)) == Uint32(0x2)) &&
   60146                         ((instr & 0xf0000000) != 0xf0000000)) {
   60147                       Condition condition((instr >> 28) & 0xf);
   60148                       unsigned rd = (instr >> 12) & 0xf;
   60149                       unsigned rm = instr & 0xf;
   60150                       unsigned rs = (instr >> 8) & 0xf;
   60151                       // ASRS{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; A1
   60152                       asrs(condition,
   60153                            Best,
   60154                            Register(rd),
   60155                            Register(rm),
   60156                            Register(rs));
   60157                       if (((instr & 0xfff00f0) != 0x1b00050)) {
   60158                         UnpredictableA32(instr);
   60159                       }
   60160                       return;
   60161                     }
   60162                     if (((Uint32((instr >> 5)) & Uint32(0x3)) == Uint32(0x0)) &&
   60163                         ((instr & 0xf0000000) != 0xf0000000)) {
   60164                       Condition condition((instr >> 28) & 0xf);
   60165                       unsigned rd = (instr >> 12) & 0xf;
   60166                       unsigned rm = instr & 0xf;
   60167                       unsigned rs = (instr >> 8) & 0xf;
   60168                       // LSLS{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; A1
   60169                       lsls(condition,
   60170                            Best,
   60171                            Register(rd),
   60172                            Register(rm),
   60173                            Register(rs));
   60174                       if (((instr & 0xfff00f0) != 0x1b00010)) {
   60175                         UnpredictableA32(instr);
   60176                       }
   60177                       return;
   60178                     }
   60179                     if (((Uint32((instr >> 5)) & Uint32(0x3)) == Uint32(0x1)) &&
   60180                         ((instr & 0xf0000000) != 0xf0000000)) {
   60181                       Condition condition((instr >> 28) & 0xf);
   60182                       unsigned rd = (instr >> 12) & 0xf;
   60183                       unsigned rm = instr & 0xf;
   60184                       unsigned rs = (instr >> 8) & 0xf;
   60185                       // LSRS{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; A1
   60186                       lsrs(condition,
   60187                            Best,
   60188                            Register(rd),
   60189                            Register(rm),
   60190                            Register(rs));
   60191                       if (((instr & 0xfff00f0) != 0x1b00030)) {
   60192                         UnpredictableA32(instr);
   60193                       }
   60194                       return;
   60195                     }
   60196                     if (((Uint32((instr >> 5)) & Uint32(0x3)) == Uint32(0x3)) &&
   60197                         ((instr & 0xf0000000) != 0xf0000000)) {
   60198                       Condition condition((instr >> 28) & 0xf);
   60199                       unsigned rd = (instr >> 12) & 0xf;
   60200                       unsigned rm = instr & 0xf;
   60201                       unsigned rs = (instr >> 8) & 0xf;
   60202                       // RORS{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; A1
   60203                       rors(condition,
   60204                            Best,
   60205                            Register(rd),
   60206                            Register(rm),
   60207                            Register(rs));
   60208                       if (((instr & 0xfff00f0) != 0x1b00070)) {
   60209                         UnpredictableA32(instr);
   60210                       }
   60211                       return;
   60212                     }
   60213                     Condition condition((instr >> 28) & 0xf);
   60214                     unsigned rd = (instr >> 12) & 0xf;
   60215                     unsigned rm = instr & 0xf;
   60216                     Shift shift((instr >> 5) & 0x3);
   60217                     unsigned rs = (instr >> 8) & 0xf;
   60218                     // MOVS{<c>}{<q>} <Rd>, <Rm>, <shift> <Rs> ; A1
   60219                     movs(condition,
   60220                          Best,
   60221                          Register(rd),
   60222                          Operand(Register(rm), shift.GetType(), Register(rs)));
   60223                     if (((instr & 0xfff0090) != 0x1b00010)) {
   60224                       UnpredictableA32(instr);
   60225                     }
   60226                     break;
   60227                   }
   60228                 }
   60229                 break;
   60230               }
   60231               case 0x00000080: {
   60232                 // 0x00100090
   60233                 switch (instr & 0x01200060) {
   60234                   case 0x00000000: {
   60235                     // 0x00100090
   60236                     switch (instr & 0x00800000) {
   60237                       case 0x00000000: {
   60238                         // 0x00100090
   60239                         if (((instr & 0xf0000000) == 0xf0000000)) {
   60240                           UnallocatedA32(instr);
   60241                           return;
   60242                         }
   60243                         Condition condition((instr >> 28) & 0xf);
   60244                         unsigned rd = (instr >> 16) & 0xf;
   60245                         unsigned rn = instr & 0xf;
   60246                         unsigned rm = (instr >> 8) & 0xf;
   60247                         // MULS{<c>}{<q>} <Rd>, <Rn>, {<Rm>} ; A1
   60248                         muls(condition,
   60249                              Register(rd),
   60250                              Register(rn),
   60251                              Register(rm));
   60252                         if (((instr & 0xff0f0f0) != 0x100090)) {
   60253                           UnpredictableA32(instr);
   60254                         }
   60255                         break;
   60256                       }
   60257                       case 0x00800000: {
   60258                         // 0x00900090
   60259                         if (((instr & 0xf0000000) == 0xf0000000)) {
   60260                           UnallocatedA32(instr);
   60261                           return;
   60262                         }
   60263                         Condition condition((instr >> 28) & 0xf);
   60264                         unsigned rdlo = (instr >> 12) & 0xf;
   60265                         unsigned rdhi = (instr >> 16) & 0xf;
   60266                         unsigned rn = instr & 0xf;
   60267                         unsigned rm = (instr >> 8) & 0xf;
   60268                         // UMULLS{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
   60269                         umulls(condition,
   60270                                Register(rdlo),
   60271                                Register(rdhi),
   60272                                Register(rn),
   60273                                Register(rm));
   60274                         break;
   60275                       }
   60276                     }
   60277                     break;
   60278                   }
   60279                   case 0x00000020: {
   60280                     // 0x001000b0
   60281                     if (((instr & 0xf0000000) == 0xf0000000)) {
   60282                       UnallocatedA32(instr);
   60283                       return;
   60284                     }
   60285                     Condition condition((instr >> 28) & 0xf);
   60286                     unsigned rt = (instr >> 12) & 0xf;
   60287                     unsigned rn = (instr >> 16) & 0xf;
   60288                     Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
   60289                     unsigned rm = instr & 0xf;
   60290                     // LDRH{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<Rm> ; A1
   60291                     ldrh(condition,
   60292                          Best,
   60293                          Register(rt),
   60294                          MemOperand(Register(rn),
   60295                                     sign,
   60296                                     Register(rm),
   60297                                     PostIndex));
   60298                     if (((instr & 0xf700ff0) != 0x1000b0)) {
   60299                       UnpredictableA32(instr);
   60300                     }
   60301                     break;
   60302                   }
   60303                   case 0x00000040: {
   60304                     // 0x001000d0
   60305                     if (((instr & 0xf0000000) == 0xf0000000)) {
   60306                       UnallocatedA32(instr);
   60307                       return;
   60308                     }
   60309                     Condition condition((instr >> 28) & 0xf);
   60310                     unsigned rt = (instr >> 12) & 0xf;
   60311                     unsigned rn = (instr >> 16) & 0xf;
   60312                     Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
   60313                     unsigned rm = instr & 0xf;
   60314                     // LDRSB{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<Rm> ; A1
   60315                     ldrsb(condition,
   60316                           Best,
   60317                           Register(rt),
   60318                           MemOperand(Register(rn),
   60319                                      sign,
   60320                                      Register(rm),
   60321                                      PostIndex));
   60322                     if (((instr & 0xf700ff0) != 0x1000d0)) {
   60323                       UnpredictableA32(instr);
   60324                     }
   60325                     break;
   60326                   }
   60327                   case 0x00000060: {
   60328                     // 0x001000f0
   60329                     if (((instr & 0xf0000000) == 0xf0000000)) {
   60330                       UnallocatedA32(instr);
   60331                       return;
   60332                     }
   60333                     Condition condition((instr >> 28) & 0xf);
   60334                     unsigned rt = (instr >> 12) & 0xf;
   60335                     unsigned rn = (instr >> 16) & 0xf;
   60336                     Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
   60337                     unsigned rm = instr & 0xf;
   60338                     // LDRSH{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<Rm> ; A1
   60339                     ldrsh(condition,
   60340                           Best,
   60341                           Register(rt),
   60342                           MemOperand(Register(rn),
   60343                                      sign,
   60344                                      Register(rm),
   60345                                      PostIndex));
   60346                     if (((instr & 0xf700ff0) != 0x1000f0)) {
   60347                       UnpredictableA32(instr);
   60348                     }
   60349                     break;
   60350                   }
   60351                   case 0x00200000: {
   60352                     // 0x00300090
   60353                     switch (instr & 0x00800000) {
   60354                       case 0x00000000: {
   60355                         // 0x00300090
   60356                         if (((instr & 0xf0000000) == 0xf0000000)) {
   60357                           UnallocatedA32(instr);
   60358                           return;
   60359                         }
   60360                         Condition condition((instr >> 28) & 0xf);
   60361                         unsigned rd = (instr >> 16) & 0xf;
   60362                         unsigned rn = instr & 0xf;
   60363                         unsigned rm = (instr >> 8) & 0xf;
   60364                         unsigned ra = (instr >> 12) & 0xf;
   60365                         // MLAS{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
   60366                         mlas(condition,
   60367                              Register(rd),
   60368                              Register(rn),
   60369                              Register(rm),
   60370                              Register(ra));
   60371                         break;
   60372                       }
   60373                       case 0x00800000: {
   60374                         // 0x00b00090
   60375                         if (((instr & 0xf0000000) == 0xf0000000)) {
   60376                           UnallocatedA32(instr);
   60377                           return;
   60378                         }
   60379                         Condition condition((instr >> 28) & 0xf);
   60380                         unsigned rdlo = (instr >> 12) & 0xf;
   60381                         unsigned rdhi = (instr >> 16) & 0xf;
   60382                         unsigned rn = instr & 0xf;
   60383                         unsigned rm = (instr >> 8) & 0xf;
   60384                         // UMLALS{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
   60385                         umlals(condition,
   60386                                Register(rdlo),
   60387                                Register(rdhi),
   60388                                Register(rn),
   60389                                Register(rm));
   60390                         break;
   60391                       }
   60392                     }
   60393                     break;
   60394                   }
   60395                   case 0x00200020: {
   60396                     // 0x003000b0
   60397                     if (((instr & 0xf0000000) == 0xf0000000)) {
   60398                       UnallocatedA32(instr);
   60399                       return;
   60400                     }
   60401                     UnimplementedA32("LDRHT", instr);
   60402                     break;
   60403                   }
   60404                   case 0x00200040: {
   60405                     // 0x003000d0
   60406                     if (((instr & 0xf0000000) == 0xf0000000)) {
   60407                       UnallocatedA32(instr);
   60408                       return;
   60409                     }
   60410                     UnimplementedA32("LDRSBT", instr);
   60411                     break;
   60412                   }
   60413                   case 0x00200060: {
   60414                     // 0x003000f0
   60415                     if (((instr & 0xf0000000) == 0xf0000000)) {
   60416                       UnallocatedA32(instr);
   60417                       return;
   60418                     }
   60419                     UnimplementedA32("LDRSHT", instr);
   60420                     break;
   60421                   }
   60422                   case 0x01000000: {
   60423                     // 0x01100090
   60424                     switch (instr & 0x00800300) {
   60425                       case 0x00800000: {
   60426                         // 0x01900090
   60427                         if (((instr & 0xf0000000) == 0xf0000000)) {
   60428                           UnallocatedA32(instr);
   60429                           return;
   60430                         }
   60431                         Condition condition((instr >> 28) & 0xf);
   60432                         unsigned rt = (instr >> 12) & 0xf;
   60433                         unsigned rn = (instr >> 16) & 0xf;
   60434                         // LDA{<c>}{<q>} <Rt>, [<Rn>] ; A1
   60435                         lda(condition,
   60436                             Register(rt),
   60437                             MemOperand(Register(rn), Offset));
   60438                         if (((instr & 0xff00fff) != 0x1900c9f)) {
   60439                           UnpredictableA32(instr);
   60440                         }
   60441                         break;
   60442                       }
   60443                       case 0x00800200: {
   60444                         // 0x01900290
   60445                         if (((instr & 0xf0000000) == 0xf0000000)) {
   60446                           UnallocatedA32(instr);
   60447                           return;
   60448                         }
   60449                         Condition condition((instr >> 28) & 0xf);
   60450                         unsigned rt = (instr >> 12) & 0xf;
   60451                         unsigned rn = (instr >> 16) & 0xf;
   60452                         // LDAEX{<c>}{<q>} <Rt>, [<Rn>] ; A1
   60453                         ldaex(condition,
   60454                               Register(rt),
   60455                               MemOperand(Register(rn), Offset));
   60456                         if (((instr & 0xff00fff) != 0x1900e9f)) {
   60457                           UnpredictableA32(instr);
   60458                         }
   60459                         break;
   60460                       }
   60461                       case 0x00800300: {
   60462                         // 0x01900390
   60463                         if (((instr & 0xf0000000) == 0xf0000000)) {
   60464                           UnallocatedA32(instr);
   60465                           return;
   60466                         }
   60467                         Condition condition((instr >> 28) & 0xf);
   60468                         unsigned rt = (instr >> 12) & 0xf;
   60469                         unsigned rn = (instr >> 16) & 0xf;
   60470                         // LDREX{<c>}{<q>} <Rt>, [<Rn>{, #<imm_1>}] ; A1
   60471                         ldrex(condition,
   60472                               Register(rt),
   60473                               MemOperand(Register(rn), plus, 0, Offset));
   60474                         if (((instr & 0xff00fff) != 0x1900f9f)) {
   60475                           UnpredictableA32(instr);
   60476                         }
   60477                         break;
   60478                       }
   60479                       default:
   60480                         UnallocatedA32(instr);
   60481                         break;
   60482                     }
   60483                     break;
   60484                   }
   60485                   case 0x01000020: {
   60486                     // 0x011000b0
   60487                     if (((instr & 0xf0000000) == 0xf0000000)) {
   60488                       UnallocatedA32(instr);
   60489                       return;
   60490                     }
   60491                     Condition condition((instr >> 28) & 0xf);
   60492                     unsigned rt = (instr >> 12) & 0xf;
   60493                     unsigned rn = (instr >> 16) & 0xf;
   60494                     Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
   60495                     unsigned rm = instr & 0xf;
   60496                     AddrMode addrmode = Offset;
   60497                     // LDRH{<c>}{<q>} <Rt>, [<Rn>, #{+/-}<Rm>] ; A1
   60498                     ldrh(condition,
   60499                          Best,
   60500                          Register(rt),
   60501                          MemOperand(Register(rn),
   60502                                     sign,
   60503                                     Register(rm),
   60504                                     addrmode));
   60505                     if (((instr & 0xf700ff0) != 0x11000b0)) {
   60506                       UnpredictableA32(instr);
   60507                     }
   60508                     break;
   60509                   }
   60510                   case 0x01000040: {
   60511                     // 0x011000d0
   60512                     if (((instr & 0xf0000000) == 0xf0000000)) {
   60513                       UnallocatedA32(instr);
   60514                       return;
   60515                     }
   60516                     Condition condition((instr >> 28) & 0xf);
   60517                     unsigned rt = (instr >> 12) & 0xf;
   60518                     unsigned rn = (instr >> 16) & 0xf;
   60519                     Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
   60520                     unsigned rm = instr & 0xf;
   60521                     AddrMode addrmode = Offset;
   60522                     // LDRSB{<c>}{<q>} <Rt>, [<Rn>, #{+/-}<Rm>] ; A1
   60523                     ldrsb(condition,
   60524                           Best,
   60525                           Register(rt),
   60526                           MemOperand(Register(rn),
   60527                                      sign,
   60528                                      Register(rm),
   60529                                      addrmode));
   60530                     if (((instr & 0xf700ff0) != 0x11000d0)) {
   60531                       UnpredictableA32(instr);
   60532                     }
   60533                     break;
   60534                   }
   60535                   case 0x01000060: {
   60536                     // 0x011000f0
   60537                     if (((instr & 0xf0000000) == 0xf0000000)) {
   60538                       UnallocatedA32(instr);
   60539                       return;
   60540                     }
   60541                     Condition condition((instr >> 28) & 0xf);
   60542                     unsigned rt = (instr >> 12) & 0xf;
   60543                     unsigned rn = (instr >> 16) & 0xf;
   60544                     Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
   60545                     unsigned rm = instr & 0xf;
   60546                     AddrMode addrmode = Offset;
   60547                     // LDRSH{<c>}{<q>} <Rt>, [<Rn>, #{+/-}<Rm>] ; A1
   60548                     ldrsh(condition,
   60549                           Best,
   60550                           Register(rt),
   60551                           MemOperand(Register(rn),
   60552                                      sign,
   60553                                      Register(rm),
   60554                                      addrmode));
   60555                     if (((instr & 0xf700ff0) != 0x11000f0)) {
   60556                       UnpredictableA32(instr);
   60557                     }
   60558                     break;
   60559                   }
   60560                   case 0x01200000: {
   60561                     // 0x01300090
   60562                     switch (instr & 0x00800300) {
   60563                       case 0x00800200: {
   60564                         // 0x01b00290
   60565                         if (((instr & 0xf0000000) == 0xf0000000)) {
   60566                           UnallocatedA32(instr);
   60567                           return;
   60568                         }
   60569                         Condition condition((instr >> 28) & 0xf);
   60570                         unsigned rt = (instr >> 12) & 0xf;
   60571                         unsigned rn = (instr >> 16) & 0xf;
   60572                         // LDAEXD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>] ; A1
   60573                         ldaexd(condition,
   60574                                Register(rt),
   60575                                Register(rt + 1),
   60576                                MemOperand(Register(rn), Offset));
   60577                         if (((instr & 0xff00fff) != 0x1b00e9f)) {
   60578                           UnpredictableA32(instr);
   60579                         }
   60580                         break;
   60581                       }
   60582                       case 0x00800300: {
   60583                         // 0x01b00390
   60584                         if (((instr & 0xf0000000) == 0xf0000000)) {
   60585                           UnallocatedA32(instr);
   60586                           return;
   60587                         }
   60588                         Condition condition((instr >> 28) & 0xf);
   60589                         unsigned rt = (instr >> 12) & 0xf;
   60590                         unsigned rn = (instr >> 16) & 0xf;
   60591                         // LDREXD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>] ; A1
   60592                         ldrexd(condition,
   60593                                Register(rt),
   60594                                Register(rt + 1),
   60595                                MemOperand(Register(rn), Offset));
   60596                         if (((instr & 0xff00fff) != 0x1b00f9f)) {
   60597                           UnpredictableA32(instr);
   60598                         }
   60599                         break;
   60600                       }
   60601                       default:
   60602                         UnallocatedA32(instr);
   60603                         break;
   60604                     }
   60605                     break;
   60606                   }
   60607                   case 0x01200020: {
   60608                     // 0x013000b0
   60609                     if (((instr & 0xf0000000) == 0xf0000000)) {
   60610                       UnallocatedA32(instr);
   60611                       return;
   60612                     }
   60613                     Condition condition((instr >> 28) & 0xf);
   60614                     unsigned rt = (instr >> 12) & 0xf;
   60615                     unsigned rn = (instr >> 16) & 0xf;
   60616                     Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
   60617                     unsigned rm = instr & 0xf;
   60618                     AddrMode addrmode = PreIndex;
   60619                     // LDRH{<c>}{<q>} <Rt>, [<Rn>, #{+/-}<Rm>]! ; A1
   60620                     ldrh(condition,
   60621                          Best,
   60622                          Register(rt),
   60623                          MemOperand(Register(rn),
   60624                                     sign,
   60625                                     Register(rm),
   60626                                     addrmode));
   60627                     if (((instr & 0xf700ff0) != 0x13000b0)) {
   60628                       UnpredictableA32(instr);
   60629                     }
   60630                     break;
   60631                   }
   60632                   case 0x01200040: {
   60633                     // 0x013000d0
   60634                     if (((instr & 0xf0000000) == 0xf0000000)) {
   60635                       UnallocatedA32(instr);
   60636                       return;
   60637                     }
   60638                     Condition condition((instr >> 28) & 0xf);
   60639                     unsigned rt = (instr >> 12) & 0xf;
   60640                     unsigned rn = (instr >> 16) & 0xf;
   60641                     Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
   60642                     unsigned rm = instr & 0xf;
   60643                     AddrMode addrmode = PreIndex;
   60644                     // LDRSB{<c>}{<q>} <Rt>, [<Rn>, #{+/-}<Rm>]! ; A1
   60645                     ldrsb(condition,
   60646                           Best,
   60647                           Register(rt),
   60648                           MemOperand(Register(rn),
   60649                                      sign,
   60650                                      Register(rm),
   60651                                      addrmode));
   60652                     if (((instr & 0xf700ff0) != 0x13000d0)) {
   60653                       UnpredictableA32(instr);
   60654                     }
   60655                     break;
   60656                   }
   60657                   case 0x01200060: {
   60658                     // 0x013000f0
   60659                     if (((instr & 0xf0000000) == 0xf0000000)) {
   60660                       UnallocatedA32(instr);
   60661                       return;
   60662                     }
   60663                     Condition condition((instr >> 28) & 0xf);
   60664                     unsigned rt = (instr >> 12) & 0xf;
   60665                     unsigned rn = (instr >> 16) & 0xf;
   60666                     Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
   60667                     unsigned rm = instr & 0xf;
   60668                     AddrMode addrmode = PreIndex;
   60669                     // LDRSH{<c>}{<q>} <Rt>, [<Rn>, #{+/-}<Rm>]! ; A1
   60670                     ldrsh(condition,
   60671                           Best,
   60672                           Register(rt),
   60673                           MemOperand(Register(rn),
   60674                                      sign,
   60675                                      Register(rm),
   60676                                      addrmode));
   60677                     if (((instr & 0xf700ff0) != 0x13000f0)) {
   60678                       UnpredictableA32(instr);
   60679                     }
   60680                     break;
   60681                   }
   60682                 }
   60683                 break;
   60684               }
   60685               case 0x00400000: {
   60686                 // 0x00500010
   60687                 switch (instr & 0x01a00000) {
   60688                   case 0x00000000: {
   60689                     // 0x00500010
   60690                     if (((instr & 0xf0000000) == 0xf0000000)) {
   60691                       UnallocatedA32(instr);
   60692                       return;
   60693                     }
   60694                     Condition condition((instr >> 28) & 0xf);
   60695                     unsigned rd = (instr >> 12) & 0xf;
   60696                     unsigned rn = (instr >> 16) & 0xf;
   60697                     unsigned rm = instr & 0xf;
   60698                     Shift shift((instr >> 5) & 0x3);
   60699                     unsigned rs = (instr >> 8) & 0xf;
   60700                     // SUBS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
   60701                     subs(condition,
   60702                          Best,
   60703                          Register(rd),
   60704                          Register(rn),
   60705                          Operand(Register(rm), shift.GetType(), Register(rs)));
   60706                     break;
   60707                   }
   60708                   case 0x00200000: {
   60709                     // 0x00700010
   60710                     if (((instr & 0xf0000000) == 0xf0000000)) {
   60711                       UnallocatedA32(instr);
   60712                       return;
   60713                     }
   60714                     Condition condition((instr >> 28) & 0xf);
   60715                     unsigned rd = (instr >> 12) & 0xf;
   60716                     unsigned rn = (instr >> 16) & 0xf;
   60717                     unsigned rm = instr & 0xf;
   60718                     Shift shift((instr >> 5) & 0x3);
   60719                     unsigned rs = (instr >> 8) & 0xf;
   60720                     // RSBS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
   60721                     rsbs(condition,
   60722                          Best,
   60723                          Register(rd),
   60724                          Register(rn),
   60725                          Operand(Register(rm), shift.GetType(), Register(rs)));
   60726                     break;
   60727                   }
   60728                   case 0x00800000: {
   60729                     // 0x00d00010
   60730                     if (((instr & 0xf0000000) == 0xf0000000)) {
   60731                       UnallocatedA32(instr);
   60732                       return;
   60733                     }
   60734                     Condition condition((instr >> 28) & 0xf);
   60735                     unsigned rd = (instr >> 12) & 0xf;
   60736                     unsigned rn = (instr >> 16) & 0xf;
   60737                     unsigned rm = instr & 0xf;
   60738                     Shift shift((instr >> 5) & 0x3);
   60739                     unsigned rs = (instr >> 8) & 0xf;
   60740                     // SBCS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
   60741                     sbcs(condition,
   60742                          Best,
   60743                          Register(rd),
   60744                          Register(rn),
   60745                          Operand(Register(rm), shift.GetType(), Register(rs)));
   60746                     break;
   60747                   }
   60748                   case 0x00a00000: {
   60749                     // 0x00f00010
   60750                     if (((instr & 0xf0000000) == 0xf0000000)) {
   60751                       UnallocatedA32(instr);
   60752                       return;
   60753                     }
   60754                     Condition condition((instr >> 28) & 0xf);
   60755                     unsigned rd = (instr >> 12) & 0xf;
   60756                     unsigned rn = (instr >> 16) & 0xf;
   60757                     unsigned rm = instr & 0xf;
   60758                     Shift shift((instr >> 5) & 0x3);
   60759                     unsigned rs = (instr >> 8) & 0xf;
   60760                     // RSCS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
   60761                     rscs(condition,
   60762                          Register(rd),
   60763                          Register(rn),
   60764                          Operand(Register(rm), shift.GetType(), Register(rs)));
   60765                     break;
   60766                   }
   60767                   case 0x01000000: {
   60768                     // 0x01500010
   60769                     if (((instr & 0xf0000000) == 0xf0000000)) {
   60770                       UnallocatedA32(instr);
   60771                       return;
   60772                     }
   60773                     Condition condition((instr >> 28) & 0xf);
   60774                     unsigned rn = (instr >> 16) & 0xf;
   60775                     unsigned rm = instr & 0xf;
   60776                     Shift shift((instr >> 5) & 0x3);
   60777                     unsigned rs = (instr >> 8) & 0xf;
   60778                     // CMP{<c>}{<q>} <Rn>, <Rm>, <shift> <Rs> ; A1
   60779                     cmp(condition,
   60780                         Best,
   60781                         Register(rn),
   60782                         Operand(Register(rm), shift.GetType(), Register(rs)));
   60783                     if (((instr & 0xff0f090) != 0x1500010)) {
   60784                       UnpredictableA32(instr);
   60785                     }
   60786                     break;
   60787                   }
   60788                   case 0x01200000: {
   60789                     // 0x01700010
   60790                     if (((instr & 0xf0000000) == 0xf0000000)) {
   60791                       UnallocatedA32(instr);
   60792                       return;
   60793                     }
   60794                     Condition condition((instr >> 28) & 0xf);
   60795                     unsigned rn = (instr >> 16) & 0xf;
   60796                     unsigned rm = instr & 0xf;
   60797                     Shift shift((instr >> 5) & 0x3);
   60798                     unsigned rs = (instr >> 8) & 0xf;
   60799                     // CMN{<c>}{<q>} <Rn>, <Rm>, <shift> <Rs> ; A1
   60800                     cmn(condition,
   60801                         Best,
   60802                         Register(rn),
   60803                         Operand(Register(rm), shift.GetType(), Register(rs)));
   60804                     if (((instr & 0xff0f090) != 0x1700010)) {
   60805                       UnpredictableA32(instr);
   60806                     }
   60807                     break;
   60808                   }
   60809                   case 0x01800000: {
   60810                     // 0x01d00010
   60811                     if (((instr & 0xf0000000) == 0xf0000000)) {
   60812                       UnallocatedA32(instr);
   60813                       return;
   60814                     }
   60815                     Condition condition((instr >> 28) & 0xf);
   60816                     unsigned rd = (instr >> 12) & 0xf;
   60817                     unsigned rn = (instr >> 16) & 0xf;
   60818                     unsigned rm = instr & 0xf;
   60819                     Shift shift((instr >> 5) & 0x3);
   60820                     unsigned rs = (instr >> 8) & 0xf;
   60821                     // BICS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
   60822                     bics(condition,
   60823                          Best,
   60824                          Register(rd),
   60825                          Register(rn),
   60826                          Operand(Register(rm), shift.GetType(), Register(rs)));
   60827                     break;
   60828                   }
   60829                   case 0x01a00000: {
   60830                     // 0x01f00010
   60831                     if (((instr & 0xf0000000) == 0xf0000000)) {
   60832                       UnallocatedA32(instr);
   60833                       return;
   60834                     }
   60835                     Condition condition((instr >> 28) & 0xf);
   60836                     unsigned rd = (instr >> 12) & 0xf;
   60837                     unsigned rm = instr & 0xf;
   60838                     Shift shift((instr >> 5) & 0x3);
   60839                     unsigned rs = (instr >> 8) & 0xf;
   60840                     // MVNS{<c>}{<q>} <Rd>, <Rm>, <shift> <Rs> ; A1
   60841                     mvns(condition,
   60842                          Best,
   60843                          Register(rd),
   60844                          Operand(Register(rm), shift.GetType(), Register(rs)));
   60845                     if (((instr & 0xfff0090) != 0x1f00010)) {
   60846                       UnpredictableA32(instr);
   60847                     }
   60848                     break;
   60849                   }
   60850                 }
   60851                 break;
   60852               }
   60853               case 0x00400080: {
   60854                 // 0x00500090
   60855                 switch (instr & 0x00000060) {
   60856                   case 0x00000000: {
   60857                     // 0x00500090
   60858                     switch (instr & 0x01a00000) {
   60859                       case 0x00800000: {
   60860                         // 0x00d00090
   60861                         if (((instr & 0xf0000000) == 0xf0000000)) {
   60862                           UnallocatedA32(instr);
   60863                           return;
   60864                         }
   60865                         Condition condition((instr >> 28) & 0xf);
   60866                         unsigned rdlo = (instr >> 12) & 0xf;
   60867                         unsigned rdhi = (instr >> 16) & 0xf;
   60868                         unsigned rn = instr & 0xf;
   60869                         unsigned rm = (instr >> 8) & 0xf;
   60870                         // SMULLS{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
   60871                         smulls(condition,
   60872                                Register(rdlo),
   60873                                Register(rdhi),
   60874                                Register(rn),
   60875                                Register(rm));
   60876                         break;
   60877                       }
   60878                       case 0x00a00000: {
   60879                         // 0x00f00090
   60880                         if (((instr & 0xf0000000) == 0xf0000000)) {
   60881                           UnallocatedA32(instr);
   60882                           return;
   60883                         }
   60884                         Condition condition((instr >> 28) & 0xf);
   60885                         unsigned rdlo = (instr >> 12) & 0xf;
   60886                         unsigned rdhi = (instr >> 16) & 0xf;
   60887                         unsigned rn = instr & 0xf;
   60888                         unsigned rm = (instr >> 8) & 0xf;
   60889                         // SMLALS{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
   60890                         smlals(condition,
   60891                                Register(rdlo),
   60892                                Register(rdhi),
   60893                                Register(rn),
   60894                                Register(rm));
   60895                         break;
   60896                       }
   60897                       case 0x01800000: {
   60898                         // 0x01d00090
   60899                         switch (instr & 0x00000300) {
   60900                           case 0x00000000: {
   60901                             // 0x01d00090
   60902                             if (((instr & 0xf0000000) == 0xf0000000)) {
   60903                               UnallocatedA32(instr);
   60904                               return;
   60905                             }
   60906                             Condition condition((instr >> 28) & 0xf);
   60907                             unsigned rt = (instr >> 12) & 0xf;
   60908                             unsigned rn = (instr >> 16) & 0xf;
   60909                             // LDAB{<c>}{<q>} <Rt>, [<Rn>] ; A1
   60910                             ldab(condition,
   60911                                  Register(rt),
   60912                                  MemOperand(Register(rn), Offset));
   60913                             if (((instr & 0xff00fff) != 0x1d00c9f)) {
   60914                               UnpredictableA32(instr);
   60915                             }
   60916                             break;
   60917                           }
   60918                           case 0x00000200: {
   60919                             // 0x01d00290
   60920                             if (((instr & 0xf0000000) == 0xf0000000)) {
   60921                               UnallocatedA32(instr);
   60922                               return;
   60923                             }
   60924                             Condition condition((instr >> 28) & 0xf);
   60925                             unsigned rt = (instr >> 12) & 0xf;
   60926                             unsigned rn = (instr >> 16) & 0xf;
   60927                             // LDAEXB{<c>}{<q>} <Rt>, [<Rn>] ; A1
   60928                             ldaexb(condition,
   60929                                    Register(rt),
   60930                                    MemOperand(Register(rn), Offset));
   60931                             if (((instr & 0xff00fff) != 0x1d00e9f)) {
   60932                               UnpredictableA32(instr);
   60933                             }
   60934                             break;
   60935                           }
   60936                           case 0x00000300: {
   60937                             // 0x01d00390
   60938                             if (((instr & 0xf0000000) == 0xf0000000)) {
   60939                               UnallocatedA32(instr);
   60940                               return;
   60941                             }
   60942                             Condition condition((instr >> 28) & 0xf);
   60943                             unsigned rt = (instr >> 12) & 0xf;
   60944                             unsigned rn = (instr >> 16) & 0xf;
   60945                             // LDREXB{<c>}{<q>} <Rt>, [<Rn>] ; A1
   60946                             ldrexb(condition,
   60947                                    Register(rt),
   60948                                    MemOperand(Register(rn), Offset));
   60949                             if (((instr & 0xff00fff) != 0x1d00f9f)) {
   60950                               UnpredictableA32(instr);
   60951                             }
   60952                             break;
   60953                           }
   60954                           default:
   60955                             UnallocatedA32(instr);
   60956                             break;
   60957                         }
   60958                         break;
   60959                       }
   60960                       case 0x01a00000: {
   60961                         // 0x01f00090
   60962                         switch (instr & 0x00000300) {
   60963                           case 0x00000000: {
   60964                             // 0x01f00090
   60965                             if (((instr & 0xf0000000) == 0xf0000000)) {
   60966                               UnallocatedA32(instr);
   60967                               return;
   60968                             }
   60969                             Condition condition((instr >> 28) & 0xf);
   60970                             unsigned rt = (instr >> 12) & 0xf;
   60971                             unsigned rn = (instr >> 16) & 0xf;
   60972                             // LDAH{<c>}{<q>} <Rt>, [<Rn>] ; A1
   60973                             ldah(condition,
   60974                                  Register(rt),
   60975                                  MemOperand(Register(rn), Offset));
   60976                             if (((instr & 0xff00fff) != 0x1f00c9f)) {
   60977                               UnpredictableA32(instr);
   60978                             }
   60979                             break;
   60980                           }
   60981                           case 0x00000200: {
   60982                             // 0x01f00290
   60983                             if (((instr & 0xf0000000) == 0xf0000000)) {
   60984                               UnallocatedA32(instr);
   60985                               return;
   60986                             }
   60987                             Condition condition((instr >> 28) & 0xf);
   60988                             unsigned rt = (instr >> 12) & 0xf;
   60989                             unsigned rn = (instr >> 16) & 0xf;
   60990                             // LDAEXH{<c>}{<q>} <Rt>, [<Rn>] ; A1
   60991                             ldaexh(condition,
   60992                                    Register(rt),
   60993                                    MemOperand(Register(rn), Offset));
   60994                             if (((instr & 0xff00fff) != 0x1f00e9f)) {
   60995                               UnpredictableA32(instr);
   60996                             }
   60997                             break;
   60998                           }
   60999                           case 0x00000300: {
   61000                             // 0x01f00390
   61001                             if (((instr & 0xf0000000) == 0xf0000000)) {
   61002                               UnallocatedA32(instr);
   61003                               return;
   61004                             }
   61005                             Condition condition((instr >> 28) & 0xf);
   61006                             unsigned rt = (instr >> 12) & 0xf;
   61007                             unsigned rn = (instr >> 16) & 0xf;
   61008                             // LDREXH{<c>}{<q>} <Rt>, [<Rn>] ; A1
   61009                             ldrexh(condition,
   61010                                    Register(rt),
   61011                                    MemOperand(Register(rn), Offset));
   61012                             if (((instr & 0xff00fff) != 0x1f00f9f)) {
   61013                               UnpredictableA32(instr);
   61014                             }
   61015                             break;
   61016                           }
   61017                           default:
   61018                             UnallocatedA32(instr);
   61019                             break;
   61020                         }
   61021                         break;
   61022                       }
   61023                       default:
   61024                         UnallocatedA32(instr);
   61025                         break;
   61026                     }
   61027                     break;
   61028                   }
   61029                   case 0x00000020: {
   61030                     // 0x005000b0
   61031                     switch (instr & 0x01200000) {
   61032                       case 0x00000000: {
   61033                         // 0x005000b0
   61034                         switch (instr & 0x000f0000) {
   61035                           case 0x000f0000: {
   61036                             // 0x005f00b0
   61037                             if (((instr & 0xf0000000) == 0xf0000000) ||
   61038                                 ((instr & 0x1200000) == 0x200000)) {
   61039                               UnallocatedA32(instr);
   61040                               return;
   61041                             }
   61042                             Condition condition((instr >> 28) & 0xf);
   61043                             unsigned rt = (instr >> 12) & 0xf;
   61044                             uint32_t U = (instr >> 23) & 0x1;
   61045                             int32_t imm = (instr & 0xf) | ((instr >> 4) & 0xf0);
   61046                             if (U == 0) imm = -imm;
   61047                             bool minus_zero = (imm == 0) && (U == 0);
   61048                             Location location(imm, kA32PcDelta);
   61049                             // LDRH{<c>}{<q>} <Rt>, <label> ; A1
   61050                             if (minus_zero) {
   61051                               ldrh(condition,
   61052                                    Best,
   61053                                    Register(rt),
   61054                                    MemOperand(pc, minus, 0));
   61055                             } else {
   61056                               ldrh(condition, Register(rt), &location);
   61057                             }
   61058                             if (((instr & 0xf7f00f0) != 0x15f00b0)) {
   61059                               UnpredictableA32(instr);
   61060                             }
   61061                             break;
   61062                           }
   61063                           default: {
   61064                             if (((instr & 0xf0000000) == 0xf0000000) ||
   61065                                 ((instr & 0xf0000) == 0xf0000)) {
   61066                               UnallocatedA32(instr);
   61067                               return;
   61068                             }
   61069                             Condition condition((instr >> 28) & 0xf);
   61070                             unsigned rt = (instr >> 12) & 0xf;
   61071                             unsigned rn = (instr >> 16) & 0xf;
   61072                             Sign sign((((instr >> 23) & 0x1) == 0) ? minus
   61073                                                                    : plus);
   61074                             int32_t offset =
   61075                                 (instr & 0xf) | ((instr >> 4) & 0xf0);
   61076                             // LDRH{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_3> ; A1
   61077                             ldrh(condition,
   61078                                  Best,
   61079                                  Register(rt),
   61080                                  MemOperand(Register(rn),
   61081                                             sign,
   61082                                             offset,
   61083                                             PostIndex));
   61084                             break;
   61085                           }
   61086                         }
   61087                         break;
   61088                       }
   61089                       case 0x00200000: {
   61090                         // 0x007000b0
   61091                         if (((instr & 0xf0000000) == 0xf0000000)) {
   61092                           UnallocatedA32(instr);
   61093                           return;
   61094                         }
   61095                         UnimplementedA32("LDRHT", instr);
   61096                         break;
   61097                       }
   61098                       case 0x01000000: {
   61099                         // 0x015000b0
   61100                         switch (instr & 0x000f0000) {
   61101                           case 0x000f0000: {
   61102                             // 0x015f00b0
   61103                             if (((instr & 0xf0000000) == 0xf0000000) ||
   61104                                 ((instr & 0x1200000) == 0x200000)) {
   61105                               UnallocatedA32(instr);
   61106                               return;
   61107                             }
   61108                             Condition condition((instr >> 28) & 0xf);
   61109                             unsigned rt = (instr >> 12) & 0xf;
   61110                             uint32_t U = (instr >> 23) & 0x1;
   61111                             int32_t imm = (instr & 0xf) | ((instr >> 4) & 0xf0);
   61112                             if (U == 0) imm = -imm;
   61113                             bool minus_zero = (imm == 0) && (U == 0);
   61114                             Location location(imm, kA32PcDelta);
   61115                             // LDRH{<c>}{<q>} <Rt>, <label> ; A1
   61116                             if (minus_zero) {
   61117                               ldrh(condition,
   61118                                    Best,
   61119                                    Register(rt),
   61120                                    MemOperand(pc, minus, 0));
   61121                             } else {
   61122                               ldrh(condition, Register(rt), &location);
   61123                             }
   61124                             if (((instr & 0xf7f00f0) != 0x15f00b0)) {
   61125                               UnpredictableA32(instr);
   61126                             }
   61127                             break;
   61128                           }
   61129                           default: {
   61130                             if (((instr & 0xf0000000) == 0xf0000000) ||
   61131                                 ((instr & 0xf0000) == 0xf0000)) {
   61132                               UnallocatedA32(instr);
   61133                               return;
   61134                             }
   61135                             Condition condition((instr >> 28) & 0xf);
   61136                             unsigned rt = (instr >> 12) & 0xf;
   61137                             unsigned rn = (instr >> 16) & 0xf;
   61138                             Sign sign((((instr >> 23) & 0x1) == 0) ? minus
   61139                                                                    : plus);
   61140                             int32_t offset =
   61141                                 (instr & 0xf) | ((instr >> 4) & 0xf0);
   61142                             // LDRH{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_3>}] ; A1
   61143                             ldrh(condition,
   61144                                  Best,
   61145                                  Register(rt),
   61146                                  MemOperand(Register(rn),
   61147                                             sign,
   61148                                             offset,
   61149                                             Offset));
   61150                             break;
   61151                           }
   61152                         }
   61153                         break;
   61154                       }
   61155                       case 0x01200000: {
   61156                         // 0x017000b0
   61157                         switch (instr & 0x000f0000) {
   61158                           case 0x000f0000: {
   61159                             // 0x017f00b0
   61160                             if (((instr & 0xf0000000) == 0xf0000000) ||
   61161                                 ((instr & 0x1200000) == 0x200000)) {
   61162                               UnallocatedA32(instr);
   61163                               return;
   61164                             }
   61165                             Condition condition((instr >> 28) & 0xf);
   61166                             unsigned rt = (instr >> 12) & 0xf;
   61167                             uint32_t U = (instr >> 23) & 0x1;
   61168                             int32_t imm = (instr & 0xf) | ((instr >> 4) & 0xf0);
   61169                             if (U == 0) imm = -imm;
   61170                             bool minus_zero = (imm == 0) && (U == 0);
   61171                             Location location(imm, kA32PcDelta);
   61172                             // LDRH{<c>}{<q>} <Rt>, <label> ; A1
   61173                             if (minus_zero) {
   61174                               ldrh(condition,
   61175                                    Best,
   61176                                    Register(rt),
   61177                                    MemOperand(pc, minus, 0));
   61178                             } else {
   61179                               ldrh(condition, Register(rt), &location);
   61180                             }
   61181                             if (((instr & 0xf7f00f0) != 0x15f00b0)) {
   61182                               UnpredictableA32(instr);
   61183                             }
   61184                             break;
   61185                           }
   61186                           default: {
   61187                             if (((instr & 0xf0000000) == 0xf0000000) ||
   61188                                 ((instr & 0xf0000) == 0xf0000)) {
   61189                               UnallocatedA32(instr);
   61190                               return;
   61191                             }
   61192                             Condition condition((instr >> 28) & 0xf);
   61193                             unsigned rt = (instr >> 12) & 0xf;
   61194                             unsigned rn = (instr >> 16) & 0xf;
   61195                             Sign sign((((instr >> 23) & 0x1) == 0) ? minus
   61196                                                                    : plus);
   61197                             int32_t offset =
   61198                                 (instr & 0xf) | ((instr >> 4) & 0xf0);
   61199                             // LDRH{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_3>}]! ; A1 NOLINT(whitespace/line_length)
   61200                             ldrh(condition,
   61201                                  Best,
   61202                                  Register(rt),
   61203                                  MemOperand(Register(rn),
   61204                                             sign,
   61205                                             offset,
   61206                                             PreIndex));
   61207                             break;
   61208                           }
   61209                         }
   61210                         break;
   61211                       }
   61212                     }
   61213                     break;
   61214                   }
   61215                   case 0x00000040: {
   61216                     // 0x005000d0
   61217                     switch (instr & 0x01200000) {
   61218                       case 0x00000000: {
   61219                         // 0x005000d0
   61220                         switch (instr & 0x000f0000) {
   61221                           case 0x000f0000: {
   61222                             // 0x005f00d0
   61223                             if (((instr & 0xf0000000) == 0xf0000000) ||
   61224                                 ((instr & 0x1200000) == 0x200000)) {
   61225                               UnallocatedA32(instr);
   61226                               return;
   61227                             }
   61228                             Condition condition((instr >> 28) & 0xf);
   61229                             unsigned rt = (instr >> 12) & 0xf;
   61230                             uint32_t U = (instr >> 23) & 0x1;
   61231                             int32_t imm = (instr & 0xf) | ((instr >> 4) & 0xf0);
   61232                             if (U == 0) imm = -imm;
   61233                             bool minus_zero = (imm == 0) && (U == 0);
   61234                             Location location(imm, kA32PcDelta);
   61235                             // LDRSB{<c>}{<q>} <Rt>, <label> ; A1
   61236                             if (minus_zero) {
   61237                               ldrsb(condition,
   61238                                     Best,
   61239                                     Register(rt),
   61240                                     MemOperand(pc, minus, 0));
   61241                             } else {
   61242                               ldrsb(condition, Register(rt), &location);
   61243                             }
   61244                             if (((instr & 0xf7f00f0) != 0x15f00d0)) {
   61245                               UnpredictableA32(instr);
   61246                             }
   61247                             break;
   61248                           }
   61249                           default: {
   61250                             if (((instr & 0xf0000000) == 0xf0000000) ||
   61251                                 ((instr & 0xf0000) == 0xf0000)) {
   61252                               UnallocatedA32(instr);
   61253                               return;
   61254                             }
   61255                             Condition condition((instr >> 28) & 0xf);
   61256                             unsigned rt = (instr >> 12) & 0xf;
   61257                             unsigned rn = (instr >> 16) & 0xf;
   61258                             Sign sign((((instr >> 23) & 0x1) == 0) ? minus
   61259                                                                    : plus);
   61260                             int32_t offset =
   61261                                 (instr & 0xf) | ((instr >> 4) & 0xf0);
   61262                             // LDRSB{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_2> ; A1
   61263                             ldrsb(condition,
   61264                                   Best,
   61265                                   Register(rt),
   61266                                   MemOperand(Register(rn),
   61267                                              sign,
   61268                                              offset,
   61269                                              PostIndex));
   61270                             break;
   61271                           }
   61272                         }
   61273                         break;
   61274                       }
   61275                       case 0x00200000: {
   61276                         // 0x007000d0
   61277                         if (((instr & 0xf0000000) == 0xf0000000)) {
   61278                           UnallocatedA32(instr);
   61279                           return;
   61280                         }
   61281                         UnimplementedA32("LDRSBT", instr);
   61282                         break;
   61283                       }
   61284                       case 0x01000000: {
   61285                         // 0x015000d0
   61286                         switch (instr & 0x000f0000) {
   61287                           case 0x000f0000: {
   61288                             // 0x015f00d0
   61289                             if (((instr & 0xf0000000) == 0xf0000000) ||
   61290                                 ((instr & 0x1200000) == 0x200000)) {
   61291                               UnallocatedA32(instr);
   61292                               return;
   61293                             }
   61294                             Condition condition((instr >> 28) & 0xf);
   61295                             unsigned rt = (instr >> 12) & 0xf;
   61296                             uint32_t U = (instr >> 23) & 0x1;
   61297                             int32_t imm = (instr & 0xf) | ((instr >> 4) & 0xf0);
   61298                             if (U == 0) imm = -imm;
   61299                             bool minus_zero = (imm == 0) && (U == 0);
   61300                             Location location(imm, kA32PcDelta);
   61301                             // LDRSB{<c>}{<q>} <Rt>, <label> ; A1
   61302                             if (minus_zero) {
   61303                               ldrsb(condition,
   61304                                     Best,
   61305                                     Register(rt),
   61306                                     MemOperand(pc, minus, 0));
   61307                             } else {
   61308                               ldrsb(condition, Register(rt), &location);
   61309                             }
   61310                             if (((instr & 0xf7f00f0) != 0x15f00d0)) {
   61311                               UnpredictableA32(instr);
   61312                             }
   61313                             break;
   61314                           }
   61315                           default: {
   61316                             if (((instr & 0xf0000000) == 0xf0000000) ||
   61317                                 ((instr & 0xf0000) == 0xf0000)) {
   61318                               UnallocatedA32(instr);
   61319                               return;
   61320                             }
   61321                             Condition condition((instr >> 28) & 0xf);
   61322                             unsigned rt = (instr >> 12) & 0xf;
   61323                             unsigned rn = (instr >> 16) & 0xf;
   61324                             Sign sign((((instr >> 23) & 0x1) == 0) ? minus
   61325                                                                    : plus);
   61326                             int32_t offset =
   61327                                 (instr & 0xf) | ((instr >> 4) & 0xf0);
   61328                             // LDRSB{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_2>}] ; A1 NOLINT(whitespace/line_length)
   61329                             ldrsb(condition,
   61330                                   Best,
   61331                                   Register(rt),
   61332                                   MemOperand(Register(rn),
   61333                                              sign,
   61334                                              offset,
   61335                                              Offset));
   61336                             break;
   61337                           }
   61338                         }
   61339                         break;
   61340                       }
   61341                       case 0x01200000: {
   61342                         // 0x017000d0
   61343                         switch (instr & 0x000f0000) {
   61344                           case 0x000f0000: {
   61345                             // 0x017f00d0
   61346                             if (((instr & 0xf0000000) == 0xf0000000) ||
   61347                                 ((instr & 0x1200000) == 0x200000)) {
   61348                               UnallocatedA32(instr);
   61349                               return;
   61350                             }
   61351                             Condition condition((instr >> 28) & 0xf);
   61352                             unsigned rt = (instr >> 12) & 0xf;
   61353                             uint32_t U = (instr >> 23) & 0x1;
   61354                             int32_t imm = (instr & 0xf) | ((instr >> 4) & 0xf0);
   61355                             if (U == 0) imm = -imm;
   61356                             bool minus_zero = (imm == 0) && (U == 0);
   61357                             Location location(imm, kA32PcDelta);
   61358                             // LDRSB{<c>}{<q>} <Rt>, <label> ; A1
   61359                             if (minus_zero) {
   61360                               ldrsb(condition,
   61361                                     Best,
   61362                                     Register(rt),
   61363                                     MemOperand(pc, minus, 0));
   61364                             } else {
   61365                               ldrsb(condition, Register(rt), &location);
   61366                             }
   61367                             if (((instr & 0xf7f00f0) != 0x15f00d0)) {
   61368                               UnpredictableA32(instr);
   61369                             }
   61370                             break;
   61371                           }
   61372                           default: {
   61373                             if (((instr & 0xf0000000) == 0xf0000000) ||
   61374                                 ((instr & 0xf0000) == 0xf0000)) {
   61375                               UnallocatedA32(instr);
   61376                               return;
   61377                             }
   61378                             Condition condition((instr >> 28) & 0xf);
   61379                             unsigned rt = (instr >> 12) & 0xf;
   61380                             unsigned rn = (instr >> 16) & 0xf;
   61381                             Sign sign((((instr >> 23) & 0x1) == 0) ? minus
   61382                                                                    : plus);
   61383                             int32_t offset =
   61384                                 (instr & 0xf) | ((instr >> 4) & 0xf0);
   61385                             // LDRSB{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_2>}]! ; A1 NOLINT(whitespace/line_length)
   61386                             ldrsb(condition,
   61387                                   Best,
   61388                                   Register(rt),
   61389                                   MemOperand(Register(rn),
   61390                                              sign,
   61391                                              offset,
   61392                                              PreIndex));
   61393                             break;
   61394                           }
   61395                         }
   61396                         break;
   61397                       }
   61398                     }
   61399                     break;
   61400                   }
   61401                   case 0x00000060: {
   61402                     // 0x005000f0
   61403                     switch (instr & 0x01200000) {
   61404                       case 0x00000000: {
   61405                         // 0x005000f0
   61406                         switch (instr & 0x000f0000) {
   61407                           case 0x000f0000: {
   61408                             // 0x005f00f0
   61409                             if (((instr & 0xf0000000) == 0xf0000000) ||
   61410                                 ((instr & 0x1200000) == 0x200000)) {
   61411                               UnallocatedA32(instr);
   61412                               return;
   61413                             }
   61414                             Condition condition((instr >> 28) & 0xf);
   61415                             unsigned rt = (instr >> 12) & 0xf;
   61416                             uint32_t U = (instr >> 23) & 0x1;
   61417                             int32_t imm = (instr & 0xf) | ((instr >> 4) & 0xf0);
   61418                             if (U == 0) imm = -imm;
   61419                             bool minus_zero = (imm == 0) && (U == 0);
   61420                             Location location(imm, kA32PcDelta);
   61421                             // LDRSH{<c>}{<q>} <Rt>, <label> ; A1
   61422                             if (minus_zero) {
   61423                               ldrsh(condition,
   61424                                     Best,
   61425                                     Register(rt),
   61426                                     MemOperand(pc, minus, 0));
   61427                             } else {
   61428                               ldrsh(condition, Register(rt), &location);
   61429                             }
   61430                             if (((instr & 0xf7f00f0) != 0x15f00f0)) {
   61431                               UnpredictableA32(instr);
   61432                             }
   61433                             break;
   61434                           }
   61435                           default: {
   61436                             if (((instr & 0xf0000000) == 0xf0000000) ||
   61437                                 ((instr & 0xf0000) == 0xf0000)) {
   61438                               UnallocatedA32(instr);
   61439                               return;
   61440                             }
   61441                             Condition condition((instr >> 28) & 0xf);
   61442                             unsigned rt = (instr >> 12) & 0xf;
   61443                             unsigned rn = (instr >> 16) & 0xf;
   61444                             Sign sign((((instr >> 23) & 0x1) == 0) ? minus
   61445                                                                    : plus);
   61446                             int32_t offset =
   61447                                 (instr & 0xf) | ((instr >> 4) & 0xf0);
   61448                             // LDRSH{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_2> ; A1
   61449                             ldrsh(condition,
   61450                                   Best,
   61451                                   Register(rt),
   61452                                   MemOperand(Register(rn),
   61453                                              sign,
   61454                                              offset,
   61455                                              PostIndex));
   61456                             break;
   61457                           }
   61458                         }
   61459                         break;
   61460                       }
   61461                       case 0x00200000: {
   61462                         // 0x007000f0
   61463                         if (((instr & 0xf0000000) == 0xf0000000)) {
   61464                           UnallocatedA32(instr);
   61465                           return;
   61466                         }
   61467                         UnimplementedA32("LDRSHT", instr);
   61468                         break;
   61469                       }
   61470                       case 0x01000000: {
   61471                         // 0x015000f0
   61472                         switch (instr & 0x000f0000) {
   61473                           case 0x000f0000: {
   61474                             // 0x015f00f0
   61475                             if (((instr & 0xf0000000) == 0xf0000000) ||
   61476                                 ((instr & 0x1200000) == 0x200000)) {
   61477                               UnallocatedA32(instr);
   61478                               return;
   61479                             }
   61480                             Condition condition((instr >> 28) & 0xf);
   61481                             unsigned rt = (instr >> 12) & 0xf;
   61482                             uint32_t U = (instr >> 23) & 0x1;
   61483                             int32_t imm = (instr & 0xf) | ((instr >> 4) & 0xf0);
   61484                             if (U == 0) imm = -imm;
   61485                             bool minus_zero = (imm == 0) && (U == 0);
   61486                             Location location(imm, kA32PcDelta);
   61487                             // LDRSH{<c>}{<q>} <Rt>, <label> ; A1
   61488                             if (minus_zero) {
   61489                               ldrsh(condition,
   61490                                     Best,
   61491                                     Register(rt),
   61492                                     MemOperand(pc, minus, 0));
   61493                             } else {
   61494                               ldrsh(condition, Register(rt), &location);
   61495                             }
   61496                             if (((instr & 0xf7f00f0) != 0x15f00f0)) {
   61497                               UnpredictableA32(instr);
   61498                             }
   61499                             break;
   61500                           }
   61501                           default: {
   61502                             if (((instr & 0xf0000000) == 0xf0000000) ||
   61503                                 ((instr & 0xf0000) == 0xf0000)) {
   61504                               UnallocatedA32(instr);
   61505                               return;
   61506                             }
   61507                             Condition condition((instr >> 28) & 0xf);
   61508                             unsigned rt = (instr >> 12) & 0xf;
   61509                             unsigned rn = (instr >> 16) & 0xf;
   61510                             Sign sign((((instr >> 23) & 0x1) == 0) ? minus
   61511                                                                    : plus);
   61512                             int32_t offset =
   61513                                 (instr & 0xf) | ((instr >> 4) & 0xf0);
   61514                             // LDRSH{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_2>}] ; A1 NOLINT(whitespace/line_length)
   61515                             ldrsh(condition,
   61516                                   Best,
   61517                                   Register(rt),
   61518                                   MemOperand(Register(rn),
   61519                                              sign,
   61520                                              offset,
   61521                                              Offset));
   61522                             break;
   61523                           }
   61524                         }
   61525                         break;
   61526                       }
   61527                       case 0x01200000: {
   61528                         // 0x017000f0
   61529                         switch (instr & 0x000f0000) {
   61530                           case 0x000f0000: {
   61531                             // 0x017f00f0
   61532                             if (((instr & 0xf0000000) == 0xf0000000) ||
   61533                                 ((instr & 0x1200000) == 0x200000)) {
   61534                               UnallocatedA32(instr);
   61535                               return;
   61536                             }
   61537                             Condition condition((instr >> 28) & 0xf);
   61538                             unsigned rt = (instr >> 12) & 0xf;
   61539                             uint32_t U = (instr >> 23) & 0x1;
   61540                             int32_t imm = (instr & 0xf) | ((instr >> 4) & 0xf0);
   61541                             if (U == 0) imm = -imm;
   61542                             bool minus_zero = (imm == 0) && (U == 0);
   61543                             Location location(imm, kA32PcDelta);
   61544                             // LDRSH{<c>}{<q>} <Rt>, <label> ; A1
   61545                             if (minus_zero) {
   61546                               ldrsh(condition,
   61547                                     Best,
   61548                                     Register(rt),
   61549                                     MemOperand(pc, minus, 0));
   61550                             } else {
   61551                               ldrsh(condition, Register(rt), &location);
   61552                             }
   61553                             if (((instr & 0xf7f00f0) != 0x15f00f0)) {
   61554                               UnpredictableA32(instr);
   61555                             }
   61556                             break;
   61557                           }
   61558                           default: {
   61559                             if (((instr & 0xf0000000) == 0xf0000000) ||
   61560                                 ((instr & 0xf0000) == 0xf0000)) {
   61561                               UnallocatedA32(instr);
   61562                               return;
   61563                             }
   61564                             Condition condition((instr >> 28) & 0xf);
   61565                             unsigned rt = (instr >> 12) & 0xf;
   61566                             unsigned rn = (instr >> 16) & 0xf;
   61567                             Sign sign((((instr >> 23) & 0x1) == 0) ? minus
   61568                                                                    : plus);
   61569                             int32_t offset =
   61570                                 (instr & 0xf) | ((instr >> 4) & 0xf0);
   61571                             // LDRSH{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_2>}]! ; A1 NOLINT(whitespace/line_length)
   61572                             ldrsh(condition,
   61573                                   Best,
   61574                                   Register(rt),
   61575                                   MemOperand(Register(rn),
   61576                                              sign,
   61577                                              offset,
   61578                                              PreIndex));
   61579                             break;
   61580                           }
   61581                         }
   61582                         break;
   61583                       }
   61584                     }
   61585                     break;
   61586                   }
   61587                 }
   61588                 break;
   61589               }
   61590             }
   61591             break;
   61592           }
   61593         }
   61594         break;
   61595       }
   61596       case 0x02000000: {
   61597         // 0x02000000
   61598         switch (instr & 0x01b00000) {
   61599           case 0x00000000: {
   61600             // 0x02000000
   61601             switch (instr & 0x00400000) {
   61602               case 0x00000000: {
   61603                 // 0x02000000
   61604                 if (((instr & 0xf0000000) == 0xf0000000)) {
   61605                   UnallocatedA32(instr);
   61606                   return;
   61607                 }
   61608                 Condition condition((instr >> 28) & 0xf);
   61609                 unsigned rd = (instr >> 12) & 0xf;
   61610                 unsigned rn = (instr >> 16) & 0xf;
   61611                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
   61612                 // AND{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
   61613                 and_(condition, Best, Register(rd), Register(rn), imm);
   61614                 break;
   61615               }
   61616               case 0x00400000: {
   61617                 // 0x02400000
   61618                 switch (instr & 0x000d0000) {
   61619                   case 0x000d0000: {
   61620                     // 0x024d0000
   61621                     switch (instr & 0x00020000) {
   61622                       case 0x00000000: {
   61623                         // 0x024d0000
   61624                         if (((instr & 0xf0000000) == 0xf0000000)) {
   61625                           UnallocatedA32(instr);
   61626                           return;
   61627                         }
   61628                         Condition condition((instr >> 28) & 0xf);
   61629                         unsigned rd = (instr >> 12) & 0xf;
   61630                         uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
   61631                         // SUB{<c>}{<q>} {<Rd>}, SP, #<const> ; A1
   61632                         sub(condition, Best, Register(rd), sp, imm);
   61633                         break;
   61634                       }
   61635                       case 0x00020000: {
   61636                         // 0x024f0000
   61637                         if (((instr & 0xf0000000) == 0xf0000000)) {
   61638                           UnallocatedA32(instr);
   61639                           return;
   61640                         }
   61641                         if (((instr & 0xf0000000) != 0xf0000000) &&
   61642                             ((Uint32(instr) & Uint32(0xfff)) == Uint32(0x0))) {
   61643                           Condition condition((instr >> 28) & 0xf);
   61644                           unsigned rd = (instr >> 12) & 0xf;
   61645                           uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
   61646                           // SUB{<c>}{<q>} <Rd>, PC, #<const> ; A2
   61647                           sub(condition, Best, Register(rd), pc, imm);
   61648                           return;
   61649                         }
   61650                         Condition condition((instr >> 28) & 0xf);
   61651                         unsigned rd = (instr >> 12) & 0xf;
   61652                         uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
   61653                         Location location(-imm, kA32PcDelta);
   61654                         // ADR{<c>}{<q>} <Rd>, <label> ; A2
   61655                         adr(condition, Best, Register(rd), &location);
   61656                         break;
   61657                       }
   61658                     }
   61659                     break;
   61660                   }
   61661                   default: {
   61662                     if (((instr & 0xf0000000) == 0xf0000000) ||
   61663                         ((instr & 0xd0000) == 0xd0000)) {
   61664                       UnallocatedA32(instr);
   61665                       return;
   61666                     }
   61667                     Condition condition((instr >> 28) & 0xf);
   61668                     unsigned rd = (instr >> 12) & 0xf;
   61669                     unsigned rn = (instr >> 16) & 0xf;
   61670                     uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
   61671                     // SUB{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
   61672                     sub(condition, Best, Register(rd), Register(rn), imm);
   61673                     break;
   61674                   }
   61675                 }
   61676                 break;
   61677               }
   61678             }
   61679             break;
   61680           }
   61681           case 0x00100000: {
   61682             // 0x02100000
   61683             switch (instr & 0x00400000) {
   61684               case 0x00000000: {
   61685                 // 0x02100000
   61686                 if (((instr & 0xf0000000) == 0xf0000000)) {
   61687                   UnallocatedA32(instr);
   61688                   return;
   61689                 }
   61690                 Condition condition((instr >> 28) & 0xf);
   61691                 unsigned rd = (instr >> 12) & 0xf;
   61692                 unsigned rn = (instr >> 16) & 0xf;
   61693                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
   61694                 // ANDS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
   61695                 ands(condition, Best, Register(rd), Register(rn), imm);
   61696                 break;
   61697               }
   61698               case 0x00400000: {
   61699                 // 0x02500000
   61700                 switch (instr & 0x000f0000) {
   61701                   case 0x000d0000: {
   61702                     // 0x025d0000
   61703                     if (((instr & 0xf0000000) == 0xf0000000)) {
   61704                       UnallocatedA32(instr);
   61705                       return;
   61706                     }
   61707                     Condition condition((instr >> 28) & 0xf);
   61708                     unsigned rd = (instr >> 12) & 0xf;
   61709                     uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
   61710                     // SUBS{<c>}{<q>} {<Rd>}, SP, #<const> ; A1
   61711                     subs(condition, Best, Register(rd), sp, imm);
   61712                     break;
   61713                   }
   61714                   default: {
   61715                     if (((instr & 0xf0000000) == 0xf0000000) ||
   61716                         ((instr & 0xf0000) == 0xd0000)) {
   61717                       UnallocatedA32(instr);
   61718                       return;
   61719                     }
   61720                     Condition condition((instr >> 28) & 0xf);
   61721                     unsigned rd = (instr >> 12) & 0xf;
   61722                     unsigned rn = (instr >> 16) & 0xf;
   61723                     uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
   61724                     // SUBS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
   61725                     subs(condition, Best, Register(rd), Register(rn), imm);
   61726                     break;
   61727                   }
   61728                 }
   61729                 break;
   61730               }
   61731             }
   61732             break;
   61733           }
   61734           case 0x00200000: {
   61735             // 0x02200000
   61736             switch (instr & 0x00400000) {
   61737               case 0x00000000: {
   61738                 // 0x02200000
   61739                 if (((instr & 0xf0000000) == 0xf0000000)) {
   61740                   UnallocatedA32(instr);
   61741                   return;
   61742                 }
   61743                 Condition condition((instr >> 28) & 0xf);
   61744                 unsigned rd = (instr >> 12) & 0xf;
   61745                 unsigned rn = (instr >> 16) & 0xf;
   61746                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
   61747                 // EOR{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
   61748                 eor(condition, Best, Register(rd), Register(rn), imm);
   61749                 break;
   61750               }
   61751               case 0x00400000: {
   61752                 // 0x02600000
   61753                 if (((instr & 0xf0000000) == 0xf0000000)) {
   61754                   UnallocatedA32(instr);
   61755                   return;
   61756                 }
   61757                 Condition condition((instr >> 28) & 0xf);
   61758                 unsigned rd = (instr >> 12) & 0xf;
   61759                 unsigned rn = (instr >> 16) & 0xf;
   61760                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
   61761                 // RSB{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
   61762                 rsb(condition, Best, Register(rd), Register(rn), imm);
   61763                 break;
   61764               }
   61765             }
   61766             break;
   61767           }
   61768           case 0x00300000: {
   61769             // 0x02300000
   61770             switch (instr & 0x00400000) {
   61771               case 0x00000000: {
   61772                 // 0x02300000
   61773                 if (((instr & 0xf0000000) == 0xf0000000)) {
   61774                   UnallocatedA32(instr);
   61775                   return;
   61776                 }
   61777                 Condition condition((instr >> 28) & 0xf);
   61778                 unsigned rd = (instr >> 12) & 0xf;
   61779                 unsigned rn = (instr >> 16) & 0xf;
   61780                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
   61781                 // EORS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
   61782                 eors(condition, Best, Register(rd), Register(rn), imm);
   61783                 break;
   61784               }
   61785               case 0x00400000: {
   61786                 // 0x02700000
   61787                 if (((instr & 0xf0000000) == 0xf0000000)) {
   61788                   UnallocatedA32(instr);
   61789                   return;
   61790                 }
   61791                 Condition condition((instr >> 28) & 0xf);
   61792                 unsigned rd = (instr >> 12) & 0xf;
   61793                 unsigned rn = (instr >> 16) & 0xf;
   61794                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
   61795                 // RSBS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
   61796                 rsbs(condition, Best, Register(rd), Register(rn), imm);
   61797                 break;
   61798               }
   61799             }
   61800             break;
   61801           }
   61802           case 0x00800000: {
   61803             // 0x02800000
   61804             switch (instr & 0x00400000) {
   61805               case 0x00000000: {
   61806                 // 0x02800000
   61807                 switch (instr & 0x000d0000) {
   61808                   case 0x000d0000: {
   61809                     // 0x028d0000
   61810                     switch (instr & 0x00020000) {
   61811                       case 0x00000000: {
   61812                         // 0x028d0000
   61813                         if (((instr & 0xf0000000) == 0xf0000000)) {
   61814                           UnallocatedA32(instr);
   61815                           return;
   61816                         }
   61817                         Condition condition((instr >> 28) & 0xf);
   61818                         unsigned rd = (instr >> 12) & 0xf;
   61819                         uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
   61820                         // ADD{<c>}{<q>} {<Rd>}, SP, #<const> ; A1
   61821                         add(condition, Best, Register(rd), sp, imm);
   61822                         break;
   61823                       }
   61824                       case 0x00020000: {
   61825                         // 0x028f0000
   61826                         if (((instr & 0xf0000000) == 0xf0000000)) {
   61827                           UnallocatedA32(instr);
   61828                           return;
   61829                         }
   61830                         Condition condition((instr >> 28) & 0xf);
   61831                         unsigned rd = (instr >> 12) & 0xf;
   61832                         uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
   61833                         Location location(imm, kA32PcDelta);
   61834                         // ADR{<c>}{<q>} <Rd>, <label> ; A1
   61835                         adr(condition, Best, Register(rd), &location);
   61836                         break;
   61837                       }
   61838                     }
   61839                     break;
   61840                   }
   61841                   default: {
   61842                     if (((instr & 0xf0000000) == 0xf0000000) ||
   61843                         ((instr & 0xd0000) == 0xd0000)) {
   61844                       UnallocatedA32(instr);
   61845                       return;
   61846                     }
   61847                     Condition condition((instr >> 28) & 0xf);
   61848                     unsigned rd = (instr >> 12) & 0xf;
   61849                     unsigned rn = (instr >> 16) & 0xf;
   61850                     uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
   61851                     // ADD{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
   61852                     add(condition, Best, Register(rd), Register(rn), imm);
   61853                     break;
   61854                   }
   61855                 }
   61856                 break;
   61857               }
   61858               case 0x00400000: {
   61859                 // 0x02c00000
   61860                 if (((instr & 0xf0000000) == 0xf0000000)) {
   61861                   UnallocatedA32(instr);
   61862                   return;
   61863                 }
   61864                 Condition condition((instr >> 28) & 0xf);
   61865                 unsigned rd = (instr >> 12) & 0xf;
   61866                 unsigned rn = (instr >> 16) & 0xf;
   61867                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
   61868                 // SBC{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
   61869                 sbc(condition, Best, Register(rd), Register(rn), imm);
   61870                 break;
   61871               }
   61872             }
   61873             break;
   61874           }
   61875           case 0x00900000: {
   61876             // 0x02900000
   61877             switch (instr & 0x00400000) {
   61878               case 0x00000000: {
   61879                 // 0x02900000
   61880                 switch (instr & 0x000f0000) {
   61881                   case 0x000d0000: {
   61882                     // 0x029d0000
   61883                     if (((instr & 0xf0000000) == 0xf0000000)) {
   61884                       UnallocatedA32(instr);
   61885                       return;
   61886                     }
   61887                     Condition condition((instr >> 28) & 0xf);
   61888                     unsigned rd = (instr >> 12) & 0xf;
   61889                     uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
   61890                     // ADDS{<c>}{<q>} {<Rd>}, SP, #<const> ; A1
   61891                     adds(condition, Best, Register(rd), sp, imm);
   61892                     break;
   61893                   }
   61894                   default: {
   61895                     if (((instr & 0xf0000000) == 0xf0000000) ||
   61896                         ((instr & 0xf0000) == 0xd0000)) {
   61897                       UnallocatedA32(instr);
   61898                       return;
   61899                     }
   61900                     Condition condition((instr >> 28) & 0xf);
   61901                     unsigned rd = (instr >> 12) & 0xf;
   61902                     unsigned rn = (instr >> 16) & 0xf;
   61903                     uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
   61904                     // ADDS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
   61905                     adds(condition, Best, Register(rd), Register(rn), imm);
   61906                     break;
   61907                   }
   61908                 }
   61909                 break;
   61910               }
   61911               case 0x00400000: {
   61912                 // 0x02d00000
   61913                 if (((instr & 0xf0000000) == 0xf0000000)) {
   61914                   UnallocatedA32(instr);
   61915                   return;
   61916                 }
   61917                 Condition condition((instr >> 28) & 0xf);
   61918                 unsigned rd = (instr >> 12) & 0xf;
   61919                 unsigned rn = (instr >> 16) & 0xf;
   61920                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
   61921                 // SBCS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
   61922                 sbcs(condition, Best, Register(rd), Register(rn), imm);
   61923                 break;
   61924               }
   61925             }
   61926             break;
   61927           }
   61928           case 0x00a00000: {
   61929             // 0x02a00000
   61930             switch (instr & 0x00400000) {
   61931               case 0x00000000: {
   61932                 // 0x02a00000
   61933                 if (((instr & 0xf0000000) == 0xf0000000)) {
   61934                   UnallocatedA32(instr);
   61935                   return;
   61936                 }
   61937                 Condition condition((instr >> 28) & 0xf);
   61938                 unsigned rd = (instr >> 12) & 0xf;
   61939                 unsigned rn = (instr >> 16) & 0xf;
   61940                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
   61941                 // ADC{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
   61942                 adc(condition, Best, Register(rd), Register(rn), imm);
   61943                 break;
   61944               }
   61945               case 0x00400000: {
   61946                 // 0x02e00000
   61947                 if (((instr & 0xf0000000) == 0xf0000000)) {
   61948                   UnallocatedA32(instr);
   61949                   return;
   61950                 }
   61951                 Condition condition((instr >> 28) & 0xf);
   61952                 unsigned rd = (instr >> 12) & 0xf;
   61953                 unsigned rn = (instr >> 16) & 0xf;
   61954                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
   61955                 // RSC{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
   61956                 rsc(condition, Register(rd), Register(rn), imm);
   61957                 break;
   61958               }
   61959             }
   61960             break;
   61961           }
   61962           case 0x00b00000: {
   61963             // 0x02b00000
   61964             switch (instr & 0x00400000) {
   61965               case 0x00000000: {
   61966                 // 0x02b00000
   61967                 if (((instr & 0xf0000000) == 0xf0000000)) {
   61968                   UnallocatedA32(instr);
   61969                   return;
   61970                 }
   61971                 Condition condition((instr >> 28) & 0xf);
   61972                 unsigned rd = (instr >> 12) & 0xf;
   61973                 unsigned rn = (instr >> 16) & 0xf;
   61974                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
   61975                 // ADCS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
   61976                 adcs(condition, Best, Register(rd), Register(rn), imm);
   61977                 break;
   61978               }
   61979               case 0x00400000: {
   61980                 // 0x02f00000
   61981                 if (((instr & 0xf0000000) == 0xf0000000)) {
   61982                   UnallocatedA32(instr);
   61983                   return;
   61984                 }
   61985                 Condition condition((instr >> 28) & 0xf);
   61986                 unsigned rd = (instr >> 12) & 0xf;
   61987                 unsigned rn = (instr >> 16) & 0xf;
   61988                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
   61989                 // RSCS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
   61990                 rscs(condition, Register(rd), Register(rn), imm);
   61991                 break;
   61992               }
   61993             }
   61994             break;
   61995           }
   61996           case 0x01000000: {
   61997             // 0x03000000
   61998             switch (instr & 0x00400000) {
   61999               case 0x00000000: {
   62000                 // 0x03000000
   62001                 if (((instr & 0xf0000000) == 0xf0000000)) {
   62002                   UnallocatedA32(instr);
   62003                   return;
   62004                 }
   62005                 Condition condition((instr >> 28) & 0xf);
   62006                 unsigned rd = (instr >> 12) & 0xf;
   62007                 uint32_t imm = (instr & 0xfff) | ((instr >> 4) & 0xf000);
   62008                 if (!ImmediateA32::IsImmediateA32(imm)) {
   62009                   // MOV{<c>}{<q>} <Rd>, #<imm16> ; A2
   62010                   mov(condition, Best, Register(rd), imm);
   62011                 } else {
   62012                   // MOVW{<c>}{<q>} <Rd>, #<imm16> ; A2
   62013                   movw(condition, Register(rd), imm);
   62014                 }
   62015                 break;
   62016               }
   62017               case 0x00400000: {
   62018                 // 0x03400000
   62019                 if (((instr & 0xf0000000) == 0xf0000000)) {
   62020                   UnallocatedA32(instr);
   62021                   return;
   62022                 }
   62023                 Condition condition((instr >> 28) & 0xf);
   62024                 unsigned rd = (instr >> 12) & 0xf;
   62025                 uint32_t imm = (instr & 0xfff) | ((instr >> 4) & 0xf000);
   62026                 // MOVT{<c>}{<q>} <Rd>, #<imm16> ; A1
   62027                 movt(condition, Register(rd), imm);
   62028                 break;
   62029               }
   62030             }
   62031             break;
   62032           }
   62033           case 0x01100000: {
   62034             // 0x03100000
   62035             switch (instr & 0x00400000) {
   62036               case 0x00000000: {
   62037                 // 0x03100000
   62038                 if (((instr & 0xf0000000) == 0xf0000000)) {
   62039                   UnallocatedA32(instr);
   62040                   return;
   62041                 }
   62042                 Condition condition((instr >> 28) & 0xf);
   62043                 unsigned rn = (instr >> 16) & 0xf;
   62044                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
   62045                 // TST{<c>}{<q>} <Rn>, #<const> ; A1
   62046                 tst(condition, Best, Register(rn), imm);
   62047                 if (((instr & 0xff0f000) != 0x3100000)) {
   62048                   UnpredictableA32(instr);
   62049                 }
   62050                 break;
   62051               }
   62052               case 0x00400000: {
   62053                 // 0x03500000
   62054                 if (((instr & 0xf0000000) == 0xf0000000)) {
   62055                   UnallocatedA32(instr);
   62056                   return;
   62057                 }
   62058                 Condition condition((instr >> 28) & 0xf);
   62059                 unsigned rn = (instr >> 16) & 0xf;
   62060                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
   62061                 // CMP{<c>}{<q>} <Rn>, #<const> ; A1
   62062                 cmp(condition, Best, Register(rn), imm);
   62063                 if (((instr & 0xff0f000) != 0x3500000)) {
   62064                   UnpredictableA32(instr);
   62065                 }
   62066                 break;
   62067               }
   62068             }
   62069             break;
   62070           }
   62071           case 0x01200000: {
   62072             // 0x03200000
   62073             switch (instr & 0x004f0000) {
   62074               case 0x00000000: {
   62075                 // 0x03200000
   62076                 switch (instr & 0x000000f0) {
   62077                   case 0x00000000: {
   62078                     // 0x03200000
   62079                     switch (instr & 0x0000000f) {
   62080                       case 0x00000000: {
   62081                         // 0x03200000
   62082                         if (((instr & 0xf0000000) == 0xf0000000)) {
   62083                           UnallocatedA32(instr);
   62084                           return;
   62085                         }
   62086                         Condition condition((instr >> 28) & 0xf);
   62087                         // NOP{<c>}{<q>} ; A1
   62088                         nop(condition, Best);
   62089                         if (((instr & 0xfffffff) != 0x320f000)) {
   62090                           UnpredictableA32(instr);
   62091                         }
   62092                         break;
   62093                       }
   62094                       case 0x00000001: {
   62095                         // 0x03200001
   62096                         if (((instr & 0xf0000000) == 0xf0000000)) {
   62097                           UnallocatedA32(instr);
   62098                           return;
   62099                         }
   62100                         Condition condition((instr >> 28) & 0xf);
   62101                         // YIELD{<c>}{<q>} ; A1
   62102                         yield(condition, Best);
   62103                         if (((instr & 0xfffffff) != 0x320f001)) {
   62104                           UnpredictableA32(instr);
   62105                         }
   62106                         break;
   62107                       }
   62108                       case 0x00000002: {
   62109                         // 0x03200002
   62110                         if (((instr & 0xf0000000) == 0xf0000000)) {
   62111                           UnallocatedA32(instr);
   62112                           return;
   62113                         }
   62114                         UnimplementedA32("WFE", instr);
   62115                         break;
   62116                       }
   62117                       case 0x00000003: {
   62118                         // 0x03200003
   62119                         if (((instr & 0xf0000000) == 0xf0000000)) {
   62120                           UnallocatedA32(instr);
   62121                           return;
   62122                         }
   62123                         UnimplementedA32("WFI", instr);
   62124                         break;
   62125                       }
   62126                       case 0x00000004: {
   62127                         // 0x03200004
   62128                         if (((instr & 0xf0000000) == 0xf0000000)) {
   62129                           UnallocatedA32(instr);
   62130                           return;
   62131                         }
   62132                         UnimplementedA32("SEV", instr);
   62133                         break;
   62134                       }
   62135                       case 0x00000005: {
   62136                         // 0x03200005
   62137                         if (((instr & 0xf0000000) == 0xf0000000)) {
   62138                           UnallocatedA32(instr);
   62139                           return;
   62140                         }
   62141                         UnimplementedA32("SEVL", instr);
   62142                         break;
   62143                       }
   62144                       default:
   62145                         UnallocatedA32(instr);
   62146                         break;
   62147                     }
   62148                     break;
   62149                   }
   62150                   case 0x000000f0: {
   62151                     // 0x032000f0
   62152                     if (((instr & 0xf0000000) == 0xf0000000)) {
   62153                       UnallocatedA32(instr);
   62154                       return;
   62155                     }
   62156                     UnimplementedA32("DBG", instr);
   62157                     break;
   62158                   }
   62159                   default:
   62160                     UnallocatedA32(instr);
   62161                     break;
   62162                 }
   62163                 break;
   62164               }
   62165               default: {
   62166                 if (((instr & 0xf0000000) == 0xf0000000) ||
   62167                     ((instr & 0x4f0000) == 0x0)) {
   62168                   UnallocatedA32(instr);
   62169                   return;
   62170                 }
   62171                 Condition condition((instr >> 28) & 0xf);
   62172                 unsigned spec_reg =
   62173                     ((instr >> 16) & 0xf) | ((instr >> 18) & 0x10);
   62174                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
   62175                 // MSR{<c>}{<q>} <spec_reg>, #<imm> ; A1
   62176                 msr(condition, MaskedSpecialRegister(spec_reg), imm);
   62177                 if (((instr & 0xfb0f000) != 0x320f000)) {
   62178                   UnpredictableA32(instr);
   62179                 }
   62180                 break;
   62181               }
   62182             }
   62183             break;
   62184           }
   62185           case 0x01300000: {
   62186             // 0x03300000
   62187             switch (instr & 0x00400000) {
   62188               case 0x00000000: {
   62189                 // 0x03300000
   62190                 if (((instr & 0xf0000000) == 0xf0000000)) {
   62191                   UnallocatedA32(instr);
   62192                   return;
   62193                 }
   62194                 Condition condition((instr >> 28) & 0xf);
   62195                 unsigned rn = (instr >> 16) & 0xf;
   62196                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
   62197                 // TEQ{<c>}{<q>} <Rn>, #<const> ; A1
   62198                 teq(condition, Register(rn), imm);
   62199                 if (((instr & 0xff0f000) != 0x3300000)) {
   62200                   UnpredictableA32(instr);
   62201                 }
   62202                 break;
   62203               }
   62204               case 0x00400000: {
   62205                 // 0x03700000
   62206                 if (((instr & 0xf0000000) == 0xf0000000)) {
   62207                   UnallocatedA32(instr);
   62208                   return;
   62209                 }
   62210                 Condition condition((instr >> 28) & 0xf);
   62211                 unsigned rn = (instr >> 16) & 0xf;
   62212                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
   62213                 // CMN{<c>}{<q>} <Rn>, #<const> ; A1
   62214                 cmn(condition, Best, Register(rn), imm);
   62215                 if (((instr & 0xff0f000) != 0x3700000)) {
   62216                   UnpredictableA32(instr);
   62217                 }
   62218                 break;
   62219               }
   62220             }
   62221             break;
   62222           }
   62223           case 0x01800000: {
   62224             // 0x03800000
   62225             switch (instr & 0x00400000) {
   62226               case 0x00000000: {
   62227                 // 0x03800000
   62228                 if (((instr & 0xf0000000) == 0xf0000000)) {
   62229                   UnallocatedA32(instr);
   62230                   return;
   62231                 }
   62232                 Condition condition((instr >> 28) & 0xf);
   62233                 unsigned rd = (instr >> 12) & 0xf;
   62234                 unsigned rn = (instr >> 16) & 0xf;
   62235                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
   62236                 // ORR{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
   62237                 orr(condition, Best, Register(rd), Register(rn), imm);
   62238                 break;
   62239               }
   62240               case 0x00400000: {
   62241                 // 0x03c00000
   62242                 if (((instr & 0xf0000000) == 0xf0000000)) {
   62243                   UnallocatedA32(instr);
   62244                   return;
   62245                 }
   62246                 Condition condition((instr >> 28) & 0xf);
   62247                 unsigned rd = (instr >> 12) & 0xf;
   62248                 unsigned rn = (instr >> 16) & 0xf;
   62249                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
   62250                 // BIC{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
   62251                 bic(condition, Best, Register(rd), Register(rn), imm);
   62252                 break;
   62253               }
   62254             }
   62255             break;
   62256           }
   62257           case 0x01900000: {
   62258             // 0x03900000
   62259             switch (instr & 0x00400000) {
   62260               case 0x00000000: {
   62261                 // 0x03900000
   62262                 if (((instr & 0xf0000000) == 0xf0000000)) {
   62263                   UnallocatedA32(instr);
   62264                   return;
   62265                 }
   62266                 Condition condition((instr >> 28) & 0xf);
   62267                 unsigned rd = (instr >> 12) & 0xf;
   62268                 unsigned rn = (instr >> 16) & 0xf;
   62269                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
   62270                 // ORRS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
   62271                 orrs(condition, Best, Register(rd), Register(rn), imm);
   62272                 break;
   62273               }
   62274               case 0x00400000: {
   62275                 // 0x03d00000
   62276                 if (((instr & 0xf0000000) == 0xf0000000)) {
   62277                   UnallocatedA32(instr);
   62278                   return;
   62279                 }
   62280                 Condition condition((instr >> 28) & 0xf);
   62281                 unsigned rd = (instr >> 12) & 0xf;
   62282                 unsigned rn = (instr >> 16) & 0xf;
   62283                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
   62284                 // BICS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
   62285                 bics(condition, Best, Register(rd), Register(rn), imm);
   62286                 break;
   62287               }
   62288             }
   62289             break;
   62290           }
   62291           case 0x01a00000: {
   62292             // 0x03a00000
   62293             switch (instr & 0x00400000) {
   62294               case 0x00000000: {
   62295                 // 0x03a00000
   62296                 if (((instr & 0xf0000000) == 0xf0000000)) {
   62297                   UnallocatedA32(instr);
   62298                   return;
   62299                 }
   62300                 Condition condition((instr >> 28) & 0xf);
   62301                 unsigned rd = (instr >> 12) & 0xf;
   62302                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
   62303                 // MOV{<c>}{<q>} <Rd>, #<const> ; A1
   62304                 mov(condition, Best, Register(rd), imm);
   62305                 if (((instr & 0xfff0000) != 0x3a00000)) {
   62306                   UnpredictableA32(instr);
   62307                 }
   62308                 break;
   62309               }
   62310               case 0x00400000: {
   62311                 // 0x03e00000
   62312                 if (((instr & 0xf0000000) == 0xf0000000)) {
   62313                   UnallocatedA32(instr);
   62314                   return;
   62315                 }
   62316                 Condition condition((instr >> 28) & 0xf);
   62317                 unsigned rd = (instr >> 12) & 0xf;
   62318                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
   62319                 // MVN{<c>}{<q>} <Rd>, #<const> ; A1
   62320                 mvn(condition, Best, Register(rd), imm);
   62321                 if (((instr & 0xfff0000) != 0x3e00000)) {
   62322                   UnpredictableA32(instr);
   62323                 }
   62324                 break;
   62325               }
   62326             }
   62327             break;
   62328           }
   62329           case 0x01b00000: {
   62330             // 0x03b00000
   62331             switch (instr & 0x00400000) {
   62332               case 0x00000000: {
   62333                 // 0x03b00000
   62334                 if (((instr & 0xf0000000) == 0xf0000000)) {
   62335                   UnallocatedA32(instr);
   62336                   return;
   62337                 }
   62338                 Condition condition((instr >> 28) & 0xf);
   62339                 unsigned rd = (instr >> 12) & 0xf;
   62340                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
   62341                 // MOVS{<c>}{<q>} <Rd>, #<const> ; A1
   62342                 movs(condition, Best, Register(rd), imm);
   62343                 if (((instr & 0xfff0000) != 0x3b00000)) {
   62344                   UnpredictableA32(instr);
   62345                 }
   62346                 break;
   62347               }
   62348               case 0x00400000: {
   62349                 // 0x03f00000
   62350                 if (((instr & 0xf0000000) == 0xf0000000)) {
   62351                   UnallocatedA32(instr);
   62352                   return;
   62353                 }
   62354                 Condition condition((instr >> 28) & 0xf);
   62355                 unsigned rd = (instr >> 12) & 0xf;
   62356                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
   62357                 // MVNS{<c>}{<q>} <Rd>, #<const> ; A1
   62358                 mvns(condition, Best, Register(rd), imm);
   62359                 if (((instr & 0xfff0000) != 0x3f00000)) {
   62360                   UnpredictableA32(instr);
   62361                 }
   62362                 break;
   62363               }
   62364             }
   62365             break;
   62366           }
   62367         }
   62368         break;
   62369       }
   62370       case 0x04000000: {
   62371         // 0x04000000
   62372         switch (instr & 0x00500000) {
   62373           case 0x00000000: {
   62374             // 0x04000000
   62375             switch (instr & 0x01200000) {
   62376               case 0x00000000: {
   62377                 // 0x04000000
   62378                 if (((instr & 0xf0000000) == 0xf0000000)) {
   62379                   UnallocatedA32(instr);
   62380                   return;
   62381                 }
   62382                 Condition condition((instr >> 28) & 0xf);
   62383                 unsigned rt = (instr >> 12) & 0xf;
   62384                 unsigned rn = (instr >> 16) & 0xf;
   62385                 Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
   62386                 int32_t offset = instr & 0xfff;
   62387                 // STR{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_3> ; A1
   62388                 str(condition,
   62389                     Best,
   62390                     Register(rt),
   62391                     MemOperand(Register(rn), sign, offset, PostIndex));
   62392                 break;
   62393               }
   62394               case 0x00200000: {
   62395                 // 0x04200000
   62396                 if (((instr & 0xf0000000) == 0xf0000000)) {
   62397                   UnallocatedA32(instr);
   62398                   return;
   62399                 }
   62400                 UnimplementedA32("STRT", instr);
   62401                 break;
   62402               }
   62403               case 0x01000000: {
   62404                 // 0x05000000
   62405                 if (((instr & 0xf0000000) == 0xf0000000)) {
   62406                   UnallocatedA32(instr);
   62407                   return;
   62408                 }
   62409                 Condition condition((instr >> 28) & 0xf);
   62410                 unsigned rt = (instr >> 12) & 0xf;
   62411                 unsigned rn = (instr >> 16) & 0xf;
   62412                 Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
   62413                 int32_t offset = instr & 0xfff;
   62414                 // STR{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_3>}] ; A1
   62415                 str(condition,
   62416                     Best,
   62417                     Register(rt),
   62418                     MemOperand(Register(rn), sign, offset, Offset));
   62419                 break;
   62420               }
   62421               case 0x01200000: {
   62422                 // 0x05200000
   62423                 if (((instr & 0xf0000000) == 0xf0000000)) {
   62424                   UnallocatedA32(instr);
   62425                   return;
   62426                 }
   62427                 if (((Uint32((instr >> 23)) & Uint32(0x1)) == Uint32(0x0)) &&
   62428                     ((Uint32((instr >> 16)) & Uint32(0xf)) == Uint32(0xd)) &&
   62429                     ((Uint32(instr) & Uint32(0xfff)) == Uint32(0x4)) &&
   62430                     ((instr & 0xf0000000) != 0xf0000000)) {
   62431                   Condition condition((instr >> 28) & 0xf);
   62432                   unsigned rt = (instr >> 12) & 0xf;
   62433                   // PUSH{<c>}{<q>} <single_register_list> ; A1
   62434                   push(condition, Best, Register(rt));
   62435                   return;
   62436                 }
   62437                 Condition condition((instr >> 28) & 0xf);
   62438                 unsigned rt = (instr >> 12) & 0xf;
   62439                 unsigned rn = (instr >> 16) & 0xf;
   62440                 Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
   62441                 int32_t offset = instr & 0xfff;
   62442                 // STR{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_3>}]! ; A1
   62443                 str(condition,
   62444                     Best,
   62445                     Register(rt),
   62446                     MemOperand(Register(rn), sign, offset, PreIndex));
   62447                 break;
   62448               }
   62449             }
   62450             break;
   62451           }
   62452           case 0x00100000: {
   62453             // 0x04100000
   62454             switch (instr & 0x01200000) {
   62455               case 0x00000000: {
   62456                 // 0x04100000
   62457                 switch (instr & 0x000f0000) {
   62458                   case 0x000f0000: {
   62459                     // 0x041f0000
   62460                     if (((instr & 0xf0000000) == 0xf0000000) ||
   62461                         ((instr & 0x1200000) == 0x200000)) {
   62462                       UnallocatedA32(instr);
   62463                       return;
   62464                     }
   62465                     Condition condition((instr >> 28) & 0xf);
   62466                     unsigned rt = (instr >> 12) & 0xf;
   62467                     uint32_t U = (instr >> 23) & 0x1;
   62468                     int32_t imm = instr & 0xfff;
   62469                     if (U == 0) imm = -imm;
   62470                     bool minus_zero = (imm == 0) && (U == 0);
   62471                     Location location(imm, kA32PcDelta);
   62472                     // LDR{<c>}{<q>} <Rt>, <label> ; A1
   62473                     if (minus_zero) {
   62474                       ldr(condition,
   62475                           Best,
   62476                           Register(rt),
   62477                           MemOperand(pc, minus, 0));
   62478                     } else {
   62479                       ldr(condition, Best, Register(rt), &location);
   62480                     }
   62481                     if (((instr & 0xf7f0000) != 0x51f0000)) {
   62482                       UnpredictableA32(instr);
   62483                     }
   62484                     break;
   62485                   }
   62486                   default: {
   62487                     if (((instr & 0xf0000000) == 0xf0000000) ||
   62488                         ((instr & 0xf0000) == 0xf0000)) {
   62489                       UnallocatedA32(instr);
   62490                       return;
   62491                     }
   62492                     if (((Uint32((instr >> 23)) & Uint32(0x1)) ==
   62493                          Uint32(0x1)) &&
   62494                         ((Uint32((instr >> 16)) & Uint32(0xf)) ==
   62495                          Uint32(0xd)) &&
   62496                         ((Uint32(instr) & Uint32(0xfff)) == Uint32(0x4)) &&
   62497                         ((instr & 0xf0000000) != 0xf0000000)) {
   62498                       Condition condition((instr >> 28) & 0xf);
   62499                       unsigned rt = (instr >> 12) & 0xf;
   62500                       // POP{<c>}{<q>} <single_register_list> ; A1
   62501                       pop(condition, Best, Register(rt));
   62502                       return;
   62503                     }
   62504                     Condition condition((instr >> 28) & 0xf);
   62505                     unsigned rt = (instr >> 12) & 0xf;
   62506                     unsigned rn = (instr >> 16) & 0xf;
   62507                     Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
   62508                     int32_t offset = instr & 0xfff;
   62509                     // LDR{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_3> ; A1
   62510                     ldr(condition,
   62511                         Best,
   62512                         Register(rt),
   62513                         MemOperand(Register(rn), sign, offset, PostIndex));
   62514                     break;
   62515                   }
   62516                 }
   62517                 break;
   62518               }
   62519               case 0x00200000: {
   62520                 // 0x04300000
   62521                 if (((instr & 0xf0000000) == 0xf0000000)) {
   62522                   UnallocatedA32(instr);
   62523                   return;
   62524                 }
   62525                 UnimplementedA32("LDRT", instr);
   62526                 break;
   62527               }
   62528               case 0x01000000: {
   62529                 // 0x05100000
   62530                 switch (instr & 0x000f0000) {
   62531                   case 0x000f0000: {
   62532                     // 0x051f0000
   62533                     if (((instr & 0xf0000000) == 0xf0000000) ||
   62534                         ((instr & 0x1200000) == 0x200000)) {
   62535                       UnallocatedA32(instr);
   62536                       return;
   62537                     }
   62538                     Condition condition((instr >> 28) & 0xf);
   62539                     unsigned rt = (instr >> 12) & 0xf;
   62540                     uint32_t U = (instr >> 23) & 0x1;
   62541                     int32_t imm = instr & 0xfff;
   62542                     if (U == 0) imm = -imm;
   62543                     bool minus_zero = (imm == 0) && (U == 0);
   62544                     Location location(imm, kA32PcDelta);
   62545                     // LDR{<c>}{<q>} <Rt>, <label> ; A1
   62546                     if (minus_zero) {
   62547                       ldr(condition,
   62548                           Best,
   62549                           Register(rt),
   62550                           MemOperand(pc, minus, 0));
   62551                     } else {
   62552                       ldr(condition, Best, Register(rt), &location);
   62553                     }
   62554                     if (((instr & 0xf7f0000) != 0x51f0000)) {
   62555                       UnpredictableA32(instr);
   62556                     }
   62557                     break;
   62558                   }
   62559                   default: {
   62560                     if (((instr & 0xf0000000) == 0xf0000000) ||
   62561                         ((instr & 0xf0000) == 0xf0000)) {
   62562                       UnallocatedA32(instr);
   62563                       return;
   62564                     }
   62565                     Condition condition((instr >> 28) & 0xf);
   62566                     unsigned rt = (instr >> 12) & 0xf;
   62567                     unsigned rn = (instr >> 16) & 0xf;
   62568                     Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
   62569                     int32_t offset = instr & 0xfff;
   62570                     // LDR{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_3>}] ; A1
   62571                     ldr(condition,
   62572                         Best,
   62573                         Register(rt),
   62574                         MemOperand(Register(rn), sign, offset, Offset));
   62575                     break;
   62576                   }
   62577                 }
   62578                 break;
   62579               }
   62580               case 0x01200000: {
   62581                 // 0x05300000
   62582                 switch (instr & 0x000f0000) {
   62583                   case 0x000f0000: {
   62584                     // 0x053f0000
   62585                     if (((instr & 0xf0000000) == 0xf0000000) ||
   62586                         ((instr & 0x1200000) == 0x200000)) {
   62587                       UnallocatedA32(instr);
   62588                       return;
   62589                     }
   62590                     Condition condition((instr >> 28) & 0xf);
   62591                     unsigned rt = (instr >> 12) & 0xf;
   62592                     uint32_t U = (instr >> 23) & 0x1;
   62593                     int32_t imm = instr & 0xfff;
   62594                     if (U == 0) imm = -imm;
   62595                     bool minus_zero = (imm == 0) && (U == 0);
   62596                     Location location(imm, kA32PcDelta);
   62597                     // LDR{<c>}{<q>} <Rt>, <label> ; A1
   62598                     if (minus_zero) {
   62599                       ldr(condition,
   62600                           Best,
   62601                           Register(rt),
   62602                           MemOperand(pc, minus, 0));
   62603                     } else {
   62604                       ldr(condition, Best, Register(rt), &location);
   62605                     }
   62606                     if (((instr & 0xf7f0000) != 0x51f0000)) {
   62607                       UnpredictableA32(instr);
   62608                     }
   62609                     break;
   62610                   }
   62611                   default: {
   62612                     if (((instr & 0xf0000000) == 0xf0000000) ||
   62613                         ((instr & 0xf0000) == 0xf0000)) {
   62614                       UnallocatedA32(instr);
   62615                       return;
   62616                     }
   62617                     Condition condition((instr >> 28) & 0xf);
   62618                     unsigned rt = (instr >> 12) & 0xf;
   62619                     unsigned rn = (instr >> 16) & 0xf;
   62620                     Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
   62621                     int32_t offset = instr & 0xfff;
   62622                     // LDR{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_3>}]! ; A1
   62623                     ldr(condition,
   62624                         Best,
   62625                         Register(rt),
   62626                         MemOperand(Register(rn), sign, offset, PreIndex));
   62627                     break;
   62628                   }
   62629                 }
   62630                 break;
   62631               }
   62632             }
   62633             break;
   62634           }
   62635           case 0x00400000: {
   62636             // 0x04400000
   62637             switch (instr & 0x01200000) {
   62638               case 0x00000000: {
   62639                 // 0x04400000
   62640                 if (((instr & 0xf0000000) == 0xf0000000)) {
   62641                   UnallocatedA32(instr);
   62642                   return;
   62643                 }
   62644                 Condition condition((instr >> 28) & 0xf);
   62645                 unsigned rt = (instr >> 12) & 0xf;
   62646                 unsigned rn = (instr >> 16) & 0xf;
   62647                 Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
   62648                 int32_t offset = instr & 0xfff;
   62649                 // STRB{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_3> ; A1
   62650                 strb(condition,
   62651                      Best,
   62652                      Register(rt),
   62653                      MemOperand(Register(rn), sign, offset, PostIndex));
   62654                 break;
   62655               }
   62656               case 0x00200000: {
   62657                 // 0x04600000
   62658                 if (((instr & 0xf0000000) == 0xf0000000)) {
   62659                   UnallocatedA32(instr);
   62660                   return;
   62661                 }
   62662                 UnimplementedA32("STRBT", instr);
   62663                 break;
   62664               }
   62665               case 0x01000000: {
   62666                 // 0x05400000
   62667                 if (((instr & 0xf0000000) == 0xf0000000)) {
   62668                   UnallocatedA32(instr);
   62669                   return;
   62670                 }
   62671                 Condition condition((instr >> 28) & 0xf);
   62672                 unsigned rt = (instr >> 12) & 0xf;
   62673                 unsigned rn = (instr >> 16) & 0xf;
   62674                 Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
   62675                 int32_t offset = instr & 0xfff;
   62676                 // STRB{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_3>}] ; A1
   62677                 strb(condition,
   62678                      Best,
   62679                      Register(rt),
   62680                      MemOperand(Register(rn), sign, offset, Offset));
   62681                 break;
   62682               }
   62683               case 0x01200000: {
   62684                 // 0x05600000
   62685                 if (((instr & 0xf0000000) == 0xf0000000)) {
   62686                   UnallocatedA32(instr);
   62687                   return;
   62688                 }
   62689                 Condition condition((instr >> 28) & 0xf);
   62690                 unsigned rt = (instr >> 12) & 0xf;
   62691                 unsigned rn = (instr >> 16) & 0xf;
   62692                 Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
   62693                 int32_t offset = instr & 0xfff;
   62694                 // STRB{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_3>}]! ; A1
   62695                 strb(condition,
   62696                      Best,
   62697                      Register(rt),
   62698                      MemOperand(Register(rn), sign, offset, PreIndex));
   62699                 break;
   62700               }
   62701             }
   62702             break;
   62703           }
   62704           case 0x00500000: {
   62705             // 0x04500000
   62706             switch (instr & 0x01200000) {
   62707               case 0x00000000: {
   62708                 // 0x04500000
   62709                 switch (instr & 0x000f0000) {
   62710                   case 0x000f0000: {
   62711                     // 0x045f0000
   62712                     if (((instr & 0xf0000000) == 0xf0000000) ||
   62713                         ((instr & 0x1200000) == 0x200000)) {
   62714                       UnallocatedA32(instr);
   62715                       return;
   62716                     }
   62717                     Condition condition((instr >> 28) & 0xf);
   62718                     unsigned rt = (instr >> 12) & 0xf;
   62719                     uint32_t U = (instr >> 23) & 0x1;
   62720                     int32_t imm = instr & 0xfff;
   62721                     if (U == 0) imm = -imm;
   62722                     bool minus_zero = (imm == 0) && (U == 0);
   62723                     Location location(imm, kA32PcDelta);
   62724                     // LDRB{<c>}{<q>} <Rt>, <label> ; A1
   62725                     if (minus_zero) {
   62726                       ldrb(condition,
   62727                            Best,
   62728                            Register(rt),
   62729                            MemOperand(pc, minus, 0));
   62730                     } else {
   62731                       ldrb(condition, Register(rt), &location);
   62732                     }
   62733                     if (((instr & 0xf7f0000) != 0x55f0000)) {
   62734                       UnpredictableA32(instr);
   62735                     }
   62736                     break;
   62737                   }
   62738                   default: {
   62739                     if (((instr & 0xf0000000) == 0xf0000000) ||
   62740                         ((instr & 0xf0000) == 0xf0000)) {
   62741                       UnallocatedA32(instr);
   62742                       return;
   62743                     }
   62744                     Condition condition((instr >> 28) & 0xf);
   62745                     unsigned rt = (instr >> 12) & 0xf;
   62746                     unsigned rn = (instr >> 16) & 0xf;
   62747                     Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
   62748                     int32_t offset = instr & 0xfff;
   62749                     // LDRB{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_3> ; A1
   62750                     ldrb(condition,
   62751                          Best,
   62752                          Register(rt),
   62753                          MemOperand(Register(rn), sign, offset, PostIndex));
   62754                     break;
   62755                   }
   62756                 }
   62757                 break;
   62758               }
   62759               case 0x00200000: {
   62760                 // 0x04700000
   62761                 if (((instr & 0xf0000000) == 0xf0000000)) {
   62762                   UnallocatedA32(instr);
   62763                   return;
   62764                 }
   62765                 UnimplementedA32("LDRBT", instr);
   62766                 break;
   62767               }
   62768               case 0x01000000: {
   62769                 // 0x05500000
   62770                 switch (instr & 0x000f0000) {
   62771                   case 0x000f0000: {
   62772                     // 0x055f0000
   62773                     if (((instr & 0xf0000000) == 0xf0000000) ||
   62774                         ((instr & 0x1200000) == 0x200000)) {
   62775                       UnallocatedA32(instr);
   62776                       return;
   62777                     }
   62778                     Condition condition((instr >> 28) & 0xf);
   62779                     unsigned rt = (instr >> 12) & 0xf;
   62780                     uint32_t U = (instr >> 23) & 0x1;
   62781                     int32_t imm = instr & 0xfff;
   62782                     if (U == 0) imm = -imm;
   62783                     bool minus_zero = (imm == 0) && (U == 0);
   62784                     Location location(imm, kA32PcDelta);
   62785                     // LDRB{<c>}{<q>} <Rt>, <label> ; A1
   62786                     if (minus_zero) {
   62787                       ldrb(condition,
   62788                            Best,
   62789                            Register(rt),
   62790                            MemOperand(pc, minus, 0));
   62791                     } else {
   62792                       ldrb(condition, Register(rt), &location);
   62793                     }
   62794                     if (((instr & 0xf7f0000) != 0x55f0000)) {
   62795                       UnpredictableA32(instr);
   62796                     }
   62797                     break;
   62798                   }
   62799                   default: {
   62800                     if (((instr & 0xf0000000) == 0xf0000000) ||
   62801                         ((instr & 0xf0000) == 0xf0000)) {
   62802                       UnallocatedA32(instr);
   62803                       return;
   62804                     }
   62805                     Condition condition((instr >> 28) & 0xf);
   62806                     unsigned rt = (instr >> 12) & 0xf;
   62807                     unsigned rn = (instr >> 16) & 0xf;
   62808                     Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
   62809                     int32_t offset = instr & 0xfff;
   62810                     // LDRB{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_3>}] ; A1
   62811                     ldrb(condition,
   62812                          Best,
   62813                          Register(rt),
   62814                          MemOperand(Register(rn), sign, offset, Offset));
   62815                     break;
   62816                   }
   62817                 }
   62818                 break;
   62819               }
   62820               case 0x01200000: {
   62821                 // 0x05700000
   62822                 switch (instr & 0x000f0000) {
   62823                   case 0x000f0000: {
   62824                     // 0x057f0000
   62825                     if (((instr & 0xf0000000) == 0xf0000000) ||
   62826                         ((instr & 0x1200000) == 0x200000)) {
   62827                       UnallocatedA32(instr);
   62828                       return;
   62829                     }
   62830                     Condition condition((instr >> 28) & 0xf);
   62831                     unsigned rt = (instr >> 12) & 0xf;
   62832                     uint32_t U = (instr >> 23) & 0x1;
   62833                     int32_t imm = instr & 0xfff;
   62834                     if (U == 0) imm = -imm;
   62835                     bool minus_zero = (imm == 0) && (U == 0);
   62836                     Location location(imm, kA32PcDelta);
   62837                     // LDRB{<c>}{<q>} <Rt>, <label> ; A1
   62838                     if (minus_zero) {
   62839                       ldrb(condition,
   62840                            Best,
   62841                            Register(rt),
   62842                            MemOperand(pc, minus, 0));
   62843                     } else {
   62844                       ldrb(condition, Register(rt), &location);
   62845                     }
   62846                     if (((instr & 0xf7f0000) != 0x55f0000)) {
   62847                       UnpredictableA32(instr);
   62848                     }
   62849                     break;
   62850                   }
   62851                   default: {
   62852                     if (((instr & 0xf0000000) == 0xf0000000) ||
   62853                         ((instr & 0xf0000) == 0xf0000)) {
   62854                       UnallocatedA32(instr);
   62855                       return;
   62856                     }
   62857                     Condition condition((instr >> 28) & 0xf);
   62858                     unsigned rt = (instr >> 12) & 0xf;
   62859                     unsigned rn = (instr >> 16) & 0xf;
   62860                     Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
   62861                     int32_t offset = instr & 0xfff;
   62862                     // LDRB{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_3>}]! ; A1
   62863                     ldrb(condition,
   62864                          Best,
   62865                          Register(rt),
   62866                          MemOperand(Register(rn), sign, offset, PreIndex));
   62867                     break;
   62868                   }
   62869                 }
   62870                 break;
   62871               }
   62872             }
   62873             break;
   62874           }
   62875         }
   62876         break;
   62877       }
   62878       case 0x06000000: {
   62879         // 0x06000000
   62880         switch (instr & 0x01600010) {
   62881           case 0x00000000: {
   62882             // 0x06000000
   62883             switch (instr & 0x00100000) {
   62884               case 0x00000000: {
   62885                 // 0x06000000
   62886                 if (((instr & 0xf0000000) == 0xf0000000)) {
   62887                   UnallocatedA32(instr);
   62888                   return;
   62889                 }
   62890                 Condition condition((instr >> 28) & 0xf);
   62891                 unsigned rt = (instr >> 12) & 0xf;
   62892                 unsigned rn = (instr >> 16) & 0xf;
   62893                 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
   62894                 unsigned rm = instr & 0xf;
   62895                 uint32_t imm_and_type_ = ((instr >> 5) & 0x7f);
   62896                 ImmediateShiftOperand shift_operand(imm_and_type_ & 0x3,
   62897                                                     (imm_and_type_ & 0x7c) >>
   62898                                                         2);
   62899                 Shift shift = shift_operand.GetShift();
   62900                 uint32_t amount = shift_operand.GetAmount();
   62901                 // STR{<c>}{<q>} <Rt>, [<Rn>], {+/-}<Rm>{, <shift>} ; A1
   62902                 str(condition,
   62903                     Best,
   62904                     Register(rt),
   62905                     MemOperand(Register(rn),
   62906                                sign,
   62907                                Register(rm),
   62908                                shift,
   62909                                amount,
   62910                                PostIndex));
   62911                 break;
   62912               }
   62913               case 0x00100000: {
   62914                 // 0x06100000
   62915                 if (((instr & 0xf0000000) == 0xf0000000)) {
   62916                   UnallocatedA32(instr);
   62917                   return;
   62918                 }
   62919                 Condition condition((instr >> 28) & 0xf);
   62920                 unsigned rt = (instr >> 12) & 0xf;
   62921                 unsigned rn = (instr >> 16) & 0xf;
   62922                 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
   62923                 unsigned rm = instr & 0xf;
   62924                 uint32_t imm_and_type_ = ((instr >> 5) & 0x7f);
   62925                 ImmediateShiftOperand shift_operand(imm_and_type_ & 0x3,
   62926                                                     (imm_and_type_ & 0x7c) >>
   62927                                                         2);
   62928                 Shift shift = shift_operand.GetShift();
   62929                 uint32_t amount = shift_operand.GetAmount();
   62930                 // LDR{<c>}{<q>} <Rt>, [<Rn>], {+/-}<Rm>{, <shift>} ; A1
   62931                 ldr(condition,
   62932                     Best,
   62933                     Register(rt),
   62934                     MemOperand(Register(rn),
   62935                                sign,
   62936                                Register(rm),
   62937                                shift,
   62938                                amount,
   62939                                PostIndex));
   62940                 break;
   62941               }
   62942             }
   62943             break;
   62944           }
   62945           case 0x00000010: {
   62946             // 0x06000010
   62947             switch (instr & 0x00900060) {
   62948               case 0x00100000: {
   62949                 // 0x06100010
   62950                 switch (instr & 0x00000080) {
   62951                   case 0x00000000: {
   62952                     // 0x06100010
   62953                     if (((instr & 0xf0000000) == 0xf0000000)) {
   62954                       UnallocatedA32(instr);
   62955                       return;
   62956                     }
   62957                     Condition condition((instr >> 28) & 0xf);
   62958                     unsigned rd = (instr >> 12) & 0xf;
   62959                     unsigned rn = (instr >> 16) & 0xf;
   62960                     unsigned rm = instr & 0xf;
   62961                     // SADD16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
   62962                     sadd16(condition, Register(rd), Register(rn), Register(rm));
   62963                     if (((instr & 0xff00ff0) != 0x6100f10)) {
   62964                       UnpredictableA32(instr);
   62965                     }
   62966                     break;
   62967                   }
   62968                   case 0x00000080: {
   62969                     // 0x06100090
   62970                     if (((instr & 0xf0000000) == 0xf0000000)) {
   62971                       UnallocatedA32(instr);
   62972                       return;
   62973                     }
   62974                     Condition condition((instr >> 28) & 0xf);
   62975                     unsigned rd = (instr >> 12) & 0xf;
   62976                     unsigned rn = (instr >> 16) & 0xf;
   62977                     unsigned rm = instr & 0xf;
   62978                     // SADD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
   62979                     sadd8(condition, Register(rd), Register(rn), Register(rm));
   62980                     if (((instr & 0xff00ff0) != 0x6100f90)) {
   62981                       UnpredictableA32(instr);
   62982                     }
   62983                     break;
   62984                   }
   62985                 }
   62986                 break;
   62987               }
   62988               case 0x00100020: {
   62989                 // 0x06100030
   62990                 if ((instr & 0x00000080) == 0x00000000) {
   62991                   if (((instr & 0xf0000000) == 0xf0000000)) {
   62992                     UnallocatedA32(instr);
   62993                     return;
   62994                   }
   62995                   Condition condition((instr >> 28) & 0xf);
   62996                   unsigned rd = (instr >> 12) & 0xf;
   62997                   unsigned rn = (instr >> 16) & 0xf;
   62998                   unsigned rm = instr & 0xf;
   62999                   // SASX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
   63000                   sasx(condition, Register(rd), Register(rn), Register(rm));
   63001                   if (((instr & 0xff00ff0) != 0x6100f30)) {
   63002                     UnpredictableA32(instr);
   63003                   }
   63004                 } else {
   63005                   UnallocatedA32(instr);
   63006                 }
   63007                 break;
   63008               }
   63009               case 0x00100040: {
   63010                 // 0x06100050
   63011                 if ((instr & 0x00000080) == 0x00000000) {
   63012                   if (((instr & 0xf0000000) == 0xf0000000)) {
   63013                     UnallocatedA32(instr);
   63014                     return;
   63015                   }
   63016                   Condition condition((instr >> 28) & 0xf);
   63017                   unsigned rd = (instr >> 12) & 0xf;
   63018                   unsigned rn = (instr >> 16) & 0xf;
   63019                   unsigned rm = instr & 0xf;
   63020                   // SSAX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
   63021                   ssax(condition, Register(rd), Register(rn), Register(rm));
   63022                   if (((instr & 0xff00ff0) != 0x6100f50)) {
   63023                     UnpredictableA32(instr);
   63024                   }
   63025                 } else {
   63026                   UnallocatedA32(instr);
   63027                 }
   63028                 break;
   63029               }
   63030               case 0x00100060: {
   63031                 // 0x06100070
   63032                 switch (instr & 0x00000080) {
   63033                   case 0x00000000: {
   63034                     // 0x06100070
   63035                     if (((instr & 0xf0000000) == 0xf0000000)) {
   63036                       UnallocatedA32(instr);
   63037                       return;
   63038                     }
   63039                     Condition condition((instr >> 28) & 0xf);
   63040                     unsigned rd = (instr >> 12) & 0xf;
   63041                     unsigned rn = (instr >> 16) & 0xf;
   63042                     unsigned rm = instr & 0xf;
   63043                     // SSUB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
   63044                     ssub16(condition, Register(rd), Register(rn), Register(rm));
   63045                     if (((instr & 0xff00ff0) != 0x6100f70)) {
   63046                       UnpredictableA32(instr);
   63047                     }
   63048                     break;
   63049                   }
   63050                   case 0x00000080: {
   63051                     // 0x061000f0
   63052                     if (((instr & 0xf0000000) == 0xf0000000)) {
   63053                       UnallocatedA32(instr);
   63054                       return;
   63055                     }
   63056                     Condition condition((instr >> 28) & 0xf);
   63057                     unsigned rd = (instr >> 12) & 0xf;
   63058                     unsigned rn = (instr >> 16) & 0xf;
   63059                     unsigned rm = instr & 0xf;
   63060                     // SSUB8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
   63061                     ssub8(condition, Register(rd), Register(rn), Register(rm));
   63062                     if (((instr & 0xff00ff0) != 0x6100ff0)) {
   63063                       UnpredictableA32(instr);
   63064                     }
   63065                     break;
   63066                   }
   63067                 }
   63068                 break;
   63069               }
   63070               case 0x00800000: {
   63071                 // 0x06800010
   63072                 if (((instr & 0xf0000000) == 0xf0000000)) {
   63073                   UnallocatedA32(instr);
   63074                   return;
   63075                 }
   63076                 Condition condition((instr >> 28) & 0xf);
   63077                 unsigned rd = (instr >> 12) & 0xf;
   63078                 unsigned rn = (instr >> 16) & 0xf;
   63079                 unsigned rm = instr & 0xf;
   63080                 uint32_t amount = (instr >> 7) & 0x1f;
   63081                 // PKHBT{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, LSL #<imm> } ; A1
   63082                 pkhbt(condition,
   63083                       Register(rd),
   63084                       Register(rn),
   63085                       Operand(Register(rm), LSL, amount));
   63086                 break;
   63087               }
   63088               case 0x00800020: {
   63089                 // 0x06800030
   63090                 if ((instr & 0x00000080) == 0x00000080) {
   63091                   if (((instr & 0xf0000000) == 0xf0000000)) {
   63092                     UnallocatedA32(instr);
   63093                     return;
   63094                   }
   63095                   Condition condition((instr >> 28) & 0xf);
   63096                   unsigned rd = (instr >> 12) & 0xf;
   63097                   unsigned rn = (instr >> 16) & 0xf;
   63098                   unsigned rm = instr & 0xf;
   63099                   // SEL{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
   63100                   sel(condition, Register(rd), Register(rn), Register(rm));
   63101                   if (((instr & 0xff00ff0) != 0x6800fb0)) {
   63102                     UnpredictableA32(instr);
   63103                   }
   63104                 } else {
   63105                   UnallocatedA32(instr);
   63106                 }
   63107                 break;
   63108               }
   63109               case 0x00800040: {
   63110                 // 0x06800050
   63111                 if (((instr & 0xf0000000) == 0xf0000000)) {
   63112                   UnallocatedA32(instr);
   63113                   return;
   63114                 }
   63115                 Condition condition((instr >> 28) & 0xf);
   63116                 unsigned rd = (instr >> 12) & 0xf;
   63117                 unsigned rn = (instr >> 16) & 0xf;
   63118                 unsigned rm = instr & 0xf;
   63119                 uint32_t amount = (instr >> 7) & 0x1f;
   63120                 if (amount == 0) amount = 32;
   63121                 // PKHTB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ASR #<imm> } ; A1
   63122                 pkhtb(condition,
   63123                       Register(rd),
   63124                       Register(rn),
   63125                       Operand(Register(rm), ASR, amount));
   63126                 break;
   63127               }
   63128               case 0x00800060: {
   63129                 // 0x06800070
   63130                 switch (instr & 0x00000080) {
   63131                   case 0x00000000: {
   63132                     // 0x06800070
   63133                     switch (instr & 0x000f0000) {
   63134                       case 0x000f0000: {
   63135                         // 0x068f0070
   63136                         if (((instr & 0xf0000000) == 0xf0000000)) {
   63137                           UnallocatedA32(instr);
   63138                           return;
   63139                         }
   63140                         Condition condition((instr >> 28) & 0xf);
   63141                         unsigned rd = (instr >> 12) & 0xf;
   63142                         unsigned rm = instr & 0xf;
   63143                         uint32_t amount = ((instr >> 10) & 0x3) * 8;
   63144                         // SXTB16{<c>}{<q>} {<Rd>}, <Rm> {, ROR #<amount> } ; A1
   63145                         sxtb16(condition,
   63146                                Register(rd),
   63147                                Operand(Register(rm), ROR, amount));
   63148                         if (((instr & 0xfff03f0) != 0x68f0070)) {
   63149                           UnpredictableA32(instr);
   63150                         }
   63151                         break;
   63152                       }
   63153                       default: {
   63154                         if (((instr & 0xf0000000) == 0xf0000000) ||
   63155                             ((instr & 0xf0000) == 0xf0000)) {
   63156                           UnallocatedA32(instr);
   63157                           return;
   63158                         }
   63159                         Condition condition((instr >> 28) & 0xf);
   63160                         unsigned rd = (instr >> 12) & 0xf;
   63161                         unsigned rn = (instr >> 16) & 0xf;
   63162                         unsigned rm = instr & 0xf;
   63163                         uint32_t amount = ((instr >> 10) & 0x3) * 8;
   63164                         // SXTAB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ROR #<amount> } ; A1 NOLINT(whitespace/line_length)
   63165                         sxtab16(condition,
   63166                                 Register(rd),
   63167                                 Register(rn),
   63168                                 Operand(Register(rm), ROR, amount));
   63169                         if (((instr & 0xff003f0) != 0x6800070)) {
   63170                           UnpredictableA32(instr);
   63171                         }
   63172                         break;
   63173                       }
   63174                     }
   63175                     break;
   63176                   }
   63177                   default:
   63178                     UnallocatedA32(instr);
   63179                     break;
   63180                 }
   63181                 break;
   63182               }
   63183               default:
   63184                 UnallocatedA32(instr);
   63185                 break;
   63186             }
   63187             break;
   63188           }
   63189           case 0x00200000: {
   63190             // 0x06200000
   63191             switch (instr & 0x00100000) {
   63192               case 0x00000000: {
   63193                 // 0x06200000
   63194                 if (((instr & 0xf0000000) == 0xf0000000)) {
   63195                   UnallocatedA32(instr);
   63196                   return;
   63197                 }
   63198                 UnimplementedA32("STRT", instr);
   63199                 break;
   63200               }
   63201               case 0x00100000: {
   63202                 // 0x06300000
   63203                 if (((instr & 0xf0000000) == 0xf0000000)) {
   63204                   UnallocatedA32(instr);
   63205                   return;
   63206                 }
   63207                 UnimplementedA32("LDRT", instr);
   63208                 break;
   63209               }
   63210             }
   63211             break;
   63212           }
   63213           case 0x00200010: {
   63214             // 0x06200010
   63215             switch (instr & 0x00800060) {
   63216               case 0x00000000: {
   63217                 // 0x06200010
   63218                 switch (instr & 0x00100080) {
   63219                   case 0x00000000: {
   63220                     // 0x06200010
   63221                     if (((instr & 0xf0000000) == 0xf0000000)) {
   63222                       UnallocatedA32(instr);
   63223                       return;
   63224                     }
   63225                     Condition condition((instr >> 28) & 0xf);
   63226                     unsigned rd = (instr >> 12) & 0xf;
   63227                     unsigned rn = (instr >> 16) & 0xf;
   63228                     unsigned rm = instr & 0xf;
   63229                     // QADD16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
   63230                     qadd16(condition, Register(rd), Register(rn), Register(rm));
   63231                     if (((instr & 0xff00ff0) != 0x6200f10)) {
   63232                       UnpredictableA32(instr);
   63233                     }
   63234                     break;
   63235                   }
   63236                   case 0x00000080: {
   63237                     // 0x06200090
   63238                     if (((instr & 0xf0000000) == 0xf0000000)) {
   63239                       UnallocatedA32(instr);
   63240                       return;
   63241                     }
   63242                     Condition condition((instr >> 28) & 0xf);
   63243                     unsigned rd = (instr >> 12) & 0xf;
   63244                     unsigned rn = (instr >> 16) & 0xf;
   63245                     unsigned rm = instr & 0xf;
   63246                     // QADD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
   63247                     qadd8(condition, Register(rd), Register(rn), Register(rm));
   63248                     if (((instr & 0xff00ff0) != 0x6200f90)) {
   63249                       UnpredictableA32(instr);
   63250                     }
   63251                     break;
   63252                   }
   63253                   case 0x00100000: {
   63254                     // 0x06300010
   63255                     if (((instr & 0xf0000000) == 0xf0000000)) {
   63256                       UnallocatedA32(instr);
   63257                       return;
   63258                     }
   63259                     Condition condition((instr >> 28) & 0xf);
   63260                     unsigned rd = (instr >> 12) & 0xf;
   63261                     unsigned rn = (instr >> 16) & 0xf;
   63262                     unsigned rm = instr & 0xf;
   63263                     // SHADD16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
   63264                     shadd16(condition,
   63265                             Register(rd),
   63266                             Register(rn),
   63267                             Register(rm));
   63268                     if (((instr & 0xff00ff0) != 0x6300f10)) {
   63269                       UnpredictableA32(instr);
   63270                     }
   63271                     break;
   63272                   }
   63273                   case 0x00100080: {
   63274                     // 0x06300090
   63275                     if (((instr & 0xf0000000) == 0xf0000000)) {
   63276                       UnallocatedA32(instr);
   63277                       return;
   63278                     }
   63279                     Condition condition((instr >> 28) & 0xf);
   63280                     unsigned rd = (instr >> 12) & 0xf;
   63281                     unsigned rn = (instr >> 16) & 0xf;
   63282                     unsigned rm = instr & 0xf;
   63283                     // SHADD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
   63284                     shadd8(condition, Register(rd), Register(rn), Register(rm));
   63285                     if (((instr & 0xff00ff0) != 0x6300f90)) {
   63286                       UnpredictableA32(instr);
   63287                     }
   63288                     break;
   63289                   }
   63290                 }
   63291                 break;
   63292               }
   63293               case 0x00000020: {
   63294                 // 0x06200030
   63295                 switch (instr & 0x00100080) {
   63296                   case 0x00000000: {
   63297                     // 0x06200030
   63298                     if (((instr & 0xf0000000) == 0xf0000000)) {
   63299                       UnallocatedA32(instr);
   63300                       return;
   63301                     }
   63302                     Condition condition((instr >> 28) & 0xf);
   63303                     unsigned rd = (instr >> 12) & 0xf;
   63304                     unsigned rn = (instr >> 16) & 0xf;
   63305                     unsigned rm = instr & 0xf;
   63306                     // QASX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
   63307                     qasx(condition, Register(rd), Register(rn), Register(rm));
   63308                     if (((instr & 0xff00ff0) != 0x6200f30)) {
   63309                       UnpredictableA32(instr);
   63310                     }
   63311                     break;
   63312                   }
   63313                   case 0x00100000: {
   63314                     // 0x06300030
   63315                     if (((instr & 0xf0000000) == 0xf0000000)) {
   63316                       UnallocatedA32(instr);
   63317                       return;
   63318                     }
   63319                     Condition condition((instr >> 28) & 0xf);
   63320                     unsigned rd = (instr >> 12) & 0xf;
   63321                     unsigned rn = (instr >> 16) & 0xf;
   63322                     unsigned rm = instr & 0xf;
   63323                     // SHASX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
   63324                     shasx(condition, Register(rd), Register(rn), Register(rm));
   63325                     if (((instr & 0xff00ff0) != 0x6300f30)) {
   63326                       UnpredictableA32(instr);
   63327                     }
   63328                     break;
   63329                   }
   63330                   default:
   63331                     UnallocatedA32(instr);
   63332                     break;
   63333                 }
   63334                 break;
   63335               }
   63336               case 0x00000040: {
   63337                 // 0x06200050
   63338                 switch (instr & 0x00100080) {
   63339                   case 0x00000000: {
   63340                     // 0x06200050
   63341                     if (((instr & 0xf0000000) == 0xf0000000)) {
   63342                       UnallocatedA32(instr);
   63343                       return;
   63344                     }
   63345                     Condition condition((instr >> 28) & 0xf);
   63346                     unsigned rd = (instr >> 12) & 0xf;
   63347                     unsigned rn = (instr >> 16) & 0xf;
   63348                     unsigned rm = instr & 0xf;
   63349                     // QSAX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
   63350                     qsax(condition, Register(rd), Register(rn), Register(rm));
   63351                     if (((instr & 0xff00ff0) != 0x6200f50)) {
   63352                       UnpredictableA32(instr);
   63353                     }
   63354                     break;
   63355                   }
   63356                   case 0x00100000: {
   63357                     // 0x06300050
   63358                     if (((instr & 0xf0000000) == 0xf0000000)) {
   63359                       UnallocatedA32(instr);
   63360                       return;
   63361                     }
   63362                     Condition condition((instr >> 28) & 0xf);
   63363                     unsigned rd = (instr >> 12) & 0xf;
   63364                     unsigned rn = (instr >> 16) & 0xf;
   63365                     unsigned rm = instr & 0xf;
   63366                     // SHSAX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
   63367                     shsax(condition, Register(rd), Register(rn), Register(rm));
   63368                     if (((instr & 0xff00ff0) != 0x6300f50)) {
   63369                       UnpredictableA32(instr);
   63370                     }
   63371                     break;
   63372                   }
   63373                   default:
   63374                     UnallocatedA32(instr);
   63375                     break;
   63376                 }
   63377                 break;
   63378               }
   63379               case 0x00000060: {
   63380                 // 0x06200070
   63381                 switch (instr & 0x00100080) {
   63382                   case 0x00000000: {
   63383                     // 0x06200070
   63384                     if (((instr & 0xf0000000) == 0xf0000000)) {
   63385                       UnallocatedA32(instr);
   63386                       return;
   63387                     }
   63388                     Condition condition((instr >> 28) & 0xf);
   63389                     unsigned rd = (instr >> 12) & 0xf;
   63390                     unsigned rn = (instr >> 16) & 0xf;
   63391                     unsigned rm = instr & 0xf;
   63392                     // QSUB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
   63393                     qsub16(condition, Register(rd), Register(rn), Register(rm));
   63394                     if (((instr & 0xff00ff0) != 0x6200f70)) {
   63395                       UnpredictableA32(instr);
   63396                     }
   63397                     break;
   63398                   }
   63399                   case 0x00000080: {
   63400                     // 0x062000f0
   63401                     if (((instr & 0xf0000000) == 0xf0000000)) {
   63402                       UnallocatedA32(instr);
   63403                       return;
   63404                     }
   63405                     Condition condition((instr >> 28) & 0xf);
   63406                     unsigned rd = (instr >> 12) & 0xf;
   63407                     unsigned rn = (instr >> 16) & 0xf;
   63408                     unsigned rm = instr & 0xf;
   63409                     // QSUB8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
   63410                     qsub8(condition, Register(rd), Register(rn), Register(rm));
   63411                     if (((instr & 0xff00ff0) != 0x6200ff0)) {
   63412                       UnpredictableA32(instr);
   63413                     }
   63414                     break;
   63415                   }
   63416                   case 0x00100000: {
   63417                     // 0x06300070
   63418                     if (((instr & 0xf0000000) == 0xf0000000)) {
   63419                       UnallocatedA32(instr);
   63420                       return;
   63421                     }
   63422                     Condition condition((instr >> 28) & 0xf);
   63423                     unsigned rd = (instr >> 12) & 0xf;
   63424                     unsigned rn = (instr >> 16) & 0xf;
   63425                     unsigned rm = instr & 0xf;
   63426                     // SHSUB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
   63427                     shsub16(condition,
   63428                             Register(rd),
   63429                             Register(rn),
   63430                             Register(rm));
   63431                     if (((instr & 0xff00ff0) != 0x6300f70)) {
   63432                       UnpredictableA32(instr);
   63433                     }
   63434                     break;
   63435                   }
   63436                   case 0x00100080: {
   63437                     // 0x063000f0
   63438                     if (((instr & 0xf0000000) == 0xf0000000)) {
   63439                       UnallocatedA32(instr);
   63440                       return;
   63441                     }
   63442                     Condition condition((instr >> 28) & 0xf);
   63443                     unsigned rd = (instr >> 12) & 0xf;
   63444                     unsigned rn = (instr >> 16) & 0xf;
   63445                     unsigned rm = instr & 0xf;
   63446                     // SHSUB8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
   63447                     shsub8(condition, Register(rd), Register(rn), Register(rm));
   63448                     if (((instr & 0xff00ff0) != 0x6300ff0)) {
   63449                       UnpredictableA32(instr);
   63450                     }
   63451                     break;
   63452                   }
   63453                 }
   63454                 break;
   63455               }
   63456               case 0x00800000: {
   63457                 // 0x06a00010
   63458                 if (((instr & 0xf0000000) == 0xf0000000)) {
   63459                   UnallocatedA32(instr);
   63460                   return;
   63461                 }
   63462                 Condition condition((instr >> 28) & 0xf);
   63463                 unsigned rd = (instr >> 12) & 0xf;
   63464                 uint32_t imm = ((instr >> 16) & 0x1f) + 1;
   63465                 unsigned rn = instr & 0xf;
   63466                 uint32_t amount = (instr >> 7) & 0x1f;
   63467                 // SSAT{<c>}{<q>} <Rd>, #<imm>, <Rn> {, LSL #<amount> } ; A1
   63468                 ssat(condition,
   63469                      Register(rd),
   63470                      imm,
   63471                      Operand(Register(rn), LSL, amount));
   63472                 break;
   63473               }
   63474               case 0x00800020: {
   63475                 // 0x06a00030
   63476                 switch (instr & 0x00100080) {
   63477                   case 0x00000000: {
   63478                     // 0x06a00030
   63479                     if (((instr & 0xf0000000) == 0xf0000000)) {
   63480                       UnallocatedA32(instr);
   63481                       return;
   63482                     }
   63483                     Condition condition((instr >> 28) & 0xf);
   63484                     unsigned rd = (instr >> 12) & 0xf;
   63485                     uint32_t imm = ((instr >> 16) & 0xf) + 1;
   63486                     unsigned rn = instr & 0xf;
   63487                     // SSAT16{<c>}{<q>} <Rd>, #<imm>, <Rn> ; A1
   63488                     ssat16(condition, Register(rd), imm, Register(rn));
   63489                     if (((instr & 0xff00ff0) != 0x6a00f30)) {
   63490                       UnpredictableA32(instr);
   63491                     }
   63492                     break;
   63493                   }
   63494                   case 0x00100000: {
   63495                     // 0x06b00030
   63496                     if (((instr & 0xf0000000) == 0xf0000000)) {
   63497                       UnallocatedA32(instr);
   63498                       return;
   63499                     }
   63500                     Condition condition((instr >> 28) & 0xf);
   63501                     unsigned rd = (instr >> 12) & 0xf;
   63502                     unsigned rm = instr & 0xf;
   63503                     // REV{<c>}{<q>} <Rd>, <Rm> ; A1
   63504                     rev(condition, Best, Register(rd), Register(rm));
   63505                     if (((instr & 0xfff0ff0) != 0x6bf0f30)) {
   63506                       UnpredictableA32(instr);
   63507                     }
   63508                     break;
   63509                   }
   63510                   case 0x00100080: {
   63511                     // 0x06b000b0
   63512                     if (((instr & 0xf0000000) == 0xf0000000)) {
   63513                       UnallocatedA32(instr);
   63514                       return;
   63515                     }
   63516                     Condition condition((instr >> 28) & 0xf);
   63517                     unsigned rd = (instr >> 12) & 0xf;
   63518                     unsigned rm = instr & 0xf;
   63519                     // REV16{<c>}{<q>} <Rd>, <Rm> ; A1
   63520                     rev16(condition, Best, Register(rd), Register(rm));
   63521                     if (((instr & 0xfff0ff0) != 0x6bf0fb0)) {
   63522                       UnpredictableA32(instr);
   63523                     }
   63524                     break;
   63525                   }
   63526                   default:
   63527                     UnallocatedA32(instr);
   63528                     break;
   63529                 }
   63530                 break;
   63531               }
   63532               case 0x00800040: {
   63533                 // 0x06a00050
   63534                 if (((instr & 0xf0000000) == 0xf0000000)) {
   63535                   UnallocatedA32(instr);
   63536                   return;
   63537                 }
   63538                 Condition condition((instr >> 28) & 0xf);
   63539                 unsigned rd = (instr >> 12) & 0xf;
   63540                 uint32_t imm = ((instr >> 16) & 0x1f) + 1;
   63541                 unsigned rn = instr & 0xf;
   63542                 uint32_t amount = (instr >> 7) & 0x1f;
   63543                 if (amount == 0) amount = 32;
   63544                 // SSAT{<c>}{<q>} <Rd>, #<imm>, <Rn>, ASR #<amount> ; A1
   63545                 ssat(condition,
   63546                      Register(rd),
   63547                      imm,
   63548                      Operand(Register(rn), ASR, amount));
   63549                 break;
   63550               }
   63551               case 0x00800060: {
   63552                 // 0x06a00070
   63553                 switch (instr & 0x00100080) {
   63554                   case 0x00000000: {
   63555                     // 0x06a00070
   63556                     switch (instr & 0x000f0000) {
   63557                       case 0x000f0000: {
   63558                         // 0x06af0070
   63559                         if (((instr & 0xf0000000) == 0xf0000000)) {
   63560                           UnallocatedA32(instr);
   63561                           return;
   63562                         }
   63563                         Condition condition((instr >> 28) & 0xf);
   63564                         unsigned rd = (instr >> 12) & 0xf;
   63565                         unsigned rm = instr & 0xf;
   63566                         uint32_t amount = ((instr >> 10) & 0x3) * 8;
   63567                         // SXTB{<c>}{<q>} {<Rd>}, <Rm> {, ROR #<amount> } ; A1
   63568                         sxtb(condition,
   63569                              Best,
   63570                              Register(rd),
   63571                              Operand(Register(rm), ROR, amount));
   63572                         if (((instr & 0xfff03f0) != 0x6af0070)) {
   63573                           UnpredictableA32(instr);
   63574                         }
   63575                         break;
   63576                       }
   63577                       default: {
   63578                         if (((instr & 0xf0000000) == 0xf0000000) ||
   63579                             ((instr & 0xf0000) == 0xf0000)) {
   63580                           UnallocatedA32(instr);
   63581                           return;
   63582                         }
   63583                         Condition condition((instr >> 28) & 0xf);
   63584                         unsigned rd = (instr >> 12) & 0xf;
   63585                         unsigned rn = (instr >> 16) & 0xf;
   63586                         unsigned rm = instr & 0xf;
   63587                         uint32_t amount = ((instr >> 10) & 0x3) * 8;
   63588                         // SXTAB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ROR #<amount> } ; A1 NOLINT(whitespace/line_length)
   63589                         sxtab(condition,
   63590                               Register(rd),
   63591                               Register(rn),
   63592                               Operand(Register(rm), ROR, amount));
   63593                         if (((instr & 0xff003f0) != 0x6a00070)) {
   63594                           UnpredictableA32(instr);
   63595                         }
   63596                         break;
   63597                       }
   63598                     }
   63599                     break;
   63600                   }
   63601                   case 0x00100000: {
   63602                     // 0x06b00070
   63603                     switch (instr & 0x000f0000) {
   63604                       case 0x000f0000: {
   63605                         // 0x06bf0070
   63606                         if (((instr & 0xf0000000) == 0xf0000000)) {
   63607                           UnallocatedA32(instr);
   63608                           return;
   63609                         }
   63610                         Condition condition((instr >> 28) & 0xf);
   63611                         unsigned rd = (instr >> 12) & 0xf;
   63612                         unsigned rm = instr & 0xf;
   63613                         uint32_t amount = ((instr >> 10) & 0x3) * 8;
   63614                         // SXTH{<c>}{<q>} {<Rd>}, <Rm> {, ROR #<amount> } ; A1
   63615                         sxth(condition,
   63616                              Best,
   63617                              Register(rd),
   63618                              Operand(Register(rm), ROR, amount));
   63619                         if (((instr & 0xfff03f0) != 0x6bf0070)) {
   63620                           UnpredictableA32(instr);
   63621                         }
   63622                         break;
   63623                       }
   63624                       default: {
   63625                         if (((instr & 0xf0000000) == 0xf0000000) ||
   63626                             ((instr & 0xf0000) == 0xf0000)) {
   63627                           UnallocatedA32(instr);
   63628                           return;
   63629                         }
   63630                         Condition condition((instr >> 28) & 0xf);
   63631                         unsigned rd = (instr >> 12) & 0xf;
   63632                         unsigned rn = (instr >> 16) & 0xf;
   63633                         unsigned rm = instr & 0xf;
   63634                         uint32_t amount = ((instr >> 10) & 0x3) * 8;
   63635                         // SXTAH{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ROR #<amount> } ; A1 NOLINT(whitespace/line_length)
   63636                         sxtah(condition,
   63637                               Register(rd),
   63638                               Register(rn),
   63639                               Operand(Register(rm), ROR, amount));
   63640                         if (((instr & 0xff003f0) != 0x6b00070)) {
   63641                           UnpredictableA32(instr);
   63642                         }
   63643                         break;
   63644                       }
   63645                     }
   63646                     break;
   63647                   }
   63648                   default:
   63649                     UnallocatedA32(instr);
   63650                     break;
   63651                 }
   63652                 break;
   63653               }
   63654             }
   63655             break;
   63656           }
   63657           case 0x00400000: {
   63658             // 0x06400000
   63659             switch (instr & 0x00100000) {
   63660               case 0x00000000: {
   63661                 // 0x06400000
   63662                 if (((instr & 0xf0000000) == 0xf0000000)) {
   63663                   UnallocatedA32(instr);
   63664                   return;
   63665                 }
   63666                 Condition condition((instr >> 28) & 0xf);
   63667                 unsigned rt = (instr >> 12) & 0xf;
   63668                 unsigned rn = (instr >> 16) & 0xf;
   63669                 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
   63670                 unsigned rm = instr & 0xf;
   63671                 uint32_t imm_and_type_ = ((instr >> 5) & 0x7f);
   63672                 ImmediateShiftOperand shift_operand(imm_and_type_ & 0x3,
   63673                                                     (imm_and_type_ & 0x7c) >>
   63674                                                         2);
   63675                 Shift shift = shift_operand.GetShift();
   63676                 uint32_t amount = shift_operand.GetAmount();
   63677                 // STRB{<c>}{<q>} <Rt>, [<Rn>], {+/-}<Rm>{, <shift>} ; A1
   63678                 strb(condition,
   63679                      Best,
   63680                      Register(rt),
   63681                      MemOperand(Register(rn),
   63682                                 sign,
   63683                                 Register(rm),
   63684                                 shift,
   63685                                 amount,
   63686                                 PostIndex));
   63687                 break;
   63688               }
   63689               case 0x00100000: {
   63690                 // 0x06500000
   63691                 if (((instr & 0xf0000000) == 0xf0000000)) {
   63692                   UnallocatedA32(instr);
   63693                   return;
   63694                 }
   63695                 Condition condition((instr >> 28) & 0xf);
   63696                 unsigned rt = (instr >> 12) & 0xf;
   63697                 unsigned rn = (instr >> 16) & 0xf;
   63698                 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
   63699                 unsigned rm = instr & 0xf;
   63700                 uint32_t imm_and_type_ = ((instr >> 5) & 0x7f);
   63701                 ImmediateShiftOperand shift_operand(imm_and_type_ & 0x3,
   63702                                                     (imm_and_type_ & 0x7c) >>
   63703                                                         2);
   63704                 Shift shift = shift_operand.GetShift();
   63705                 uint32_t amount = shift_operand.GetAmount();
   63706                 // LDRB{<c>}{<q>} <Rt>, [<Rn>], {+/-}<Rm>{, <shift>} ; A1
   63707                 ldrb(condition,
   63708                      Best,
   63709                      Register(rt),
   63710                      MemOperand(Register(rn),
   63711                                 sign,
   63712                                 Register(rm),
   63713                                 shift,
   63714                                 amount,
   63715                                 PostIndex));
   63716                 break;
   63717               }
   63718             }
   63719             break;
   63720           }
   63721           case 0x00400010: {
   63722             // 0x06400010
   63723             switch (instr & 0x009000e0) {
   63724               case 0x00100000: {
   63725                 // 0x06500010
   63726                 if (((instr & 0xf0000000) == 0xf0000000)) {
   63727                   UnallocatedA32(instr);
   63728                   return;
   63729                 }
   63730                 Condition condition((instr >> 28) & 0xf);
   63731                 unsigned rd = (instr >> 12) & 0xf;
   63732                 unsigned rn = (instr >> 16) & 0xf;
   63733                 unsigned rm = instr & 0xf;
   63734                 // UADD16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
   63735                 uadd16(condition, Register(rd), Register(rn), Register(rm));
   63736                 if (((instr & 0xff00ff0) != 0x6500f10)) {
   63737                   UnpredictableA32(instr);
   63738                 }
   63739                 break;
   63740               }
   63741               case 0x00100020: {
   63742                 // 0x06500030
   63743                 if (((instr & 0xf0000000) == 0xf0000000)) {
   63744                   UnallocatedA32(instr);
   63745                   return;
   63746                 }
   63747                 Condition condition((instr >> 28) & 0xf);
   63748                 unsigned rd = (instr >> 12) & 0xf;
   63749                 unsigned rn = (instr >> 16) & 0xf;
   63750                 unsigned rm = instr & 0xf;
   63751                 // UASX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
   63752                 uasx(condition, Register(rd), Register(rn), Register(rm));
   63753                 if (((instr & 0xff00ff0) != 0x6500f30)) {
   63754                   UnpredictableA32(instr);
   63755                 }
   63756                 break;
   63757               }
   63758               case 0x00100040: {
   63759                 // 0x06500050
   63760                 if (((instr & 0xf0000000) == 0xf0000000)) {
   63761                   UnallocatedA32(instr);
   63762                   return;
   63763                 }
   63764                 Condition condition((instr >> 28) & 0xf);
   63765                 unsigned rd = (instr >> 12) & 0xf;
   63766                 unsigned rn = (instr >> 16) & 0xf;
   63767                 unsigned rm = instr & 0xf;
   63768                 // USAX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
   63769                 usax(condition, Register(rd), Register(rn), Register(rm));
   63770                 if (((instr & 0xff00ff0) != 0x6500f50)) {
   63771                   UnpredictableA32(instr);
   63772                 }
   63773                 break;
   63774               }
   63775               case 0x00100060: {
   63776                 // 0x06500070
   63777                 if (((instr & 0xf0000000) == 0xf0000000)) {
   63778                   UnallocatedA32(instr);
   63779                   return;
   63780                 }
   63781                 Condition condition((instr >> 28) & 0xf);
   63782                 unsigned rd = (instr >> 12) & 0xf;
   63783                 unsigned rn = (instr >> 16) & 0xf;
   63784                 unsigned rm = instr & 0xf;
   63785                 // USUB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
   63786                 usub16(condition, Register(rd), Register(rn), Register(rm));
   63787                 if (((instr & 0xff00ff0) != 0x6500f70)) {
   63788                   UnpredictableA32(instr);
   63789                 }
   63790                 break;
   63791               }
   63792               case 0x00100080: {
   63793                 // 0x06500090
   63794                 if (((instr & 0xf0000000) == 0xf0000000)) {
   63795                   UnallocatedA32(instr);
   63796                   return;
   63797                 }
   63798                 Condition condition((instr >> 28) & 0xf);
   63799                 unsigned rd = (instr >> 12) & 0xf;
   63800                 unsigned rn = (instr >> 16) & 0xf;
   63801                 unsigned rm = instr & 0xf;
   63802                 // UADD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
   63803                 uadd8(condition, Register(rd), Register(rn), Register(rm));
   63804                 if (((instr & 0xff00ff0) != 0x6500f90)) {
   63805                   UnpredictableA32(instr);
   63806                 }
   63807                 break;
   63808               }
   63809               case 0x001000e0: {
   63810                 // 0x065000f0
   63811                 if (((instr & 0xf0000000) == 0xf0000000)) {
   63812                   UnallocatedA32(instr);
   63813                   return;
   63814                 }
   63815                 Condition condition((instr >> 28) & 0xf);
   63816                 unsigned rd = (instr >> 12) & 0xf;
   63817                 unsigned rn = (instr >> 16) & 0xf;
   63818                 unsigned rm = instr & 0xf;
   63819                 // USUB8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
   63820                 usub8(condition, Register(rd), Register(rn), Register(rm));
   63821                 if (((instr & 0xff00ff0) != 0x6500ff0)) {
   63822                   UnpredictableA32(instr);
   63823                 }
   63824                 break;
   63825               }
   63826               case 0x00800060: {
   63827                 // 0x06c00070
   63828                 switch (instr & 0x000f0000) {
   63829                   case 0x000f0000: {
   63830                     // 0x06cf0070
   63831                     if (((instr & 0xf0000000) == 0xf0000000)) {
   63832                       UnallocatedA32(instr);
   63833                       return;
   63834                     }
   63835                     Condition condition((instr >> 28) & 0xf);
   63836                     unsigned rd = (instr >> 12) & 0xf;
   63837                     unsigned rm = instr & 0xf;
   63838                     uint32_t amount = ((instr >> 10) & 0x3) * 8;
   63839                     // UXTB16{<c>}{<q>} {<Rd>}, <Rm> {, ROR #<amount> } ; A1
   63840                     uxtb16(condition,
   63841                            Register(rd),
   63842                            Operand(Register(rm), ROR, amount));
   63843                     if (((instr & 0xfff03f0) != 0x6cf0070)) {
   63844                       UnpredictableA32(instr);
   63845                     }
   63846                     break;
   63847                   }
   63848                   default: {
   63849                     if (((instr & 0xf0000000) == 0xf0000000) ||
   63850                         ((instr & 0xf0000) == 0xf0000)) {
   63851                       UnallocatedA32(instr);
   63852                       return;
   63853                     }
   63854                     Condition condition((instr >> 28) & 0xf);
   63855                     unsigned rd = (instr >> 12) & 0xf;
   63856                     unsigned rn = (instr >> 16) & 0xf;
   63857                     unsigned rm = instr & 0xf;
   63858                     uint32_t amount = ((instr >> 10) & 0x3) * 8;
   63859                     // UXTAB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ROR #<amount> } ; A1 NOLINT(whitespace/line_length)
   63860                     uxtab16(condition,
   63861                             Register(rd),
   63862                             Register(rn),
   63863                             Operand(Register(rm), ROR, amount));
   63864                     if (((instr & 0xff003f0) != 0x6c00070)) {
   63865                       UnpredictableA32(instr);
   63866                     }
   63867                     break;
   63868                   }
   63869                 }
   63870                 break;
   63871               }
   63872               default:
   63873                 UnallocatedA32(instr);
   63874                 break;
   63875             }
   63876             break;
   63877           }
   63878           case 0x00600000: {
   63879             // 0x06600000
   63880             switch (instr & 0x00100000) {
   63881               case 0x00000000: {
   63882                 // 0x06600000
   63883                 if (((instr & 0xf0000000) == 0xf0000000)) {
   63884                   UnallocatedA32(instr);
   63885                   return;
   63886                 }
   63887                 UnimplementedA32("STRBT", instr);
   63888                 break;
   63889               }
   63890               case 0x00100000: {
   63891                 // 0x06700000
   63892                 if (((instr & 0xf0000000) == 0xf0000000)) {
   63893                   UnallocatedA32(instr);
   63894                   return;
   63895                 }
   63896                 UnimplementedA32("LDRBT", instr);
   63897                 break;
   63898               }
   63899             }
   63900             break;
   63901           }
   63902           case 0x00600010: {
   63903             // 0x06600010
   63904             switch (instr & 0x00800060) {
   63905               case 0x00000000: {
   63906                 // 0x06600010
   63907                 switch (instr & 0x00100080) {
   63908                   case 0x00000000: {
   63909                     // 0x06600010
   63910                     if (((instr & 0xf0000000) == 0xf0000000)) {
   63911                       UnallocatedA32(instr);
   63912                       return;
   63913                     }
   63914                     Condition condition((instr >> 28) & 0xf);
   63915                     unsigned rd = (instr >> 12) & 0xf;
   63916                     unsigned rn = (instr >> 16) & 0xf;
   63917                     unsigned rm = instr & 0xf;
   63918                     // UQADD16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
   63919                     uqadd16(condition,
   63920                             Register(rd),
   63921                             Register(rn),
   63922                             Register(rm));
   63923                     if (((instr & 0xff00ff0) != 0x6600f10)) {
   63924                       UnpredictableA32(instr);
   63925                     }
   63926                     break;
   63927                   }
   63928                   case 0x00000080: {
   63929                     // 0x06600090
   63930                     if (((instr & 0xf0000000) == 0xf0000000)) {
   63931                       UnallocatedA32(instr);
   63932                       return;
   63933                     }
   63934                     Condition condition((instr >> 28) & 0xf);
   63935                     unsigned rd = (instr >> 12) & 0xf;
   63936                     unsigned rn = (instr >> 16) & 0xf;
   63937                     unsigned rm = instr & 0xf;
   63938                     // UQADD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
   63939                     uqadd8(condition, Register(rd), Register(rn), Register(rm));
   63940                     if (((instr & 0xff00ff0) != 0x6600f90)) {
   63941                       UnpredictableA32(instr);
   63942                     }
   63943                     break;
   63944                   }
   63945                   case 0x00100000: {
   63946                     // 0x06700010
   63947                     if (((instr & 0xf0000000) == 0xf0000000)) {
   63948                       UnallocatedA32(instr);
   63949                       return;
   63950                     }
   63951                     Condition condition((instr >> 28) & 0xf);
   63952                     unsigned rd = (instr >> 12) & 0xf;
   63953                     unsigned rn = (instr >> 16) & 0xf;
   63954                     unsigned rm = instr & 0xf;
   63955                     // UHADD16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
   63956                     uhadd16(condition,
   63957                             Register(rd),
   63958                             Register(rn),
   63959                             Register(rm));
   63960                     if (((instr & 0xff00ff0) != 0x6700f10)) {
   63961                       UnpredictableA32(instr);
   63962                     }
   63963                     break;
   63964                   }
   63965                   case 0x00100080: {
   63966                     // 0x06700090
   63967                     if (((instr & 0xf0000000) == 0xf0000000)) {
   63968                       UnallocatedA32(instr);
   63969                       return;
   63970                     }
   63971                     Condition condition((instr >> 28) & 0xf);
   63972                     unsigned rd = (instr >> 12) & 0xf;
   63973                     unsigned rn = (instr >> 16) & 0xf;
   63974                     unsigned rm = instr & 0xf;
   63975                     // UHADD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
   63976                     uhadd8(condition, Register(rd), Register(rn), Register(rm));
   63977                     if (((instr & 0xff00ff0) != 0x6700f90)) {
   63978                       UnpredictableA32(instr);
   63979                     }
   63980                     break;
   63981                   }
   63982                 }
   63983                 break;
   63984               }
   63985               case 0x00000020: {
   63986                 // 0x06600030
   63987                 switch (instr & 0x00100080) {
   63988                   case 0x00000000: {
   63989                     // 0x06600030
   63990                     if (((instr & 0xf0000000) == 0xf0000000)) {
   63991                       UnallocatedA32(instr);
   63992                       return;
   63993                     }
   63994                     Condition condition((instr >> 28) & 0xf);
   63995                     unsigned rd = (instr >> 12) & 0xf;
   63996                     unsigned rn = (instr >> 16) & 0xf;
   63997                     unsigned rm = instr & 0xf;
   63998                     // UQASX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
   63999                     uqasx(condition, Register(rd), Register(rn), Register(rm));
   64000                     if (((instr & 0xff00ff0) != 0x6600f30)) {
   64001                       UnpredictableA32(instr);
   64002                     }
   64003                     break;
   64004                   }
   64005                   case 0x00100000: {
   64006                     // 0x06700030
   64007                     if (((instr & 0xf0000000) == 0xf0000000)) {
   64008                       UnallocatedA32(instr);
   64009                       return;
   64010                     }
   64011                     Condition condition((instr >> 28) & 0xf);
   64012                     unsigned rd = (instr >> 12) & 0xf;
   64013                     unsigned rn = (instr >> 16) & 0xf;
   64014                     unsigned rm = instr & 0xf;
   64015                     // UHASX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
   64016                     uhasx(condition, Register(rd), Register(rn), Register(rm));
   64017                     if (((instr & 0xff00ff0) != 0x6700f30)) {
   64018                       UnpredictableA32(instr);
   64019                     }
   64020                     break;
   64021                   }
   64022                   default:
   64023                     UnallocatedA32(instr);
   64024                     break;
   64025                 }
   64026                 break;
   64027               }
   64028               case 0x00000040: {
   64029                 // 0x06600050
   64030                 switch (instr & 0x00100080) {
   64031                   case 0x00000000: {
   64032                     // 0x06600050
   64033                     if (((instr & 0xf0000000) == 0xf0000000)) {
   64034                       UnallocatedA32(instr);
   64035                       return;
   64036                     }
   64037                     Condition condition((instr >> 28) & 0xf);
   64038                     unsigned rd = (instr >> 12) & 0xf;
   64039                     unsigned rn = (instr >> 16) & 0xf;
   64040                     unsigned rm = instr & 0xf;
   64041                     // UQSAX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
   64042                     uqsax(condition, Register(rd), Register(rn), Register(rm));
   64043                     if (((instr & 0xff00ff0) != 0x6600f50)) {
   64044                       UnpredictableA32(instr);
   64045                     }
   64046                     break;
   64047                   }
   64048                   case 0x00100000: {
   64049                     // 0x06700050
   64050                     if (((instr & 0xf0000000) == 0xf0000000)) {
   64051                       UnallocatedA32(instr);
   64052                       return;
   64053                     }
   64054                     Condition condition((instr >> 28) & 0xf);
   64055                     unsigned rd = (instr >> 12) & 0xf;
   64056                     unsigned rn = (instr >> 16) & 0xf;
   64057                     unsigned rm = instr & 0xf;
   64058                     // UHSAX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
   64059                     uhsax(condition, Register(rd), Register(rn), Register(rm));
   64060                     if (((instr & 0xff00ff0) != 0x6700f50)) {
   64061                       UnpredictableA32(instr);
   64062                     }
   64063                     break;
   64064                   }
   64065                   default:
   64066                     UnallocatedA32(instr);
   64067                     break;
   64068                 }
   64069                 break;
   64070               }
   64071               case 0x00000060: {
   64072                 // 0x06600070
   64073                 switch (instr & 0x00100080) {
   64074                   case 0x00000000: {
   64075                     // 0x06600070
   64076                     if (((instr & 0xf0000000) == 0xf0000000)) {
   64077                       UnallocatedA32(instr);
   64078                       return;
   64079                     }
   64080                     Condition condition((instr >> 28) & 0xf);
   64081                     unsigned rd = (instr >> 12) & 0xf;
   64082                     unsigned rn = (instr >> 16) & 0xf;
   64083                     unsigned rm = instr & 0xf;
   64084                     // UQSUB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
   64085                     uqsub16(condition,
   64086                             Register(rd),
   64087                             Register(rn),
   64088                             Register(rm));
   64089                     if (((instr & 0xff00ff0) != 0x6600f70)) {
   64090                       UnpredictableA32(instr);
   64091                     }
   64092                     break;
   64093                   }
   64094                   case 0x00000080: {
   64095                     // 0x066000f0
   64096                     if (((instr & 0xf0000000) == 0xf0000000)) {
   64097                       UnallocatedA32(instr);
   64098                       return;
   64099                     }
   64100                     Condition condition((instr >> 28) & 0xf);
   64101                     unsigned rd = (instr >> 12) & 0xf;
   64102                     unsigned rn = (instr >> 16) & 0xf;
   64103                     unsigned rm = instr & 0xf;
   64104                     // UQSUB8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
   64105                     uqsub8(condition, Register(rd), Register(rn), Register(rm));
   64106                     if (((instr & 0xff00ff0) != 0x6600ff0)) {
   64107                       UnpredictableA32(instr);
   64108                     }
   64109                     break;
   64110                   }
   64111                   case 0x00100000: {
   64112                     // 0x06700070
   64113                     if (((instr & 0xf0000000) == 0xf0000000)) {
   64114                       UnallocatedA32(instr);
   64115                       return;
   64116                     }
   64117                     Condition condition((instr >> 28) & 0xf);
   64118                     unsigned rd = (instr >> 12) & 0xf;
   64119                     unsigned rn = (instr >> 16) & 0xf;
   64120                     unsigned rm = instr & 0xf;
   64121                     // UHSUB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
   64122                     uhsub16(condition,
   64123                             Register(rd),
   64124                             Register(rn),
   64125                             Register(rm));
   64126                     if (((instr & 0xff00ff0) != 0x6700f70)) {
   64127                       UnpredictableA32(instr);
   64128                     }
   64129                     break;
   64130                   }
   64131                   case 0x00100080: {
   64132                     // 0x067000f0
   64133                     if (((instr & 0xf0000000) == 0xf0000000)) {
   64134                       UnallocatedA32(instr);
   64135                       return;
   64136                     }
   64137                     Condition condition((instr >> 28) & 0xf);
   64138                     unsigned rd = (instr >> 12) & 0xf;
   64139                     unsigned rn = (instr >> 16) & 0xf;
   64140                     unsigned rm = instr & 0xf;
   64141                     // UHSUB8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
   64142                     uhsub8(condition, Register(rd), Register(rn), Register(rm));
   64143                     if (((instr & 0xff00ff0) != 0x6700ff0)) {
   64144                       UnpredictableA32(instr);
   64145                     }
   64146                     break;
   64147                   }
   64148                 }
   64149                 break;
   64150               }
   64151               case 0x00800000: {
   64152                 // 0x06e00010
   64153                 if (((instr & 0xf0000000) == 0xf0000000)) {
   64154                   UnallocatedA32(instr);
   64155                   return;
   64156                 }
   64157                 Condition condition((instr >> 28) & 0xf);
   64158                 unsigned rd = (instr >> 12) & 0xf;
   64159                 uint32_t imm = (instr >> 16) & 0x1f;
   64160                 unsigned rn = instr & 0xf;
   64161                 uint32_t amount = (instr >> 7) & 0x1f;
   64162                 // USAT{<c>}{<q>} <Rd>, #<imm>, <Rn> {, LSL #<amount> } ; A1
   64163                 usat(condition,
   64164                      Register(rd),
   64165                      imm,
   64166                      Operand(Register(rn), LSL, amount));
   64167                 break;
   64168               }
   64169               case 0x00800020: {
   64170                 // 0x06e00030
   64171                 switch (instr & 0x00100080) {
   64172                   case 0x00000000: {
   64173                     // 0x06e00030
   64174                     if (((instr & 0xf0000000) == 0xf0000000)) {
   64175                       UnallocatedA32(instr);
   64176                       return;
   64177                     }
   64178                     Condition condition((instr >> 28) & 0xf);
   64179                     unsigned rd = (instr >> 12) & 0xf;
   64180                     uint32_t imm = (instr >> 16) & 0xf;
   64181                     unsigned rn = instr & 0xf;
   64182                     // USAT16{<c>}{<q>} <Rd>, #<imm>, <Rn> ; A1
   64183                     usat16(condition, Register(rd), imm, Register(rn));
   64184                     if (((instr & 0xff00ff0) != 0x6e00f30)) {
   64185                       UnpredictableA32(instr);
   64186                     }
   64187                     break;
   64188                   }
   64189                   case 0x00100000: {
   64190                     // 0x06f00030
   64191                     if (((instr & 0xf0000000) == 0xf0000000)) {
   64192                       UnallocatedA32(instr);
   64193                       return;
   64194                     }
   64195                     Condition condition((instr >> 28) & 0xf);
   64196                     unsigned rd = (instr >> 12) & 0xf;
   64197                     unsigned rm = instr & 0xf;
   64198                     // RBIT{<c>}{<q>} <Rd>, <Rm> ; A1
   64199                     rbit(condition, Register(rd), Register(rm));
   64200                     if (((instr & 0xfff0ff0) != 0x6ff0f30)) {
   64201                       UnpredictableA32(instr);
   64202                     }
   64203                     break;
   64204                   }
   64205                   case 0x00100080: {
   64206                     // 0x06f000b0
   64207                     if (((instr & 0xf0000000) == 0xf0000000)) {
   64208                       UnallocatedA32(instr);
   64209                       return;
   64210                     }
   64211                     Condition condition((instr >> 28) & 0xf);
   64212                     unsigned rd = (instr >> 12) & 0xf;
   64213                     unsigned rm = instr & 0xf;
   64214                     // REVSH{<c>}{<q>} <Rd>, <Rm> ; A1
   64215                     revsh(condition, Best, Register(rd), Register(rm));
   64216                     if (((instr & 0xfff0ff0) != 0x6ff0fb0)) {
   64217                       UnpredictableA32(instr);
   64218                     }
   64219                     break;
   64220                   }
   64221                   default:
   64222                     UnallocatedA32(instr);
   64223                     break;
   64224                 }
   64225                 break;
   64226               }
   64227               case 0x00800040: {
   64228                 // 0x06e00050
   64229                 if (((instr & 0xf0000000) == 0xf0000000)) {
   64230                   UnallocatedA32(instr);
   64231                   return;
   64232                 }
   64233                 Condition condition((instr >> 28) & 0xf);
   64234                 unsigned rd = (instr >> 12) & 0xf;
   64235                 uint32_t imm = (instr >> 16) & 0x1f;
   64236                 unsigned rn = instr & 0xf;
   64237                 uint32_t amount = (instr >> 7) & 0x1f;
   64238                 if (amount == 0) amount = 32;
   64239                 // USAT{<c>}{<q>} <Rd>, #<imm>, <Rn>, ASR #<amount> ; A1
   64240                 usat(condition,
   64241                      Register(rd),
   64242                      imm,
   64243                      Operand(Register(rn), ASR, amount));
   64244                 break;
   64245               }
   64246               case 0x00800060: {
   64247                 // 0x06e00070
   64248                 switch (instr & 0x00100080) {
   64249                   case 0x00000000: {
   64250                     // 0x06e00070
   64251                     switch (instr & 0x000f0000) {
   64252                       case 0x000f0000: {
   64253                         // 0x06ef0070
   64254                         if (((instr & 0xf0000000) == 0xf0000000)) {
   64255                           UnallocatedA32(instr);
   64256                           return;
   64257                         }
   64258                         Condition condition((instr >> 28) & 0xf);
   64259                         unsigned rd = (instr >> 12) & 0xf;
   64260                         unsigned rm = instr & 0xf;
   64261                         uint32_t amount = ((instr >> 10) & 0x3) * 8;
   64262                         // UXTB{<c>}{<q>} {<Rd>}, <Rm> {, ROR #<amount> } ; A1
   64263                         uxtb(condition,
   64264                              Best,
   64265                              Register(rd),
   64266                              Operand(Register(rm), ROR, amount));
   64267                         if (((instr & 0xfff03f0) != 0x6ef0070)) {
   64268                           UnpredictableA32(instr);
   64269                         }
   64270                         break;
   64271                       }
   64272                       default: {
   64273                         if (((instr & 0xf0000000) == 0xf0000000) ||
   64274                             ((instr & 0xf0000) == 0xf0000)) {
   64275                           UnallocatedA32(instr);
   64276                           return;
   64277                         }
   64278                         Condition condition((instr >> 28) & 0xf);
   64279                         unsigned rd = (instr >> 12) & 0xf;
   64280                         unsigned rn = (instr >> 16) & 0xf;
   64281                         unsigned rm = instr & 0xf;
   64282                         uint32_t amount = ((instr >> 10) & 0x3) * 8;
   64283                         // UXTAB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ROR #<amount> } ; A1 NOLINT(whitespace/line_length)
   64284                         uxtab(condition,
   64285                               Register(rd),
   64286                               Register(rn),
   64287                               Operand(Register(rm), ROR, amount));
   64288                         if (((instr & 0xff003f0) != 0x6e00070)) {
   64289                           UnpredictableA32(instr);
   64290                         }
   64291                         break;
   64292                       }
   64293                     }
   64294                     break;
   64295                   }
   64296                   case 0x00100000: {
   64297                     // 0x06f00070
   64298                     switch (instr & 0x000f0000) {
   64299                       case 0x000f0000: {
   64300                         // 0x06ff0070
   64301                         if (((instr & 0xf0000000) == 0xf0000000)) {
   64302                           UnallocatedA32(instr);
   64303                           return;
   64304                         }
   64305                         Condition condition((instr >> 28) & 0xf);
   64306                         unsigned rd = (instr >> 12) & 0xf;
   64307                         unsigned rm = instr & 0xf;
   64308                         uint32_t amount = ((instr >> 10) & 0x3) * 8;
   64309                         // UXTH{<c>}{<q>} {<Rd>}, <Rm> {, ROR #<amount> } ; A1
   64310                         uxth(condition,
   64311                              Best,
   64312                              Register(rd),
   64313                              Operand(Register(rm), ROR, amount));
   64314                         if (((instr & 0xfff03f0) != 0x6ff0070)) {
   64315                           UnpredictableA32(instr);
   64316                         }
   64317                         break;
   64318                       }
   64319                       default: {
   64320                         if (((instr & 0xf0000000) == 0xf0000000) ||
   64321                             ((instr & 0xf0000) == 0xf0000)) {
   64322                           UnallocatedA32(instr);
   64323                           return;
   64324                         }
   64325                         Condition condition((instr >> 28) & 0xf);
   64326                         unsigned rd = (instr >> 12) & 0xf;
   64327                         unsigned rn = (instr >> 16) & 0xf;
   64328                         unsigned rm = instr & 0xf;
   64329                         uint32_t amount = ((instr >> 10) & 0x3) * 8;
   64330                         // UXTAH{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ROR #<amount> } ; A1 NOLINT(whitespace/line_length)
   64331                         uxtah(condition,
   64332                               Register(rd),
   64333                               Register(rn),
   64334                               Operand(Register(rm), ROR, amount));
   64335                         if (((instr & 0xff003f0) != 0x6f00070)) {
   64336                           UnpredictableA32(instr);
   64337                         }
   64338                         break;
   64339                       }
   64340                     }
   64341                     break;
   64342                   }
   64343                   default:
   64344                     UnallocatedA32(instr);
   64345                     break;
   64346                 }
   64347                 break;
   64348               }
   64349             }
   64350             break;
   64351           }
   64352           case 0x01000000: {
   64353             // 0x07000000
   64354             switch (instr & 0x00100000) {
   64355               case 0x00000000: {
   64356                 // 0x07000000
   64357                 if (((instr & 0xf0000000) == 0xf0000000)) {
   64358                   UnallocatedA32(instr);
   64359                   return;
   64360                 }
   64361                 Condition condition((instr >> 28) & 0xf);
   64362                 unsigned rt = (instr >> 12) & 0xf;
   64363                 unsigned rn = (instr >> 16) & 0xf;
   64364                 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
   64365                 unsigned rm = instr & 0xf;
   64366                 uint32_t imm_and_type_ = ((instr >> 5) & 0x7f);
   64367                 ImmediateShiftOperand shift_operand(imm_and_type_ & 0x3,
   64368                                                     (imm_and_type_ & 0x7c) >>
   64369                                                         2);
   64370                 Shift shift = shift_operand.GetShift();
   64371                 uint32_t amount = shift_operand.GetAmount();
   64372                 AddrMode addrmode = Offset;
   64373                 // STR{<c>}{<q>} <Rt>, [<Rn>, {+/-}<Rm>{, <shift>}] ; A1
   64374                 str(condition,
   64375                     Best,
   64376                     Register(rt),
   64377                     MemOperand(Register(rn),
   64378                                sign,
   64379                                Register(rm),
   64380                                shift,
   64381                                amount,
   64382                                addrmode));
   64383                 break;
   64384               }
   64385               case 0x00100000: {
   64386                 // 0x07100000
   64387                 if (((instr & 0xf0000000) == 0xf0000000)) {
   64388                   UnallocatedA32(instr);
   64389                   return;
   64390                 }
   64391                 Condition condition((instr >> 28) & 0xf);
   64392                 unsigned rt = (instr >> 12) & 0xf;
   64393                 unsigned rn = (instr >> 16) & 0xf;
   64394                 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
   64395                 unsigned rm = instr & 0xf;
   64396                 uint32_t imm_and_type_ = ((instr >> 5) & 0x7f);
   64397                 ImmediateShiftOperand shift_operand(imm_and_type_ & 0x3,
   64398                                                     (imm_and_type_ & 0x7c) >>
   64399                                                         2);
   64400                 Shift shift = shift_operand.GetShift();
   64401                 uint32_t amount = shift_operand.GetAmount();
   64402                 AddrMode addrmode = Offset;
   64403                 // LDR{<c>}{<q>} <Rt>, [<Rn>, {+/-}<Rm>{, <shift>}] ; A1
   64404                 ldr(condition,
   64405                     Best,
   64406                     Register(rt),
   64407                     MemOperand(Register(rn),
   64408                                sign,
   64409                                Register(rm),
   64410                                shift,
   64411                                amount,
   64412                                addrmode));
   64413                 break;
   64414               }
   64415             }
   64416             break;
   64417           }
   64418           case 0x01000010: {
   64419             // 0x07000010
   64420             switch (instr & 0x009000e0) {
   64421               case 0x00000000: {
   64422                 // 0x07000010
   64423                 switch (instr & 0x0000f000) {
   64424                   case 0x0000f000: {
   64425                     // 0x0700f010
   64426                     if (((instr & 0xf0000000) == 0xf0000000)) {
   64427                       UnallocatedA32(instr);
   64428                       return;
   64429                     }
   64430                     Condition condition((instr >> 28) & 0xf);
   64431                     unsigned rd = (instr >> 16) & 0xf;
   64432                     unsigned rn = instr & 0xf;
   64433                     unsigned rm = (instr >> 8) & 0xf;
   64434                     // SMUAD{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
   64435                     smuad(condition, Register(rd), Register(rn), Register(rm));
   64436                     break;
   64437                   }
   64438                   default: {
   64439                     if (((instr & 0xf0000000) == 0xf0000000) ||
   64440                         ((instr & 0xf000) == 0xf000)) {
   64441                       UnallocatedA32(instr);
   64442                       return;
   64443                     }
   64444                     Condition condition((instr >> 28) & 0xf);
   64445                     unsigned rd = (instr >> 16) & 0xf;
   64446                     unsigned rn = instr & 0xf;
   64447                     unsigned rm = (instr >> 8) & 0xf;
   64448                     unsigned ra = (instr >> 12) & 0xf;
   64449                     // SMLAD{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
   64450                     smlad(condition,
   64451                           Register(rd),
   64452                           Register(rn),
   64453                           Register(rm),
   64454                           Register(ra));
   64455                     break;
   64456                   }
   64457                 }
   64458                 break;
   64459               }
   64460               case 0x00000020: {
   64461                 // 0x07000030
   64462                 switch (instr & 0x0000f000) {
   64463                   case 0x0000f000: {
   64464                     // 0x0700f030
   64465                     if (((instr & 0xf0000000) == 0xf0000000)) {
   64466                       UnallocatedA32(instr);
   64467                       return;
   64468                     }
   64469                     Condition condition((instr >> 28) & 0xf);
   64470                     unsigned rd = (instr >> 16) & 0xf;
   64471                     unsigned rn = instr & 0xf;
   64472                     unsigned rm = (instr >> 8) & 0xf;
   64473                     // SMUADX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
   64474                     smuadx(condition, Register(rd), Register(rn), Register(rm));
   64475                     break;
   64476                   }
   64477                   default: {
   64478                     if (((instr & 0xf0000000) == 0xf0000000) ||
   64479                         ((instr & 0xf000) == 0xf000)) {
   64480                       UnallocatedA32(instr);
   64481                       return;
   64482                     }
   64483                     Condition condition((instr >> 28) & 0xf);
   64484                     unsigned rd = (instr >> 16) & 0xf;
   64485                     unsigned rn = instr & 0xf;
   64486                     unsigned rm = (instr >> 8) & 0xf;
   64487                     unsigned ra = (instr >> 12) & 0xf;
   64488                     // SMLADX{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
   64489                     smladx(condition,
   64490                            Register(rd),
   64491                            Register(rn),
   64492                            Register(rm),
   64493                            Register(ra));
   64494                     break;
   64495                   }
   64496                 }
   64497                 break;
   64498               }
   64499               case 0x00000040: {
   64500                 // 0x07000050
   64501                 switch (instr & 0x0000f000) {
   64502                   case 0x0000f000: {
   64503                     // 0x0700f050
   64504                     if (((instr & 0xf0000000) == 0xf0000000)) {
   64505                       UnallocatedA32(instr);
   64506                       return;
   64507                     }
   64508                     Condition condition((instr >> 28) & 0xf);
   64509                     unsigned rd = (instr >> 16) & 0xf;
   64510                     unsigned rn = instr & 0xf;
   64511                     unsigned rm = (instr >> 8) & 0xf;
   64512                     // SMUSD{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
   64513                     smusd(condition, Register(rd), Register(rn), Register(rm));
   64514                     break;
   64515                   }
   64516                   default: {
   64517                     if (((instr & 0xf0000000) == 0xf0000000) ||
   64518                         ((instr & 0xf000) == 0xf000)) {
   64519                       UnallocatedA32(instr);
   64520                       return;
   64521                     }
   64522                     Condition condition((instr >> 28) & 0xf);
   64523                     unsigned rd = (instr >> 16) & 0xf;
   64524                     unsigned rn = instr & 0xf;
   64525                     unsigned rm = (instr >> 8) & 0xf;
   64526                     unsigned ra = (instr >> 12) & 0xf;
   64527                     // SMLSD{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
   64528                     smlsd(condition,
   64529                           Register(rd),
   64530                           Register(rn),
   64531                           Register(rm),
   64532                           Register(ra));
   64533                     break;
   64534                   }
   64535                 }
   64536                 break;
   64537               }
   64538               case 0x00000060: {
   64539                 // 0x07000070
   64540                 switch (instr & 0x0000f000) {
   64541                   case 0x0000f000: {
   64542                     // 0x0700f070
   64543                     if (((instr & 0xf0000000) == 0xf0000000)) {
   64544                       UnallocatedA32(instr);
   64545                       return;
   64546                     }
   64547                     Condition condition((instr >> 28) & 0xf);
   64548                     unsigned rd = (instr >> 16) & 0xf;
   64549                     unsigned rn = instr & 0xf;
   64550                     unsigned rm = (instr >> 8) & 0xf;
   64551                     // SMUSDX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
   64552                     smusdx(condition, Register(rd), Register(rn), Register(rm));
   64553                     break;
   64554                   }
   64555                   default: {
   64556                     if (((instr & 0xf0000000) == 0xf0000000) ||
   64557                         ((instr & 0xf000) == 0xf000)) {
   64558                       UnallocatedA32(instr);
   64559                       return;
   64560                     }
   64561                     Condition condition((instr >> 28) & 0xf);
   64562                     unsigned rd = (instr >> 16) & 0xf;
   64563                     unsigned rn = instr & 0xf;
   64564                     unsigned rm = (instr >> 8) & 0xf;
   64565                     unsigned ra = (instr >> 12) & 0xf;
   64566                     // SMLSDX{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
   64567                     smlsdx(condition,
   64568                            Register(rd),
   64569                            Register(rn),
   64570                            Register(rm),
   64571                            Register(ra));
   64572                     break;
   64573                   }
   64574                 }
   64575                 break;
   64576               }
   64577               case 0x00100000: {
   64578                 // 0x07100010
   64579                 if (((instr & 0xf0000000) == 0xf0000000)) {
   64580                   UnallocatedA32(instr);
   64581                   return;
   64582                 }
   64583                 Condition condition((instr >> 28) & 0xf);
   64584                 unsigned rd = (instr >> 16) & 0xf;
   64585                 unsigned rn = instr & 0xf;
   64586                 unsigned rm = (instr >> 8) & 0xf;
   64587                 // SDIV{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
   64588                 sdiv(condition, Register(rd), Register(rn), Register(rm));
   64589                 if (((instr & 0xff0f0f0) != 0x710f010)) {
   64590                   UnpredictableA32(instr);
   64591                 }
   64592                 break;
   64593               }
   64594               case 0x00800000: {
   64595                 // 0x07800010
   64596                 switch (instr & 0x0000f000) {
   64597                   case 0x0000f000: {
   64598                     // 0x0780f010
   64599                     if (((instr & 0xf0000000) == 0xf0000000)) {
   64600                       UnallocatedA32(instr);
   64601                       return;
   64602                     }
   64603                     Condition condition((instr >> 28) & 0xf);
   64604                     unsigned rd = (instr >> 16) & 0xf;
   64605                     unsigned rn = instr & 0xf;
   64606                     unsigned rm = (instr >> 8) & 0xf;
   64607                     // USAD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
   64608                     usad8(condition, Register(rd), Register(rn), Register(rm));
   64609                     break;
   64610                   }
   64611                   default: {
   64612                     if (((instr & 0xf0000000) == 0xf0000000) ||
   64613                         ((instr & 0xf000) == 0xf000)) {
   64614                       UnallocatedA32(instr);
   64615                       return;
   64616                     }
   64617                     Condition condition((instr >> 28) & 0xf);
   64618                     unsigned rd = (instr >> 16) & 0xf;
   64619                     unsigned rn = instr & 0xf;
   64620                     unsigned rm = (instr >> 8) & 0xf;
   64621                     unsigned ra = (instr >> 12) & 0xf;
   64622                     // USADA8{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
   64623                     usada8(condition,
   64624                            Register(rd),
   64625                            Register(rn),
   64626                            Register(rm),
   64627                            Register(ra));
   64628                     break;
   64629                   }
   64630                 }
   64631                 break;
   64632               }
   64633               default:
   64634                 UnallocatedA32(instr);
   64635                 break;
   64636             }
   64637             break;
   64638           }
   64639           case 0x01200000: {
   64640             // 0x07200000
   64641             switch (instr & 0x00100000) {
   64642               case 0x00000000: {
   64643                 // 0x07200000
   64644                 if (((instr & 0xf0000000) == 0xf0000000)) {
   64645                   UnallocatedA32(instr);
   64646                   return;
   64647                 }
   64648                 Condition condition((instr >> 28) & 0xf);
   64649                 unsigned rt = (instr >> 12) & 0xf;
   64650                 unsigned rn = (instr >> 16) & 0xf;
   64651                 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
   64652                 unsigned rm = instr & 0xf;
   64653                 uint32_t imm_and_type_ = ((instr >> 5) & 0x7f);
   64654                 ImmediateShiftOperand shift_operand(imm_and_type_ & 0x3,
   64655                                                     (imm_and_type_ & 0x7c) >>
   64656                                                         2);
   64657                 Shift shift = shift_operand.GetShift();
   64658                 uint32_t amount = shift_operand.GetAmount();
   64659                 AddrMode addrmode = PreIndex;
   64660                 // STR{<c>}{<q>} <Rt>, [<Rn>, {+/-}<Rm>{, <shift>}]! ; A1
   64661                 str(condition,
   64662                     Best,
   64663                     Register(rt),
   64664                     MemOperand(Register(rn),
   64665                                sign,
   64666                                Register(rm),
   64667                                shift,
   64668                                amount,
   64669                                addrmode));
   64670                 break;
   64671               }
   64672               case 0x00100000: {
   64673                 // 0x07300000
   64674                 if (((instr & 0xf0000000) == 0xf0000000)) {
   64675                   UnallocatedA32(instr);
   64676                   return;
   64677                 }
   64678                 Condition condition((instr >> 28) & 0xf);
   64679                 unsigned rt = (instr >> 12) & 0xf;
   64680                 unsigned rn = (instr >> 16) & 0xf;
   64681                 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
   64682                 unsigned rm = instr & 0xf;
   64683                 uint32_t imm_and_type_ = ((instr >> 5) & 0x7f);
   64684                 ImmediateShiftOperand shift_operand(imm_and_type_ & 0x3,
   64685                                                     (imm_and_type_ & 0x7c) >>
   64686                                                         2);
   64687                 Shift shift = shift_operand.GetShift();
   64688                 uint32_t amount = shift_operand.GetAmount();
   64689                 AddrMode addrmode = PreIndex;
   64690                 // LDR{<c>}{<q>} <Rt>, [<Rn>, {+/-}<Rm>{, <shift>}]! ; A1
   64691                 ldr(condition,
   64692                     Best,
   64693                     Register(rt),
   64694                     MemOperand(Register(rn),
   64695                                sign,
   64696                                Register(rm),
   64697                                shift,
   64698                                amount,
   64699                                addrmode));
   64700                 break;
   64701               }
   64702             }
   64703             break;
   64704           }
   64705           case 0x01200010: {
   64706             // 0x07200010
   64707             switch (instr & 0x00800060) {
   64708               case 0x00000000: {
   64709                 // 0x07200010
   64710                 if ((instr & 0x00100080) == 0x00100000) {
   64711                   if (((instr & 0xf0000000) == 0xf0000000)) {
   64712                     UnallocatedA32(instr);
   64713                     return;
   64714                   }
   64715                   Condition condition((instr >> 28) & 0xf);
   64716                   unsigned rd = (instr >> 16) & 0xf;
   64717                   unsigned rn = instr & 0xf;
   64718                   unsigned rm = (instr >> 8) & 0xf;
   64719                   // UDIV{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
   64720                   udiv(condition, Register(rd), Register(rn), Register(rm));
   64721                   if (((instr & 0xff0f0f0) != 0x730f010)) {
   64722                     UnpredictableA32(instr);
   64723                   }
   64724                 } else {
   64725                   UnallocatedA32(instr);
   64726                 }
   64727                 break;
   64728               }
   64729               case 0x00800040: {
   64730                 // 0x07a00050
   64731                 if (((instr & 0xf0000000) == 0xf0000000)) {
   64732                   UnallocatedA32(instr);
   64733                   return;
   64734                 }
   64735                 Condition condition((instr >> 28) & 0xf);
   64736                 unsigned rd = (instr >> 12) & 0xf;
   64737                 unsigned rn = instr & 0xf;
   64738                 uint32_t lsb = (instr >> 7) & 0x1f;
   64739                 uint32_t widthm1 = (instr >> 16) & 0x1f;
   64740                 uint32_t width = widthm1 + 1;
   64741                 // SBFX{<c>}{<q>} <Rd>, <Rn>, #<lsb>, #<width> ; A1
   64742                 sbfx(condition, Register(rd), Register(rn), lsb, width);
   64743                 break;
   64744               }
   64745               default:
   64746                 UnallocatedA32(instr);
   64747                 break;
   64748             }
   64749             break;
   64750           }
   64751           case 0x01400000: {
   64752             // 0x07400000
   64753             switch (instr & 0x00100000) {
   64754               case 0x00000000: {
   64755                 // 0x07400000
   64756                 if (((instr & 0xf0000000) == 0xf0000000)) {
   64757                   UnallocatedA32(instr);
   64758                   return;
   64759                 }
   64760                 Condition condition((instr >> 28) & 0xf);
   64761                 unsigned rt = (instr >> 12) & 0xf;
   64762                 unsigned rn = (instr >> 16) & 0xf;
   64763                 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
   64764                 unsigned rm = instr & 0xf;
   64765                 uint32_t imm_and_type_ = ((instr >> 5) & 0x7f);
   64766                 ImmediateShiftOperand shift_operand(imm_and_type_ & 0x3,
   64767                                                     (imm_and_type_ & 0x7c) >>
   64768                                                         2);
   64769                 Shift shift = shift_operand.GetShift();
   64770                 uint32_t amount = shift_operand.GetAmount();
   64771                 AddrMode addrmode = Offset;
   64772                 // STRB{<c>}{<q>} <Rt>, [<Rn>, {+/-}<Rm>{, <shift>}] ; A1
   64773                 strb(condition,
   64774                      Best,
   64775                      Register(rt),
   64776                      MemOperand(Register(rn),
   64777                                 sign,
   64778                                 Register(rm),
   64779                                 shift,
   64780                                 amount,
   64781                                 addrmode));
   64782                 break;
   64783               }
   64784               case 0x00100000: {
   64785                 // 0x07500000
   64786                 if (((instr & 0xf0000000) == 0xf0000000)) {
   64787                   UnallocatedA32(instr);
   64788                   return;
   64789                 }
   64790                 Condition condition((instr >> 28) & 0xf);
   64791                 unsigned rt = (instr >> 12) & 0xf;
   64792                 unsigned rn = (instr >> 16) & 0xf;
   64793                 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
   64794                 unsigned rm = instr & 0xf;
   64795                 uint32_t imm_and_type_ = ((instr >> 5) & 0x7f);
   64796                 ImmediateShiftOperand shift_operand(imm_and_type_ & 0x3,
   64797                                                     (imm_and_type_ & 0x7c) >>
   64798                                                         2);
   64799                 Shift shift = shift_operand.GetShift();
   64800                 uint32_t amount = shift_operand.GetAmount();
   64801                 AddrMode addrmode = Offset;
   64802                 // LDRB{<c>}{<q>} <Rt>, [<Rn>, {+/-}<Rm>{, <shift>}] ; A1
   64803                 ldrb(condition,
   64804                      Best,
   64805                      Register(rt),
   64806                      MemOperand(Register(rn),
   64807                                 sign,
   64808                                 Register(rm),
   64809                                 shift,
   64810                                 amount,
   64811                                 addrmode));
   64812                 break;
   64813               }
   64814             }
   64815             break;
   64816           }
   64817           case 0x01400010: {
   64818             // 0x07400010
   64819             switch (instr & 0x00800060) {
   64820               case 0x00000000: {
   64821                 // 0x07400010
   64822                 switch (instr & 0x00100080) {
   64823                   case 0x00000000: {
   64824                     // 0x07400010
   64825                     if (((instr & 0xf0000000) == 0xf0000000)) {
   64826                       UnallocatedA32(instr);
   64827                       return;
   64828                     }
   64829                     Condition condition((instr >> 28) & 0xf);
   64830                     unsigned rdlo = (instr >> 12) & 0xf;
   64831                     unsigned rdhi = (instr >> 16) & 0xf;
   64832                     unsigned rn = instr & 0xf;
   64833                     unsigned rm = (instr >> 8) & 0xf;
   64834                     // SMLALD{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
   64835                     smlald(condition,
   64836                            Register(rdlo),
   64837                            Register(rdhi),
   64838                            Register(rn),
   64839                            Register(rm));
   64840                     break;
   64841                   }
   64842                   case 0x00100000: {
   64843                     // 0x07500010
   64844                     switch (instr & 0x0000f000) {
   64845                       case 0x0000f000: {
   64846                         // 0x0750f010
   64847                         if (((instr & 0xf0000000) == 0xf0000000)) {
   64848                           UnallocatedA32(instr);
   64849                           return;
   64850                         }
   64851                         Condition condition((instr >> 28) & 0xf);
   64852                         unsigned rd = (instr >> 16) & 0xf;
   64853                         unsigned rn = instr & 0xf;
   64854                         unsigned rm = (instr >> 8) & 0xf;
   64855                         // SMMUL{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
   64856                         smmul(condition,
   64857                               Register(rd),
   64858                               Register(rn),
   64859                               Register(rm));
   64860                         break;
   64861                       }
   64862                       default: {
   64863                         if (((instr & 0xf0000000) == 0xf0000000) ||
   64864                             ((instr & 0xf000) == 0xf000)) {
   64865                           UnallocatedA32(instr);
   64866                           return;
   64867                         }
   64868                         Condition condition((instr >> 28) & 0xf);
   64869                         unsigned rd = (instr >> 16) & 0xf;
   64870                         unsigned rn = instr & 0xf;
   64871                         unsigned rm = (instr >> 8) & 0xf;
   64872                         unsigned ra = (instr >> 12) & 0xf;
   64873                         // SMMLA{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
   64874                         smmla(condition,
   64875                               Register(rd),
   64876                               Register(rn),
   64877                               Register(rm),
   64878                               Register(ra));
   64879                         break;
   64880                       }
   64881                     }
   64882                     break;
   64883                   }
   64884                   default:
   64885                     UnallocatedA32(instr);
   64886                     break;
   64887                 }
   64888                 break;
   64889               }
   64890               case 0x00000020: {
   64891                 // 0x07400030
   64892                 switch (instr & 0x00100080) {
   64893                   case 0x00000000: {
   64894                     // 0x07400030
   64895                     if (((instr & 0xf0000000) == 0xf0000000)) {
   64896                       UnallocatedA32(instr);
   64897                       return;
   64898                     }
   64899                     Condition condition((instr >> 28) & 0xf);
   64900                     unsigned rdlo = (instr >> 12) & 0xf;
   64901                     unsigned rdhi = (instr >> 16) & 0xf;
   64902                     unsigned rn = instr & 0xf;
   64903                     unsigned rm = (instr >> 8) & 0xf;
   64904                     // SMLALDX{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
   64905                     smlaldx(condition,
   64906                             Register(rdlo),
   64907                             Register(rdhi),
   64908                             Register(rn),
   64909                             Register(rm));
   64910                     break;
   64911                   }
   64912                   case 0x00100000: {
   64913                     // 0x07500030
   64914                     switch (instr & 0x0000f000) {
   64915                       case 0x0000f000: {
   64916                         // 0x0750f030
   64917                         if (((instr & 0xf0000000) == 0xf0000000)) {
   64918                           UnallocatedA32(instr);
   64919                           return;
   64920                         }
   64921                         Condition condition((instr >> 28) & 0xf);
   64922                         unsigned rd = (instr >> 16) & 0xf;
   64923                         unsigned rn = instr & 0xf;
   64924                         unsigned rm = (instr >> 8) & 0xf;
   64925                         // SMMULR{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
   64926                         smmulr(condition,
   64927                                Register(rd),
   64928                                Register(rn),
   64929                                Register(rm));
   64930                         break;
   64931                       }
   64932                       default: {
   64933                         if (((instr & 0xf0000000) == 0xf0000000) ||
   64934                             ((instr & 0xf000) == 0xf000)) {
   64935                           UnallocatedA32(instr);
   64936                           return;
   64937                         }
   64938                         Condition condition((instr >> 28) & 0xf);
   64939                         unsigned rd = (instr >> 16) & 0xf;
   64940                         unsigned rn = instr & 0xf;
   64941                         unsigned rm = (instr >> 8) & 0xf;
   64942                         unsigned ra = (instr >> 12) & 0xf;
   64943                         // SMMLAR{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
   64944                         smmlar(condition,
   64945                                Register(rd),
   64946                                Register(rn),
   64947                                Register(rm),
   64948                                Register(ra));
   64949                         break;
   64950                       }
   64951                     }
   64952                     break;
   64953                   }
   64954                   default:
   64955                     UnallocatedA32(instr);
   64956                     break;
   64957                 }
   64958                 break;
   64959               }
   64960               case 0x00000040: {
   64961                 // 0x07400050
   64962                 switch (instr & 0x00100080) {
   64963                   case 0x00000000: {
   64964                     // 0x07400050
   64965                     if (((instr & 0xf0000000) == 0xf0000000)) {
   64966                       UnallocatedA32(instr);
   64967                       return;
   64968                     }
   64969                     Condition condition((instr >> 28) & 0xf);
   64970                     unsigned rdlo = (instr >> 12) & 0xf;
   64971                     unsigned rdhi = (instr >> 16) & 0xf;
   64972                     unsigned rn = instr & 0xf;
   64973                     unsigned rm = (instr >> 8) & 0xf;
   64974                     // SMLSLD{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
   64975                     smlsld(condition,
   64976                            Register(rdlo),
   64977                            Register(rdhi),
   64978                            Register(rn),
   64979                            Register(rm));
   64980                     break;
   64981                   }
   64982                   case 0x00100080: {
   64983                     // 0x075000d0
   64984                     if (((instr & 0xf0000000) == 0xf0000000)) {
   64985                       UnallocatedA32(instr);
   64986                       return;
   64987                     }
   64988                     Condition condition((instr >> 28) & 0xf);
   64989                     unsigned rd = (instr >> 16) & 0xf;
   64990                     unsigned rn = instr & 0xf;
   64991                     unsigned rm = (instr >> 8) & 0xf;
   64992                     unsigned ra = (instr >> 12) & 0xf;
   64993                     // SMMLS{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
   64994                     smmls(condition,
   64995                           Register(rd),
   64996                           Register(rn),
   64997                           Register(rm),
   64998                           Register(ra));
   64999                     break;
   65000                   }
   65001                   default:
   65002                     UnallocatedA32(instr);
   65003                     break;
   65004                 }
   65005                 break;
   65006               }
   65007               case 0x00000060: {
   65008                 // 0x07400070
   65009                 switch (instr & 0x00100080) {
   65010                   case 0x00000000: {
   65011                     // 0x07400070
   65012                     if (((instr & 0xf0000000) == 0xf0000000)) {
   65013                       UnallocatedA32(instr);
   65014                       return;
   65015                     }
   65016                     Condition condition((instr >> 28) & 0xf);
   65017                     unsigned rdlo = (instr >> 12) & 0xf;
   65018                     unsigned rdhi = (instr >> 16) & 0xf;
   65019                     unsigned rn = instr & 0xf;
   65020                     unsigned rm = (instr >> 8) & 0xf;
   65021                     // SMLSLDX{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
   65022                     smlsldx(condition,
   65023                             Register(rdlo),
   65024                             Register(rdhi),
   65025                             Register(rn),
   65026                             Register(rm));
   65027                     break;
   65028                   }
   65029                   case 0x00100080: {
   65030                     // 0x075000f0
   65031                     if (((instr & 0xf0000000) == 0xf0000000)) {
   65032                       UnallocatedA32(instr);
   65033                       return;
   65034                     }
   65035                     Condition condition((instr >> 28) & 0xf);
   65036                     unsigned rd = (instr >> 16) & 0xf;
   65037                     unsigned rn = instr & 0xf;
   65038                     unsigned rm = (instr >> 8) & 0xf;
   65039                     unsigned ra = (instr >> 12) & 0xf;
   65040                     // SMMLSR{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
   65041                     smmlsr(condition,
   65042                            Register(rd),
   65043                            Register(rn),
   65044                            Register(rm),
   65045                            Register(ra));
   65046                     break;
   65047                   }
   65048                   default:
   65049                     UnallocatedA32(instr);
   65050                     break;
   65051                 }
   65052                 break;
   65053               }
   65054               case 0x00800000: {
   65055                 // 0x07c00010
   65056                 switch (instr & 0x0000000f) {
   65057                   case 0x0000000f: {
   65058                     // 0x07c0001f
   65059                     if (((instr & 0xf0000000) == 0xf0000000)) {
   65060                       UnallocatedA32(instr);
   65061                       return;
   65062                     }
   65063                     Condition condition((instr >> 28) & 0xf);
   65064                     unsigned rd = (instr >> 12) & 0xf;
   65065                     uint32_t lsb = (instr >> 7) & 0x1f;
   65066                     uint32_t msb = (instr >> 16) & 0x1f;
   65067                     uint32_t width = msb - lsb + 1;
   65068                     // BFC{<c>}{<q>} <Rd>, #<lsb>, #<width> ; A1
   65069                     bfc(condition, Register(rd), lsb, width);
   65070                     break;
   65071                   }
   65072                   default: {
   65073                     if (((instr & 0xf0000000) == 0xf0000000) ||
   65074                         ((instr & 0xf) == 0xf)) {
   65075                       UnallocatedA32(instr);
   65076                       return;
   65077                     }
   65078                     Condition condition((instr >> 28) & 0xf);
   65079                     unsigned rd = (instr >> 12) & 0xf;
   65080                     unsigned rn = instr & 0xf;
   65081                     uint32_t lsb = (instr >> 7) & 0x1f;
   65082                     uint32_t msb = (instr >> 16) & 0x1f;
   65083                     uint32_t width = msb - lsb + 1;
   65084                     // BFI{<c>}{<q>} <Rd>, <Rn>, #<lsb>, #<width> ; A1
   65085                     bfi(condition, Register(rd), Register(rn), lsb, width);
   65086                     break;
   65087                   }
   65088                 }
   65089                 break;
   65090               }
   65091               default:
   65092                 UnallocatedA32(instr);
   65093                 break;
   65094             }
   65095             break;
   65096           }
   65097           case 0x01600000: {
   65098             // 0x07600000
   65099             switch (instr & 0x00100000) {
   65100               case 0x00000000: {
   65101                 // 0x07600000
   65102                 if (((instr & 0xf0000000) == 0xf0000000)) {
   65103                   UnallocatedA32(instr);
   65104                   return;
   65105                 }
   65106                 Condition condition((instr >> 28) & 0xf);
   65107                 unsigned rt = (instr >> 12) & 0xf;
   65108                 unsigned rn = (instr >> 16) & 0xf;
   65109                 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
   65110                 unsigned rm = instr & 0xf;
   65111                 uint32_t imm_and_type_ = ((instr >> 5) & 0x7f);
   65112                 ImmediateShiftOperand shift_operand(imm_and_type_ & 0x3,
   65113                                                     (imm_and_type_ & 0x7c) >>
   65114                                                         2);
   65115                 Shift shift = shift_operand.GetShift();
   65116                 uint32_t amount = shift_operand.GetAmount();
   65117                 AddrMode addrmode = PreIndex;
   65118                 // STRB{<c>}{<q>} <Rt>, [<Rn>, {+/-}<Rm>{, <shift>}]! ; A1
   65119                 strb(condition,
   65120                      Best,
   65121                      Register(rt),
   65122                      MemOperand(Register(rn),
   65123                                 sign,
   65124                                 Register(rm),
   65125                                 shift,
   65126                                 amount,
   65127                                 addrmode));
   65128                 break;
   65129               }
   65130               case 0x00100000: {
   65131                 // 0x07700000
   65132                 if (((instr & 0xf0000000) == 0xf0000000)) {
   65133                   UnallocatedA32(instr);
   65134                   return;
   65135                 }
   65136                 Condition condition((instr >> 28) & 0xf);
   65137                 unsigned rt = (instr >> 12) & 0xf;
   65138                 unsigned rn = (instr >> 16) & 0xf;
   65139                 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
   65140                 unsigned rm = instr & 0xf;
   65141                 uint32_t imm_and_type_ = ((instr >> 5) & 0x7f);
   65142                 ImmediateShiftOperand shift_operand(imm_and_type_ & 0x3,
   65143                                                     (imm_and_type_ & 0x7c) >>
   65144                                                         2);
   65145                 Shift shift = shift_operand.GetShift();
   65146                 uint32_t amount = shift_operand.GetAmount();
   65147                 AddrMode addrmode = PreIndex;
   65148                 // LDRB{<c>}{<q>} <Rt>, [<Rn>, {+/-}<Rm>{, <shift>}]! ; A1
   65149                 ldrb(condition,
   65150                      Best,
   65151                      Register(rt),
   65152                      MemOperand(Register(rn),
   65153                                 sign,
   65154                                 Register(rm),
   65155                                 shift,
   65156                                 amount,
   65157                                 addrmode));
   65158                 break;
   65159               }
   65160             }
   65161             break;
   65162           }
   65163           case 0x01600010: {
   65164             // 0x07600010
   65165             switch (instr & 0x00800060) {
   65166               case 0x00800040: {
   65167                 // 0x07e00050
   65168                 if (((instr & 0xf0000000) == 0xf0000000)) {
   65169                   UnallocatedA32(instr);
   65170                   return;
   65171                 }
   65172                 Condition condition((instr >> 28) & 0xf);
   65173                 unsigned rd = (instr >> 12) & 0xf;
   65174                 unsigned rn = instr & 0xf;
   65175                 uint32_t lsb = (instr >> 7) & 0x1f;
   65176                 uint32_t widthm1 = (instr >> 16) & 0x1f;
   65177                 uint32_t width = widthm1 + 1;
   65178                 // UBFX{<c>}{<q>} <Rd>, <Rn>, #<lsb>, #<width> ; A1
   65179                 ubfx(condition, Register(rd), Register(rn), lsb, width);
   65180                 break;
   65181               }
   65182               case 0x00800060: {
   65183                 // 0x07e00070
   65184                 if ((instr & 0xf0100080) == 0xe0100080) {
   65185                   uint32_t imm = (instr & 0xf) | ((instr >> 4) & 0xfff0);
   65186                   // UDF{<c>}{<q>} {#}<imm> ; A1
   65187                   udf(al, Best, imm);
   65188                 } else {
   65189                   UnallocatedA32(instr);
   65190                 }
   65191                 break;
   65192               }
   65193               default:
   65194                 UnallocatedA32(instr);
   65195                 break;
   65196             }
   65197             break;
   65198           }
   65199         }
   65200         break;
   65201       }
   65202       case 0x08000000: {
   65203         // 0x08000000
   65204         switch (instr & 0x00500000) {
   65205           case 0x00000000: {
   65206             // 0x08000000
   65207             switch (instr & 0x01800000) {
   65208               case 0x00000000: {
   65209                 // 0x08000000
   65210                 if (((instr & 0xf0000000) == 0xf0000000)) {
   65211                   UnallocatedA32(instr);
   65212                   return;
   65213                 }
   65214                 Condition condition((instr >> 28) & 0xf);
   65215                 unsigned rn = (instr >> 16) & 0xf;
   65216                 WriteBack write_back((instr >> 21) & 0x1);
   65217                 RegisterList registers((instr & 0xffff));
   65218                 // STMDA{<c>}{<q>} <Rn>{!}, <registers> ; A1
   65219                 stmda(condition, Register(rn), write_back, registers);
   65220                 break;
   65221               }
   65222               case 0x00800000: {
   65223                 // 0x08800000
   65224                 if (((instr & 0xf0000000) == 0xf0000000)) {
   65225                   UnallocatedA32(instr);
   65226                   return;
   65227                 }
   65228                 Condition condition((instr >> 28) & 0xf);
   65229                 unsigned rn = (instr >> 16) & 0xf;
   65230                 WriteBack write_back((instr >> 21) & 0x1);
   65231                 RegisterList registers((instr & 0xffff));
   65232                 // STM{<c>}{<q>} <Rn>{!}, <registers> ; A1
   65233                 stm(condition, Best, Register(rn), write_back, registers);
   65234                 break;
   65235               }
   65236               case 0x01000000: {
   65237                 // 0x09000000
   65238                 if (((instr & 0xf0000000) == 0xf0000000)) {
   65239                   UnallocatedA32(instr);
   65240                   return;
   65241                 }
   65242                 if (((Uint32((instr >> 21)) & Uint32(0x1)) == Uint32(0x1)) &&
   65243                     ((Uint32((instr >> 16)) & Uint32(0xf)) == Uint32(0xd)) &&
   65244                     ((instr & 0xf0000000) != 0xf0000000) &&
   65245                     (BitCount((Uint32(instr) & Uint32(0xffff))) > Int64(1))) {
   65246                   Condition condition((instr >> 28) & 0xf);
   65247                   RegisterList registers((instr & 0xffff));
   65248                   // PUSH{<c>}{<q>} <registers> ; A1
   65249                   push(condition, Best, registers);
   65250                   return;
   65251                 }
   65252                 Condition condition((instr >> 28) & 0xf);
   65253                 unsigned rn = (instr >> 16) & 0xf;
   65254                 WriteBack write_back((instr >> 21) & 0x1);
   65255                 RegisterList registers((instr & 0xffff));
   65256                 // STMDB{<c>}{<q>} <Rn>{!}, <registers> ; A1
   65257                 stmdb(condition, Best, Register(rn), write_back, registers);
   65258                 break;
   65259               }
   65260               case 0x01800000: {
   65261                 // 0x09800000
   65262                 if (((instr & 0xf0000000) == 0xf0000000)) {
   65263                   UnallocatedA32(instr);
   65264                   return;
   65265                 }
   65266                 Condition condition((instr >> 28) & 0xf);
   65267                 unsigned rn = (instr >> 16) & 0xf;
   65268                 WriteBack write_back((instr >> 21) & 0x1);
   65269                 RegisterList registers((instr & 0xffff));
   65270                 // STMIB{<c>}{<q>} <Rn>{!}, <registers> ; A1
   65271                 stmib(condition, Register(rn), write_back, registers);
   65272                 break;
   65273               }
   65274             }
   65275             break;
   65276           }
   65277           case 0x00100000: {
   65278             // 0x08100000
   65279             switch (instr & 0x01800000) {
   65280               case 0x00000000: {
   65281                 // 0x08100000
   65282                 if (((instr & 0xf0000000) == 0xf0000000)) {
   65283                   UnallocatedA32(instr);
   65284                   return;
   65285                 }
   65286                 Condition condition((instr >> 28) & 0xf);
   65287                 unsigned rn = (instr >> 16) & 0xf;
   65288                 WriteBack write_back((instr >> 21) & 0x1);
   65289                 RegisterList registers((instr & 0xffff));
   65290                 // LDMDA{<c>}{<q>} <Rn>{!}, <registers> ; A1
   65291                 ldmda(condition, Register(rn), write_back, registers);
   65292                 break;
   65293               }
   65294               case 0x00800000: {
   65295                 // 0x08900000
   65296                 if (((instr & 0xf0000000) == 0xf0000000)) {
   65297                   UnallocatedA32(instr);
   65298                   return;
   65299                 }
   65300                 if (((Uint32((instr >> 21)) & Uint32(0x1)) == Uint32(0x1)) &&
   65301                     ((Uint32((instr >> 16)) & Uint32(0xf)) == Uint32(0xd)) &&
   65302                     ((instr & 0xf0000000) != 0xf0000000) &&
   65303                     (BitCount((Uint32(instr) & Uint32(0xffff))) > Int64(1))) {
   65304                   Condition condition((instr >> 28) & 0xf);
   65305                   RegisterList registers((instr & 0xffff));
   65306                   // POP{<c>}{<q>} <registers> ; A1
   65307                   pop(condition, Best, registers);
   65308                   return;
   65309                 }
   65310                 Condition condition((instr >> 28) & 0xf);
   65311                 unsigned rn = (instr >> 16) & 0xf;
   65312                 WriteBack write_back((instr >> 21) & 0x1);
   65313                 RegisterList registers((instr & 0xffff));
   65314                 // LDM{<c>}{<q>} <Rn>{!}, <registers> ; A1
   65315                 ldm(condition, Best, Register(rn), write_back, registers);
   65316                 break;
   65317               }
   65318               case 0x01000000: {
   65319                 // 0x09100000
   65320                 if (((instr & 0xf0000000) == 0xf0000000)) {
   65321                   UnallocatedA32(instr);
   65322                   return;
   65323                 }
   65324                 Condition condition((instr >> 28) & 0xf);
   65325                 unsigned rn = (instr >> 16) & 0xf;
   65326                 WriteBack write_back((instr >> 21) & 0x1);
   65327                 RegisterList registers((instr & 0xffff));
   65328                 // LDMDB{<c>}{<q>} <Rn>{!}, <registers> ; A1
   65329                 ldmdb(condition, Register(rn), write_back, registers);
   65330                 break;
   65331               }
   65332               case 0x01800000: {
   65333                 // 0x09900000
   65334                 if (((instr & 0xf0000000) == 0xf0000000)) {
   65335                   UnallocatedA32(instr);
   65336                   return;
   65337                 }
   65338                 Condition condition((instr >> 28) & 0xf);
   65339                 unsigned rn = (instr >> 16) & 0xf;
   65340                 WriteBack write_back((instr >> 21) & 0x1);
   65341                 RegisterList registers((instr & 0xffff));
   65342                 // LDMIB{<c>}{<q>} <Rn>{!}, <registers> ; A1
   65343                 ldmib(condition, Register(rn), write_back, registers);
   65344                 break;
   65345               }
   65346             }
   65347             break;
   65348           }
   65349           case 0x00400000: {
   65350             // 0x08400000
   65351             if (((instr & 0xf0000000) == 0xf0000000)) {
   65352               UnallocatedA32(instr);
   65353               return;
   65354             }
   65355             UnimplementedA32("STM", instr);
   65356             break;
   65357           }
   65358           case 0x00500000: {
   65359             // 0x08500000
   65360             switch (instr & 0x00008000) {
   65361               case 0x00000000: {
   65362                 // 0x08500000
   65363                 if (((instr & 0xf0000000) == 0xf0000000)) {
   65364                   UnallocatedA32(instr);
   65365                   return;
   65366                 }
   65367                 UnimplementedA32("LDM", instr);
   65368                 break;
   65369               }
   65370               case 0x00008000: {
   65371                 // 0x08508000
   65372                 if (((instr & 0xf0000000) == 0xf0000000)) {
   65373                   UnallocatedA32(instr);
   65374                   return;
   65375                 }
   65376                 UnimplementedA32("LDM", instr);
   65377                 break;
   65378               }
   65379             }
   65380             break;
   65381           }
   65382         }
   65383         break;
   65384       }
   65385       case 0x0a000000: {
   65386         // 0x0a000000
   65387         switch (instr & 0x01000000) {
   65388           case 0x00000000: {
   65389             // 0x0a000000
   65390             if (((instr & 0xf0000000) == 0xf0000000)) {
   65391               UnallocatedA32(instr);
   65392               return;
   65393             }
   65394             Condition condition((instr >> 28) & 0xf);
   65395             int32_t imm = SignExtend<int32_t>(instr & 0xffffff, 24) << 2;
   65396             Location location(imm, kA32PcDelta);
   65397             // B{<c>}{<q>} <label> ; A1
   65398             b(condition, Best, &location);
   65399             break;
   65400           }
   65401           case 0x01000000: {
   65402             // 0x0b000000
   65403             if (((instr & 0xf0000000) == 0xf0000000)) {
   65404               UnallocatedA32(instr);
   65405               return;
   65406             }
   65407             Condition condition((instr >> 28) & 0xf);
   65408             int32_t imm = SignExtend<int32_t>(instr & 0xffffff, 24) << 2;
   65409             Location location(imm, kA32PcDelta);
   65410             // BL{<c>}{<q>} <label> ; A1
   65411             bl(condition, &location);
   65412             break;
   65413           }
   65414         }
   65415         break;
   65416       }
   65417       case 0x0c000000: {
   65418         // 0x0c000000
   65419         switch (instr & 0x01100000) {
   65420           case 0x00000000: {
   65421             // 0x0c000000
   65422             switch (instr & 0x00000e00) {
   65423               case 0x00000a00: {
   65424                 // 0x0c000a00
   65425                 switch (instr & 0x00800100) {
   65426                   case 0x00000000: {
   65427                     // 0x0c000a00
   65428                     if ((instr & 0x006000d0) == 0x00400010) {
   65429                       if (((instr & 0xf0000000) == 0xf0000000)) {
   65430                         UnallocatedA32(instr);
   65431                         return;
   65432                       }
   65433                       Condition condition((instr >> 28) & 0xf);
   65434                       unsigned rm = ExtractSRegister(instr, 5, 0);
   65435                       unsigned rt = (instr >> 12) & 0xf;
   65436                       unsigned rt2 = (instr >> 16) & 0xf;
   65437                       // VMOV{<c>}{<q>} <Sm>, <Sm1>, <Rt>, <Rt2> ; A1
   65438                       vmov(condition,
   65439                            SRegister(rm),
   65440                            SRegister(rm + 1),
   65441                            Register(rt),
   65442                            Register(rt2));
   65443                     } else {
   65444                       UnallocatedA32(instr);
   65445                     }
   65446                     break;
   65447                   }
   65448                   case 0x00000100: {
   65449                     // 0x0c000b00
   65450                     if ((instr & 0x006000d0) == 0x00400010) {
   65451                       if (((instr & 0xf0000000) == 0xf0000000)) {
   65452                         UnallocatedA32(instr);
   65453                         return;
   65454                       }
   65455                       Condition condition((instr >> 28) & 0xf);
   65456                       unsigned rm = ExtractDRegister(instr, 5, 0);
   65457                       unsigned rt = (instr >> 12) & 0xf;
   65458                       unsigned rt2 = (instr >> 16) & 0xf;
   65459                       // VMOV{<c>}{<q>} <Dm>, <Rt>, <Rt2> ; A1
   65460                       vmov(condition,
   65461                            DRegister(rm),
   65462                            Register(rt),
   65463                            Register(rt2));
   65464                     } else {
   65465                       UnallocatedA32(instr);
   65466                     }
   65467                     break;
   65468                   }
   65469                   case 0x00800000: {
   65470                     // 0x0c800a00
   65471                     if (((instr & 0xf0000000) == 0xf0000000)) {
   65472                       UnallocatedA32(instr);
   65473                       return;
   65474                     }
   65475                     Condition condition((instr >> 28) & 0xf);
   65476                     unsigned rn = (instr >> 16) & 0xf;
   65477                     WriteBack write_back((instr >> 21) & 0x1);
   65478                     unsigned first = ExtractSRegister(instr, 22, 12);
   65479                     unsigned len = instr & 0xff;
   65480                     // VSTM{<c>}{<q>}{.<size>} <Rn>{!}, <sreglist> ; A2
   65481                     vstm(condition,
   65482                          kDataTypeValueNone,
   65483                          Register(rn),
   65484                          write_back,
   65485                          SRegisterList(SRegister(first), len));
   65486                     if ((len == 0) || ((first + len) > kNumberOfSRegisters)) {
   65487                       UnpredictableA32(instr);
   65488                     }
   65489                     break;
   65490                   }
   65491                   case 0x00800100: {
   65492                     // 0x0c800b00
   65493                     switch (instr & 0x00000001) {
   65494                       case 0x00000000: {
   65495                         // 0x0c800b00
   65496                         if (((instr & 0xf0000000) == 0xf0000000)) {
   65497                           UnallocatedA32(instr);
   65498                           return;
   65499                         }
   65500                         Condition condition((instr >> 28) & 0xf);
   65501                         unsigned rn = (instr >> 16) & 0xf;
   65502                         WriteBack write_back((instr >> 21) & 0x1);
   65503                         unsigned first = ExtractDRegister(instr, 22, 12);
   65504                         unsigned imm8 = (instr & 0xff);
   65505                         unsigned len = imm8 / 2;
   65506                         unsigned end = first + len;
   65507                         // VSTM{<c>}{<q>}{.<size>} <Rn>{!}, <dreglist> ; A1
   65508                         vstm(condition,
   65509                              kDataTypeValueNone,
   65510                              Register(rn),
   65511                              write_back,
   65512                              DRegisterList(DRegister(first), len));
   65513                         if ((len == 0) || (len > 16) ||
   65514                             (end > kMaxNumberOfDRegisters)) {
   65515                           UnpredictableA32(instr);
   65516                         }
   65517                         break;
   65518                       }
   65519                       case 0x00000001: {
   65520                         // 0x0c800b01
   65521                         if (((instr & 0xf0000000) == 0xf0000000)) {
   65522                           UnallocatedA32(instr);
   65523                           return;
   65524                         }
   65525                         Condition condition((instr >> 28) & 0xf);
   65526                         unsigned rn = (instr >> 16) & 0xf;
   65527                         WriteBack write_back((instr >> 21) & 0x1);
   65528                         unsigned first = ExtractDRegister(instr, 22, 12);
   65529                         unsigned imm8 = (instr & 0xff);
   65530                         unsigned len = imm8 / 2;
   65531                         unsigned end = first + len;
   65532                         // FSTMIAX{<c>}{<q>} <Rn>{!}, <dreglist> ; A1
   65533                         fstmiax(condition,
   65534                                 Register(rn),
   65535                                 write_back,
   65536                                 DRegisterList(DRegister(first), len));
   65537                         if ((len == 0) || (len > 16) || (end > 16)) {
   65538                           UnpredictableA32(instr);
   65539                         }
   65540                         break;
   65541                       }
   65542                     }
   65543                     break;
   65544                   }
   65545                 }
   65546                 break;
   65547               }
   65548               default: {
   65549                 switch (instr & 0x00200000) {
   65550                   case 0x00000000: {
   65551                     // 0x0c000000
   65552                     switch (instr & 0x00800000) {
   65553                       case 0x00000000: {
   65554                         // 0x0c000000
   65555                         if ((instr & 0x00400000) == 0x00400000) {
   65556                           if (((instr & 0xf0000000) == 0xf0000000) ||
   65557                               ((instr & 0xe00) == 0xa00)) {
   65558                             UnallocatedA32(instr);
   65559                             return;
   65560                           }
   65561                           UnimplementedA32("MCRR", instr);
   65562                         } else {
   65563                           UnallocatedA32(instr);
   65564                         }
   65565                         break;
   65566                       }
   65567                       case 0x00800000: {
   65568                         // 0x0c800000
   65569                         if (((instr & 0xf0000000) == 0xf0000000) ||
   65570                             ((instr & 0xe00) == 0xa00)) {
   65571                           UnallocatedA32(instr);
   65572                           return;
   65573                         }
   65574                         UnimplementedA32("STC", instr);
   65575                         break;
   65576                       }
   65577                     }
   65578                     break;
   65579                   }
   65580                   case 0x00200000: {
   65581                     // 0x0c200000
   65582                     if (((instr & 0xf0000000) == 0xf0000000) ||
   65583                         ((instr & 0xe00) == 0xa00)) {
   65584                       UnallocatedA32(instr);
   65585                       return;
   65586                     }
   65587                     UnimplementedA32("STC", instr);
   65588                     break;
   65589                   }
   65590                 }
   65591                 break;
   65592               }
   65593             }
   65594             break;
   65595           }
   65596           case 0x00100000: {
   65597             // 0x0c100000
   65598             switch (instr & 0x00000e00) {
   65599               case 0x00000a00: {
   65600                 // 0x0c100a00
   65601                 switch (instr & 0x00800100) {
   65602                   case 0x00000000: {
   65603                     // 0x0c100a00
   65604                     if ((instr & 0x006000d0) == 0x00400010) {
   65605                       if (((instr & 0xf0000000) == 0xf0000000)) {
   65606                         UnallocatedA32(instr);
   65607                         return;
   65608                       }
   65609                       Condition condition((instr >> 28) & 0xf);
   65610                       unsigned rt = (instr >> 12) & 0xf;
   65611                       unsigned rt2 = (instr >> 16) & 0xf;
   65612                       unsigned rm = ExtractSRegister(instr, 5, 0);
   65613                       // VMOV{<c>}{<q>} <Rt>, <Rt2>, <Sm>, <Sm1> ; A1
   65614                       vmov(condition,
   65615                            Register(rt),
   65616                            Register(rt2),
   65617                            SRegister(rm),
   65618                            SRegister(rm + 1));
   65619                     } else {
   65620                       UnallocatedA32(instr);
   65621                     }
   65622                     break;
   65623                   }
   65624                   case 0x00000100: {
   65625                     // 0x0c100b00
   65626                     if ((instr & 0x006000d0) == 0x00400010) {
   65627                       if (((instr & 0xf0000000) == 0xf0000000)) {
   65628                         UnallocatedA32(instr);
   65629                         return;
   65630                       }
   65631                       Condition condition((instr >> 28) & 0xf);
   65632                       unsigned rt = (instr >> 12) & 0xf;
   65633                       unsigned rt2 = (instr >> 16) & 0xf;
   65634                       unsigned rm = ExtractDRegister(instr, 5, 0);
   65635                       // VMOV{<c>}{<q>} <Rt>, <Rt2>, <Dm> ; A1
   65636                       vmov(condition,
   65637                            Register(rt),
   65638                            Register(rt2),
   65639                            DRegister(rm));
   65640                     } else {
   65641                       UnallocatedA32(instr);
   65642                     }
   65643                     break;
   65644                   }
   65645                   case 0x00800000: {
   65646                     // 0x0c900a00
   65647                     if (((instr & 0xf0000000) == 0xf0000000)) {
   65648                       UnallocatedA32(instr);
   65649                       return;
   65650                     }
   65651                     if (((Uint32((instr >> 21)) & Uint32(0x1)) ==
   65652                          Uint32(0x1)) &&
   65653                         ((Uint32((instr >> 16)) & Uint32(0xf)) ==
   65654                          Uint32(0xd)) &&
   65655                         ((instr & 0xf0000000) != 0xf0000000)) {
   65656                       Condition condition((instr >> 28) & 0xf);
   65657                       unsigned first = ExtractSRegister(instr, 22, 12);
   65658                       unsigned len = instr & 0xff;
   65659                       // VPOP{<c>}{<q>}{.<size>} <sreglist> ; A2
   65660                       vpop(condition,
   65661                            kDataTypeValueNone,
   65662                            SRegisterList(SRegister(first), len));
   65663                       if ((len == 0) || ((first + len) > kNumberOfSRegisters)) {
   65664                         UnpredictableA32(instr);
   65665                       }
   65666                       return;
   65667                     }
   65668                     Condition condition((instr >> 28) & 0xf);
   65669                     unsigned rn = (instr >> 16) & 0xf;
   65670                     WriteBack write_back((instr >> 21) & 0x1);
   65671                     unsigned first = ExtractSRegister(instr, 22, 12);
   65672                     unsigned len = instr & 0xff;
   65673                     // VLDM{<c>}{<q>}{.<size>} <Rn>{!}, <sreglist> ; A2
   65674                     vldm(condition,
   65675                          kDataTypeValueNone,
   65676                          Register(rn),
   65677                          write_back,
   65678                          SRegisterList(SRegister(first), len));
   65679                     if ((len == 0) || ((first + len) > kNumberOfSRegisters)) {
   65680                       UnpredictableA32(instr);
   65681                     }
   65682                     break;
   65683                   }
   65684                   case 0x00800100: {
   65685                     // 0x0c900b00
   65686                     switch (instr & 0x00000001) {
   65687                       case 0x00000000: {
   65688                         // 0x0c900b00
   65689                         if (((instr & 0xf0000000) == 0xf0000000)) {
   65690                           UnallocatedA32(instr);
   65691                           return;
   65692                         }
   65693                         if (((Uint32((instr >> 21)) & Uint32(0x1)) ==
   65694                              Uint32(0x1)) &&
   65695                             ((Uint32((instr >> 16)) & Uint32(0xf)) ==
   65696                              Uint32(0xd)) &&
   65697                             ((instr & 0xf0000000) != 0xf0000000)) {
   65698                           Condition condition((instr >> 28) & 0xf);
   65699                           unsigned first = ExtractDRegister(instr, 22, 12);
   65700                           unsigned imm8 = (instr & 0xff);
   65701                           unsigned len = imm8 / 2;
   65702                           unsigned end = first + len;
   65703                           // VPOP{<c>}{<q>}{.<size>} <dreglist> ; A1
   65704                           vpop(condition,
   65705                                kDataTypeValueNone,
   65706                                DRegisterList(DRegister(first), len));
   65707                           if ((len == 0) || (len > 16) ||
   65708                               (end > kMaxNumberOfDRegisters)) {
   65709                             UnpredictableA32(instr);
   65710                           }
   65711                           return;
   65712                         }
   65713                         Condition condition((instr >> 28) & 0xf);
   65714                         unsigned rn = (instr >> 16) & 0xf;
   65715                         WriteBack write_back((instr >> 21) & 0x1);
   65716                         unsigned first = ExtractDRegister(instr, 22, 12);
   65717                         unsigned imm8 = (instr & 0xff);
   65718                         unsigned len = imm8 / 2;
   65719                         unsigned end = first + len;
   65720                         // VLDM{<c>}{<q>}{.<size>} <Rn>{!}, <dreglist> ; A1
   65721                         vldm(condition,
   65722                              kDataTypeValueNone,
   65723                              Register(rn),
   65724                              write_back,
   65725                              DRegisterList(DRegister(first), len));
   65726                         if ((len == 0) || (len > 16) ||
   65727                             (end > kMaxNumberOfDRegisters)) {
   65728                           UnpredictableA32(instr);
   65729                         }
   65730                         break;
   65731                       }
   65732                       case 0x00000001: {
   65733                         // 0x0c900b01
   65734                         if (((instr & 0xf0000000) == 0xf0000000)) {
   65735                           UnallocatedA32(instr);
   65736                           return;
   65737                         }
   65738                         Condition condition((instr >> 28) & 0xf);
   65739                         unsigned rn = (instr >> 16) & 0xf;
   65740                         WriteBack write_back((instr >> 21) & 0x1);
   65741                         unsigned first = ExtractDRegister(instr, 22, 12);
   65742                         unsigned imm8 = (instr & 0xff);
   65743                         unsigned len = imm8 / 2;
   65744                         unsigned end = first + len;
   65745                         // FLDMIAX{<c>}{<q>} <Rn>{!}, <dreglist> ; A1
   65746                         fldmiax(condition,
   65747                                 Register(rn),
   65748                                 write_back,
   65749                                 DRegisterList(DRegister(first), len));
   65750                         if ((len == 0) || (len > 16) || (end > 16)) {
   65751                           UnpredictableA32(instr);
   65752                         }
   65753                         break;
   65754                       }
   65755                     }
   65756                     break;
   65757                   }
   65758                 }
   65759                 break;
   65760               }
   65761               default: {
   65762                 switch (instr & 0x00200000) {
   65763                   case 0x00000000: {
   65764                     // 0x0c100000
   65765                     switch (instr & 0x00800000) {
   65766                       case 0x00000000: {
   65767                         // 0x0c100000
   65768                         if ((instr & 0x00400000) == 0x00400000) {
   65769                           if (((instr & 0xf0000000) == 0xf0000000) ||
   65770                               ((instr & 0xe00) == 0xa00)) {
   65771                             UnallocatedA32(instr);
   65772                             return;
   65773                           }
   65774                           UnimplementedA32("MRRC", instr);
   65775                         } else {
   65776                           UnallocatedA32(instr);
   65777                         }
   65778                         break;
   65779                       }
   65780                       case 0x00800000: {
   65781                         // 0x0c900000
   65782                         switch (instr & 0x000f0000) {
   65783                           case 0x000f0000: {
   65784                             // 0x0c9f0000
   65785                             if (((instr & 0xf0000000) == 0xf0000000) ||
   65786                                 ((instr & 0xe00) == 0xa00)) {
   65787                               UnallocatedA32(instr);
   65788                               return;
   65789                             }
   65790                             UnimplementedA32("LDC", instr);
   65791                             break;
   65792                           }
   65793                           default: {
   65794                             if (((instr & 0xf0000000) == 0xf0000000) ||
   65795                                 ((instr & 0xf0000) == 0xf0000) ||
   65796                                 ((instr & 0xe00) == 0xa00)) {
   65797                               UnallocatedA32(instr);
   65798                               return;
   65799                             }
   65800                             UnimplementedA32("LDC", instr);
   65801                             break;
   65802                           }
   65803                         }
   65804                         break;
   65805                       }
   65806                     }
   65807                     break;
   65808                   }
   65809                   case 0x00200000: {
   65810                     // 0x0c300000
   65811                     if (((instr & 0xf0000000) == 0xf0000000) ||
   65812                         ((instr & 0xf0000) == 0xf0000) ||
   65813                         ((instr & 0xe00) == 0xa00)) {
   65814                       UnallocatedA32(instr);
   65815                       return;
   65816                     }
   65817                     UnimplementedA32("LDC", instr);
   65818                     break;
   65819                   }
   65820                 }
   65821                 break;
   65822               }
   65823             }
   65824             break;
   65825           }
   65826           case 0x01000000: {
   65827             // 0x0d000000
   65828             switch (instr & 0x00200000) {
   65829               case 0x00000000: {
   65830                 // 0x0d000000
   65831                 switch (instr & 0x00000e00) {
   65832                   case 0x00000a00: {
   65833                     // 0x0d000a00
   65834                     switch (instr & 0x00000100) {
   65835                       case 0x00000000: {
   65836                         // 0x0d000a00
   65837                         if (((instr & 0xf0000000) == 0xf0000000)) {
   65838                           UnallocatedA32(instr);
   65839                           return;
   65840                         }
   65841                         Condition condition((instr >> 28) & 0xf);
   65842                         unsigned rd = ExtractSRegister(instr, 22, 12);
   65843                         unsigned rn = (instr >> 16) & 0xf;
   65844                         Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
   65845                         int32_t offset = (instr & 0xff) << 2;
   65846                         // VSTR{<c>}{<q>}{.32} <Sd>, [<Rn>{, #{+/-}<imm>}] ; A2
   65847                         vstr(condition,
   65848                              Untyped32,
   65849                              SRegister(rd),
   65850                              MemOperand(Register(rn), sign, offset, Offset));
   65851                         break;
   65852                       }
   65853                       case 0x00000100: {
   65854                         // 0x0d000b00
   65855                         if (((instr & 0xf0000000) == 0xf0000000)) {
   65856                           UnallocatedA32(instr);
   65857                           return;
   65858                         }
   65859                         Condition condition((instr >> 28) & 0xf);
   65860                         unsigned rd = ExtractDRegister(instr, 22, 12);
   65861                         unsigned rn = (instr >> 16) & 0xf;
   65862                         Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
   65863                         int32_t offset = (instr & 0xff) << 2;
   65864                         // VSTR{<c>}{<q>}{.64} <Dd>, [<Rn>{, #{+/-}<imm>}] ; A1
   65865                         vstr(condition,
   65866                              Untyped64,
   65867                              DRegister(rd),
   65868                              MemOperand(Register(rn), sign, offset, Offset));
   65869                         break;
   65870                       }
   65871                     }
   65872                     break;
   65873                   }
   65874                   default: {
   65875                     if (((instr & 0xf0000000) == 0xf0000000) ||
   65876                         ((instr & 0xe00) == 0xa00)) {
   65877                       UnallocatedA32(instr);
   65878                       return;
   65879                     }
   65880                     UnimplementedA32("STC", instr);
   65881                     break;
   65882                   }
   65883                 }
   65884                 break;
   65885               }
   65886               case 0x00200000: {
   65887                 // 0x0d200000
   65888                 switch (instr & 0x00000e00) {
   65889                   case 0x00000a00: {
   65890                     // 0x0d200a00
   65891                     switch (instr & 0x00800100) {
   65892                       case 0x00000000: {
   65893                         // 0x0d200a00
   65894                         if (((instr & 0xf0000000) == 0xf0000000)) {
   65895                           UnallocatedA32(instr);
   65896                           return;
   65897                         }
   65898                         if (((Uint32((instr >> 16)) & Uint32(0xf)) ==
   65899                              Uint32(0xd)) &&
   65900                             ((instr & 0xf0000000) != 0xf0000000)) {
   65901                           Condition condition((instr >> 28) & 0xf);
   65902                           unsigned first = ExtractSRegister(instr, 22, 12);
   65903                           unsigned len = instr & 0xff;
   65904                           // VPUSH{<c>}{<q>}{.<size>} <sreglist> ; A2
   65905                           vpush(condition,
   65906                                 kDataTypeValueNone,
   65907                                 SRegisterList(SRegister(first), len));
   65908                           if ((len == 0) ||
   65909                               ((first + len) > kNumberOfSRegisters)) {
   65910                             UnpredictableA32(instr);
   65911                           }
   65912                           return;
   65913                         }
   65914                         Condition condition((instr >> 28) & 0xf);
   65915                         unsigned rn = (instr >> 16) & 0xf;
   65916                         unsigned first = ExtractSRegister(instr, 22, 12);
   65917                         unsigned len = instr & 0xff;
   65918                         // VSTMDB{<c>}{<q>}{.<size>} <Rn>!, <sreglist> ; A2
   65919                         vstmdb(condition,
   65920                                kDataTypeValueNone,
   65921                                Register(rn),
   65922                                WriteBack(WRITE_BACK),
   65923                                SRegisterList(SRegister(first), len));
   65924                         if ((len == 0) ||
   65925                             ((first + len) > kNumberOfSRegisters)) {
   65926                           UnpredictableA32(instr);
   65927                         }
   65928                         break;
   65929                       }
   65930                       case 0x00000100: {
   65931                         // 0x0d200b00
   65932                         switch (instr & 0x00000001) {
   65933                           case 0x00000000: {
   65934                             // 0x0d200b00
   65935                             if (((instr & 0xf0000000) == 0xf0000000)) {
   65936                               UnallocatedA32(instr);
   65937                               return;
   65938                             }
   65939                             if (((Uint32((instr >> 16)) & Uint32(0xf)) ==
   65940                                  Uint32(0xd)) &&
   65941                                 ((instr & 0xf0000000) != 0xf0000000)) {
   65942                               Condition condition((instr >> 28) & 0xf);
   65943                               unsigned first = ExtractDRegister(instr, 22, 12);
   65944                               unsigned imm8 = (instr & 0xff);
   65945                               unsigned len = imm8 / 2;
   65946                               unsigned end = first + len;
   65947                               // VPUSH{<c>}{<q>}{.<size>} <dreglist> ; A1
   65948                               vpush(condition,
   65949                                     kDataTypeValueNone,
   65950                                     DRegisterList(DRegister(first), len));
   65951                               if ((len == 0) || (len > 16) ||
   65952                                   (end > kMaxNumberOfDRegisters)) {
   65953                                 UnpredictableA32(instr);
   65954                               }
   65955                               return;
   65956                             }
   65957                             Condition condition((instr >> 28) & 0xf);
   65958                             unsigned rn = (instr >> 16) & 0xf;
   65959                             unsigned first = ExtractDRegister(instr, 22, 12);
   65960                             unsigned imm8 = (instr & 0xff);
   65961                             unsigned len = imm8 / 2;
   65962                             unsigned end = first + len;
   65963                             // VSTMDB{<c>}{<q>}{.<size>} <Rn>!, <dreglist> ; A1
   65964                             vstmdb(condition,
   65965                                    kDataTypeValueNone,
   65966                                    Register(rn),
   65967                                    WriteBack(WRITE_BACK),
   65968                                    DRegisterList(DRegister(first), len));
   65969                             if ((len == 0) || (len > 16) ||
   65970                                 (end > kMaxNumberOfDRegisters)) {
   65971                               UnpredictableA32(instr);
   65972                             }
   65973                             break;
   65974                           }
   65975                           case 0x00000001: {
   65976                             // 0x0d200b01
   65977                             if (((instr & 0xf0000000) == 0xf0000000)) {
   65978                               UnallocatedA32(instr);
   65979                               return;
   65980                             }
   65981                             Condition condition((instr >> 28) & 0xf);
   65982                             unsigned rn = (instr >> 16) & 0xf;
   65983                             unsigned first = ExtractDRegister(instr, 22, 12);
   65984                             unsigned imm8 = (instr & 0xff);
   65985                             unsigned len = imm8 / 2;
   65986                             unsigned end = first + len;
   65987                             // FSTMDBX{<c>}{<q>} <Rn>!, <dreglist> ; A1
   65988                             fstmdbx(condition,
   65989                                     Register(rn),
   65990                                     WriteBack(WRITE_BACK),
   65991                                     DRegisterList(DRegister(first), len));
   65992                             if ((len == 0) || (len > 16) || (end > 16)) {
   65993                               UnpredictableA32(instr);
   65994                             }
   65995                             break;
   65996                           }
   65997                         }
   65998                         break;
   65999                       }
   66000                       default:
   66001                         UnallocatedA32(instr);
   66002                         break;
   66003                     }
   66004                     break;
   66005                   }
   66006                   default: {
   66007                     if (((instr & 0xf0000000) == 0xf0000000) ||
   66008                         ((instr & 0xe00) == 0xa00)) {
   66009                       UnallocatedA32(instr);
   66010                       return;
   66011                     }
   66012                     UnimplementedA32("STC", instr);
   66013                     break;
   66014                   }
   66015                 }
   66016                 break;
   66017               }
   66018             }
   66019             break;
   66020           }
   66021           case 0x01100000: {
   66022             // 0x0d100000
   66023             switch (instr & 0x00200000) {
   66024               case 0x00000000: {
   66025                 // 0x0d100000
   66026                 switch (instr & 0x000f0000) {
   66027                   case 0x000f0000: {
   66028                     // 0x0d1f0000
   66029                     switch (instr & 0x00000e00) {
   66030                       case 0x00000a00: {
   66031                         // 0x0d1f0a00
   66032                         switch (instr & 0x00000100) {
   66033                           case 0x00000000: {
   66034                             // 0x0d1f0a00
   66035                             if (((instr & 0xf0000000) == 0xf0000000)) {
   66036                               UnallocatedA32(instr);
   66037                               return;
   66038                             }
   66039                             Condition condition((instr >> 28) & 0xf);
   66040                             unsigned rd = ExtractSRegister(instr, 22, 12);
   66041                             uint32_t U = (instr >> 23) & 0x1;
   66042                             int32_t imm = instr & 0xff;
   66043                             imm <<= 2;
   66044                             if (U == 0) imm = -imm;
   66045                             bool minus_zero = (imm == 0) && (U == 0);
   66046                             Location location(imm, kA32PcDelta);
   66047                             // VLDR{<c>}{<q>}{.32} <Sd>, <label> ; A2
   66048                             if (minus_zero) {
   66049                               vldr(condition,
   66050                                    Untyped32,
   66051                                    SRegister(rd),
   66052                                    MemOperand(pc, minus, 0));
   66053                             } else {
   66054                               vldr(condition,
   66055                                    Untyped32,
   66056                                    SRegister(rd),
   66057                                    &location);
   66058                             }
   66059                             break;
   66060                           }
   66061                           case 0x00000100: {
   66062                             // 0x0d1f0b00
   66063                             if (((instr & 0xf0000000) == 0xf0000000)) {
   66064                               UnallocatedA32(instr);
   66065                               return;
   66066                             }
   66067                             Condition condition((instr >> 28) & 0xf);
   66068                             unsigned rd = ExtractDRegister(instr, 22, 12);
   66069                             uint32_t U = (instr >> 23) & 0x1;
   66070                             int32_t imm = instr & 0xff;
   66071                             imm <<= 2;
   66072                             if (U == 0) imm = -imm;
   66073                             bool minus_zero = (imm == 0) && (U == 0);
   66074                             Location location(imm, kA32PcDelta);
   66075                             // VLDR{<c>}{<q>}{.64} <Dd>, <label> ; A1
   66076                             if (minus_zero) {
   66077                               vldr(condition,
   66078                                    Untyped64,
   66079                                    DRegister(rd),
   66080                                    MemOperand(pc, minus, 0));
   66081                             } else {
   66082                               vldr(condition,
   66083                                    Untyped64,
   66084                                    DRegister(rd),
   66085                                    &location);
   66086                             }
   66087                             break;
   66088                           }
   66089                         }
   66090                         break;
   66091                       }
   66092                       default: {
   66093                         if (((instr & 0xf0000000) == 0xf0000000) ||
   66094                             ((instr & 0xe00) == 0xa00)) {
   66095                           UnallocatedA32(instr);
   66096                           return;
   66097                         }
   66098                         UnimplementedA32("LDC", instr);
   66099                         break;
   66100                       }
   66101                     }
   66102                     break;
   66103                   }
   66104                   default: {
   66105                     switch (instr & 0x00000e00) {
   66106                       case 0x00000a00: {
   66107                         // 0x0d100a00
   66108                         switch (instr & 0x00000100) {
   66109                           case 0x00000000: {
   66110                             // 0x0d100a00
   66111                             if (((instr & 0xf0000000) == 0xf0000000) ||
   66112                                 ((instr & 0xf0000) == 0xf0000)) {
   66113                               UnallocatedA32(instr);
   66114                               return;
   66115                             }
   66116                             Condition condition((instr >> 28) & 0xf);
   66117                             unsigned rd = ExtractSRegister(instr, 22, 12);
   66118                             unsigned rn = (instr >> 16) & 0xf;
   66119                             Sign sign((((instr >> 23) & 0x1) == 0) ? minus
   66120                                                                    : plus);
   66121                             int32_t offset = (instr & 0xff) << 2;
   66122                             // VLDR{<c>}{<q>}{.32} <Sd>, [<Rn>{, #{+/-}<imm>}] ; A2 NOLINT(whitespace/line_length)
   66123                             vldr(condition,
   66124                                  Untyped32,
   66125                                  SRegister(rd),
   66126                                  MemOperand(Register(rn),
   66127                                             sign,
   66128                                             offset,
   66129                                             Offset));
   66130                             break;
   66131                           }
   66132                           case 0x00000100: {
   66133                             // 0x0d100b00
   66134                             if (((instr & 0xf0000000) == 0xf0000000) ||
   66135                                 ((instr & 0xf0000) == 0xf0000)) {
   66136                               UnallocatedA32(instr);
   66137                               return;
   66138                             }
   66139                             Condition condition((instr >> 28) & 0xf);
   66140                             unsigned rd = ExtractDRegister(instr, 22, 12);
   66141                             unsigned rn = (instr >> 16) & 0xf;
   66142                             Sign sign((((instr >> 23) & 0x1) == 0) ? minus
   66143                                                                    : plus);
   66144                             int32_t offset = (instr & 0xff) << 2;
   66145                             // VLDR{<c>}{<q>}{.64} <Dd>, [<Rn>{, #{+/-}<imm>}] ; A1 NOLINT(whitespace/line_length)
   66146                             vldr(condition,
   66147                                  Untyped64,
   66148                                  DRegister(rd),
   66149                                  MemOperand(Register(rn),
   66150                                             sign,
   66151                                             offset,
   66152                                             Offset));
   66153                             break;
   66154                           }
   66155                         }
   66156                         break;
   66157                       }
   66158                       default: {
   66159                         if (((instr & 0xf0000000) == 0xf0000000) ||
   66160                             ((instr & 0xf0000) == 0xf0000) ||
   66161                             ((instr & 0xe00) == 0xa00)) {
   66162                           UnallocatedA32(instr);
   66163                           return;
   66164                         }
   66165                         UnimplementedA32("LDC", instr);
   66166                         break;
   66167                       }
   66168                     }
   66169                     break;
   66170                   }
   66171                 }
   66172                 break;
   66173               }
   66174               case 0x00200000: {
   66175                 // 0x0d300000
   66176                 switch (instr & 0x00000e00) {
   66177                   case 0x00000a00: {
   66178                     // 0x0d300a00
   66179                     switch (instr & 0x00800100) {
   66180                       case 0x00000000: {
   66181                         // 0x0d300a00
   66182                         if (((instr & 0xf0000000) == 0xf0000000)) {
   66183                           UnallocatedA32(instr);
   66184                           return;
   66185                         }
   66186                         Condition condition((instr >> 28) & 0xf);
   66187                         unsigned rn = (instr >> 16) & 0xf;
   66188                         unsigned first = ExtractSRegister(instr, 22, 12);
   66189                         unsigned len = instr & 0xff;
   66190                         // VLDMDB{<c>}{<q>}{.<size>} <Rn>!, <sreglist> ; A2
   66191                         vldmdb(condition,
   66192                                kDataTypeValueNone,
   66193                                Register(rn),
   66194                                WriteBack(WRITE_BACK),
   66195                                SRegisterList(SRegister(first), len));
   66196                         if ((len == 0) ||
   66197                             ((first + len) > kNumberOfSRegisters)) {
   66198                           UnpredictableA32(instr);
   66199                         }
   66200                         break;
   66201                       }
   66202                       case 0x00000100: {
   66203                         // 0x0d300b00
   66204                         switch (instr & 0x00000001) {
   66205                           case 0x00000000: {
   66206                             // 0x0d300b00
   66207                             if (((instr & 0xf0000000) == 0xf0000000)) {
   66208                               UnallocatedA32(instr);
   66209                               return;
   66210                             }
   66211                             Condition condition((instr >> 28) & 0xf);
   66212                             unsigned rn = (instr >> 16) & 0xf;
   66213                             unsigned first = ExtractDRegister(instr, 22, 12);
   66214                             unsigned imm8 = (instr & 0xff);
   66215                             unsigned len = imm8 / 2;
   66216                             unsigned end = first + len;
   66217                             // VLDMDB{<c>}{<q>}{.<size>} <Rn>!, <dreglist> ; A1
   66218                             vldmdb(condition,
   66219                                    kDataTypeValueNone,
   66220                                    Register(rn),
   66221                                    WriteBack(WRITE_BACK),
   66222                                    DRegisterList(DRegister(first), len));
   66223                             if ((len == 0) || (len > 16) ||
   66224                                 (end > kMaxNumberOfDRegisters)) {
   66225                               UnpredictableA32(instr);
   66226                             }
   66227                             break;
   66228                           }
   66229                           case 0x00000001: {
   66230                             // 0x0d300b01
   66231                             if (((instr & 0xf0000000) == 0xf0000000)) {
   66232                               UnallocatedA32(instr);
   66233                               return;
   66234                             }
   66235                             Condition condition((instr >> 28) & 0xf);
   66236                             unsigned rn = (instr >> 16) & 0xf;
   66237                             unsigned first = ExtractDRegister(instr, 22, 12);
   66238                             unsigned imm8 = (instr & 0xff);
   66239                             unsigned len = imm8 / 2;
   66240                             unsigned end = first + len;
   66241                             // FLDMDBX{<c>}{<q>} <Rn>!, <dreglist> ; A1
   66242                             fldmdbx(condition,
   66243                                     Register(rn),
   66244                                     WriteBack(WRITE_BACK),
   66245                                     DRegisterList(DRegister(first), len));
   66246                             if ((len == 0) || (len > 16) || (end > 16)) {
   66247                               UnpredictableA32(instr);
   66248                             }
   66249                             break;
   66250                           }
   66251                         }
   66252                         break;
   66253                       }
   66254                       default:
   66255                         UnallocatedA32(instr);
   66256                         break;
   66257                     }
   66258                     break;
   66259                   }
   66260                   default: {
   66261                     if (((instr & 0xf0000000) == 0xf0000000) ||
   66262                         ((instr & 0xf0000) == 0xf0000) ||
   66263                         ((instr & 0xe00) == 0xa00)) {
   66264                       UnallocatedA32(instr);
   66265                       return;
   66266                     }
   66267                     UnimplementedA32("LDC", instr);
   66268                     break;
   66269                   }
   66270                 }
   66271                 break;
   66272               }
   66273             }
   66274             break;
   66275           }
   66276         }
   66277         break;
   66278       }
   66279       case 0x0e000000: {
   66280         // 0x0e000000
   66281         switch (instr & 0x01000000) {
   66282           case 0x00000000: {
   66283             // 0x0e000000
   66284             switch (instr & 0x00000010) {
   66285               case 0x00000000: {
   66286                 // 0x0e000000
   66287                 switch (instr & 0x00000e00) {
   66288                   case 0x00000a00: {
   66289                     // 0x0e000a00
   66290                     switch (instr & 0x00b00140) {
   66291                       case 0x00000000: {
   66292                         // 0x0e000a00
   66293                         if (((instr & 0xf0000000) == 0xf0000000)) {
   66294                           UnallocatedA32(instr);
   66295                           return;
   66296                         }
   66297                         Condition condition((instr >> 28) & 0xf);
   66298                         unsigned rd = ExtractSRegister(instr, 22, 12);
   66299                         unsigned rn = ExtractSRegister(instr, 7, 16);
   66300                         unsigned rm = ExtractSRegister(instr, 5, 0);
   66301                         // VMLA{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; A2
   66302                         vmla(condition,
   66303                              F32,
   66304                              SRegister(rd),
   66305                              SRegister(rn),
   66306                              SRegister(rm));
   66307                         break;
   66308                       }
   66309                       case 0x00000040: {
   66310                         // 0x0e000a40
   66311                         if (((instr & 0xf0000000) == 0xf0000000)) {
   66312                           UnallocatedA32(instr);
   66313                           return;
   66314                         }
   66315                         Condition condition((instr >> 28) & 0xf);
   66316                         unsigned rd = ExtractSRegister(instr, 22, 12);
   66317                         unsigned rn = ExtractSRegister(instr, 7, 16);
   66318                         unsigned rm = ExtractSRegister(instr, 5, 0);
   66319                         // VMLS{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; A2
   66320                         vmls(condition,
   66321                              F32,
   66322                              SRegister(rd),
   66323                              SRegister(rn),
   66324                              SRegister(rm));
   66325                         break;
   66326                       }
   66327                       case 0x00000100: {
   66328                         // 0x0e000b00
   66329                         if (((instr & 0xf0000000) == 0xf0000000)) {
   66330                           UnallocatedA32(instr);
   66331                           return;
   66332                         }
   66333                         Condition condition((instr >> 28) & 0xf);
   66334                         unsigned rd = ExtractDRegister(instr, 22, 12);
   66335                         unsigned rn = ExtractDRegister(instr, 7, 16);
   66336                         unsigned rm = ExtractDRegister(instr, 5, 0);
   66337                         // VMLA{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; A2
   66338                         vmla(condition,
   66339                              F64,
   66340                              DRegister(rd),
   66341                              DRegister(rn),
   66342                              DRegister(rm));
   66343                         break;
   66344                       }
   66345                       case 0x00000140: {
   66346                         // 0x0e000b40
   66347                         if (((instr & 0xf0000000) == 0xf0000000)) {
   66348                           UnallocatedA32(instr);
   66349                           return;
   66350                         }
   66351                         Condition condition((instr >> 28) & 0xf);
   66352                         unsigned rd = ExtractDRegister(instr, 22, 12);
   66353                         unsigned rn = ExtractDRegister(instr, 7, 16);
   66354                         unsigned rm = ExtractDRegister(instr, 5, 0);
   66355                         // VMLS{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; A2
   66356                         vmls(condition,
   66357                              F64,
   66358                              DRegister(rd),
   66359                              DRegister(rn),
   66360                              DRegister(rm));
   66361                         break;
   66362                       }
   66363                       case 0x00100000: {
   66364                         // 0x0e100a00
   66365                         if (((instr & 0xf0000000) == 0xf0000000)) {
   66366                           UnallocatedA32(instr);
   66367                           return;
   66368                         }
   66369                         Condition condition((instr >> 28) & 0xf);
   66370                         unsigned rd = ExtractSRegister(instr, 22, 12);
   66371                         unsigned rn = ExtractSRegister(instr, 7, 16);
   66372                         unsigned rm = ExtractSRegister(instr, 5, 0);
   66373                         // VNMLS{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; A1
   66374                         vnmls(condition,
   66375                               F32,
   66376                               SRegister(rd),
   66377                               SRegister(rn),
   66378                               SRegister(rm));
   66379                         break;
   66380                       }
   66381                       case 0x00100040: {
   66382                         // 0x0e100a40
   66383                         if (((instr & 0xf0000000) == 0xf0000000)) {
   66384                           UnallocatedA32(instr);
   66385                           return;
   66386                         }
   66387                         Condition condition((instr >> 28) & 0xf);
   66388                         unsigned rd = ExtractSRegister(instr, 22, 12);
   66389                         unsigned rn = ExtractSRegister(instr, 7, 16);
   66390                         unsigned rm = ExtractSRegister(instr, 5, 0);
   66391                         // VNMLA{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; A1
   66392                         vnmla(condition,
   66393                               F32,
   66394                               SRegister(rd),
   66395                               SRegister(rn),
   66396                               SRegister(rm));
   66397                         break;
   66398                       }
   66399                       case 0x00100100: {
   66400                         // 0x0e100b00
   66401                         if (((instr & 0xf0000000) == 0xf0000000)) {
   66402                           UnallocatedA32(instr);
   66403                           return;
   66404                         }
   66405                         Condition condition((instr >> 28) & 0xf);
   66406                         unsigned rd = ExtractDRegister(instr, 22, 12);
   66407                         unsigned rn = ExtractDRegister(instr, 7, 16);
   66408                         unsigned rm = ExtractDRegister(instr, 5, 0);
   66409                         // VNMLS{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; A1
   66410                         vnmls(condition,
   66411                               F64,
   66412                               DRegister(rd),
   66413                               DRegister(rn),
   66414                               DRegister(rm));
   66415                         break;
   66416                       }
   66417                       case 0x00100140: {
   66418                         // 0x0e100b40
   66419                         if (((instr & 0xf0000000) == 0xf0000000)) {
   66420                           UnallocatedA32(instr);
   66421                           return;
   66422                         }
   66423                         Condition condition((instr >> 28) & 0xf);
   66424                         unsigned rd = ExtractDRegister(instr, 22, 12);
   66425                         unsigned rn = ExtractDRegister(instr, 7, 16);
   66426                         unsigned rm = ExtractDRegister(instr, 5, 0);
   66427                         // VNMLA{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; A1
   66428                         vnmla(condition,
   66429                               F64,
   66430                               DRegister(rd),
   66431                               DRegister(rn),
   66432                               DRegister(rm));
   66433                         break;
   66434                       }
   66435                       case 0x00200000: {
   66436                         // 0x0e200a00
   66437                         if (((instr & 0xf0000000) == 0xf0000000)) {
   66438                           UnallocatedA32(instr);
   66439                           return;
   66440                         }
   66441                         Condition condition((instr >> 28) & 0xf);
   66442                         unsigned rd = ExtractSRegister(instr, 22, 12);
   66443                         unsigned rn = ExtractSRegister(instr, 7, 16);
   66444                         unsigned rm = ExtractSRegister(instr, 5, 0);
   66445                         // VMUL{<c>}{<q>}.F32 {<Sd>}, <Sn>, <Sm> ; A2
   66446                         vmul(condition,
   66447                              F32,
   66448                              SRegister(rd),
   66449                              SRegister(rn),
   66450                              SRegister(rm));
   66451                         break;
   66452                       }
   66453                       case 0x00200040: {
   66454                         // 0x0e200a40
   66455                         if (((instr & 0xf0000000) == 0xf0000000)) {
   66456                           UnallocatedA32(instr);
   66457                           return;
   66458                         }
   66459                         Condition condition((instr >> 28) & 0xf);
   66460                         unsigned rd = ExtractSRegister(instr, 22, 12);
   66461                         unsigned rn = ExtractSRegister(instr, 7, 16);
   66462                         unsigned rm = ExtractSRegister(instr, 5, 0);
   66463                         // VNMUL{<c>}{<q>}.F32 {<Sd>}, <Sn>, <Sm> ; A1
   66464                         vnmul(condition,
   66465                               F32,
   66466                               SRegister(rd),
   66467                               SRegister(rn),
   66468                               SRegister(rm));
   66469                         break;
   66470                       }
   66471                       case 0x00200100: {
   66472                         // 0x0e200b00
   66473                         if (((instr & 0xf0000000) == 0xf0000000)) {
   66474                           UnallocatedA32(instr);
   66475                           return;
   66476                         }
   66477                         Condition condition((instr >> 28) & 0xf);
   66478                         unsigned rd = ExtractDRegister(instr, 22, 12);
   66479                         unsigned rn = ExtractDRegister(instr, 7, 16);
   66480                         unsigned rm = ExtractDRegister(instr, 5, 0);
   66481                         // VMUL{<c>}{<q>}.F64 {<Dd>}, <Dn>, <Dm> ; A2
   66482                         vmul(condition,
   66483                              F64,
   66484                              DRegister(rd),
   66485                              DRegister(rn),
   66486                              DRegister(rm));
   66487                         break;
   66488                       }
   66489                       case 0x00200140: {
   66490                         // 0x0e200b40
   66491                         if (((instr & 0xf0000000) == 0xf0000000)) {
   66492                           UnallocatedA32(instr);
   66493                           return;
   66494                         }
   66495                         Condition condition((instr >> 28) & 0xf);
   66496                         unsigned rd = ExtractDRegister(instr, 22, 12);
   66497                         unsigned rn = ExtractDRegister(instr, 7, 16);
   66498                         unsigned rm = ExtractDRegister(instr, 5, 0);
   66499                         // VNMUL{<c>}{<q>}.F64 {<Dd>}, <Dn>, <Dm> ; A1
   66500                         vnmul(condition,
   66501                               F64,
   66502                               DRegister(rd),
   66503                               DRegister(rn),
   66504                               DRegister(rm));
   66505                         break;
   66506                       }
   66507                       case 0x00300000: {
   66508                         // 0x0e300a00
   66509                         if (((instr & 0xf0000000) == 0xf0000000)) {
   66510                           UnallocatedA32(instr);
   66511                           return;
   66512                         }
   66513                         Condition condition((instr >> 28) & 0xf);
   66514                         unsigned rd = ExtractSRegister(instr, 22, 12);
   66515                         unsigned rn = ExtractSRegister(instr, 7, 16);
   66516                         unsigned rm = ExtractSRegister(instr, 5, 0);
   66517                         // VADD{<c>}{<q>}.F32 {<Sd>}, <Sn>, <Sm> ; A2
   66518                         vadd(condition,
   66519                              F32,
   66520                              SRegister(rd),
   66521                              SRegister(rn),
   66522                              SRegister(rm));
   66523                         break;
   66524                       }
   66525                       case 0x00300040: {
   66526                         // 0x0e300a40
   66527                         if (((instr & 0xf0000000) == 0xf0000000)) {
   66528                           UnallocatedA32(instr);
   66529                           return;
   66530                         }
   66531                         Condition condition((instr >> 28) & 0xf);
   66532                         unsigned rd = ExtractSRegister(instr, 22, 12);
   66533                         unsigned rn = ExtractSRegister(instr, 7, 16);
   66534                         unsigned rm = ExtractSRegister(instr, 5, 0);
   66535                         // VSUB{<c>}{<q>}.F32 {<Sd>}, <Sn>, <Sm> ; A2
   66536                         vsub(condition,
   66537                              F32,
   66538                              SRegister(rd),
   66539                              SRegister(rn),
   66540                              SRegister(rm));
   66541                         break;
   66542                       }
   66543                       case 0x00300100: {
   66544                         // 0x0e300b00
   66545                         if (((instr & 0xf0000000) == 0xf0000000)) {
   66546                           UnallocatedA32(instr);
   66547                           return;
   66548                         }
   66549                         Condition condition((instr >> 28) & 0xf);
   66550                         unsigned rd = ExtractDRegister(instr, 22, 12);
   66551                         unsigned rn = ExtractDRegister(instr, 7, 16);
   66552                         unsigned rm = ExtractDRegister(instr, 5, 0);
   66553                         // VADD{<c>}{<q>}.F64 {<Dd>}, <Dn>, <Dm> ; A2
   66554                         vadd(condition,
   66555                              F64,
   66556                              DRegister(rd),
   66557                              DRegister(rn),
   66558                              DRegister(rm));
   66559                         break;
   66560                       }
   66561                       case 0x00300140: {
   66562                         // 0x0e300b40
   66563                         if (((instr & 0xf0000000) == 0xf0000000)) {
   66564                           UnallocatedA32(instr);
   66565                           return;
   66566                         }
   66567                         Condition condition((instr >> 28) & 0xf);
   66568                         unsigned rd = ExtractDRegister(instr, 22, 12);
   66569                         unsigned rn = ExtractDRegister(instr, 7, 16);
   66570                         unsigned rm = ExtractDRegister(instr, 5, 0);
   66571                         // VSUB{<c>}{<q>}.F64 {<Dd>}, <Dn>, <Dm> ; A2
   66572                         vsub(condition,
   66573                              F64,
   66574                              DRegister(rd),
   66575                              DRegister(rn),
   66576                              DRegister(rm));
   66577                         break;
   66578                       }
   66579                       case 0x00800000: {
   66580                         // 0x0e800a00
   66581                         if (((instr & 0xf0000000) == 0xf0000000)) {
   66582                           UnallocatedA32(instr);
   66583                           return;
   66584                         }
   66585                         Condition condition((instr >> 28) & 0xf);
   66586                         unsigned rd = ExtractSRegister(instr, 22, 12);
   66587                         unsigned rn = ExtractSRegister(instr, 7, 16);
   66588                         unsigned rm = ExtractSRegister(instr, 5, 0);
   66589                         // VDIV{<c>}{<q>}.F32 {<Sd>}, <Sn>, <Sm> ; A1
   66590                         vdiv(condition,
   66591                              F32,
   66592                              SRegister(rd),
   66593                              SRegister(rn),
   66594                              SRegister(rm));
   66595                         break;
   66596                       }
   66597                       case 0x00800100: {
   66598                         // 0x0e800b00
   66599                         if (((instr & 0xf0000000) == 0xf0000000)) {
   66600                           UnallocatedA32(instr);
   66601                           return;
   66602                         }
   66603                         Condition condition((instr >> 28) & 0xf);
   66604                         unsigned rd = ExtractDRegister(instr, 22, 12);
   66605                         unsigned rn = ExtractDRegister(instr, 7, 16);
   66606                         unsigned rm = ExtractDRegister(instr, 5, 0);
   66607                         // VDIV{<c>}{<q>}.F64 {<Dd>}, <Dn>, <Dm> ; A1
   66608                         vdiv(condition,
   66609                              F64,
   66610                              DRegister(rd),
   66611                              DRegister(rn),
   66612                              DRegister(rm));
   66613                         break;
   66614                       }
   66615                       case 0x00900000: {
   66616                         // 0x0e900a00
   66617                         if (((instr & 0xf0000000) == 0xf0000000)) {
   66618                           UnallocatedA32(instr);
   66619                           return;
   66620                         }
   66621                         Condition condition((instr >> 28) & 0xf);
   66622                         unsigned rd = ExtractSRegister(instr, 22, 12);
   66623                         unsigned rn = ExtractSRegister(instr, 7, 16);
   66624                         unsigned rm = ExtractSRegister(instr, 5, 0);
   66625                         // VFNMS{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; A1
   66626                         vfnms(condition,
   66627                               F32,
   66628                               SRegister(rd),
   66629                               SRegister(rn),
   66630                               SRegister(rm));
   66631                         break;
   66632                       }
   66633                       case 0x00900040: {
   66634                         // 0x0e900a40
   66635                         if (((instr & 0xf0000000) == 0xf0000000)) {
   66636                           UnallocatedA32(instr);
   66637                           return;
   66638                         }
   66639                         Condition condition((instr >> 28) & 0xf);
   66640                         unsigned rd = ExtractSRegister(instr, 22, 12);
   66641                         unsigned rn = ExtractSRegister(instr, 7, 16);
   66642                         unsigned rm = ExtractSRegister(instr, 5, 0);
   66643                         // VFNMA{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; A1
   66644                         vfnma(condition,
   66645                               F32,
   66646                               SRegister(rd),
   66647                               SRegister(rn),
   66648                               SRegister(rm));
   66649                         break;
   66650                       }
   66651                       case 0x00900100: {
   66652                         // 0x0e900b00
   66653                         if (((instr & 0xf0000000) == 0xf0000000)) {
   66654                           UnallocatedA32(instr);
   66655                           return;
   66656                         }
   66657                         Condition condition((instr >> 28) & 0xf);
   66658                         unsigned rd = ExtractDRegister(instr, 22, 12);
   66659                         unsigned rn = ExtractDRegister(instr, 7, 16);
   66660                         unsigned rm = ExtractDRegister(instr, 5, 0);
   66661                         // VFNMS{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; A1
   66662                         vfnms(condition,
   66663                               F64,
   66664                               DRegister(rd),
   66665                               DRegister(rn),
   66666                               DRegister(rm));
   66667                         break;
   66668                       }
   66669                       case 0x00900140: {
   66670                         // 0x0e900b40
   66671                         if (((instr & 0xf0000000) == 0xf0000000)) {
   66672                           UnallocatedA32(instr);
   66673                           return;
   66674                         }
   66675                         Condition condition((instr >> 28) & 0xf);
   66676                         unsigned rd = ExtractDRegister(instr, 22, 12);
   66677                         unsigned rn = ExtractDRegister(instr, 7, 16);
   66678                         unsigned rm = ExtractDRegister(instr, 5, 0);
   66679                         // VFNMA{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; A1
   66680                         vfnma(condition,
   66681                               F64,
   66682                               DRegister(rd),
   66683                               DRegister(rn),
   66684                               DRegister(rm));
   66685                         break;
   66686                       }
   66687                       case 0x00a00000: {
   66688                         // 0x0ea00a00
   66689                         if (((instr & 0xf0000000) == 0xf0000000)) {
   66690                           UnallocatedA32(instr);
   66691                           return;
   66692                         }
   66693                         Condition condition((instr >> 28) & 0xf);
   66694                         unsigned rd = ExtractSRegister(instr, 22, 12);
   66695                         unsigned rn = ExtractSRegister(instr, 7, 16);
   66696                         unsigned rm = ExtractSRegister(instr, 5, 0);
   66697                         // VFMA{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; A2
   66698                         vfma(condition,
   66699                              F32,
   66700                              SRegister(rd),
   66701                              SRegister(rn),
   66702                              SRegister(rm));
   66703                         break;
   66704                       }
   66705                       case 0x00a00040: {
   66706                         // 0x0ea00a40
   66707                         if (((instr & 0xf0000000) == 0xf0000000)) {
   66708                           UnallocatedA32(instr);
   66709                           return;
   66710                         }
   66711                         Condition condition((instr >> 28) & 0xf);
   66712                         unsigned rd = ExtractSRegister(instr, 22, 12);
   66713                         unsigned rn = ExtractSRegister(instr, 7, 16);
   66714                         unsigned rm = ExtractSRegister(instr, 5, 0);
   66715                         // VFMS{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; A2
   66716                         vfms(condition,
   66717                              F32,
   66718                              SRegister(rd),
   66719                              SRegister(rn),
   66720                              SRegister(rm));
   66721                         break;
   66722                       }
   66723                       case 0x00a00100: {
   66724                         // 0x0ea00b00
   66725                         if (((instr & 0xf0000000) == 0xf0000000)) {
   66726                           UnallocatedA32(instr);
   66727                           return;
   66728                         }
   66729                         Condition condition((instr >> 28) & 0xf);
   66730                         unsigned rd = ExtractDRegister(instr, 22, 12);
   66731                         unsigned rn = ExtractDRegister(instr, 7, 16);
   66732                         unsigned rm = ExtractDRegister(instr, 5, 0);
   66733                         // VFMA{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; A2
   66734                         vfma(condition,
   66735                              F64,
   66736                              DRegister(rd),
   66737                              DRegister(rn),
   66738                              DRegister(rm));
   66739                         break;
   66740                       }
   66741                       case 0x00a00140: {
   66742                         // 0x0ea00b40
   66743                         if (((instr & 0xf0000000) == 0xf0000000)) {
   66744                           UnallocatedA32(instr);
   66745                           return;
   66746                         }
   66747                         Condition condition((instr >> 28) & 0xf);
   66748                         unsigned rd = ExtractDRegister(instr, 22, 12);
   66749                         unsigned rn = ExtractDRegister(instr, 7, 16);
   66750                         unsigned rm = ExtractDRegister(instr, 5, 0);
   66751                         // VFMS{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; A2
   66752                         vfms(condition,
   66753                              F64,
   66754                              DRegister(rd),
   66755                              DRegister(rn),
   66756                              DRegister(rm));
   66757                         break;
   66758                       }
   66759                       case 0x00b00000: {
   66760                         // 0x0eb00a00
   66761                         if (((instr & 0xf0000000) == 0xf0000000)) {
   66762                           UnallocatedA32(instr);
   66763                           return;
   66764                         }
   66765                         Condition condition((instr >> 28) & 0xf);
   66766                         unsigned rd = ExtractSRegister(instr, 22, 12);
   66767                         uint32_t encoded_imm =
   66768                             (instr & 0xf) | ((instr >> 12) & 0xf0);
   66769                         NeonImmediate imm =
   66770                             ImmediateVFP::Decode<float>(encoded_imm);
   66771                         // VMOV{<c>}{<q>}.F32 <Sd>, #<imm> ; A2
   66772                         vmov(condition, F32, SRegister(rd), imm);
   66773                         if (((instr & 0xfb00ff0) != 0xeb00a00)) {
   66774                           UnpredictableA32(instr);
   66775                         }
   66776                         break;
   66777                       }
   66778                       case 0x00b00040: {
   66779                         // 0x0eb00a40
   66780                         switch (instr & 0x000e0000) {
   66781                           case 0x00000000: {
   66782                             // 0x0eb00a40
   66783                             switch (instr & 0x00010080) {
   66784                               case 0x00000000: {
   66785                                 // 0x0eb00a40
   66786                                 if (((instr & 0xf0000000) == 0xf0000000)) {
   66787                                   UnallocatedA32(instr);
   66788                                   return;
   66789                                 }
   66790                                 Condition condition((instr >> 28) & 0xf);
   66791                                 unsigned rd = ExtractSRegister(instr, 22, 12);
   66792                                 unsigned rm = ExtractSRegister(instr, 5, 0);
   66793                                 // VMOV{<c>}{<q>}.F32 <Sd>, <Sm> ; A2
   66794                                 vmov(condition,
   66795                                      F32,
   66796                                      SRegister(rd),
   66797                                      SRegister(rm));
   66798                                 break;
   66799                               }
   66800                               case 0x00000080: {
   66801                                 // 0x0eb00ac0
   66802                                 if (((instr & 0xf0000000) == 0xf0000000)) {
   66803                                   UnallocatedA32(instr);
   66804                                   return;
   66805                                 }
   66806                                 Condition condition((instr >> 28) & 0xf);
   66807                                 unsigned rd = ExtractSRegister(instr, 22, 12);
   66808                                 unsigned rm = ExtractSRegister(instr, 5, 0);
   66809                                 // VABS{<c>}{<q>}.F32 <Sd>, <Sm> ; A2
   66810                                 vabs(condition,
   66811                                      F32,
   66812                                      SRegister(rd),
   66813                                      SRegister(rm));
   66814                                 break;
   66815                               }
   66816                               case 0x00010000: {
   66817                                 // 0x0eb10a40
   66818                                 if (((instr & 0xf0000000) == 0xf0000000)) {
   66819                                   UnallocatedA32(instr);
   66820                                   return;
   66821                                 }
   66822                                 Condition condition((instr >> 28) & 0xf);
   66823                                 unsigned rd = ExtractSRegister(instr, 22, 12);
   66824                                 unsigned rm = ExtractSRegister(instr, 5, 0);
   66825                                 // VNEG{<c>}{<q>}.F32 <Sd>, <Sm> ; A2
   66826                                 vneg(condition,
   66827                                      F32,
   66828                                      SRegister(rd),
   66829                                      SRegister(rm));
   66830                                 break;
   66831                               }
   66832                               case 0x00010080: {
   66833                                 // 0x0eb10ac0
   66834                                 if (((instr & 0xf0000000) == 0xf0000000)) {
   66835                                   UnallocatedA32(instr);
   66836                                   return;
   66837                                 }
   66838                                 Condition condition((instr >> 28) & 0xf);
   66839                                 unsigned rd = ExtractSRegister(instr, 22, 12);
   66840                                 unsigned rm = ExtractSRegister(instr, 5, 0);
   66841                                 // VSQRT{<c>}{<q>}.F32 <Sd>, <Sm> ; A1
   66842                                 vsqrt(condition,
   66843                                       F32,
   66844                                       SRegister(rd),
   66845                                       SRegister(rm));
   66846                                 break;
   66847                               }
   66848                             }
   66849                             break;
   66850                           }
   66851                           case 0x00020000: {
   66852                             // 0x0eb20a40
   66853                             switch (instr & 0x00010080) {
   66854                               case 0x00000000: {
   66855                                 // 0x0eb20a40
   66856                                 if (((instr & 0xf0000000) == 0xf0000000)) {
   66857                                   UnallocatedA32(instr);
   66858                                   return;
   66859                                 }
   66860                                 Condition condition((instr >> 28) & 0xf);
   66861                                 unsigned rd = ExtractSRegister(instr, 22, 12);
   66862                                 unsigned rm = ExtractSRegister(instr, 5, 0);
   66863                                 // VCVTB{<c>}{<q>}.F32.F16 <Sd>, <Sm> ; A1
   66864                                 vcvtb(condition,
   66865                                       F32,
   66866                                       F16,
   66867                                       SRegister(rd),
   66868                                       SRegister(rm));
   66869                                 break;
   66870                               }
   66871                               case 0x00000080: {
   66872                                 // 0x0eb20ac0
   66873                                 if (((instr & 0xf0000000) == 0xf0000000)) {
   66874                                   UnallocatedA32(instr);
   66875                                   return;
   66876                                 }
   66877                                 Condition condition((instr >> 28) & 0xf);
   66878                                 unsigned rd = ExtractSRegister(instr, 22, 12);
   66879                                 unsigned rm = ExtractSRegister(instr, 5, 0);
   66880                                 // VCVTT{<c>}{<q>}.F32.F16 <Sd>, <Sm> ; A1
   66881                                 vcvtt(condition,
   66882                                       F32,
   66883                                       F16,
   66884                                       SRegister(rd),
   66885                                       SRegister(rm));
   66886                                 break;
   66887                               }
   66888                               case 0x00010000: {
   66889                                 // 0x0eb30a40
   66890                                 if (((instr & 0xf0000000) == 0xf0000000)) {
   66891                                   UnallocatedA32(instr);
   66892                                   return;
   66893                                 }
   66894                                 Condition condition((instr >> 28) & 0xf);
   66895                                 unsigned rd = ExtractSRegister(instr, 22, 12);
   66896                                 unsigned rm = ExtractSRegister(instr, 5, 0);
   66897                                 // VCVTB{<c>}{<q>}.F16.F32 <Sd>, <Sm> ; A1
   66898                                 vcvtb(condition,
   66899                                       F16,
   66900                                       F32,
   66901                                       SRegister(rd),
   66902                                       SRegister(rm));
   66903                                 break;
   66904                               }
   66905                               case 0x00010080: {
   66906                                 // 0x0eb30ac0
   66907                                 if (((instr & 0xf0000000) == 0xf0000000)) {
   66908                                   UnallocatedA32(instr);
   66909                                   return;
   66910                                 }
   66911                                 Condition condition((instr >> 28) & 0xf);
   66912                                 unsigned rd = ExtractSRegister(instr, 22, 12);
   66913                                 unsigned rm = ExtractSRegister(instr, 5, 0);
   66914                                 // VCVTT{<c>}{<q>}.F16.F32 <Sd>, <Sm> ; A1
   66915                                 vcvtt(condition,
   66916                                       F16,
   66917                                       F32,
   66918                                       SRegister(rd),
   66919                                       SRegister(rm));
   66920                                 break;
   66921                               }
   66922                             }
   66923                             break;
   66924                           }
   66925                           case 0x00040000: {
   66926                             // 0x0eb40a40
   66927                             switch (instr & 0x00010080) {
   66928                               case 0x00000000: {
   66929                                 // 0x0eb40a40
   66930                                 if (((instr & 0xf0000000) == 0xf0000000)) {
   66931                                   UnallocatedA32(instr);
   66932                                   return;
   66933                                 }
   66934                                 Condition condition((instr >> 28) & 0xf);
   66935                                 unsigned rd = ExtractSRegister(instr, 22, 12);
   66936                                 unsigned rm = ExtractSRegister(instr, 5, 0);
   66937                                 // VCMP{<c>}{<q>}.F32 <Sd>, <Sm> ; A1
   66938                                 vcmp(condition,
   66939                                      F32,
   66940                                      SRegister(rd),
   66941                                      SRegister(rm));
   66942                                 break;
   66943                               }
   66944                               case 0x00000080: {
   66945                                 // 0x0eb40ac0
   66946                                 if (((instr & 0xf0000000) == 0xf0000000)) {
   66947                                   UnallocatedA32(instr);
   66948                                   return;
   66949                                 }
   66950                                 Condition condition((instr >> 28) & 0xf);
   66951                                 unsigned rd = ExtractSRegister(instr, 22, 12);
   66952                                 unsigned rm = ExtractSRegister(instr, 5, 0);
   66953                                 // VCMPE{<c>}{<q>}.F32 <Sd>, <Sm> ; A1
   66954                                 vcmpe(condition,
   66955                                       F32,
   66956                                       SRegister(rd),
   66957                                       SRegister(rm));
   66958                                 break;
   66959                               }
   66960                               case 0x00010000: {
   66961                                 // 0x0eb50a40
   66962                                 if (((instr & 0xf0000000) == 0xf0000000)) {
   66963                                   UnallocatedA32(instr);
   66964                                   return;
   66965                                 }
   66966                                 Condition condition((instr >> 28) & 0xf);
   66967                                 unsigned rd = ExtractSRegister(instr, 22, 12);
   66968                                 // VCMP{<c>}{<q>}.F32 <Sd>, #0.0 ; A2
   66969                                 vcmp(condition, F32, SRegister(rd), 0.0);
   66970                                 if (((instr & 0xfbf0fff) != 0xeb50a40)) {
   66971                                   UnpredictableA32(instr);
   66972                                 }
   66973                                 break;
   66974                               }
   66975                               case 0x00010080: {
   66976                                 // 0x0eb50ac0
   66977                                 if (((instr & 0xf0000000) == 0xf0000000)) {
   66978                                   UnallocatedA32(instr);
   66979                                   return;
   66980                                 }
   66981                                 Condition condition((instr >> 28) & 0xf);
   66982                                 unsigned rd = ExtractSRegister(instr, 22, 12);
   66983                                 // VCMPE{<c>}{<q>}.F32 <Sd>, #0.0 ; A2
   66984                                 vcmpe(condition, F32, SRegister(rd), 0.0);
   66985                                 if (((instr & 0xfbf0fff) != 0xeb50ac0)) {
   66986                                   UnpredictableA32(instr);
   66987                                 }
   66988                                 break;
   66989                               }
   66990                             }
   66991                             break;
   66992                           }
   66993                           case 0x00060000: {
   66994                             // 0x0eb60a40
   66995                             switch (instr & 0x00010080) {
   66996                               case 0x00000000: {
   66997                                 // 0x0eb60a40
   66998                                 if (((instr & 0xf0000000) == 0xf0000000)) {
   66999                                   UnallocatedA32(instr);
   67000                                   return;
   67001                                 }
   67002                                 Condition condition((instr >> 28) & 0xf);
   67003                                 unsigned rd = ExtractSRegister(instr, 22, 12);
   67004                                 unsigned rm = ExtractSRegister(instr, 5, 0);
   67005                                 // VRINTR{<c>}{<q>}.F32.F32 <Sd>, <Sm> ; A1
   67006                                 vrintr(condition,
   67007                                        F32,
   67008                                        F32,
   67009                                        SRegister(rd),
   67010                                        SRegister(rm));
   67011                                 break;
   67012                               }
   67013                               case 0x00000080: {
   67014                                 // 0x0eb60ac0
   67015                                 if (((instr & 0xf0000000) == 0xf0000000)) {
   67016                                   UnallocatedA32(instr);
   67017                                   return;
   67018                                 }
   67019                                 Condition condition((instr >> 28) & 0xf);
   67020                                 unsigned rd = ExtractSRegister(instr, 22, 12);
   67021                                 unsigned rm = ExtractSRegister(instr, 5, 0);
   67022                                 // VRINTZ{<c>}{<q>}.F32.F32 <Sd>, <Sm> ; A1
   67023                                 vrintz(condition,
   67024                                        F32,
   67025                                        F32,
   67026                                        SRegister(rd),
   67027                                        SRegister(rm));
   67028                                 break;
   67029                               }
   67030                               case 0x00010000: {
   67031                                 // 0x0eb70a40
   67032                                 if (((instr & 0xf0000000) == 0xf0000000)) {
   67033                                   UnallocatedA32(instr);
   67034                                   return;
   67035                                 }
   67036                                 Condition condition((instr >> 28) & 0xf);
   67037                                 unsigned rd = ExtractSRegister(instr, 22, 12);
   67038                                 unsigned rm = ExtractSRegister(instr, 5, 0);
   67039                                 // VRINTX{<c>}{<q>}.F32.F32 <Sd>, <Sm> ; A1
   67040                                 vrintx(condition,
   67041                                        F32,
   67042                                        F32,
   67043                                        SRegister(rd),
   67044                                        SRegister(rm));
   67045                                 break;
   67046                               }
   67047                               case 0x00010080: {
   67048                                 // 0x0eb70ac0
   67049                                 if (((instr & 0xf0000000) == 0xf0000000)) {
   67050                                   UnallocatedA32(instr);
   67051                                   return;
   67052                                 }
   67053                                 Condition condition((instr >> 28) & 0xf);
   67054                                 unsigned rd = ExtractDRegister(instr, 22, 12);
   67055                                 unsigned rm = ExtractSRegister(instr, 5, 0);
   67056                                 // VCVT{<c>}{<q>}.F64.F32 <Dd>, <Sm> ; A1
   67057                                 vcvt(condition,
   67058                                      F64,
   67059                                      F32,
   67060                                      DRegister(rd),
   67061                                      SRegister(rm));
   67062                                 break;
   67063                               }
   67064                             }
   67065                             break;
   67066                           }
   67067                           case 0x00080000: {
   67068                             // 0x0eb80a40
   67069                             if ((instr & 0x00010000) == 0x00000000) {
   67070                               if (((instr & 0xf0000000) == 0xf0000000)) {
   67071                                 UnallocatedA32(instr);
   67072                                 return;
   67073                               }
   67074                               Condition condition((instr >> 28) & 0xf);
   67075                               DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
   67076                               if (dt.Is(kDataTypeValueInvalid)) {
   67077                                 UnallocatedA32(instr);
   67078                                 return;
   67079                               }
   67080                               unsigned rd = ExtractSRegister(instr, 22, 12);
   67081                               unsigned rm = ExtractSRegister(instr, 5, 0);
   67082                               // VCVT{<c>}{<q>}.F32.<dt> <Sd>, <Sm> ; A1
   67083                               vcvt(condition,
   67084                                    F32,
   67085                                    dt,
   67086                                    SRegister(rd),
   67087                                    SRegister(rm));
   67088                             } else {
   67089                               UnallocatedA32(instr);
   67090                             }
   67091                             break;
   67092                           }
   67093                           case 0x000a0000: {
   67094                             // 0x0eba0a40
   67095                             if (((instr & 0xf0000000) == 0xf0000000)) {
   67096                               UnallocatedA32(instr);
   67097                               return;
   67098                             }
   67099                             Condition condition((instr >> 28) & 0xf);
   67100                             DataType dt = Dt_U_sx_1_Decode(
   67101                                 ((instr >> 7) & 0x1) | ((instr >> 15) & 0x2));
   67102                             if (dt.Is(kDataTypeValueInvalid)) {
   67103                               UnallocatedA32(instr);
   67104                               return;
   67105                             }
   67106                             unsigned rd = ExtractSRegister(instr, 22, 12);
   67107                             unsigned offset = 32;
   67108                             if (dt.Is(S16) || dt.Is(U16)) {
   67109                               offset = 16;
   67110                             }
   67111                             uint32_t fbits = offset - (((instr >> 5) & 0x1) |
   67112                                                        ((instr << 1) & 0x1e));
   67113                             // VCVT{<c>}{<q>}.F32.<dt> <Sdm>, <Sdm>, #<fbits> ; A1 NOLINT(whitespace/line_length)
   67114                             vcvt(condition,
   67115                                  F32,
   67116                                  dt,
   67117                                  SRegister(rd),
   67118                                  SRegister(rd),
   67119                                  fbits);
   67120                             break;
   67121                           }
   67122                           case 0x000c0000: {
   67123                             // 0x0ebc0a40
   67124                             switch (instr & 0x00010080) {
   67125                               case 0x00000000: {
   67126                                 // 0x0ebc0a40
   67127                                 if (((instr & 0xf0000000) == 0xf0000000)) {
   67128                                   UnallocatedA32(instr);
   67129                                   return;
   67130                                 }
   67131                                 Condition condition((instr >> 28) & 0xf);
   67132                                 unsigned rd = ExtractSRegister(instr, 22, 12);
   67133                                 unsigned rm = ExtractSRegister(instr, 5, 0);
   67134                                 // VCVTR{<c>}{<q>}.U32.F32 <Sd>, <Sm> ; A1
   67135                                 vcvtr(condition,
   67136                                       U32,
   67137                                       F32,
   67138                                       SRegister(rd),
   67139                                       SRegister(rm));
   67140                                 break;
   67141                               }
   67142                               case 0x00000080: {
   67143                                 // 0x0ebc0ac0
   67144                                 if (((instr & 0xf0000000) == 0xf0000000)) {
   67145                                   UnallocatedA32(instr);
   67146                                   return;
   67147                                 }
   67148                                 Condition condition((instr >> 28) & 0xf);
   67149                                 unsigned rd = ExtractSRegister(instr, 22, 12);
   67150                                 unsigned rm = ExtractSRegister(instr, 5, 0);
   67151                                 // VCVT{<c>}{<q>}.U32.F32 <Sd>, <Sm> ; A1
   67152                                 vcvt(condition,
   67153                                      U32,
   67154                                      F32,
   67155                                      SRegister(rd),
   67156                                      SRegister(rm));
   67157                                 break;
   67158                               }
   67159                               case 0x00010000: {
   67160                                 // 0x0ebd0a40
   67161                                 if (((instr & 0xf0000000) == 0xf0000000)) {
   67162                                   UnallocatedA32(instr);
   67163                                   return;
   67164                                 }
   67165                                 Condition condition((instr >> 28) & 0xf);
   67166                                 unsigned rd = ExtractSRegister(instr, 22, 12);
   67167                                 unsigned rm = ExtractSRegister(instr, 5, 0);
   67168                                 // VCVTR{<c>}{<q>}.S32.F32 <Sd>, <Sm> ; A1
   67169                                 vcvtr(condition,
   67170                                       S32,
   67171                                       F32,
   67172                                       SRegister(rd),
   67173                                       SRegister(rm));
   67174                                 break;
   67175                               }
   67176                               case 0x00010080: {
   67177                                 // 0x0ebd0ac0
   67178                                 if (((instr & 0xf0000000) == 0xf0000000)) {
   67179                                   UnallocatedA32(instr);
   67180                                   return;
   67181                                 }
   67182                                 Condition condition((instr >> 28) & 0xf);
   67183                                 unsigned rd = ExtractSRegister(instr, 22, 12);
   67184                                 unsigned rm = ExtractSRegister(instr, 5, 0);
   67185                                 // VCVT{<c>}{<q>}.S32.F32 <Sd>, <Sm> ; A1
   67186                                 vcvt(condition,
   67187                                      S32,
   67188                                      F32,
   67189                                      SRegister(rd),
   67190                                      SRegister(rm));
   67191                                 break;
   67192                               }
   67193                             }
   67194                             break;
   67195                           }
   67196                           case 0x000e0000: {
   67197                             // 0x0ebe0a40
   67198                             if (((instr & 0xf0000000) == 0xf0000000)) {
   67199                               UnallocatedA32(instr);
   67200                               return;
   67201                             }
   67202                             Condition condition((instr >> 28) & 0xf);
   67203                             DataType dt = Dt_U_sx_1_Decode(
   67204                                 ((instr >> 7) & 0x1) | ((instr >> 15) & 0x2));
   67205                             if (dt.Is(kDataTypeValueInvalid)) {
   67206                               UnallocatedA32(instr);
   67207                               return;
   67208                             }
   67209                             unsigned rd = ExtractSRegister(instr, 22, 12);
   67210                             unsigned offset = 32;
   67211                             if (dt.Is(S16) || dt.Is(U16)) {
   67212                               offset = 16;
   67213                             }
   67214                             uint32_t fbits = offset - (((instr >> 5) & 0x1) |
   67215                                                        ((instr << 1) & 0x1e));
   67216                             // VCVT{<c>}{<q>}.<dt>.F32 <Sdm>, <Sdm>, #<fbits> ; A1 NOLINT(whitespace/line_length)
   67217                             vcvt(condition,
   67218                                  dt,
   67219                                  F32,
   67220                                  SRegister(rd),
   67221                                  SRegister(rd),
   67222                                  fbits);
   67223                             break;
   67224                           }
   67225                         }
   67226                         break;
   67227                       }
   67228                       case 0x00b00100: {
   67229                         // 0x0eb00b00
   67230                         if (((instr & 0xf0000000) == 0xf0000000)) {
   67231                           UnallocatedA32(instr);
   67232                           return;
   67233                         }
   67234                         Condition condition((instr >> 28) & 0xf);
   67235                         unsigned rd = ExtractDRegister(instr, 22, 12);
   67236                         uint32_t encoded_imm =
   67237                             (instr & 0xf) | ((instr >> 12) & 0xf0);
   67238                         NeonImmediate imm =
   67239                             ImmediateVFP::Decode<double>(encoded_imm);
   67240                         // VMOV{<c>}{<q>}.F64 <Dd>, #<imm> ; A2
   67241                         vmov(condition, F64, DRegister(rd), imm);
   67242                         if (((instr & 0xfb00ff0) != 0xeb00b00)) {
   67243                           UnpredictableA32(instr);
   67244                         }
   67245                         break;
   67246                       }
   67247                       case 0x00b00140: {
   67248                         // 0x0eb00b40
   67249                         switch (instr & 0x000e0000) {
   67250                           case 0x00000000: {
   67251                             // 0x0eb00b40
   67252                             switch (instr & 0x00010080) {
   67253                               case 0x00000000: {
   67254                                 // 0x0eb00b40
   67255                                 if (((instr & 0xf0000000) == 0xf0000000)) {
   67256                                   UnallocatedA32(instr);
   67257                                   return;
   67258                                 }
   67259                                 Condition condition((instr >> 28) & 0xf);
   67260                                 unsigned rd = ExtractDRegister(instr, 22, 12);
   67261                                 unsigned rm = ExtractDRegister(instr, 5, 0);
   67262                                 // VMOV{<c>}{<q>}.F64 <Dd>, <Dm> ; A2
   67263                                 vmov(condition,
   67264                                      F64,
   67265                                      DRegister(rd),
   67266                                      DRegister(rm));
   67267                                 break;
   67268                               }
   67269                               case 0x00000080: {
   67270                                 // 0x0eb00bc0
   67271                                 if (((instr & 0xf0000000) == 0xf0000000)) {
   67272                                   UnallocatedA32(instr);
   67273                                   return;
   67274                                 }
   67275                                 Condition condition((instr >> 28) & 0xf);
   67276                                 unsigned rd = ExtractDRegister(instr, 22, 12);
   67277                                 unsigned rm = ExtractDRegister(instr, 5, 0);
   67278                                 // VABS{<c>}{<q>}.F64 <Dd>, <Dm> ; A2
   67279                                 vabs(condition,
   67280                                      F64,
   67281                                      DRegister(rd),
   67282                                      DRegister(rm));
   67283                                 break;
   67284                               }
   67285                               case 0x00010000: {
   67286                                 // 0x0eb10b40
   67287                                 if (((instr & 0xf0000000) == 0xf0000000)) {
   67288                                   UnallocatedA32(instr);
   67289                                   return;
   67290                                 }
   67291                                 Condition condition((instr >> 28) & 0xf);
   67292                                 unsigned rd = ExtractDRegister(instr, 22, 12);
   67293                                 unsigned rm = ExtractDRegister(instr, 5, 0);
   67294                                 // VNEG{<c>}{<q>}.F64 <Dd>, <Dm> ; A2
   67295                                 vneg(condition,
   67296                                      F64,
   67297                                      DRegister(rd),
   67298                                      DRegister(rm));
   67299                                 break;
   67300                               }
   67301                               case 0x00010080: {
   67302                                 // 0x0eb10bc0
   67303                                 if (((instr & 0xf0000000) == 0xf0000000)) {
   67304                                   UnallocatedA32(instr);
   67305                                   return;
   67306                                 }
   67307                                 Condition condition((instr >> 28) & 0xf);
   67308                                 unsigned rd = ExtractDRegister(instr, 22, 12);
   67309                                 unsigned rm = ExtractDRegister(instr, 5, 0);
   67310                                 // VSQRT{<c>}{<q>}.F64 <Dd>, <Dm> ; A1
   67311                                 vsqrt(condition,
   67312                                       F64,
   67313                                       DRegister(rd),
   67314                                       DRegister(rm));
   67315                                 break;
   67316                               }
   67317                             }
   67318                             break;
   67319                           }
   67320                           case 0x00020000: {
   67321                             // 0x0eb20b40
   67322                             switch (instr & 0x00010080) {
   67323                               case 0x00000000: {
   67324                                 // 0x0eb20b40
   67325                                 if (((instr & 0xf0000000) == 0xf0000000)) {
   67326                                   UnallocatedA32(instr);
   67327                                   return;
   67328                                 }
   67329                                 Condition condition((instr >> 28) & 0xf);
   67330                                 unsigned rd = ExtractDRegister(instr, 22, 12);
   67331                                 unsigned rm = ExtractSRegister(instr, 5, 0);
   67332                                 // VCVTB{<c>}{<q>}.F64.F16 <Dd>, <Sm> ; A1
   67333                                 vcvtb(condition,
   67334                                       F64,
   67335                                       F16,
   67336                                       DRegister(rd),
   67337                                       SRegister(rm));
   67338                                 break;
   67339                               }
   67340                               case 0x00000080: {
   67341                                 // 0x0eb20bc0
   67342                                 if (((instr & 0xf0000000) == 0xf0000000)) {
   67343                                   UnallocatedA32(instr);
   67344                                   return;
   67345                                 }
   67346                                 Condition condition((instr >> 28) & 0xf);
   67347                                 unsigned rd = ExtractDRegister(instr, 22, 12);
   67348                                 unsigned rm = ExtractSRegister(instr, 5, 0);
   67349                                 // VCVTT{<c>}{<q>}.F64.F16 <Dd>, <Sm> ; A1
   67350                                 vcvtt(condition,
   67351                                       F64,
   67352                                       F16,
   67353                                       DRegister(rd),
   67354                                       SRegister(rm));
   67355                                 break;
   67356                               }
   67357                               case 0x00010000: {
   67358                                 // 0x0eb30b40
   67359                                 if (((instr & 0xf0000000) == 0xf0000000)) {
   67360                                   UnallocatedA32(instr);
   67361                                   return;
   67362                                 }
   67363                                 Condition condition((instr >> 28) & 0xf);
   67364                                 unsigned rd = ExtractSRegister(instr, 22, 12);
   67365                                 unsigned rm = ExtractDRegister(instr, 5, 0);
   67366                                 // VCVTB{<c>}{<q>}.F16.F64 <Sd>, <Dm> ; A1
   67367                                 vcvtb(condition,
   67368                                       F16,
   67369                                       F64,
   67370                                       SRegister(rd),
   67371                                       DRegister(rm));
   67372                                 break;
   67373                               }
   67374                               case 0x00010080: {
   67375                                 // 0x0eb30bc0
   67376                                 if (((instr & 0xf0000000) == 0xf0000000)) {
   67377                                   UnallocatedA32(instr);
   67378                                   return;
   67379                                 }
   67380                                 Condition condition((instr >> 28) & 0xf);
   67381                                 unsigned rd = ExtractSRegister(instr, 22, 12);
   67382                                 unsigned rm = ExtractDRegister(instr, 5, 0);
   67383                                 // VCVTT{<c>}{<q>}.F16.F64 <Sd>, <Dm> ; A1
   67384                                 vcvtt(condition,
   67385                                       F16,
   67386                                       F64,
   67387                                       SRegister(rd),
   67388                                       DRegister(rm));
   67389                                 break;
   67390                               }
   67391                             }
   67392                             break;
   67393                           }
   67394                           case 0x00040000: {
   67395                             // 0x0eb40b40
   67396                             switch (instr & 0x00010080) {
   67397                               case 0x00000000: {
   67398                                 // 0x0eb40b40
   67399                                 if (((instr & 0xf0000000) == 0xf0000000)) {
   67400                                   UnallocatedA32(instr);
   67401                                   return;
   67402                                 }
   67403                                 Condition condition((instr >> 28) & 0xf);
   67404                                 unsigned rd = ExtractDRegister(instr, 22, 12);
   67405                                 unsigned rm = ExtractDRegister(instr, 5, 0);
   67406                                 // VCMP{<c>}{<q>}.F64 <Dd>, <Dm> ; A1
   67407                                 vcmp(condition,
   67408                                      F64,
   67409                                      DRegister(rd),
   67410                                      DRegister(rm));
   67411                                 break;
   67412                               }
   67413                               case 0x00000080: {
   67414                                 // 0x0eb40bc0
   67415                                 if (((instr & 0xf0000000) == 0xf0000000)) {
   67416                                   UnallocatedA32(instr);
   67417                                   return;
   67418                                 }
   67419                                 Condition condition((instr >> 28) & 0xf);
   67420                                 unsigned rd = ExtractDRegister(instr, 22, 12);
   67421                                 unsigned rm = ExtractDRegister(instr, 5, 0);
   67422                                 // VCMPE{<c>}{<q>}.F64 <Dd>, <Dm> ; A1
   67423                                 vcmpe(condition,
   67424                                       F64,
   67425                                       DRegister(rd),
   67426                                       DRegister(rm));
   67427                                 break;
   67428                               }
   67429                               case 0x00010000: {
   67430                                 // 0x0eb50b40
   67431                                 if (((instr & 0xf0000000) == 0xf0000000)) {
   67432                                   UnallocatedA32(instr);
   67433                                   return;
   67434                                 }
   67435                                 Condition condition((instr >> 28) & 0xf);
   67436                                 unsigned rd = ExtractDRegister(instr, 22, 12);
   67437                                 // VCMP{<c>}{<q>}.F64 <Dd>, #0.0 ; A2
   67438                                 vcmp(condition, F64, DRegister(rd), 0.0);
   67439                                 if (((instr & 0xfbf0fff) != 0xeb50b40)) {
   67440                                   UnpredictableA32(instr);
   67441                                 }
   67442                                 break;
   67443                               }
   67444                               case 0x00010080: {
   67445                                 // 0x0eb50bc0
   67446                                 if (((instr & 0xf0000000) == 0xf0000000)) {
   67447                                   UnallocatedA32(instr);
   67448                                   return;
   67449                                 }
   67450                                 Condition condition((instr >> 28) & 0xf);
   67451                                 unsigned rd = ExtractDRegister(instr, 22, 12);
   67452                                 // VCMPE{<c>}{<q>}.F64 <Dd>, #0.0 ; A2
   67453                                 vcmpe(condition, F64, DRegister(rd), 0.0);
   67454                                 if (((instr & 0xfbf0fff) != 0xeb50bc0)) {
   67455                                   UnpredictableA32(instr);
   67456                                 }
   67457                                 break;
   67458                               }
   67459                             }
   67460                             break;
   67461                           }
   67462                           case 0x00060000: {
   67463                             // 0x0eb60b40
   67464                             switch (instr & 0x00010080) {
   67465                               case 0x00000000: {
   67466                                 // 0x0eb60b40
   67467                                 if (((instr & 0xf0000000) == 0xf0000000)) {
   67468                                   UnallocatedA32(instr);
   67469                                   return;
   67470                                 }
   67471                                 Condition condition((instr >> 28) & 0xf);
   67472                                 unsigned rd = ExtractDRegister(instr, 22, 12);
   67473                                 unsigned rm = ExtractDRegister(instr, 5, 0);
   67474                                 // VRINTR{<c>}{<q>}.F64.F64 <Dd>, <Dm> ; A1
   67475                                 vrintr(condition,
   67476                                        F64,
   67477                                        F64,
   67478                                        DRegister(rd),
   67479                                        DRegister(rm));
   67480                                 break;
   67481                               }
   67482                               case 0x00000080: {
   67483                                 // 0x0eb60bc0
   67484                                 if (((instr & 0xf0000000) == 0xf0000000)) {
   67485                                   UnallocatedA32(instr);
   67486                                   return;
   67487                                 }
   67488                                 Condition condition((instr >> 28) & 0xf);
   67489                                 unsigned rd = ExtractDRegister(instr, 22, 12);
   67490                                 unsigned rm = ExtractDRegister(instr, 5, 0);
   67491                                 // VRINTZ{<c>}{<q>}.F64.F64 <Dd>, <Dm> ; A1
   67492                                 vrintz(condition,
   67493                                        F64,
   67494                                        F64,
   67495                                        DRegister(rd),
   67496                                        DRegister(rm));
   67497                                 break;
   67498                               }
   67499                               case 0x00010000: {
   67500                                 // 0x0eb70b40
   67501                                 if (((instr & 0xf0000000) == 0xf0000000)) {
   67502                                   UnallocatedA32(instr);
   67503                                   return;
   67504                                 }
   67505                                 Condition condition((instr >> 28) & 0xf);
   67506                                 unsigned rd = ExtractDRegister(instr, 22, 12);
   67507                                 unsigned rm = ExtractDRegister(instr, 5, 0);
   67508                                 // VRINTX{<c>}{<q>}.F64.F64 <Dd>, <Dm> ; A1
   67509                                 vrintx(condition,
   67510                                        F64,
   67511                                        F64,
   67512                                        DRegister(rd),
   67513                                        DRegister(rm));
   67514                                 break;
   67515                               }
   67516                               case 0x00010080: {
   67517                                 // 0x0eb70bc0
   67518                                 if (((instr & 0xf0000000) == 0xf0000000)) {
   67519                                   UnallocatedA32(instr);
   67520                                   return;
   67521                                 }
   67522                                 Condition condition((instr >> 28) & 0xf);
   67523                                 unsigned rd = ExtractSRegister(instr, 22, 12);
   67524                                 unsigned rm = ExtractDRegister(instr, 5, 0);
   67525                                 // VCVT{<c>}{<q>}.F32.F64 <Sd>, <Dm> ; A1
   67526                                 vcvt(condition,
   67527                                      F32,
   67528                                      F64,
   67529                                      SRegister(rd),
   67530                                      DRegister(rm));
   67531                                 break;
   67532                               }
   67533                             }
   67534                             break;
   67535                           }
   67536                           case 0x00080000: {
   67537                             // 0x0eb80b40
   67538                             if ((instr & 0x00010000) == 0x00000000) {
   67539                               if (((instr & 0xf0000000) == 0xf0000000)) {
   67540                                 UnallocatedA32(instr);
   67541                                 return;
   67542                               }
   67543                               Condition condition((instr >> 28) & 0xf);
   67544                               DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
   67545                               if (dt.Is(kDataTypeValueInvalid)) {
   67546                                 UnallocatedA32(instr);
   67547                                 return;
   67548                               }
   67549                               unsigned rd = ExtractDRegister(instr, 22, 12);
   67550                               unsigned rm = ExtractSRegister(instr, 5, 0);
   67551                               // VCVT{<c>}{<q>}.F64.<dt> <Dd>, <Sm> ; A1
   67552                               vcvt(condition,
   67553                                    F64,
   67554                                    dt,
   67555                                    DRegister(rd),
   67556                                    SRegister(rm));
   67557                             } else {
   67558                               UnallocatedA32(instr);
   67559                             }
   67560                             break;
   67561                           }
   67562                           case 0x000a0000: {
   67563                             // 0x0eba0b40
   67564                             if (((instr & 0xf0000000) == 0xf0000000)) {
   67565                               UnallocatedA32(instr);
   67566                               return;
   67567                             }
   67568                             Condition condition((instr >> 28) & 0xf);
   67569                             DataType dt = Dt_U_sx_1_Decode(
   67570                                 ((instr >> 7) & 0x1) | ((instr >> 15) & 0x2));
   67571                             if (dt.Is(kDataTypeValueInvalid)) {
   67572                               UnallocatedA32(instr);
   67573                               return;
   67574                             }
   67575                             unsigned rd = ExtractDRegister(instr, 22, 12);
   67576                             unsigned offset = 32;
   67577                             if (dt.Is(S16) || dt.Is(U16)) {
   67578                               offset = 16;
   67579                             }
   67580                             uint32_t fbits = offset - (((instr >> 5) & 0x1) |
   67581                                                        ((instr << 1) & 0x1e));
   67582                             // VCVT{<c>}{<q>}.F64.<dt> <Ddm>, <Ddm>, #<fbits> ; A1 NOLINT(whitespace/line_length)
   67583                             vcvt(condition,
   67584                                  F64,
   67585                                  dt,
   67586                                  DRegister(rd),
   67587                                  DRegister(rd),
   67588                                  fbits);
   67589                             break;
   67590                           }
   67591                           case 0x000c0000: {
   67592                             // 0x0ebc0b40
   67593                             switch (instr & 0x00010080) {
   67594                               case 0x00000000: {
   67595                                 // 0x0ebc0b40
   67596                                 if (((instr & 0xf0000000) == 0xf0000000)) {
   67597                                   UnallocatedA32(instr);
   67598                                   return;
   67599                                 }
   67600                                 Condition condition((instr >> 28) & 0xf);
   67601                                 unsigned rd = ExtractSRegister(instr, 22, 12);
   67602                                 unsigned rm = ExtractDRegister(instr, 5, 0);
   67603                                 // VCVTR{<c>}{<q>}.U32.F64 <Sd>, <Dm> ; A1
   67604                                 vcvtr(condition,
   67605                                       U32,
   67606                                       F64,
   67607                                       SRegister(rd),
   67608                                       DRegister(rm));
   67609                                 break;
   67610                               }
   67611                               case 0x00000080: {
   67612                                 // 0x0ebc0bc0
   67613                                 if (((instr & 0xf0000000) == 0xf0000000)) {
   67614                                   UnallocatedA32(instr);
   67615                                   return;
   67616                                 }
   67617                                 Condition condition((instr >> 28) & 0xf);
   67618                                 unsigned rd = ExtractSRegister(instr, 22, 12);
   67619                                 unsigned rm = ExtractDRegister(instr, 5, 0);
   67620                                 // VCVT{<c>}{<q>}.U32.F64 <Sd>, <Dm> ; A1
   67621                                 vcvt(condition,
   67622                                      U32,
   67623                                      F64,
   67624                                      SRegister(rd),
   67625                                      DRegister(rm));
   67626                                 break;
   67627                               }
   67628                               case 0x00010000: {
   67629                                 // 0x0ebd0b40
   67630                                 if (((instr & 0xf0000000) == 0xf0000000)) {
   67631                                   UnallocatedA32(instr);
   67632                                   return;
   67633                                 }
   67634                                 Condition condition((instr >> 28) & 0xf);
   67635                                 unsigned rd = ExtractSRegister(instr, 22, 12);
   67636                                 unsigned rm = ExtractDRegister(instr, 5, 0);
   67637                                 // VCVTR{<c>}{<q>}.S32.F64 <Sd>, <Dm> ; A1
   67638                                 vcvtr(condition,
   67639                                       S32,
   67640                                       F64,
   67641                                       SRegister(rd),
   67642                                       DRegister(rm));
   67643                                 break;
   67644                               }
   67645                               case 0x00010080: {
   67646                                 // 0x0ebd0bc0
   67647                                 if (((instr & 0xf0000000) == 0xf0000000)) {
   67648                                   UnallocatedA32(instr);
   67649                                   return;
   67650                                 }
   67651                                 Condition condition((instr >> 28) & 0xf);
   67652                                 unsigned rd = ExtractSRegister(instr, 22, 12);
   67653                                 unsigned rm = ExtractDRegister(instr, 5, 0);
   67654                                 // VCVT{<c>}{<q>}.S32.F64 <Sd>, <Dm> ; A1
   67655                                 vcvt(condition,
   67656                                      S32,
   67657                                      F64,
   67658                                      SRegister(rd),
   67659                                      DRegister(rm));
   67660                                 break;
   67661                               }
   67662                             }
   67663                             break;
   67664                           }
   67665                           case 0x000e0000: {
   67666                             // 0x0ebe0b40
   67667                             if (((instr & 0xf0000000) == 0xf0000000)) {
   67668                               UnallocatedA32(instr);
   67669                               return;
   67670                             }
   67671                             Condition condition((instr >> 28) & 0xf);
   67672                             DataType dt = Dt_U_sx_1_Decode(
   67673                                 ((instr >> 7) & 0x1) | ((instr >> 15) & 0x2));
   67674                             if (dt.Is(kDataTypeValueInvalid)) {
   67675                               UnallocatedA32(instr);
   67676                               return;
   67677                             }
   67678                             unsigned rd = ExtractDRegister(instr, 22, 12);
   67679                             unsigned offset = 32;
   67680                             if (dt.Is(S16) || dt.Is(U16)) {
   67681                               offset = 16;
   67682                             }
   67683                             uint32_t fbits = offset - (((instr >> 5) & 0x1) |
   67684                                                        ((instr << 1) & 0x1e));
   67685                             // VCVT{<c>}{<q>}.<dt>.F64 <Ddm>, <Ddm>, #<fbits> ; A1 NOLINT(whitespace/line_length)
   67686                             vcvt(condition,
   67687                                  dt,
   67688                                  F64,
   67689                                  DRegister(rd),
   67690                                  DRegister(rd),
   67691                                  fbits);
   67692                             break;
   67693                           }
   67694                         }
   67695                         break;
   67696                       }
   67697                       default:
   67698                         UnallocatedA32(instr);
   67699                         break;
   67700                     }
   67701                     break;
   67702                   }
   67703                   default: {
   67704                     if (((instr & 0xf0000000) == 0xf0000000) ||
   67705                         ((instr & 0xe00) == 0xa00)) {
   67706                       UnallocatedA32(instr);
   67707                       return;
   67708                     }
   67709                     UnimplementedA32("CDP", instr);
   67710                     break;
   67711                   }
   67712                 }
   67713                 break;
   67714               }
   67715               case 0x00000010: {
   67716                 // 0x0e000010
   67717                 switch (instr & 0x00100000) {
   67718                   case 0x00000000: {
   67719                     // 0x0e000010
   67720                     switch (instr & 0x00000e00) {
   67721                       case 0x00000a00: {
   67722                         // 0x0e000a10
   67723                         switch (instr & 0x00800100) {
   67724                           case 0x00000000: {
   67725                             // 0x0e000a10
   67726                             if ((instr & 0x00600000) == 0x00000000) {
   67727                               if (((instr & 0xf0000000) == 0xf0000000)) {
   67728                                 UnallocatedA32(instr);
   67729                                 return;
   67730                               }
   67731                               Condition condition((instr >> 28) & 0xf);
   67732                               unsigned rn = ExtractSRegister(instr, 7, 16);
   67733                               unsigned rt = (instr >> 12) & 0xf;
   67734                               // VMOV{<c>}{<q>} <Sn>, <Rt> ; A1
   67735                               vmov(condition, SRegister(rn), Register(rt));
   67736                               if (((instr & 0xff00f7f) != 0xe000a10)) {
   67737                                 UnpredictableA32(instr);
   67738                               }
   67739                             } else {
   67740                               UnallocatedA32(instr);
   67741                             }
   67742                             break;
   67743                           }
   67744                           case 0x00000100: {
   67745                             // 0x0e000b10
   67746                             if (((instr & 0xf0000000) == 0xf0000000)) {
   67747                               UnallocatedA32(instr);
   67748                               return;
   67749                             }
   67750                             Condition condition((instr >> 28) & 0xf);
   67751                             unsigned lane;
   67752                             DataType dt =
   67753                                 Dt_opc1_opc2_1_Decode(((instr >> 5) & 0x3) |
   67754                                                           ((instr >> 19) & 0xc),
   67755                                                       &lane);
   67756                             if (dt.Is(kDataTypeValueInvalid)) {
   67757                               UnallocatedA32(instr);
   67758                               return;
   67759                             }
   67760                             unsigned rd = ExtractDRegister(instr, 7, 16);
   67761                             unsigned rt = (instr >> 12) & 0xf;
   67762                             // VMOV{<c>}{<q>}{.<size>} <Dd[x]>, <Rt> ; A1
   67763                             vmov(condition,
   67764                                  dt,
   67765                                  DRegisterLane(rd, lane),
   67766                                  Register(rt));
   67767                             if (((instr & 0xf900f1f) != 0xe000b10)) {
   67768                               UnpredictableA32(instr);
   67769                             }
   67770                             break;
   67771                           }
   67772                           case 0x00800000: {
   67773                             // 0x0e800a10
   67774                             if ((instr & 0x00600000) == 0x00600000) {
   67775                               if (((instr & 0xf0000000) == 0xf0000000)) {
   67776                                 UnallocatedA32(instr);
   67777                                 return;
   67778                               }
   67779                               Condition condition((instr >> 28) & 0xf);
   67780                               unsigned spec_reg = (instr >> 16) & 0xf;
   67781                               unsigned rt = (instr >> 12) & 0xf;
   67782                               switch (spec_reg) {
   67783                                 case 0x0:
   67784                                 case 0x1:
   67785                                 case 0x8: {
   67786                                   // VMSR{<c>}{<q>} <spec_reg>, <Rt> ; A1
   67787                                   vmsr(condition,
   67788                                        SpecialFPRegister(spec_reg),
   67789                                        Register(rt));
   67790                                   if (((instr & 0xff00fff) != 0xee00a10)) {
   67791                                     UnpredictableA32(instr);
   67792                                   }
   67793                                   break;
   67794                                 }
   67795                                 default:
   67796                                   UnallocatedA32(instr);
   67797                                   break;
   67798                               }
   67799                             } else {
   67800                               UnallocatedA32(instr);
   67801                             }
   67802                             break;
   67803                           }
   67804                           case 0x00800100: {
   67805                             // 0x0e800b10
   67806                             switch (instr & 0x00200040) {
   67807                               case 0x00000000: {
   67808                                 // 0x0e800b10
   67809                                 if (((instr & 0xf0000000) == 0xf0000000)) {
   67810                                   UnallocatedA32(instr);
   67811                                   return;
   67812                                 }
   67813                                 Condition condition((instr >> 28) & 0xf);
   67814                                 DataType dt =
   67815                                     Dt_B_E_1_Decode(((instr >> 5) & 0x1) |
   67816                                                     ((instr >> 21) & 0x2));
   67817                                 if (dt.Is(kDataTypeValueInvalid)) {
   67818                                   UnallocatedA32(instr);
   67819                                   return;
   67820                                 }
   67821                                 unsigned rd = ExtractDRegister(instr, 7, 16);
   67822                                 unsigned rt = (instr >> 12) & 0xf;
   67823                                 // VDUP{<c>}{<q>}.<dt> <Dd>, <Rt> ; A1
   67824                                 vdup(condition,
   67825                                      dt,
   67826                                      DRegister(rd),
   67827                                      Register(rt));
   67828                                 if (((instr & 0xfb00f5f) != 0xe800b10)) {
   67829                                   UnpredictableA32(instr);
   67830                                 }
   67831                                 break;
   67832                               }
   67833                               case 0x00200000: {
   67834                                 // 0x0ea00b10
   67835                                 if (((instr & 0xf0000000) == 0xf0000000)) {
   67836                                   UnallocatedA32(instr);
   67837                                   return;
   67838                                 }
   67839                                 Condition condition((instr >> 28) & 0xf);
   67840                                 DataType dt =
   67841                                     Dt_B_E_1_Decode(((instr >> 5) & 0x1) |
   67842                                                     ((instr >> 21) & 0x2));
   67843                                 if (dt.Is(kDataTypeValueInvalid)) {
   67844                                   UnallocatedA32(instr);
   67845                                   return;
   67846                                 }
   67847                                 if (((instr >> 16) & 1) != 0) {
   67848                                   UnallocatedA32(instr);
   67849                                   return;
   67850                                 }
   67851                                 unsigned rd = ExtractQRegister(instr, 7, 16);
   67852                                 unsigned rt = (instr >> 12) & 0xf;
   67853                                 // VDUP{<c>}{<q>}.<dt> <Qd>, <Rt> ; A1
   67854                                 vdup(condition,
   67855                                      dt,
   67856                                      QRegister(rd),
   67857                                      Register(rt));
   67858                                 if (((instr & 0xfb00f5f) != 0xea00b10)) {
   67859                                   UnpredictableA32(instr);
   67860                                 }
   67861                                 break;
   67862                               }
   67863                               default:
   67864                                 UnallocatedA32(instr);
   67865                                 break;
   67866                             }
   67867                             break;
   67868                           }
   67869                         }
   67870                         break;
   67871                       }
   67872                       default: {
   67873                         if (((instr & 0xf0000000) == 0xf0000000) ||
   67874                             ((instr & 0xe00) == 0xa00)) {
   67875                           UnallocatedA32(instr);
   67876                           return;
   67877                         }
   67878                         UnimplementedA32("MCR", instr);
   67879                         break;
   67880                       }
   67881                     }
   67882                     break;
   67883                   }
   67884                   case 0x00100000: {
   67885                     // 0x0e100010
   67886                     switch (instr & 0x00000e00) {
   67887                       case 0x00000a00: {
   67888                         // 0x0e100a10
   67889                         switch (instr & 0x00000100) {
   67890                           case 0x00000000: {
   67891                             // 0x0e100a10
   67892                             switch (instr & 0x00e00000) {
   67893                               case 0x00000000: {
   67894                                 // 0x0e100a10
   67895                                 if (((instr & 0xf0000000) == 0xf0000000)) {
   67896                                   UnallocatedA32(instr);
   67897                                   return;
   67898                                 }
   67899                                 Condition condition((instr >> 28) & 0xf);
   67900                                 unsigned rt = (instr >> 12) & 0xf;
   67901                                 unsigned rn = ExtractSRegister(instr, 7, 16);
   67902                                 // VMOV{<c>}{<q>} <Rt>, <Sn> ; A1
   67903                                 vmov(condition, Register(rt), SRegister(rn));
   67904                                 if (((instr & 0xff00f7f) != 0xe100a10)) {
   67905                                   UnpredictableA32(instr);
   67906                                 }
   67907                                 break;
   67908                               }
   67909                               case 0x00e00000: {
   67910                                 // 0x0ef00a10
   67911                                 if (((instr & 0xf0000000) == 0xf0000000)) {
   67912                                   UnallocatedA32(instr);
   67913                                   return;
   67914                                 }
   67915                                 Condition condition((instr >> 28) & 0xf);
   67916                                 unsigned rt = (instr >> 12) & 0xf;
   67917                                 unsigned spec_reg = (instr >> 16) & 0xf;
   67918                                 switch (spec_reg) {
   67919                                   case 0x0:
   67920                                   case 0x1:
   67921                                   case 0x5:
   67922                                   case 0x6:
   67923                                   case 0x7:
   67924                                   case 0x8: {
   67925                                     // VMRS{<c>}{<q>} <Rt>, <spec_reg> ; A1
   67926                                     vmrs(condition,
   67927                                          RegisterOrAPSR_nzcv(rt),
   67928                                          SpecialFPRegister(spec_reg));
   67929                                     if (((instr & 0xff00fff) != 0xef00a10)) {
   67930                                       UnpredictableA32(instr);
   67931                                     }
   67932                                     break;
   67933                                   }
   67934                                   default:
   67935                                     UnallocatedA32(instr);
   67936                                     break;
   67937                                 }
   67938                                 break;
   67939                               }
   67940                               default:
   67941                                 UnallocatedA32(instr);
   67942                                 break;
   67943                             }
   67944                             break;
   67945                           }
   67946                           case 0x00000100: {
   67947                             // 0x0e100b10
   67948                             if (((instr & 0xf0000000) == 0xf0000000)) {
   67949                               UnallocatedA32(instr);
   67950                               return;
   67951                             }
   67952                             Condition condition((instr >> 28) & 0xf);
   67953                             unsigned lane;
   67954                             DataType dt =
   67955                                 Dt_U_opc1_opc2_1_Decode(((instr >> 5) & 0x3) |
   67956                                                             ((instr >> 19) &
   67957                                                              0xc) |
   67958                                                             ((instr >> 19) &
   67959                                                              0x10),
   67960                                                         &lane);
   67961                             if (dt.Is(kDataTypeValueInvalid)) {
   67962                               UnallocatedA32(instr);
   67963                               return;
   67964                             }
   67965                             unsigned rt = (instr >> 12) & 0xf;
   67966                             unsigned rn = ExtractDRegister(instr, 7, 16);
   67967                             // VMOV{<c>}{<q>}{.<dt>} <Rt>, <Dn[x]> ; A1
   67968                             vmov(condition,
   67969                                  dt,
   67970                                  Register(rt),
   67971                                  DRegisterLane(rn, lane));
   67972                             if (((instr & 0xf100f1f) != 0xe100b10)) {
   67973                               UnpredictableA32(instr);
   67974                             }
   67975                             break;
   67976                           }
   67977                         }
   67978                         break;
   67979                       }
   67980                       default: {
   67981                         if (((instr & 0xf0000000) == 0xf0000000) ||
   67982                             ((instr & 0xe00) == 0xa00)) {
   67983                           UnallocatedA32(instr);
   67984                           return;
   67985                         }
   67986                         UnimplementedA32("MRC", instr);
   67987                         break;
   67988                       }
   67989                     }
   67990                     break;
   67991                   }
   67992                 }
   67993                 break;
   67994               }
   67995             }
   67996             break;
   67997           }
   67998           case 0x01000000: {
   67999             // 0x0f000000
   68000             if (((instr & 0xf0000000) == 0xf0000000)) {
   68001               UnallocatedA32(instr);
   68002               return;
   68003             }
   68004             Condition condition((instr >> 28) & 0xf);
   68005             uint32_t imm = instr & 0xffffff;
   68006             // SVC{<c>}{<q>} {#}<imm> ; A1
   68007             svc(condition, imm);
   68008             break;
   68009           }
   68010         }
   68011         break;
   68012       }
   68013     }
   68014   }
   68015 }  // NOLINT(readability/fn_size)
   68016 // End of generated code.
   68017 
   68018 const uint16_t* PrintDisassembler::DecodeT32At(
   68019     const uint16_t* instruction_address, const uint16_t* buffer_end) {
   68020   uint32_t instruction = *instruction_address++ << 16;
   68021 
   68022   if (instruction >= kLowestT32_32Opcode) {
   68023     if (instruction_address >= buffer_end) {
   68024       os() << "?\n";
   68025       return instruction_address;
   68026     }
   68027     instruction |= *instruction_address++;
   68028   }
   68029 
   68030   DecodeT32(instruction);
   68031   return instruction_address;
   68032 }
   68033 
   68034 void PrintDisassembler::DecodeT32(uint32_t instruction) {
   68035   PrintCodeAddress(GetCodeAddress());
   68036   if (T32Size(instruction) == 2) {
   68037     PrintOpcode16(instruction >> 16);
   68038     Disassembler::DecodeT32(instruction);
   68039   } else {
   68040     PrintOpcode32(instruction);
   68041     Disassembler::DecodeT32(instruction);
   68042   }
   68043   os() << "\n";
   68044 }
   68045 
   68046 
   68047 void PrintDisassembler::DecodeA32(uint32_t instruction) {
   68048   PrintCodeAddress(GetCodeAddress());
   68049   PrintOpcode32(instruction);
   68050   Disassembler::DecodeA32(instruction);
   68051   os() << "\n";
   68052 }
   68053 
   68054 
   68055 void PrintDisassembler::DisassembleA32Buffer(const uint32_t* buffer,
   68056                                              size_t size_in_bytes) {
   68057   VIXL_ASSERT(IsAligned<sizeof(buffer[0])>(buffer));
   68058   VIXL_ASSERT(IsMultiple<sizeof(buffer[0])>(size_in_bytes));
   68059   const uint32_t* const end_buffer =
   68060       buffer + (size_in_bytes / sizeof(uint32_t));
   68061   while (buffer < end_buffer) {
   68062     DecodeA32(*buffer++);
   68063   }
   68064 }
   68065 
   68066 
   68067 void PrintDisassembler::DisassembleT32Buffer(const uint16_t* buffer,
   68068                                              size_t size_in_bytes) {
   68069   VIXL_ASSERT(IsAligned<sizeof(buffer[0])>(buffer));
   68070   VIXL_ASSERT(IsMultiple<sizeof(buffer[0])>(size_in_bytes));
   68071   const uint16_t* const end_buffer =
   68072       buffer + (size_in_bytes / sizeof(uint16_t));
   68073   while (buffer < end_buffer) {
   68074     buffer = DecodeT32At(buffer, end_buffer);
   68075   }
   68076   VIXL_ASSERT(buffer == end_buffer);
   68077 }
   68078 
   68079 }  // namespace aarch32
   68080 }  // namespace vixl
   68081