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/instructions-aarch32.h"
     41 #include "aarch32/operands-aarch32.h"
     42 #include "aarch32/disasm-aarch32.h"
     43 
     44 namespace vixl {
     45 namespace aarch32 {
     46 
     47 class T32CodeAddressIncrementer {
     48   uint32_t* code_address_;
     49   uint32_t increment_;
     50 
     51  public:
     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)) {
   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)) {
   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)) {
   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)) {
   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)) {
   1191     os() << rd << ", ";
   1192   }
   1193   os() << rn << ", " << operand;
   1194 }
   1195 
   1196 void Disassembler::adr(Condition cond,
   1197                        EncodingSize size,
   1198                        Register rd,
   1199                        Label* label) {
   1200   os().SetCurrentInstruction(kAdr, kAddress);
   1201   os() << ToCString(kAdr) << ConditionPrinter(it_block_, cond) << size << " "
   1202        << rd << ", " << PrintLabel(kAnyLocation, label, GetCodeAddress() & ~3);
   1203 }
   1204 
   1205 void Disassembler::and_(Condition cond,
   1206                         EncodingSize size,
   1207                         Register rd,
   1208                         Register rn,
   1209                         const Operand& operand) {
   1210   os().SetCurrentInstruction(kAnd, kBitwise);
   1211   os() << ToCString(kAnd) << ConditionPrinter(it_block_, cond) << size;
   1212   os() << " ";
   1213   if (!rd.Is(rn)) {
   1214     os() << rd << ", ";
   1215   }
   1216   os() << rn << ", " << operand;
   1217 }
   1218 
   1219 void Disassembler::ands(Condition cond,
   1220                         EncodingSize size,
   1221                         Register rd,
   1222                         Register rn,
   1223                         const Operand& operand) {
   1224   os().SetCurrentInstruction(kAnds, kBitwise);
   1225   os() << ToCString(kAnds) << ConditionPrinter(it_block_, cond) << size;
   1226   os() << " ";
   1227   if (!rd.Is(rn)) {
   1228     os() << rd << ", ";
   1229   }
   1230   os() << rn << ", " << operand;
   1231 }
   1232 
   1233 void Disassembler::asr(Condition cond,
   1234                        EncodingSize size,
   1235                        Register rd,
   1236                        Register rm,
   1237                        const Operand& operand) {
   1238   os().SetCurrentInstruction(kAsr, kShift);
   1239   os() << ToCString(kAsr) << ConditionPrinter(it_block_, cond) << size;
   1240   os() << " ";
   1241   if (!rd.Is(rm)) {
   1242     os() << rd << ", ";
   1243   }
   1244   os() << rm << ", " << operand;
   1245 }
   1246 
   1247 void Disassembler::asrs(Condition cond,
   1248                         EncodingSize size,
   1249                         Register rd,
   1250                         Register rm,
   1251                         const Operand& operand) {
   1252   os().SetCurrentInstruction(kAsrs, kShift);
   1253   os() << ToCString(kAsrs) << ConditionPrinter(it_block_, cond) << size;
   1254   os() << " ";
   1255   if (!rd.Is(rm)) {
   1256     os() << rd << ", ";
   1257   }
   1258   os() << rm << ", " << operand;
   1259 }
   1260 
   1261 void Disassembler::b(Condition cond, EncodingSize size, Label* label) {
   1262   os().SetCurrentInstruction(kB, kAddress | kBranch);
   1263   os() << ToCString(kB) << ConditionPrinter(it_block_, cond) << size << " "
   1264        << PrintLabel(kCodeLocation, label, GetCodeAddress());
   1265 }
   1266 
   1267 void Disassembler::bfc(Condition cond,
   1268                        Register rd,
   1269                        uint32_t lsb,
   1270                        const Operand& operand) {
   1271   os().SetCurrentInstruction(kBfc, kShift);
   1272   os() << ToCString(kBfc) << ConditionPrinter(it_block_, cond) << " " << rd
   1273        << ", "
   1274        << "#" << lsb << ", " << operand;
   1275 }
   1276 
   1277 void Disassembler::bfi(Condition cond,
   1278                        Register rd,
   1279                        Register rn,
   1280                        uint32_t lsb,
   1281                        const Operand& operand) {
   1282   os().SetCurrentInstruction(kBfi, kShift);
   1283   os() << ToCString(kBfi) << ConditionPrinter(it_block_, cond) << " " << rd
   1284        << ", " << rn << ", "
   1285        << "#" << lsb << ", " << operand;
   1286 }
   1287 
   1288 void Disassembler::bic(Condition cond,
   1289                        EncodingSize size,
   1290                        Register rd,
   1291                        Register rn,
   1292                        const Operand& operand) {
   1293   os().SetCurrentInstruction(kBic, kBitwise);
   1294   os() << ToCString(kBic) << ConditionPrinter(it_block_, cond) << size;
   1295   os() << " ";
   1296   if (!rd.Is(rn)) {
   1297     os() << rd << ", ";
   1298   }
   1299   os() << rn << ", " << operand;
   1300 }
   1301 
   1302 void Disassembler::bics(Condition cond,
   1303                         EncodingSize size,
   1304                         Register rd,
   1305                         Register rn,
   1306                         const Operand& operand) {
   1307   os().SetCurrentInstruction(kBics, kBitwise);
   1308   os() << ToCString(kBics) << ConditionPrinter(it_block_, cond) << size;
   1309   os() << " ";
   1310   if (!rd.Is(rn)) {
   1311     os() << rd << ", ";
   1312   }
   1313   os() << rn << ", " << operand;
   1314 }
   1315 
   1316 void Disassembler::bkpt(Condition cond, uint32_t imm) {
   1317   os().SetCurrentInstruction(kBkpt, kSystem);
   1318   os() << ToCString(kBkpt) << ConditionPrinter(it_block_, cond) << " " << imm;
   1319 }
   1320 
   1321 void Disassembler::bl(Condition cond, Label* label) {
   1322   os().SetCurrentInstruction(kBl, kAddress | kBranch);
   1323   os() << ToCString(kBl) << ConditionPrinter(it_block_, cond) << " "
   1324        << PrintLabel(kCodeLocation, label, GetCodeAddress());
   1325 }
   1326 
   1327 void Disassembler::blx(Condition cond, Label* label) {
   1328   os().SetCurrentInstruction(kBlx, kAddress | kBranch);
   1329   os() << ToCString(kBlx) << ConditionPrinter(it_block_, cond) << " "
   1330        << PrintLabel(kCodeLocation, label, GetCodeAddress() & ~3);
   1331 }
   1332 
   1333 void Disassembler::blx(Condition cond, Register rm) {
   1334   os().SetCurrentInstruction(kBlx, kAddress | kBranch);
   1335   os() << ToCString(kBlx) << ConditionPrinter(it_block_, cond) << " " << rm;
   1336 }
   1337 
   1338 void Disassembler::bx(Condition cond, Register rm) {
   1339   os().SetCurrentInstruction(kBx, kAddress | kBranch);
   1340   os() << ToCString(kBx) << ConditionPrinter(it_block_, cond) << " " << rm;
   1341 }
   1342 
   1343 void Disassembler::bxj(Condition cond, Register rm) {
   1344   os().SetCurrentInstruction(kBxj, kAddress | kBranch);
   1345   os() << ToCString(kBxj) << ConditionPrinter(it_block_, cond) << " " << rm;
   1346 }
   1347 
   1348 void Disassembler::cbnz(Register rn, Label* label) {
   1349   os().SetCurrentInstruction(kCbnz, kAddress | kBranch);
   1350   os() << ToCString(kCbnz) << " " << rn << ", "
   1351        << PrintLabel(kCodeLocation, label, GetCodeAddress());
   1352 }
   1353 
   1354 void Disassembler::cbz(Register rn, Label* label) {
   1355   os().SetCurrentInstruction(kCbz, kAddress | kBranch);
   1356   os() << ToCString(kCbz) << " " << rn << ", "
   1357        << PrintLabel(kCodeLocation, label, GetCodeAddress());
   1358 }
   1359 
   1360 void Disassembler::clrex(Condition cond) {
   1361   os().SetCurrentInstruction(kClrex, kNoAttribute);
   1362   os() << ToCString(kClrex) << ConditionPrinter(it_block_, cond);
   1363 }
   1364 
   1365 void Disassembler::clz(Condition cond, Register rd, Register rm) {
   1366   os().SetCurrentInstruction(kClz, kNoAttribute);
   1367   os() << ToCString(kClz) << ConditionPrinter(it_block_, cond) << " " << rd
   1368        << ", " << rm;
   1369 }
   1370 
   1371 void Disassembler::cmn(Condition cond,
   1372                        EncodingSize size,
   1373                        Register rn,
   1374                        const Operand& operand) {
   1375   os().SetCurrentInstruction(kCmn, kArithmetic);
   1376   os() << ToCString(kCmn) << ConditionPrinter(it_block_, cond) << size << " "
   1377        << rn << ", " << operand;
   1378 }
   1379 
   1380 void Disassembler::cmp(Condition cond,
   1381                        EncodingSize size,
   1382                        Register rn,
   1383                        const Operand& operand) {
   1384   os().SetCurrentInstruction(kCmp, kArithmetic);
   1385   os() << ToCString(kCmp) << ConditionPrinter(it_block_, cond) << size << " "
   1386        << rn << ", " << operand;
   1387 }
   1388 
   1389 void Disassembler::crc32b(Condition cond,
   1390                           Register rd,
   1391                           Register rn,
   1392                           Register rm) {
   1393   os().SetCurrentInstruction(kCrc32b, kNoAttribute);
   1394   os() << ToCString(kCrc32b) << ConditionPrinter(it_block_, cond) << " " << rd
   1395        << ", " << rn << ", " << rm;
   1396 }
   1397 
   1398 void Disassembler::crc32cb(Condition cond,
   1399                            Register rd,
   1400                            Register rn,
   1401                            Register rm) {
   1402   os().SetCurrentInstruction(kCrc32cb, kNoAttribute);
   1403   os() << ToCString(kCrc32cb) << ConditionPrinter(it_block_, cond) << " " << rd
   1404        << ", " << rn << ", " << rm;
   1405 }
   1406 
   1407 void Disassembler::crc32ch(Condition cond,
   1408                            Register rd,
   1409                            Register rn,
   1410                            Register rm) {
   1411   os().SetCurrentInstruction(kCrc32ch, kNoAttribute);
   1412   os() << ToCString(kCrc32ch) << ConditionPrinter(it_block_, cond) << " " << rd
   1413        << ", " << rn << ", " << rm;
   1414 }
   1415 
   1416 void Disassembler::crc32cw(Condition cond,
   1417                            Register rd,
   1418                            Register rn,
   1419                            Register rm) {
   1420   os().SetCurrentInstruction(kCrc32cw, kNoAttribute);
   1421   os() << ToCString(kCrc32cw) << ConditionPrinter(it_block_, cond) << " " << rd
   1422        << ", " << rn << ", " << rm;
   1423 }
   1424 
   1425 void Disassembler::crc32h(Condition cond,
   1426                           Register rd,
   1427                           Register rn,
   1428                           Register rm) {
   1429   os().SetCurrentInstruction(kCrc32h, kNoAttribute);
   1430   os() << ToCString(kCrc32h) << ConditionPrinter(it_block_, cond) << " " << rd
   1431        << ", " << rn << ", " << rm;
   1432 }
   1433 
   1434 void Disassembler::crc32w(Condition cond,
   1435                           Register rd,
   1436                           Register rn,
   1437                           Register rm) {
   1438   os().SetCurrentInstruction(kCrc32w, kNoAttribute);
   1439   os() << ToCString(kCrc32w) << ConditionPrinter(it_block_, cond) << " " << rd
   1440        << ", " << rn << ", " << rm;
   1441 }
   1442 
   1443 void Disassembler::dmb(Condition cond, MemoryBarrier option) {
   1444   os().SetCurrentInstruction(kDmb, kNoAttribute);
   1445   os() << ToCString(kDmb) << ConditionPrinter(it_block_, cond) << " " << option;
   1446 }
   1447 
   1448 void Disassembler::dsb(Condition cond, MemoryBarrier option) {
   1449   os().SetCurrentInstruction(kDsb, kNoAttribute);
   1450   os() << ToCString(kDsb) << ConditionPrinter(it_block_, cond) << " " << option;
   1451 }
   1452 
   1453 void Disassembler::eor(Condition cond,
   1454                        EncodingSize size,
   1455                        Register rd,
   1456                        Register rn,
   1457                        const Operand& operand) {
   1458   os().SetCurrentInstruction(kEor, kBitwise);
   1459   os() << ToCString(kEor) << ConditionPrinter(it_block_, cond) << size;
   1460   os() << " ";
   1461   if (!rd.Is(rn)) {
   1462     os() << rd << ", ";
   1463   }
   1464   os() << rn << ", " << operand;
   1465 }
   1466 
   1467 void Disassembler::eors(Condition cond,
   1468                         EncodingSize size,
   1469                         Register rd,
   1470                         Register rn,
   1471                         const Operand& operand) {
   1472   os().SetCurrentInstruction(kEors, kBitwise);
   1473   os() << ToCString(kEors) << ConditionPrinter(it_block_, cond) << size;
   1474   os() << " ";
   1475   if (!rd.Is(rn)) {
   1476     os() << rd << ", ";
   1477   }
   1478   os() << rn << ", " << operand;
   1479 }
   1480 
   1481 void Disassembler::fldmdbx(Condition cond,
   1482                            Register rn,
   1483                            WriteBack write_back,
   1484                            DRegisterList dreglist) {
   1485   os().SetCurrentInstruction(kFldmdbx,
   1486                              kLoadStore | kLoadStoreMultiple | kFpNeon);
   1487   os() << ToCString(kFldmdbx) << ConditionPrinter(it_block_, cond) << " " << rn
   1488        << write_back << ", " << dreglist;
   1489 }
   1490 
   1491 void Disassembler::fldmiax(Condition cond,
   1492                            Register rn,
   1493                            WriteBack write_back,
   1494                            DRegisterList dreglist) {
   1495   os().SetCurrentInstruction(kFldmiax,
   1496                              kLoadStore | kLoadStoreMultiple | kFpNeon);
   1497   os() << ToCString(kFldmiax) << ConditionPrinter(it_block_, cond) << " " << rn
   1498        << write_back << ", " << dreglist;
   1499 }
   1500 
   1501 void Disassembler::fstmdbx(Condition cond,
   1502                            Register rn,
   1503                            WriteBack write_back,
   1504                            DRegisterList dreglist) {
   1505   os().SetCurrentInstruction(kFstmdbx,
   1506                              kLoadStore | kLoadStoreMultiple | kFpNeon);
   1507   os() << ToCString(kFstmdbx) << ConditionPrinter(it_block_, cond) << " " << rn
   1508        << write_back << ", " << dreglist;
   1509 }
   1510 
   1511 void Disassembler::fstmiax(Condition cond,
   1512                            Register rn,
   1513                            WriteBack write_back,
   1514                            DRegisterList dreglist) {
   1515   os().SetCurrentInstruction(kFstmiax,
   1516                              kLoadStore | kLoadStoreMultiple | kFpNeon);
   1517   os() << ToCString(kFstmiax) << ConditionPrinter(it_block_, cond) << " " << rn
   1518        << write_back << ", " << dreglist;
   1519 }
   1520 
   1521 void Disassembler::hlt(Condition cond, uint32_t imm) {
   1522   os().SetCurrentInstruction(kHlt, kSystem);
   1523   os() << ToCString(kHlt) << ConditionPrinter(it_block_, cond) << " " << imm;
   1524 }
   1525 
   1526 void Disassembler::hvc(Condition cond, uint32_t imm) {
   1527   os().SetCurrentInstruction(kHvc, kSystem);
   1528   os() << ToCString(kHvc) << ConditionPrinter(it_block_, cond) << " " << imm;
   1529 }
   1530 
   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                        Label* label) {
   1706   os().SetCurrentInstruction(kLdr, kAddress | kLoadStore);
   1707   os() << ToCString(kLdr) << ConditionPrinter(it_block_, cond) << size << " "
   1708        << rt << ", "
   1709        << PrintLabel(kLoadWordLocation, label, GetCodeAddress() & ~3);
   1710 }
   1711 
   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, Label* label) {
   1722   os().SetCurrentInstruction(kLdrb, kAddress | kLoadStore);
   1723   os() << ToCString(kLdrb) << ConditionPrinter(it_block_, cond) << " " << rt
   1724        << ", " << PrintLabel(kLoadByteLocation, label, GetCodeAddress() & ~3);
   1725 }
   1726 
   1727 void Disassembler::ldrd(Condition cond,
   1728                         Register rt,
   1729                         Register rt2,
   1730                         const MemOperand& operand) {
   1731   os().SetCurrentInstruction(kLdrd, kAddress | kLoadStore);
   1732   os() << ToCString(kLdrd) << ConditionPrinter(it_block_, cond) << " " << rt
   1733        << ", " << rt2 << ", "
   1734        << PrintMemOperand(kLoadDoubleWordLocation, operand);
   1735 }
   1736 
   1737 void Disassembler::ldrd(Condition cond,
   1738                         Register rt,
   1739                         Register rt2,
   1740                         Label* label) {
   1741   os().SetCurrentInstruction(kLdrd, kAddress | kLoadStore);
   1742   os() << ToCString(kLdrd) << ConditionPrinter(it_block_, cond) << " " << rt
   1743        << ", " << rt2 << ", "
   1744        << PrintLabel(kLoadDoubleWordLocation, label, GetCodeAddress() & ~3);
   1745 }
   1746 
   1747 void Disassembler::ldrex(Condition cond,
   1748                          Register rt,
   1749                          const MemOperand& operand) {
   1750   os().SetCurrentInstruction(kLdrex, kAddress | kLoadStore);
   1751   os() << ToCString(kLdrex) << ConditionPrinter(it_block_, cond) << " " << rt
   1752        << ", " << PrintMemOperand(kLoadWordLocation, operand);
   1753 }
   1754 
   1755 void Disassembler::ldrexb(Condition cond,
   1756                           Register rt,
   1757                           const MemOperand& operand) {
   1758   os().SetCurrentInstruction(kLdrexb, kAddress | kLoadStore);
   1759   os() << ToCString(kLdrexb) << ConditionPrinter(it_block_, cond) << " " << rt
   1760        << ", " << PrintMemOperand(kLoadByteLocation, operand);
   1761 }
   1762 
   1763 void Disassembler::ldrexd(Condition cond,
   1764                           Register rt,
   1765                           Register rt2,
   1766                           const MemOperand& operand) {
   1767   os().SetCurrentInstruction(kLdrexd, kAddress | kLoadStore);
   1768   os() << ToCString(kLdrexd) << ConditionPrinter(it_block_, cond) << " " << rt
   1769        << ", " << rt2 << ", "
   1770        << PrintMemOperand(kLoadDoubleWordLocation, operand);
   1771 }
   1772 
   1773 void Disassembler::ldrexh(Condition cond,
   1774                           Register rt,
   1775                           const MemOperand& operand) {
   1776   os().SetCurrentInstruction(kLdrexh, kAddress | kLoadStore);
   1777   os() << ToCString(kLdrexh) << ConditionPrinter(it_block_, cond) << " " << rt
   1778        << ", " << PrintMemOperand(kLoadHalfWordLocation, operand);
   1779 }
   1780 
   1781 void Disassembler::ldrh(Condition cond,
   1782                         EncodingSize size,
   1783                         Register rt,
   1784                         const MemOperand& operand) {
   1785   os().SetCurrentInstruction(kLdrh, kAddress | kLoadStore);
   1786   os() << ToCString(kLdrh) << ConditionPrinter(it_block_, cond) << size << " "
   1787        << rt << ", " << PrintMemOperand(kLoadHalfWordLocation, operand);
   1788 }
   1789 
   1790 void Disassembler::ldrh(Condition cond, Register rt, Label* label) {
   1791   os().SetCurrentInstruction(kLdrh, kAddress | kLoadStore);
   1792   os() << ToCString(kLdrh) << ConditionPrinter(it_block_, cond) << " " << rt
   1793        << ", "
   1794        << PrintLabel(kLoadHalfWordLocation, label, GetCodeAddress() & ~3);
   1795 }
   1796 
   1797 void Disassembler::ldrsb(Condition cond,
   1798                          EncodingSize size,
   1799                          Register rt,
   1800                          const MemOperand& operand) {
   1801   os().SetCurrentInstruction(kLdrsb, kAddress | kLoadStore);
   1802   os() << ToCString(kLdrsb) << ConditionPrinter(it_block_, cond) << size << " "
   1803        << rt << ", " << PrintMemOperand(kLoadSignedByteLocation, operand);
   1804 }
   1805 
   1806 void Disassembler::ldrsb(Condition cond, Register rt, Label* label) {
   1807   os().SetCurrentInstruction(kLdrsb, kAddress | kLoadStore);
   1808   os() << ToCString(kLdrsb) << ConditionPrinter(it_block_, cond) << " " << rt
   1809        << ", "
   1810        << PrintLabel(kLoadSignedByteLocation, label, GetCodeAddress() & ~3);
   1811 }
   1812 
   1813 void Disassembler::ldrsh(Condition cond,
   1814                          EncodingSize size,
   1815                          Register rt,
   1816                          const MemOperand& operand) {
   1817   os().SetCurrentInstruction(kLdrsh, kAddress | kLoadStore);
   1818   os() << ToCString(kLdrsh) << ConditionPrinter(it_block_, cond) << size << " "
   1819        << rt << ", " << PrintMemOperand(kLoadSignedHalfWordLocation, operand);
   1820 }
   1821 
   1822 void Disassembler::ldrsh(Condition cond, Register rt, Label* label) {
   1823   os().SetCurrentInstruction(kLdrsh, kAddress | kLoadStore);
   1824   os() << ToCString(kLdrsh) << ConditionPrinter(it_block_, cond) << " " << rt
   1825        << ", "
   1826        << PrintLabel(kLoadSignedHalfWordLocation, label, GetCodeAddress() & ~3);
   1827 }
   1828 
   1829 void Disassembler::lsl(Condition cond,
   1830                        EncodingSize size,
   1831                        Register rd,
   1832                        Register rm,
   1833                        const Operand& operand) {
   1834   os().SetCurrentInstruction(kLsl, kShift);
   1835   os() << ToCString(kLsl) << ConditionPrinter(it_block_, cond) << size;
   1836   os() << " ";
   1837   if (!rd.Is(rm)) {
   1838     os() << rd << ", ";
   1839   }
   1840   os() << rm << ", " << operand;
   1841 }
   1842 
   1843 void Disassembler::lsls(Condition cond,
   1844                         EncodingSize size,
   1845                         Register rd,
   1846                         Register rm,
   1847                         const Operand& operand) {
   1848   os().SetCurrentInstruction(kLsls, kShift);
   1849   os() << ToCString(kLsls) << ConditionPrinter(it_block_, cond) << size;
   1850   os() << " ";
   1851   if (!rd.Is(rm)) {
   1852     os() << rd << ", ";
   1853   }
   1854   os() << rm << ", " << operand;
   1855 }
   1856 
   1857 void Disassembler::lsr(Condition cond,
   1858                        EncodingSize size,
   1859                        Register rd,
   1860                        Register rm,
   1861                        const Operand& operand) {
   1862   os().SetCurrentInstruction(kLsr, kShift);
   1863   os() << ToCString(kLsr) << ConditionPrinter(it_block_, cond) << size;
   1864   os() << " ";
   1865   if (!rd.Is(rm)) {
   1866     os() << rd << ", ";
   1867   }
   1868   os() << rm << ", " << operand;
   1869 }
   1870 
   1871 void Disassembler::lsrs(Condition cond,
   1872                         EncodingSize size,
   1873                         Register rd,
   1874                         Register rm,
   1875                         const Operand& operand) {
   1876   os().SetCurrentInstruction(kLsrs, kShift);
   1877   os() << ToCString(kLsrs) << ConditionPrinter(it_block_, cond) << size;
   1878   os() << " ";
   1879   if (!rd.Is(rm)) {
   1880     os() << rd << ", ";
   1881   }
   1882   os() << rm << ", " << operand;
   1883 }
   1884 
   1885 void Disassembler::mla(
   1886     Condition cond, Register rd, Register rn, Register rm, Register ra) {
   1887   os().SetCurrentInstruction(kMla, kArithmetic);
   1888   os() << ToCString(kMla) << ConditionPrinter(it_block_, cond) << " " << rd
   1889        << ", " << rn << ", " << rm << ", " << ra;
   1890 }
   1891 
   1892 void Disassembler::mlas(
   1893     Condition cond, Register rd, Register rn, Register rm, Register ra) {
   1894   os().SetCurrentInstruction(kMlas, kArithmetic);
   1895   os() << ToCString(kMlas) << ConditionPrinter(it_block_, cond) << " " << rd
   1896        << ", " << rn << ", " << rm << ", " << ra;
   1897 }
   1898 
   1899 void Disassembler::mls(
   1900     Condition cond, Register rd, Register rn, Register rm, Register ra) {
   1901   os().SetCurrentInstruction(kMls, kArithmetic);
   1902   os() << ToCString(kMls) << ConditionPrinter(it_block_, cond) << " " << rd
   1903        << ", " << rn << ", " << rm << ", " << ra;
   1904 }
   1905 
   1906 void Disassembler::mov(Condition cond,
   1907                        EncodingSize size,
   1908                        Register rd,
   1909                        const Operand& operand) {
   1910   os().SetCurrentInstruction(kMov, kNoAttribute);
   1911   os() << ToCString(kMov) << ConditionPrinter(it_block_, cond) << size << " "
   1912        << rd << ", " << operand;
   1913 }
   1914 
   1915 void Disassembler::movs(Condition cond,
   1916                         EncodingSize size,
   1917                         Register rd,
   1918                         const Operand& operand) {
   1919   os().SetCurrentInstruction(kMovs, kNoAttribute);
   1920   os() << ToCString(kMovs) << ConditionPrinter(it_block_, cond) << size << " "
   1921        << rd << ", " << operand;
   1922 }
   1923 
   1924 void Disassembler::movt(Condition cond, Register rd, const Operand& operand) {
   1925   os().SetCurrentInstruction(kMovt, kNoAttribute);
   1926   os() << ToCString(kMovt) << ConditionPrinter(it_block_, cond) << " " << rd
   1927        << ", " << operand;
   1928 }
   1929 
   1930 void Disassembler::movw(Condition cond, Register rd, const Operand& operand) {
   1931   os().SetCurrentInstruction(kMovw, kNoAttribute);
   1932   os() << ToCString(kMovw) << ConditionPrinter(it_block_, cond) << " " << rd
   1933        << ", " << operand;
   1934 }
   1935 
   1936 void Disassembler::mrs(Condition cond, Register rd, SpecialRegister spec_reg) {
   1937   os().SetCurrentInstruction(kMrs, kNoAttribute);
   1938   os() << ToCString(kMrs) << ConditionPrinter(it_block_, cond) << " " << rd
   1939        << ", " << spec_reg;
   1940 }
   1941 
   1942 void Disassembler::msr(Condition cond,
   1943                        MaskedSpecialRegister spec_reg,
   1944                        const Operand& operand) {
   1945   os().SetCurrentInstruction(kMsr, kNoAttribute);
   1946   os() << ToCString(kMsr) << ConditionPrinter(it_block_, cond) << " "
   1947        << spec_reg << ", " << operand;
   1948 }
   1949 
   1950 void Disassembler::mul(
   1951     Condition cond, EncodingSize size, Register rd, Register rn, Register rm) {
   1952   os().SetCurrentInstruction(kMul, kArithmetic);
   1953   os() << ToCString(kMul) << ConditionPrinter(it_block_, cond) << size << " "
   1954        << rd << ", " << rn << ", " << rm;
   1955 }
   1956 
   1957 void Disassembler::muls(Condition cond, Register rd, Register rn, Register rm) {
   1958   os().SetCurrentInstruction(kMuls, kArithmetic);
   1959   os() << ToCString(kMuls) << ConditionPrinter(it_block_, cond) << " " << rd
   1960        << ", " << rn << ", " << rm;
   1961 }
   1962 
   1963 void Disassembler::mvn(Condition cond,
   1964                        EncodingSize size,
   1965                        Register rd,
   1966                        const Operand& operand) {
   1967   os().SetCurrentInstruction(kMvn, kNoAttribute);
   1968   os() << ToCString(kMvn) << ConditionPrinter(it_block_, cond) << size << " "
   1969        << rd << ", " << operand;
   1970 }
   1971 
   1972 void Disassembler::mvns(Condition cond,
   1973                         EncodingSize size,
   1974                         Register rd,
   1975                         const Operand& operand) {
   1976   os().SetCurrentInstruction(kMvns, kNoAttribute);
   1977   os() << ToCString(kMvns) << ConditionPrinter(it_block_, cond) << size << " "
   1978        << rd << ", " << operand;
   1979 }
   1980 
   1981 void Disassembler::nop(Condition cond, EncodingSize size) {
   1982   os().SetCurrentInstruction(kNop, kNoAttribute);
   1983   os() << ToCString(kNop) << ConditionPrinter(it_block_, cond) << size;
   1984 }
   1985 
   1986 void Disassembler::orn(Condition cond,
   1987                        Register rd,
   1988                        Register rn,
   1989                        const Operand& operand) {
   1990   os().SetCurrentInstruction(kOrn, kBitwise);
   1991   os() << ToCString(kOrn) << ConditionPrinter(it_block_, cond);
   1992   os() << " ";
   1993   if (!rd.Is(rn)) {
   1994     os() << rd << ", ";
   1995   }
   1996   os() << rn << ", " << operand;
   1997 }
   1998 
   1999 void Disassembler::orns(Condition cond,
   2000                         Register rd,
   2001                         Register rn,
   2002                         const Operand& operand) {
   2003   os().SetCurrentInstruction(kOrns, kBitwise);
   2004   os() << ToCString(kOrns) << ConditionPrinter(it_block_, cond);
   2005   os() << " ";
   2006   if (!rd.Is(rn)) {
   2007     os() << rd << ", ";
   2008   }
   2009   os() << rn << ", " << operand;
   2010 }
   2011 
   2012 void Disassembler::orr(Condition cond,
   2013                        EncodingSize size,
   2014                        Register rd,
   2015                        Register rn,
   2016                        const Operand& operand) {
   2017   os().SetCurrentInstruction(kOrr, kBitwise);
   2018   os() << ToCString(kOrr) << ConditionPrinter(it_block_, cond) << size;
   2019   os() << " ";
   2020   if (!rd.Is(rn)) {
   2021     os() << rd << ", ";
   2022   }
   2023   os() << rn << ", " << operand;
   2024 }
   2025 
   2026 void Disassembler::orrs(Condition cond,
   2027                         EncodingSize size,
   2028                         Register rd,
   2029                         Register rn,
   2030                         const Operand& operand) {
   2031   os().SetCurrentInstruction(kOrrs, kBitwise);
   2032   os() << ToCString(kOrrs) << ConditionPrinter(it_block_, cond) << size;
   2033   os() << " ";
   2034   if (!rd.Is(rn)) {
   2035     os() << rd << ", ";
   2036   }
   2037   os() << rn << ", " << operand;
   2038 }
   2039 
   2040 void Disassembler::pkhbt(Condition cond,
   2041                          Register rd,
   2042                          Register rn,
   2043                          const Operand& operand) {
   2044   os().SetCurrentInstruction(kPkhbt, kNoAttribute);
   2045   os() << ToCString(kPkhbt) << ConditionPrinter(it_block_, cond);
   2046   os() << " ";
   2047   if (!rd.Is(rn)) {
   2048     os() << rd << ", ";
   2049   }
   2050   os() << rn << ", " << operand;
   2051 }
   2052 
   2053 void Disassembler::pkhtb(Condition cond,
   2054                          Register rd,
   2055                          Register rn,
   2056                          const Operand& operand) {
   2057   os().SetCurrentInstruction(kPkhtb, kNoAttribute);
   2058   os() << ToCString(kPkhtb) << ConditionPrinter(it_block_, cond);
   2059   os() << " ";
   2060   if (!rd.Is(rn)) {
   2061     os() << rd << ", ";
   2062   }
   2063   os() << rn << ", " << operand;
   2064 }
   2065 
   2066 void Disassembler::pld(Condition cond, Label* label) {
   2067   os().SetCurrentInstruction(kPld, kAddress);
   2068   os() << ToCString(kPld) << ConditionPrinter(it_block_, cond) << " "
   2069        << PrintLabel(kDataLocation, label, GetCodeAddress() & ~3);
   2070 }
   2071 
   2072 void Disassembler::pld(Condition cond, const MemOperand& operand) {
   2073   os().SetCurrentInstruction(kPld, kAddress);
   2074   os() << ToCString(kPld) << ConditionPrinter(it_block_, cond) << " "
   2075        << PrintMemOperand(kDataLocation, operand);
   2076 }
   2077 
   2078 void Disassembler::pldw(Condition cond, const MemOperand& operand) {
   2079   os().SetCurrentInstruction(kPldw, kAddress);
   2080   os() << ToCString(kPldw) << ConditionPrinter(it_block_, cond) << " "
   2081        << PrintMemOperand(kDataLocation, operand);
   2082 }
   2083 
   2084 void Disassembler::pli(Condition cond, const MemOperand& operand) {
   2085   os().SetCurrentInstruction(kPli, kAddress);
   2086   os() << ToCString(kPli) << ConditionPrinter(it_block_, cond) << " "
   2087        << PrintMemOperand(kCodeLocation, operand);
   2088 }
   2089 
   2090 void Disassembler::pli(Condition cond, Label* label) {
   2091   os().SetCurrentInstruction(kPli, kAddress);
   2092   os() << ToCString(kPli) << ConditionPrinter(it_block_, cond) << " "
   2093        << PrintLabel(kCodeLocation, label, GetCodeAddress() & ~3);
   2094 }
   2095 
   2096 void Disassembler::pop(Condition cond,
   2097                        EncodingSize size,
   2098                        RegisterList registers) {
   2099   os().SetCurrentInstruction(kPop, kLoadStore | kLoadStoreMultiple);
   2100   os() << ToCString(kPop) << ConditionPrinter(it_block_, cond) << size << " "
   2101        << registers;
   2102 }
   2103 
   2104 void Disassembler::pop(Condition cond, EncodingSize size, Register rt) {
   2105   os().SetCurrentInstruction(kPop, kLoadStore | kLoadStoreMultiple);
   2106   os() << ToCString(kPop) << ConditionPrinter(it_block_, cond) << size << " "
   2107        << "{" << rt << "}";
   2108 }
   2109 
   2110 void Disassembler::push(Condition cond,
   2111                         EncodingSize size,
   2112                         RegisterList registers) {
   2113   os().SetCurrentInstruction(kPush, kLoadStore | kLoadStoreMultiple);
   2114   os() << ToCString(kPush) << ConditionPrinter(it_block_, cond) << size << " "
   2115        << registers;
   2116 }
   2117 
   2118 void Disassembler::push(Condition cond, EncodingSize size, Register rt) {
   2119   os().SetCurrentInstruction(kPush, kLoadStore | kLoadStoreMultiple);
   2120   os() << ToCString(kPush) << ConditionPrinter(it_block_, cond) << size << " "
   2121        << "{" << rt << "}";
   2122 }
   2123 
   2124 void Disassembler::qadd(Condition cond, Register rd, Register rm, Register rn) {
   2125   os().SetCurrentInstruction(kQadd, kArithmetic);
   2126   os() << ToCString(kQadd) << ConditionPrinter(it_block_, cond);
   2127   os() << " ";
   2128   if (!rd.Is(rm)) {
   2129     os() << rd << ", ";
   2130   }
   2131   os() << rm << ", " << rn;
   2132 }
   2133 
   2134 void Disassembler::qadd16(Condition cond,
   2135                           Register rd,
   2136                           Register rn,
   2137                           Register rm) {
   2138   os().SetCurrentInstruction(kQadd16, kArithmetic);
   2139   os() << ToCString(kQadd16) << ConditionPrinter(it_block_, cond);
   2140   os() << " ";
   2141   if (!rd.Is(rn)) {
   2142     os() << rd << ", ";
   2143   }
   2144   os() << rn << ", " << rm;
   2145 }
   2146 
   2147 void Disassembler::qadd8(Condition cond,
   2148                          Register rd,
   2149                          Register rn,
   2150                          Register rm) {
   2151   os().SetCurrentInstruction(kQadd8, kArithmetic);
   2152   os() << ToCString(kQadd8) << ConditionPrinter(it_block_, cond);
   2153   os() << " ";
   2154   if (!rd.Is(rn)) {
   2155     os() << rd << ", ";
   2156   }
   2157   os() << rn << ", " << rm;
   2158 }
   2159 
   2160 void Disassembler::qasx(Condition cond, Register rd, Register rn, Register rm) {
   2161   os().SetCurrentInstruction(kQasx, kArithmetic);
   2162   os() << ToCString(kQasx) << ConditionPrinter(it_block_, cond);
   2163   os() << " ";
   2164   if (!rd.Is(rn)) {
   2165     os() << rd << ", ";
   2166   }
   2167   os() << rn << ", " << rm;
   2168 }
   2169 
   2170 void Disassembler::qdadd(Condition cond,
   2171                          Register rd,
   2172                          Register rm,
   2173                          Register rn) {
   2174   os().SetCurrentInstruction(kQdadd, kArithmetic);
   2175   os() << ToCString(kQdadd) << ConditionPrinter(it_block_, cond);
   2176   os() << " ";
   2177   if (!rd.Is(rm)) {
   2178     os() << rd << ", ";
   2179   }
   2180   os() << rm << ", " << rn;
   2181 }
   2182 
   2183 void Disassembler::qdsub(Condition cond,
   2184                          Register rd,
   2185                          Register rm,
   2186                          Register rn) {
   2187   os().SetCurrentInstruction(kQdsub, kArithmetic);
   2188   os() << ToCString(kQdsub) << ConditionPrinter(it_block_, cond);
   2189   os() << " ";
   2190   if (!rd.Is(rm)) {
   2191     os() << rd << ", ";
   2192   }
   2193   os() << rm << ", " << rn;
   2194 }
   2195 
   2196 void Disassembler::qsax(Condition cond, Register rd, Register rn, Register rm) {
   2197   os().SetCurrentInstruction(kQsax, kArithmetic);
   2198   os() << ToCString(kQsax) << ConditionPrinter(it_block_, cond);
   2199   os() << " ";
   2200   if (!rd.Is(rn)) {
   2201     os() << rd << ", ";
   2202   }
   2203   os() << rn << ", " << rm;
   2204 }
   2205 
   2206 void Disassembler::qsub(Condition cond, Register rd, Register rm, Register rn) {
   2207   os().SetCurrentInstruction(kQsub, kArithmetic);
   2208   os() << ToCString(kQsub) << ConditionPrinter(it_block_, cond);
   2209   os() << " ";
   2210   if (!rd.Is(rm)) {
   2211     os() << rd << ", ";
   2212   }
   2213   os() << rm << ", " << rn;
   2214 }
   2215 
   2216 void Disassembler::qsub16(Condition cond,
   2217                           Register rd,
   2218                           Register rn,
   2219                           Register rm) {
   2220   os().SetCurrentInstruction(kQsub16, kArithmetic);
   2221   os() << ToCString(kQsub16) << ConditionPrinter(it_block_, cond);
   2222   os() << " ";
   2223   if (!rd.Is(rn)) {
   2224     os() << rd << ", ";
   2225   }
   2226   os() << rn << ", " << rm;
   2227 }
   2228 
   2229 void Disassembler::qsub8(Condition cond,
   2230                          Register rd,
   2231                          Register rn,
   2232                          Register rm) {
   2233   os().SetCurrentInstruction(kQsub8, kArithmetic);
   2234   os() << ToCString(kQsub8) << ConditionPrinter(it_block_, cond);
   2235   os() << " ";
   2236   if (!rd.Is(rn)) {
   2237     os() << rd << ", ";
   2238   }
   2239   os() << rn << ", " << rm;
   2240 }
   2241 
   2242 void Disassembler::rbit(Condition cond, Register rd, Register rm) {
   2243   os().SetCurrentInstruction(kRbit, kNoAttribute);
   2244   os() << ToCString(kRbit) << ConditionPrinter(it_block_, cond) << " " << rd
   2245        << ", " << rm;
   2246 }
   2247 
   2248 void Disassembler::rev(Condition cond,
   2249                        EncodingSize size,
   2250                        Register rd,
   2251                        Register rm) {
   2252   os().SetCurrentInstruction(kRev, kNoAttribute);
   2253   os() << ToCString(kRev) << ConditionPrinter(it_block_, cond) << size << " "
   2254        << rd << ", " << rm;
   2255 }
   2256 
   2257 void Disassembler::rev16(Condition cond,
   2258                          EncodingSize size,
   2259                          Register rd,
   2260                          Register rm) {
   2261   os().SetCurrentInstruction(kRev16, kNoAttribute);
   2262   os() << ToCString(kRev16) << ConditionPrinter(it_block_, cond) << size << " "
   2263        << rd << ", " << rm;
   2264 }
   2265 
   2266 void Disassembler::revsh(Condition cond,
   2267                          EncodingSize size,
   2268                          Register rd,
   2269                          Register rm) {
   2270   os().SetCurrentInstruction(kRevsh, kNoAttribute);
   2271   os() << ToCString(kRevsh) << ConditionPrinter(it_block_, cond) << size << " "
   2272        << rd << ", " << rm;
   2273 }
   2274 
   2275 void Disassembler::ror(Condition cond,
   2276                        EncodingSize size,
   2277                        Register rd,
   2278                        Register rm,
   2279                        const Operand& operand) {
   2280   os().SetCurrentInstruction(kRor, kShift);
   2281   os() << ToCString(kRor) << ConditionPrinter(it_block_, cond) << size;
   2282   os() << " ";
   2283   if (!rd.Is(rm)) {
   2284     os() << rd << ", ";
   2285   }
   2286   os() << rm << ", " << operand;
   2287 }
   2288 
   2289 void Disassembler::rors(Condition cond,
   2290                         EncodingSize size,
   2291                         Register rd,
   2292                         Register rm,
   2293                         const Operand& operand) {
   2294   os().SetCurrentInstruction(kRors, kShift);
   2295   os() << ToCString(kRors) << ConditionPrinter(it_block_, cond) << size;
   2296   os() << " ";
   2297   if (!rd.Is(rm)) {
   2298     os() << rd << ", ";
   2299   }
   2300   os() << rm << ", " << operand;
   2301 }
   2302 
   2303 void Disassembler::rrx(Condition cond, Register rd, Register rm) {
   2304   os().SetCurrentInstruction(kRrx, kShift);
   2305   os() << ToCString(kRrx) << ConditionPrinter(it_block_, cond);
   2306   os() << " ";
   2307   if (!rd.Is(rm)) {
   2308     os() << rd << ", ";
   2309   }
   2310   os() << rm;
   2311 }
   2312 
   2313 void Disassembler::rrxs(Condition cond, Register rd, Register rm) {
   2314   os().SetCurrentInstruction(kRrxs, kShift);
   2315   os() << ToCString(kRrxs) << ConditionPrinter(it_block_, cond);
   2316   os() << " ";
   2317   if (!rd.Is(rm)) {
   2318     os() << rd << ", ";
   2319   }
   2320   os() << rm;
   2321 }
   2322 
   2323 void Disassembler::rsb(Condition cond,
   2324                        EncodingSize size,
   2325                        Register rd,
   2326                        Register rn,
   2327                        const Operand& operand) {
   2328   os().SetCurrentInstruction(kRsb, kArithmetic);
   2329   os() << ToCString(kRsb) << ConditionPrinter(it_block_, cond) << size;
   2330   os() << " ";
   2331   if (!rd.Is(rn)) {
   2332     os() << rd << ", ";
   2333   }
   2334   os() << rn << ", " << operand;
   2335 }
   2336 
   2337 void Disassembler::rsbs(Condition cond,
   2338                         EncodingSize size,
   2339                         Register rd,
   2340                         Register rn,
   2341                         const Operand& operand) {
   2342   os().SetCurrentInstruction(kRsbs, kArithmetic);
   2343   os() << ToCString(kRsbs) << ConditionPrinter(it_block_, cond) << size;
   2344   os() << " ";
   2345   if (!rd.Is(rn)) {
   2346     os() << rd << ", ";
   2347   }
   2348   os() << rn << ", " << operand;
   2349 }
   2350 
   2351 void Disassembler::rsc(Condition cond,
   2352                        Register rd,
   2353                        Register rn,
   2354                        const Operand& operand) {
   2355   os().SetCurrentInstruction(kRsc, kArithmetic);
   2356   os() << ToCString(kRsc) << ConditionPrinter(it_block_, cond);
   2357   os() << " ";
   2358   if (!rd.Is(rn)) {
   2359     os() << rd << ", ";
   2360   }
   2361   os() << rn << ", " << operand;
   2362 }
   2363 
   2364 void Disassembler::rscs(Condition cond,
   2365                         Register rd,
   2366                         Register rn,
   2367                         const Operand& operand) {
   2368   os().SetCurrentInstruction(kRscs, kArithmetic);
   2369   os() << ToCString(kRscs) << ConditionPrinter(it_block_, cond);
   2370   os() << " ";
   2371   if (!rd.Is(rn)) {
   2372     os() << rd << ", ";
   2373   }
   2374   os() << rn << ", " << operand;
   2375 }
   2376 
   2377 void Disassembler::sadd16(Condition cond,
   2378                           Register rd,
   2379                           Register rn,
   2380                           Register rm) {
   2381   os().SetCurrentInstruction(kSadd16, kArithmetic);
   2382   os() << ToCString(kSadd16) << ConditionPrinter(it_block_, cond);
   2383   os() << " ";
   2384   if (!rd.Is(rn)) {
   2385     os() << rd << ", ";
   2386   }
   2387   os() << rn << ", " << rm;
   2388 }
   2389 
   2390 void Disassembler::sadd8(Condition cond,
   2391                          Register rd,
   2392                          Register rn,
   2393                          Register rm) {
   2394   os().SetCurrentInstruction(kSadd8, kArithmetic);
   2395   os() << ToCString(kSadd8) << ConditionPrinter(it_block_, cond);
   2396   os() << " ";
   2397   if (!rd.Is(rn)) {
   2398     os() << rd << ", ";
   2399   }
   2400   os() << rn << ", " << rm;
   2401 }
   2402 
   2403 void Disassembler::sasx(Condition cond, Register rd, Register rn, Register rm) {
   2404   os().SetCurrentInstruction(kSasx, kArithmetic);
   2405   os() << ToCString(kSasx) << ConditionPrinter(it_block_, cond);
   2406   os() << " ";
   2407   if (!rd.Is(rn)) {
   2408     os() << rd << ", ";
   2409   }
   2410   os() << rn << ", " << rm;
   2411 }
   2412 
   2413 void Disassembler::sbc(Condition cond,
   2414                        EncodingSize size,
   2415                        Register rd,
   2416                        Register rn,
   2417                        const Operand& operand) {
   2418   os().SetCurrentInstruction(kSbc, kArithmetic);
   2419   os() << ToCString(kSbc) << ConditionPrinter(it_block_, cond) << size;
   2420   os() << " ";
   2421   if (!rd.Is(rn)) {
   2422     os() << rd << ", ";
   2423   }
   2424   os() << rn << ", " << operand;
   2425 }
   2426 
   2427 void Disassembler::sbcs(Condition cond,
   2428                         EncodingSize size,
   2429                         Register rd,
   2430                         Register rn,
   2431                         const Operand& operand) {
   2432   os().SetCurrentInstruction(kSbcs, kArithmetic);
   2433   os() << ToCString(kSbcs) << ConditionPrinter(it_block_, cond) << size;
   2434   os() << " ";
   2435   if (!rd.Is(rn)) {
   2436     os() << rd << ", ";
   2437   }
   2438   os() << rn << ", " << operand;
   2439 }
   2440 
   2441 void Disassembler::sbfx(Condition cond,
   2442                         Register rd,
   2443                         Register rn,
   2444                         uint32_t lsb,
   2445                         const Operand& operand) {
   2446   os().SetCurrentInstruction(kSbfx, kShift);
   2447   os() << ToCString(kSbfx) << ConditionPrinter(it_block_, cond) << " " << rd
   2448        << ", " << rn << ", "
   2449        << "#" << lsb << ", " << operand;
   2450 }
   2451 
   2452 void Disassembler::sdiv(Condition cond, Register rd, Register rn, Register rm) {
   2453   os().SetCurrentInstruction(kSdiv, kArithmetic);
   2454   os() << ToCString(kSdiv) << ConditionPrinter(it_block_, cond);
   2455   os() << " ";
   2456   if (!rd.Is(rn)) {
   2457     os() << rd << ", ";
   2458   }
   2459   os() << rn << ", " << rm;
   2460 }
   2461 
   2462 void Disassembler::sel(Condition cond, Register rd, Register rn, Register rm) {
   2463   os().SetCurrentInstruction(kSel, kNoAttribute);
   2464   os() << ToCString(kSel) << ConditionPrinter(it_block_, cond);
   2465   os() << " ";
   2466   if (!rd.Is(rn)) {
   2467     os() << rd << ", ";
   2468   }
   2469   os() << rn << ", " << rm;
   2470 }
   2471 
   2472 void Disassembler::shadd16(Condition cond,
   2473                            Register rd,
   2474                            Register rn,
   2475                            Register rm) {
   2476   os().SetCurrentInstruction(kShadd16, kArithmetic);
   2477   os() << ToCString(kShadd16) << ConditionPrinter(it_block_, cond);
   2478   os() << " ";
   2479   if (!rd.Is(rn)) {
   2480     os() << rd << ", ";
   2481   }
   2482   os() << rn << ", " << rm;
   2483 }
   2484 
   2485 void Disassembler::shadd8(Condition cond,
   2486                           Register rd,
   2487                           Register rn,
   2488                           Register rm) {
   2489   os().SetCurrentInstruction(kShadd8, kArithmetic);
   2490   os() << ToCString(kShadd8) << ConditionPrinter(it_block_, cond);
   2491   os() << " ";
   2492   if (!rd.Is(rn)) {
   2493     os() << rd << ", ";
   2494   }
   2495   os() << rn << ", " << rm;
   2496 }
   2497 
   2498 void Disassembler::shasx(Condition cond,
   2499                          Register rd,
   2500                          Register rn,
   2501                          Register rm) {
   2502   os().SetCurrentInstruction(kShasx, kArithmetic);
   2503   os() << ToCString(kShasx) << ConditionPrinter(it_block_, cond);
   2504   os() << " ";
   2505   if (!rd.Is(rn)) {
   2506     os() << rd << ", ";
   2507   }
   2508   os() << rn << ", " << rm;
   2509 }
   2510 
   2511 void Disassembler::shsax(Condition cond,
   2512                          Register rd,
   2513                          Register rn,
   2514                          Register rm) {
   2515   os().SetCurrentInstruction(kShsax, kArithmetic);
   2516   os() << ToCString(kShsax) << ConditionPrinter(it_block_, cond);
   2517   os() << " ";
   2518   if (!rd.Is(rn)) {
   2519     os() << rd << ", ";
   2520   }
   2521   os() << rn << ", " << rm;
   2522 }
   2523 
   2524 void Disassembler::shsub16(Condition cond,
   2525                            Register rd,
   2526                            Register rn,
   2527                            Register rm) {
   2528   os().SetCurrentInstruction(kShsub16, kArithmetic);
   2529   os() << ToCString(kShsub16) << ConditionPrinter(it_block_, cond);
   2530   os() << " ";
   2531   if (!rd.Is(rn)) {
   2532     os() << rd << ", ";
   2533   }
   2534   os() << rn << ", " << rm;
   2535 }
   2536 
   2537 void Disassembler::shsub8(Condition cond,
   2538                           Register rd,
   2539                           Register rn,
   2540                           Register rm) {
   2541   os().SetCurrentInstruction(kShsub8, kArithmetic);
   2542   os() << ToCString(kShsub8) << ConditionPrinter(it_block_, cond);
   2543   os() << " ";
   2544   if (!rd.Is(rn)) {
   2545     os() << rd << ", ";
   2546   }
   2547   os() << rn << ", " << rm;
   2548 }
   2549 
   2550 void Disassembler::smlabb(
   2551     Condition cond, Register rd, Register rn, Register rm, Register ra) {
   2552   os().SetCurrentInstruction(kSmlabb, kArithmetic);
   2553   os() << ToCString(kSmlabb) << ConditionPrinter(it_block_, cond) << " " << rd
   2554        << ", " << rn << ", " << rm << ", " << ra;
   2555 }
   2556 
   2557 void Disassembler::smlabt(
   2558     Condition cond, Register rd, Register rn, Register rm, Register ra) {
   2559   os().SetCurrentInstruction(kSmlabt, kArithmetic);
   2560   os() << ToCString(kSmlabt) << ConditionPrinter(it_block_, cond) << " " << rd
   2561        << ", " << rn << ", " << rm << ", " << ra;
   2562 }
   2563 
   2564 void Disassembler::smlad(
   2565     Condition cond, Register rd, Register rn, Register rm, Register ra) {
   2566   os().SetCurrentInstruction(kSmlad, kArithmetic);
   2567   os() << ToCString(kSmlad) << ConditionPrinter(it_block_, cond) << " " << rd
   2568        << ", " << rn << ", " << rm << ", " << ra;
   2569 }
   2570 
   2571 void Disassembler::smladx(
   2572     Condition cond, Register rd, Register rn, Register rm, Register ra) {
   2573   os().SetCurrentInstruction(kSmladx, kArithmetic);
   2574   os() << ToCString(kSmladx) << ConditionPrinter(it_block_, cond) << " " << rd
   2575        << ", " << rn << ", " << rm << ", " << ra;
   2576 }
   2577 
   2578 void Disassembler::smlal(
   2579     Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
   2580   os().SetCurrentInstruction(kSmlal, kArithmetic);
   2581   os() << ToCString(kSmlal) << ConditionPrinter(it_block_, cond) << " " << rdlo
   2582        << ", " << rdhi << ", " << rn << ", " << rm;
   2583 }
   2584 
   2585 void Disassembler::smlalbb(
   2586     Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
   2587   os().SetCurrentInstruction(kSmlalbb, kArithmetic);
   2588   os() << ToCString(kSmlalbb) << ConditionPrinter(it_block_, cond) << " "
   2589        << rdlo << ", " << rdhi << ", " << rn << ", " << rm;
   2590 }
   2591 
   2592 void Disassembler::smlalbt(
   2593     Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
   2594   os().SetCurrentInstruction(kSmlalbt, kArithmetic);
   2595   os() << ToCString(kSmlalbt) << ConditionPrinter(it_block_, cond) << " "
   2596        << rdlo << ", " << rdhi << ", " << rn << ", " << rm;
   2597 }
   2598 
   2599 void Disassembler::smlald(
   2600     Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
   2601   os().SetCurrentInstruction(kSmlald, kArithmetic);
   2602   os() << ToCString(kSmlald) << ConditionPrinter(it_block_, cond) << " " << rdlo
   2603        << ", " << rdhi << ", " << rn << ", " << rm;
   2604 }
   2605 
   2606 void Disassembler::smlaldx(
   2607     Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
   2608   os().SetCurrentInstruction(kSmlaldx, kArithmetic);
   2609   os() << ToCString(kSmlaldx) << ConditionPrinter(it_block_, cond) << " "
   2610        << rdlo << ", " << rdhi << ", " << rn << ", " << rm;
   2611 }
   2612 
   2613 void Disassembler::smlals(
   2614     Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
   2615   os().SetCurrentInstruction(kSmlals, kArithmetic);
   2616   os() << ToCString(kSmlals) << ConditionPrinter(it_block_, cond) << " " << rdlo
   2617        << ", " << rdhi << ", " << rn << ", " << rm;
   2618 }
   2619 
   2620 void Disassembler::smlaltb(
   2621     Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
   2622   os().SetCurrentInstruction(kSmlaltb, kArithmetic);
   2623   os() << ToCString(kSmlaltb) << ConditionPrinter(it_block_, cond) << " "
   2624        << rdlo << ", " << rdhi << ", " << rn << ", " << rm;
   2625 }
   2626 
   2627 void Disassembler::smlaltt(
   2628     Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
   2629   os().SetCurrentInstruction(kSmlaltt, kArithmetic);
   2630   os() << ToCString(kSmlaltt) << ConditionPrinter(it_block_, cond) << " "
   2631        << rdlo << ", " << rdhi << ", " << rn << ", " << rm;
   2632 }
   2633 
   2634 void Disassembler::smlatb(
   2635     Condition cond, Register rd, Register rn, Register rm, Register ra) {
   2636   os().SetCurrentInstruction(kSmlatb, kArithmetic);
   2637   os() << ToCString(kSmlatb) << ConditionPrinter(it_block_, cond) << " " << rd
   2638        << ", " << rn << ", " << rm << ", " << ra;
   2639 }
   2640 
   2641 void Disassembler::smlatt(
   2642     Condition cond, Register rd, Register rn, Register rm, Register ra) {
   2643   os().SetCurrentInstruction(kSmlatt, kArithmetic);
   2644   os() << ToCString(kSmlatt) << ConditionPrinter(it_block_, cond) << " " << rd
   2645        << ", " << rn << ", " << rm << ", " << ra;
   2646 }
   2647 
   2648 void Disassembler::smlawb(
   2649     Condition cond, Register rd, Register rn, Register rm, Register ra) {
   2650   os().SetCurrentInstruction(kSmlawb, kArithmetic);
   2651   os() << ToCString(kSmlawb) << ConditionPrinter(it_block_, cond) << " " << rd
   2652        << ", " << rn << ", " << rm << ", " << ra;
   2653 }
   2654 
   2655 void Disassembler::smlawt(
   2656     Condition cond, Register rd, Register rn, Register rm, Register ra) {
   2657   os().SetCurrentInstruction(kSmlawt, kArithmetic);
   2658   os() << ToCString(kSmlawt) << ConditionPrinter(it_block_, cond) << " " << rd
   2659        << ", " << rn << ", " << rm << ", " << ra;
   2660 }
   2661 
   2662 void Disassembler::smlsd(
   2663     Condition cond, Register rd, Register rn, Register rm, Register ra) {
   2664   os().SetCurrentInstruction(kSmlsd, kArithmetic);
   2665   os() << ToCString(kSmlsd) << ConditionPrinter(it_block_, cond) << " " << rd
   2666        << ", " << rn << ", " << rm << ", " << ra;
   2667 }
   2668 
   2669 void Disassembler::smlsdx(
   2670     Condition cond, Register rd, Register rn, Register rm, Register ra) {
   2671   os().SetCurrentInstruction(kSmlsdx, kArithmetic);
   2672   os() << ToCString(kSmlsdx) << ConditionPrinter(it_block_, cond) << " " << rd
   2673        << ", " << rn << ", " << rm << ", " << ra;
   2674 }
   2675 
   2676 void Disassembler::smlsld(
   2677     Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
   2678   os().SetCurrentInstruction(kSmlsld, kArithmetic);
   2679   os() << ToCString(kSmlsld) << ConditionPrinter(it_block_, cond) << " " << rdlo
   2680        << ", " << rdhi << ", " << rn << ", " << rm;
   2681 }
   2682 
   2683 void Disassembler::smlsldx(
   2684     Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
   2685   os().SetCurrentInstruction(kSmlsldx, kArithmetic);
   2686   os() << ToCString(kSmlsldx) << ConditionPrinter(it_block_, cond) << " "
   2687        << rdlo << ", " << rdhi << ", " << rn << ", " << rm;
   2688 }
   2689 
   2690 void Disassembler::smmla(
   2691     Condition cond, Register rd, Register rn, Register rm, Register ra) {
   2692   os().SetCurrentInstruction(kSmmla, kArithmetic);
   2693   os() << ToCString(kSmmla) << ConditionPrinter(it_block_, cond) << " " << rd
   2694        << ", " << rn << ", " << rm << ", " << ra;
   2695 }
   2696 
   2697 void Disassembler::smmlar(
   2698     Condition cond, Register rd, Register rn, Register rm, Register ra) {
   2699   os().SetCurrentInstruction(kSmmlar, kArithmetic);
   2700   os() << ToCString(kSmmlar) << ConditionPrinter(it_block_, cond) << " " << rd
   2701        << ", " << rn << ", " << rm << ", " << ra;
   2702 }
   2703 
   2704 void Disassembler::smmls(
   2705     Condition cond, Register rd, Register rn, Register rm, Register ra) {
   2706   os().SetCurrentInstruction(kSmmls, kArithmetic);
   2707   os() << ToCString(kSmmls) << ConditionPrinter(it_block_, cond) << " " << rd
   2708        << ", " << rn << ", " << rm << ", " << ra;
   2709 }
   2710 
   2711 void Disassembler::smmlsr(
   2712     Condition cond, Register rd, Register rn, Register rm, Register ra) {
   2713   os().SetCurrentInstruction(kSmmlsr, kArithmetic);
   2714   os() << ToCString(kSmmlsr) << ConditionPrinter(it_block_, cond) << " " << rd
   2715        << ", " << rn << ", " << rm << ", " << ra;
   2716 }
   2717 
   2718 void Disassembler::smmul(Condition cond,
   2719                          Register rd,
   2720                          Register rn,
   2721                          Register rm) {
   2722   os().SetCurrentInstruction(kSmmul, kArithmetic);
   2723   os() << ToCString(kSmmul) << ConditionPrinter(it_block_, cond);
   2724   os() << " ";
   2725   if (!rd.Is(rn)) {
   2726     os() << rd << ", ";
   2727   }
   2728   os() << rn << ", " << rm;
   2729 }
   2730 
   2731 void Disassembler::smmulr(Condition cond,
   2732                           Register rd,
   2733                           Register rn,
   2734                           Register rm) {
   2735   os().SetCurrentInstruction(kSmmulr, kArithmetic);
   2736   os() << ToCString(kSmmulr) << ConditionPrinter(it_block_, cond);
   2737   os() << " ";
   2738   if (!rd.Is(rn)) {
   2739     os() << rd << ", ";
   2740   }
   2741   os() << rn << ", " << rm;
   2742 }
   2743 
   2744 void Disassembler::smuad(Condition cond,
   2745                          Register rd,
   2746                          Register rn,
   2747                          Register rm) {
   2748   os().SetCurrentInstruction(kSmuad, kArithmetic);
   2749   os() << ToCString(kSmuad) << ConditionPrinter(it_block_, cond);
   2750   os() << " ";
   2751   if (!rd.Is(rn)) {
   2752     os() << rd << ", ";
   2753   }
   2754   os() << rn << ", " << rm;
   2755 }
   2756 
   2757 void Disassembler::smuadx(Condition cond,
   2758                           Register rd,
   2759                           Register rn,
   2760                           Register rm) {
   2761   os().SetCurrentInstruction(kSmuadx, kArithmetic);
   2762   os() << ToCString(kSmuadx) << ConditionPrinter(it_block_, cond);
   2763   os() << " ";
   2764   if (!rd.Is(rn)) {
   2765     os() << rd << ", ";
   2766   }
   2767   os() << rn << ", " << rm;
   2768 }
   2769 
   2770 void Disassembler::smulbb(Condition cond,
   2771                           Register rd,
   2772                           Register rn,
   2773                           Register rm) {
   2774   os().SetCurrentInstruction(kSmulbb, kArithmetic);
   2775   os() << ToCString(kSmulbb) << ConditionPrinter(it_block_, cond);
   2776   os() << " ";
   2777   if (!rd.Is(rn)) {
   2778     os() << rd << ", ";
   2779   }
   2780   os() << rn << ", " << rm;
   2781 }
   2782 
   2783 void Disassembler::smulbt(Condition cond,
   2784                           Register rd,
   2785                           Register rn,
   2786                           Register rm) {
   2787   os().SetCurrentInstruction(kSmulbt, kArithmetic);
   2788   os() << ToCString(kSmulbt) << ConditionPrinter(it_block_, cond);
   2789   os() << " ";
   2790   if (!rd.Is(rn)) {
   2791     os() << rd << ", ";
   2792   }
   2793   os() << rn << ", " << rm;
   2794 }
   2795 
   2796 void Disassembler::smull(
   2797     Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
   2798   os().SetCurrentInstruction(kSmull, kArithmetic);
   2799   os() << ToCString(kSmull) << ConditionPrinter(it_block_, cond) << " " << rdlo
   2800        << ", " << rdhi << ", " << rn << ", " << rm;
   2801 }
   2802 
   2803 void Disassembler::smulls(
   2804     Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
   2805   os().SetCurrentInstruction(kSmulls, kArithmetic);
   2806   os() << ToCString(kSmulls) << ConditionPrinter(it_block_, cond) << " " << rdlo
   2807        << ", " << rdhi << ", " << rn << ", " << rm;
   2808 }
   2809 
   2810 void Disassembler::smultb(Condition cond,
   2811                           Register rd,
   2812                           Register rn,
   2813                           Register rm) {
   2814   os().SetCurrentInstruction(kSmultb, kArithmetic);
   2815   os() << ToCString(kSmultb) << ConditionPrinter(it_block_, cond);
   2816   os() << " ";
   2817   if (!rd.Is(rn)) {
   2818     os() << rd << ", ";
   2819   }
   2820   os() << rn << ", " << rm;
   2821 }
   2822 
   2823 void Disassembler::smultt(Condition cond,
   2824                           Register rd,
   2825                           Register rn,
   2826                           Register rm) {
   2827   os().SetCurrentInstruction(kSmultt, kArithmetic);
   2828   os() << ToCString(kSmultt) << ConditionPrinter(it_block_, cond);
   2829   os() << " ";
   2830   if (!rd.Is(rn)) {
   2831     os() << rd << ", ";
   2832   }
   2833   os() << rn << ", " << rm;
   2834 }
   2835 
   2836 void Disassembler::smulwb(Condition cond,
   2837                           Register rd,
   2838                           Register rn,
   2839                           Register rm) {
   2840   os().SetCurrentInstruction(kSmulwb, kArithmetic);
   2841   os() << ToCString(kSmulwb) << ConditionPrinter(it_block_, cond);
   2842   os() << " ";
   2843   if (!rd.Is(rn)) {
   2844     os() << rd << ", ";
   2845   }
   2846   os() << rn << ", " << rm;
   2847 }
   2848 
   2849 void Disassembler::smulwt(Condition cond,
   2850                           Register rd,
   2851                           Register rn,
   2852                           Register rm) {
   2853   os().SetCurrentInstruction(kSmulwt, kArithmetic);
   2854   os() << ToCString(kSmulwt) << ConditionPrinter(it_block_, cond);
   2855   os() << " ";
   2856   if (!rd.Is(rn)) {
   2857     os() << rd << ", ";
   2858   }
   2859   os() << rn << ", " << rm;
   2860 }
   2861 
   2862 void Disassembler::smusd(Condition cond,
   2863                          Register rd,
   2864                          Register rn,
   2865                          Register rm) {
   2866   os().SetCurrentInstruction(kSmusd, kArithmetic);
   2867   os() << ToCString(kSmusd) << ConditionPrinter(it_block_, cond);
   2868   os() << " ";
   2869   if (!rd.Is(rn)) {
   2870     os() << rd << ", ";
   2871   }
   2872   os() << rn << ", " << rm;
   2873 }
   2874 
   2875 void Disassembler::smusdx(Condition cond,
   2876                           Register rd,
   2877                           Register rn,
   2878                           Register rm) {
   2879   os().SetCurrentInstruction(kSmusdx, kArithmetic);
   2880   os() << ToCString(kSmusdx) << ConditionPrinter(it_block_, cond);
   2881   os() << " ";
   2882   if (!rd.Is(rn)) {
   2883     os() << rd << ", ";
   2884   }
   2885   os() << rn << ", " << rm;
   2886 }
   2887 
   2888 void Disassembler::ssat(Condition cond,
   2889                         Register rd,
   2890                         uint32_t imm,
   2891                         const Operand& operand) {
   2892   os().SetCurrentInstruction(kSsat, kArithmetic);
   2893   os() << ToCString(kSsat) << ConditionPrinter(it_block_, cond) << " " << rd
   2894        << ", "
   2895        << "#" << imm << ", " << operand;
   2896 }
   2897 
   2898 void Disassembler::ssat16(Condition cond,
   2899                           Register rd,
   2900                           uint32_t imm,
   2901                           Register rn) {
   2902   os().SetCurrentInstruction(kSsat16, kArithmetic);
   2903   os() << ToCString(kSsat16) << ConditionPrinter(it_block_, cond) << " " << rd
   2904        << ", "
   2905        << "#" << imm << ", " << rn;
   2906 }
   2907 
   2908 void Disassembler::ssax(Condition cond, Register rd, Register rn, Register rm) {
   2909   os().SetCurrentInstruction(kSsax, kArithmetic);
   2910   os() << ToCString(kSsax) << ConditionPrinter(it_block_, cond);
   2911   os() << " ";
   2912   if (!rd.Is(rn)) {
   2913     os() << rd << ", ";
   2914   }
   2915   os() << rn << ", " << rm;
   2916 }
   2917 
   2918 void Disassembler::ssub16(Condition cond,
   2919                           Register rd,
   2920                           Register rn,
   2921                           Register rm) {
   2922   os().SetCurrentInstruction(kSsub16, kArithmetic);
   2923   os() << ToCString(kSsub16) << ConditionPrinter(it_block_, cond);
   2924   os() << " ";
   2925   if (!rd.Is(rn)) {
   2926     os() << rd << ", ";
   2927   }
   2928   os() << rn << ", " << rm;
   2929 }
   2930 
   2931 void Disassembler::ssub8(Condition cond,
   2932                          Register rd,
   2933                          Register rn,
   2934                          Register rm) {
   2935   os().SetCurrentInstruction(kSsub8, kArithmetic);
   2936   os() << ToCString(kSsub8) << ConditionPrinter(it_block_, cond);
   2937   os() << " ";
   2938   if (!rd.Is(rn)) {
   2939     os() << rd << ", ";
   2940   }
   2941   os() << rn << ", " << rm;
   2942 }
   2943 
   2944 void Disassembler::stl(Condition cond, Register rt, const MemOperand& operand) {
   2945   os().SetCurrentInstruction(kStl, kAddress | kLoadStore);
   2946   os() << ToCString(kStl) << ConditionPrinter(it_block_, cond) << " " << rt
   2947        << ", " << PrintMemOperand(kStoreWordLocation, operand);
   2948 }
   2949 
   2950 void Disassembler::stlb(Condition cond,
   2951                         Register rt,
   2952                         const MemOperand& operand) {
   2953   os().SetCurrentInstruction(kStlb, kAddress | kLoadStore);
   2954   os() << ToCString(kStlb) << ConditionPrinter(it_block_, cond) << " " << rt
   2955        << ", " << PrintMemOperand(kStoreByteLocation, operand);
   2956 }
   2957 
   2958 void Disassembler::stlex(Condition cond,
   2959                          Register rd,
   2960                          Register rt,
   2961                          const MemOperand& operand) {
   2962   os().SetCurrentInstruction(kStlex, kAddress | kLoadStore);
   2963   os() << ToCString(kStlex) << ConditionPrinter(it_block_, cond) << " " << rd
   2964        << ", " << rt << ", " << PrintMemOperand(kStoreWordLocation, operand);
   2965 }
   2966 
   2967 void Disassembler::stlexb(Condition cond,
   2968                           Register rd,
   2969                           Register rt,
   2970                           const MemOperand& operand) {
   2971   os().SetCurrentInstruction(kStlexb, kAddress | kLoadStore);
   2972   os() << ToCString(kStlexb) << ConditionPrinter(it_block_, cond) << " " << rd
   2973        << ", " << rt << ", " << PrintMemOperand(kStoreByteLocation, operand);
   2974 }
   2975 
   2976 void Disassembler::stlexd(Condition cond,
   2977                           Register rd,
   2978                           Register rt,
   2979                           Register rt2,
   2980                           const MemOperand& operand) {
   2981   os().SetCurrentInstruction(kStlexd, kAddress | kLoadStore);
   2982   os() << ToCString(kStlexd) << ConditionPrinter(it_block_, cond) << " " << rd
   2983        << ", " << rt << ", " << rt2 << ", "
   2984        << PrintMemOperand(kStoreDoubleWordLocation, operand);
   2985 }
   2986 
   2987 void Disassembler::stlexh(Condition cond,
   2988                           Register rd,
   2989                           Register rt,
   2990                           const MemOperand& operand) {
   2991   os().SetCurrentInstruction(kStlexh, kAddress | kLoadStore);
   2992   os() << ToCString(kStlexh) << ConditionPrinter(it_block_, cond) << " " << rd
   2993        << ", " << rt << ", "
   2994        << PrintMemOperand(kStoreHalfWordLocation, operand);
   2995 }
   2996 
   2997 void Disassembler::stlh(Condition cond,
   2998                         Register rt,
   2999                         const MemOperand& operand) {
   3000   os().SetCurrentInstruction(kStlh, kAddress | kLoadStore);
   3001   os() << ToCString(kStlh) << ConditionPrinter(it_block_, cond) << " " << rt
   3002        << ", " << PrintMemOperand(kStoreHalfWordLocation, operand);
   3003 }
   3004 
   3005 void Disassembler::stm(Condition cond,
   3006                        EncodingSize size,
   3007                        Register rn,
   3008                        WriteBack write_back,
   3009                        RegisterList registers) {
   3010   os().SetCurrentInstruction(kStm, kLoadStore | kLoadStoreMultiple);
   3011   os() << ToCString(kStm) << ConditionPrinter(it_block_, cond) << size << " "
   3012        << rn << write_back << ", " << registers;
   3013 }
   3014 
   3015 void Disassembler::stmda(Condition cond,
   3016                          Register rn,
   3017                          WriteBack write_back,
   3018                          RegisterList registers) {
   3019   os().SetCurrentInstruction(kStmda, kLoadStore | kLoadStoreMultiple);
   3020   os() << ToCString(kStmda) << ConditionPrinter(it_block_, cond) << " " << rn
   3021        << write_back << ", " << registers;
   3022 }
   3023 
   3024 void Disassembler::stmdb(Condition cond,
   3025                          EncodingSize size,
   3026                          Register rn,
   3027                          WriteBack write_back,
   3028                          RegisterList registers) {
   3029   os().SetCurrentInstruction(kStmdb, kLoadStore | kLoadStoreMultiple);
   3030   os() << ToCString(kStmdb) << ConditionPrinter(it_block_, cond) << size << " "
   3031        << rn << write_back << ", " << registers;
   3032 }
   3033 
   3034 void Disassembler::stmea(Condition cond,
   3035                          EncodingSize size,
   3036                          Register rn,
   3037                          WriteBack write_back,
   3038                          RegisterList registers) {
   3039   os().SetCurrentInstruction(kStmea, kLoadStore | kLoadStoreMultiple);
   3040   os() << ToCString(kStmea) << ConditionPrinter(it_block_, cond) << size << " "
   3041        << rn << write_back << ", " << registers;
   3042 }
   3043 
   3044 void Disassembler::stmed(Condition cond,
   3045                          Register rn,
   3046                          WriteBack write_back,
   3047                          RegisterList registers) {
   3048   os().SetCurrentInstruction(kStmed, kLoadStore | kLoadStoreMultiple);
   3049   os() << ToCString(kStmed) << ConditionPrinter(it_block_, cond) << " " << rn
   3050        << write_back << ", " << registers;
   3051 }
   3052 
   3053 void Disassembler::stmfa(Condition cond,
   3054                          Register rn,
   3055                          WriteBack write_back,
   3056                          RegisterList registers) {
   3057   os().SetCurrentInstruction(kStmfa, kLoadStore | kLoadStoreMultiple);
   3058   os() << ToCString(kStmfa) << ConditionPrinter(it_block_, cond) << " " << rn
   3059        << write_back << ", " << registers;
   3060 }
   3061 
   3062 void Disassembler::stmfd(Condition cond,
   3063                          Register rn,
   3064                          WriteBack write_back,
   3065                          RegisterList registers) {
   3066   os().SetCurrentInstruction(kStmfd, kLoadStore | kLoadStoreMultiple);
   3067   os() << ToCString(kStmfd) << ConditionPrinter(it_block_, cond) << " " << rn
   3068        << write_back << ", " << registers;
   3069 }
   3070 
   3071 void Disassembler::stmib(Condition cond,
   3072                          Register rn,
   3073                          WriteBack write_back,
   3074                          RegisterList registers) {
   3075   os().SetCurrentInstruction(kStmib, kLoadStore | kLoadStoreMultiple);
   3076   os() << ToCString(kStmib) << ConditionPrinter(it_block_, cond) << " " << rn
   3077        << write_back << ", " << registers;
   3078 }
   3079 
   3080 void Disassembler::str(Condition cond,
   3081                        EncodingSize size,
   3082                        Register rt,
   3083                        const MemOperand& operand) {
   3084   os().SetCurrentInstruction(kStr, kAddress | kLoadStore);
   3085   os() << ToCString(kStr) << ConditionPrinter(it_block_, cond) << size << " "
   3086        << rt << ", " << PrintMemOperand(kStoreWordLocation, operand);
   3087 }
   3088 
   3089 void Disassembler::strb(Condition cond,
   3090                         EncodingSize size,
   3091                         Register rt,
   3092                         const MemOperand& operand) {
   3093   os().SetCurrentInstruction(kStrb, kAddress | kLoadStore);
   3094   os() << ToCString(kStrb) << ConditionPrinter(it_block_, cond) << size << " "
   3095        << rt << ", " << PrintMemOperand(kStoreByteLocation, operand);
   3096 }
   3097 
   3098 void Disassembler::strd(Condition cond,
   3099                         Register rt,
   3100                         Register rt2,
   3101                         const MemOperand& operand) {
   3102   os().SetCurrentInstruction(kStrd, kAddress | kLoadStore);
   3103   os() << ToCString(kStrd) << ConditionPrinter(it_block_, cond) << " " << rt
   3104        << ", " << rt2 << ", "
   3105        << PrintMemOperand(kStoreDoubleWordLocation, operand);
   3106 }
   3107 
   3108 void Disassembler::strex(Condition cond,
   3109                          Register rd,
   3110                          Register rt,
   3111                          const MemOperand& operand) {
   3112   os().SetCurrentInstruction(kStrex, kAddress | kLoadStore);
   3113   os() << ToCString(kStrex) << ConditionPrinter(it_block_, cond) << " " << rd
   3114        << ", " << rt << ", " << PrintMemOperand(kStoreWordLocation, operand);
   3115 }
   3116 
   3117 void Disassembler::strexb(Condition cond,
   3118                           Register rd,
   3119                           Register rt,
   3120                           const MemOperand& operand) {
   3121   os().SetCurrentInstruction(kStrexb, kAddress | kLoadStore);
   3122   os() << ToCString(kStrexb) << ConditionPrinter(it_block_, cond) << " " << rd
   3123        << ", " << rt << ", " << PrintMemOperand(kStoreByteLocation, operand);
   3124 }
   3125 
   3126 void Disassembler::strexd(Condition cond,
   3127                           Register rd,
   3128                           Register rt,
   3129                           Register rt2,
   3130                           const MemOperand& operand) {
   3131   os().SetCurrentInstruction(kStrexd, kAddress | kLoadStore);
   3132   os() << ToCString(kStrexd) << ConditionPrinter(it_block_, cond) << " " << rd
   3133        << ", " << rt << ", " << rt2 << ", "
   3134        << PrintMemOperand(kStoreDoubleWordLocation, operand);
   3135 }
   3136 
   3137 void Disassembler::strexh(Condition cond,
   3138                           Register rd,
   3139                           Register rt,
   3140                           const MemOperand& operand) {
   3141   os().SetCurrentInstruction(kStrexh, kAddress | kLoadStore);
   3142   os() << ToCString(kStrexh) << ConditionPrinter(it_block_, cond) << " " << rd
   3143        << ", " << rt << ", "
   3144        << PrintMemOperand(kStoreHalfWordLocation, operand);
   3145 }
   3146 
   3147 void Disassembler::strh(Condition cond,
   3148                         EncodingSize size,
   3149                         Register rt,
   3150                         const MemOperand& operand) {
   3151   os().SetCurrentInstruction(kStrh, kAddress | kLoadStore);
   3152   os() << ToCString(kStrh) << ConditionPrinter(it_block_, cond) << size << " "
   3153        << rt << ", " << PrintMemOperand(kStoreHalfWordLocation, operand);
   3154 }
   3155 
   3156 void Disassembler::sub(Condition cond,
   3157                        EncodingSize size,
   3158                        Register rd,
   3159                        Register rn,
   3160                        const Operand& operand) {
   3161   os().SetCurrentInstruction(kSub, kArithmetic);
   3162   os() << ToCString(kSub) << ConditionPrinter(it_block_, cond) << size;
   3163   os() << " ";
   3164   if (!rd.Is(rn)) {
   3165     os() << rd << ", ";
   3166   }
   3167   os() << rn << ", " << operand;
   3168 }
   3169 
   3170 void Disassembler::sub(Condition cond, Register rd, const Operand& operand) {
   3171   os().SetCurrentInstruction(kSub, kArithmetic);
   3172   os() << ToCString(kSub) << ConditionPrinter(it_block_, cond) << " " << rd
   3173        << ", " << operand;
   3174 }
   3175 
   3176 void Disassembler::subs(Condition cond,
   3177                         EncodingSize size,
   3178                         Register rd,
   3179                         Register rn,
   3180                         const Operand& operand) {
   3181   os().SetCurrentInstruction(kSubs, kArithmetic);
   3182   os() << ToCString(kSubs) << ConditionPrinter(it_block_, cond) << size;
   3183   os() << " ";
   3184   if (!rd.Is(rn)) {
   3185     os() << rd << ", ";
   3186   }
   3187   os() << rn << ", " << operand;
   3188 }
   3189 
   3190 void Disassembler::subs(Register rd, const Operand& operand) {
   3191   os().SetCurrentInstruction(kSubs, kArithmetic);
   3192   os() << ToCString(kSubs) << " " << rd << ", " << operand;
   3193 }
   3194 
   3195 void Disassembler::subw(Condition cond,
   3196                         Register rd,
   3197                         Register rn,
   3198                         const Operand& operand) {
   3199   os().SetCurrentInstruction(kSubw, kArithmetic);
   3200   os() << ToCString(kSubw) << ConditionPrinter(it_block_, cond);
   3201   os() << " ";
   3202   if (!rd.Is(rn)) {
   3203     os() << rd << ", ";
   3204   }
   3205   os() << rn << ", " << operand;
   3206 }
   3207 
   3208 void Disassembler::svc(Condition cond, uint32_t imm) {
   3209   os().SetCurrentInstruction(kSvc, kSystem);
   3210   os() << ToCString(kSvc) << ConditionPrinter(it_block_, cond) << " " << imm;
   3211 }
   3212 
   3213 void Disassembler::sxtab(Condition cond,
   3214                          Register rd,
   3215                          Register rn,
   3216                          const Operand& operand) {
   3217   os().SetCurrentInstruction(kSxtab, kArithmetic);
   3218   os() << ToCString(kSxtab) << ConditionPrinter(it_block_, cond);
   3219   os() << " ";
   3220   if (!rd.Is(rn)) {
   3221     os() << rd << ", ";
   3222   }
   3223   os() << rn << ", " << operand;
   3224 }
   3225 
   3226 void Disassembler::sxtab16(Condition cond,
   3227                            Register rd,
   3228                            Register rn,
   3229                            const Operand& operand) {
   3230   os().SetCurrentInstruction(kSxtab16, kArithmetic);
   3231   os() << ToCString(kSxtab16) << ConditionPrinter(it_block_, cond);
   3232   os() << " ";
   3233   if (!rd.Is(rn)) {
   3234     os() << rd << ", ";
   3235   }
   3236   os() << rn << ", " << operand;
   3237 }
   3238 
   3239 void Disassembler::sxtah(Condition cond,
   3240                          Register rd,
   3241                          Register rn,
   3242                          const Operand& operand) {
   3243   os().SetCurrentInstruction(kSxtah, kArithmetic);
   3244   os() << ToCString(kSxtah) << ConditionPrinter(it_block_, cond);
   3245   os() << " ";
   3246   if (!rd.Is(rn)) {
   3247     os() << rd << ", ";
   3248   }
   3249   os() << rn << ", " << operand;
   3250 }
   3251 
   3252 void Disassembler::sxtb(Condition cond,
   3253                         EncodingSize size,
   3254                         Register rd,
   3255                         const Operand& operand) {
   3256   os().SetCurrentInstruction(kSxtb, kArithmetic);
   3257   os() << ToCString(kSxtb) << ConditionPrinter(it_block_, cond) << size;
   3258   os() << " ";
   3259   if (!rd.Is(operand.GetBaseRegister())) {
   3260     os() << rd << ", ";
   3261   }
   3262   os() << operand;
   3263 }
   3264 
   3265 void Disassembler::sxtb16(Condition cond, Register rd, const Operand& operand) {
   3266   os().SetCurrentInstruction(kSxtb16, kArithmetic);
   3267   os() << ToCString(kSxtb16) << ConditionPrinter(it_block_, cond);
   3268   os() << " ";
   3269   if (!rd.Is(operand.GetBaseRegister())) {
   3270     os() << rd << ", ";
   3271   }
   3272   os() << operand;
   3273 }
   3274 
   3275 void Disassembler::sxth(Condition cond,
   3276                         EncodingSize size,
   3277                         Register rd,
   3278                         const Operand& operand) {
   3279   os().SetCurrentInstruction(kSxth, kArithmetic);
   3280   os() << ToCString(kSxth) << ConditionPrinter(it_block_, cond) << size;
   3281   os() << " ";
   3282   if (!rd.Is(operand.GetBaseRegister())) {
   3283     os() << rd << ", ";
   3284   }
   3285   os() << operand;
   3286 }
   3287 
   3288 void Disassembler::tbb(Condition cond, Register rn, Register rm) {
   3289   os().SetCurrentInstruction(kTbb, kBranch);
   3290   os() << ToCString(kTbb) << ConditionPrinter(it_block_, cond) << " "
   3291        << MemOperand(rn, rm);
   3292 }
   3293 
   3294 void Disassembler::tbh(Condition cond, Register rn, Register rm) {
   3295   os().SetCurrentInstruction(kTbh, kBranch);
   3296   os() << ToCString(kTbh) << ConditionPrinter(it_block_, cond) << " "
   3297        << MemOperand(rn, plus, rm, LSL, 1);
   3298 }
   3299 
   3300 void Disassembler::teq(Condition cond, Register rn, const Operand& operand) {
   3301   os().SetCurrentInstruction(kTeq, kBitwise);
   3302   os() << ToCString(kTeq) << ConditionPrinter(it_block_, cond) << " " << rn
   3303        << ", " << operand;
   3304 }
   3305 
   3306 void Disassembler::tst(Condition cond,
   3307                        EncodingSize size,
   3308                        Register rn,
   3309                        const Operand& operand) {
   3310   os().SetCurrentInstruction(kTst, kBitwise);
   3311   os() << ToCString(kTst) << ConditionPrinter(it_block_, cond) << size << " "
   3312        << rn << ", " << operand;
   3313 }
   3314 
   3315 void Disassembler::uadd16(Condition cond,
   3316                           Register rd,
   3317                           Register rn,
   3318                           Register rm) {
   3319   os().SetCurrentInstruction(kUadd16, kArithmetic);
   3320   os() << ToCString(kUadd16) << ConditionPrinter(it_block_, cond);
   3321   os() << " ";
   3322   if (!rd.Is(rn)) {
   3323     os() << rd << ", ";
   3324   }
   3325   os() << rn << ", " << rm;
   3326 }
   3327 
   3328 void Disassembler::uadd8(Condition cond,
   3329                          Register rd,
   3330                          Register rn,
   3331                          Register rm) {
   3332   os().SetCurrentInstruction(kUadd8, kArithmetic);
   3333   os() << ToCString(kUadd8) << ConditionPrinter(it_block_, cond);
   3334   os() << " ";
   3335   if (!rd.Is(rn)) {
   3336     os() << rd << ", ";
   3337   }
   3338   os() << rn << ", " << rm;
   3339 }
   3340 
   3341 void Disassembler::uasx(Condition cond, Register rd, Register rn, Register rm) {
   3342   os().SetCurrentInstruction(kUasx, kArithmetic);
   3343   os() << ToCString(kUasx) << ConditionPrinter(it_block_, cond);
   3344   os() << " ";
   3345   if (!rd.Is(rn)) {
   3346     os() << rd << ", ";
   3347   }
   3348   os() << rn << ", " << rm;
   3349 }
   3350 
   3351 void Disassembler::ubfx(Condition cond,
   3352                         Register rd,
   3353                         Register rn,
   3354                         uint32_t lsb,
   3355                         const Operand& operand) {
   3356   os().SetCurrentInstruction(kUbfx, kShift);
   3357   os() << ToCString(kUbfx) << ConditionPrinter(it_block_, cond) << " " << rd
   3358        << ", " << rn << ", "
   3359        << "#" << lsb << ", " << operand;
   3360 }
   3361 
   3362 void Disassembler::udf(Condition cond, EncodingSize size, uint32_t imm) {
   3363   os().SetCurrentInstruction(kUdf, kNoAttribute);
   3364   os() << ToCString(kUdf) << ConditionPrinter(it_block_, cond) << size << " "
   3365        << imm;
   3366 }
   3367 
   3368 void Disassembler::udiv(Condition cond, Register rd, Register rn, Register rm) {
   3369   os().SetCurrentInstruction(kUdiv, kArithmetic);
   3370   os() << ToCString(kUdiv) << ConditionPrinter(it_block_, cond);
   3371   os() << " ";
   3372   if (!rd.Is(rn)) {
   3373     os() << rd << ", ";
   3374   }
   3375   os() << rn << ", " << rm;
   3376 }
   3377 
   3378 void Disassembler::uhadd16(Condition cond,
   3379                            Register rd,
   3380                            Register rn,
   3381                            Register rm) {
   3382   os().SetCurrentInstruction(kUhadd16, kArithmetic);
   3383   os() << ToCString(kUhadd16) << ConditionPrinter(it_block_, cond);
   3384   os() << " ";
   3385   if (!rd.Is(rn)) {
   3386     os() << rd << ", ";
   3387   }
   3388   os() << rn << ", " << rm;
   3389 }
   3390 
   3391 void Disassembler::uhadd8(Condition cond,
   3392                           Register rd,
   3393                           Register rn,
   3394                           Register rm) {
   3395   os().SetCurrentInstruction(kUhadd8, kArithmetic);
   3396   os() << ToCString(kUhadd8) << ConditionPrinter(it_block_, cond);
   3397   os() << " ";
   3398   if (!rd.Is(rn)) {
   3399     os() << rd << ", ";
   3400   }
   3401   os() << rn << ", " << rm;
   3402 }
   3403 
   3404 void Disassembler::uhasx(Condition cond,
   3405                          Register rd,
   3406                          Register rn,
   3407                          Register rm) {
   3408   os().SetCurrentInstruction(kUhasx, kArithmetic);
   3409   os() << ToCString(kUhasx) << ConditionPrinter(it_block_, cond);
   3410   os() << " ";
   3411   if (!rd.Is(rn)) {
   3412     os() << rd << ", ";
   3413   }
   3414   os() << rn << ", " << rm;
   3415 }
   3416 
   3417 void Disassembler::uhsax(Condition cond,
   3418                          Register rd,
   3419                          Register rn,
   3420                          Register rm) {
   3421   os().SetCurrentInstruction(kUhsax, kArithmetic);
   3422   os() << ToCString(kUhsax) << ConditionPrinter(it_block_, cond);
   3423   os() << " ";
   3424   if (!rd.Is(rn)) {
   3425     os() << rd << ", ";
   3426   }
   3427   os() << rn << ", " << rm;
   3428 }
   3429 
   3430 void Disassembler::uhsub16(Condition cond,
   3431                            Register rd,
   3432                            Register rn,
   3433                            Register rm) {
   3434   os().SetCurrentInstruction(kUhsub16, kArithmetic);
   3435   os() << ToCString(kUhsub16) << ConditionPrinter(it_block_, cond);
   3436   os() << " ";
   3437   if (!rd.Is(rn)) {
   3438     os() << rd << ", ";
   3439   }
   3440   os() << rn << ", " << rm;
   3441 }
   3442 
   3443 void Disassembler::uhsub8(Condition cond,
   3444                           Register rd,
   3445                           Register rn,
   3446                           Register rm) {
   3447   os().SetCurrentInstruction(kUhsub8, kArithmetic);
   3448   os() << ToCString(kUhsub8) << ConditionPrinter(it_block_, cond);
   3449   os() << " ";
   3450   if (!rd.Is(rn)) {
   3451     os() << rd << ", ";
   3452   }
   3453   os() << rn << ", " << rm;
   3454 }
   3455 
   3456 void Disassembler::umaal(
   3457     Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
   3458   os().SetCurrentInstruction(kUmaal, kArithmetic);
   3459   os() << ToCString(kUmaal) << ConditionPrinter(it_block_, cond) << " " << rdlo
   3460        << ", " << rdhi << ", " << rn << ", " << rm;
   3461 }
   3462 
   3463 void Disassembler::umlal(
   3464     Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
   3465   os().SetCurrentInstruction(kUmlal, kArithmetic);
   3466   os() << ToCString(kUmlal) << ConditionPrinter(it_block_, cond) << " " << rdlo
   3467        << ", " << rdhi << ", " << rn << ", " << rm;
   3468 }
   3469 
   3470 void Disassembler::umlals(
   3471     Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
   3472   os().SetCurrentInstruction(kUmlals, kArithmetic);
   3473   os() << ToCString(kUmlals) << ConditionPrinter(it_block_, cond) << " " << rdlo
   3474        << ", " << rdhi << ", " << rn << ", " << rm;
   3475 }
   3476 
   3477 void Disassembler::umull(
   3478     Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
   3479   os().SetCurrentInstruction(kUmull, kArithmetic);
   3480   os() << ToCString(kUmull) << ConditionPrinter(it_block_, cond) << " " << rdlo
   3481        << ", " << rdhi << ", " << rn << ", " << rm;
   3482 }
   3483 
   3484 void Disassembler::umulls(
   3485     Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
   3486   os().SetCurrentInstruction(kUmulls, kArithmetic);
   3487   os() << ToCString(kUmulls) << ConditionPrinter(it_block_, cond) << " " << rdlo
   3488        << ", " << rdhi << ", " << rn << ", " << rm;
   3489 }
   3490 
   3491 void Disassembler::uqadd16(Condition cond,
   3492                            Register rd,
   3493                            Register rn,
   3494                            Register rm) {
   3495   os().SetCurrentInstruction(kUqadd16, kArithmetic);
   3496   os() << ToCString(kUqadd16) << ConditionPrinter(it_block_, cond);
   3497   os() << " ";
   3498   if (!rd.Is(rn)) {
   3499     os() << rd << ", ";
   3500   }
   3501   os() << rn << ", " << rm;
   3502 }
   3503 
   3504 void Disassembler::uqadd8(Condition cond,
   3505                           Register rd,
   3506                           Register rn,
   3507                           Register rm) {
   3508   os().SetCurrentInstruction(kUqadd8, kArithmetic);
   3509   os() << ToCString(kUqadd8) << ConditionPrinter(it_block_, cond);
   3510   os() << " ";
   3511   if (!rd.Is(rn)) {
   3512     os() << rd << ", ";
   3513   }
   3514   os() << rn << ", " << rm;
   3515 }
   3516 
   3517 void Disassembler::uqasx(Condition cond,
   3518                          Register rd,
   3519                          Register rn,
   3520                          Register rm) {
   3521   os().SetCurrentInstruction(kUqasx, kArithmetic);
   3522   os() << ToCString(kUqasx) << ConditionPrinter(it_block_, cond);
   3523   os() << " ";
   3524   if (!rd.Is(rn)) {
   3525     os() << rd << ", ";
   3526   }
   3527   os() << rn << ", " << rm;
   3528 }
   3529 
   3530 void Disassembler::uqsax(Condition cond,
   3531                          Register rd,
   3532                          Register rn,
   3533                          Register rm) {
   3534   os().SetCurrentInstruction(kUqsax, kArithmetic);
   3535   os() << ToCString(kUqsax) << ConditionPrinter(it_block_, cond);
   3536   os() << " ";
   3537   if (!rd.Is(rn)) {
   3538     os() << rd << ", ";
   3539   }
   3540   os() << rn << ", " << rm;
   3541 }
   3542 
   3543 void Disassembler::uqsub16(Condition cond,
   3544                            Register rd,
   3545                            Register rn,
   3546                            Register rm) {
   3547   os().SetCurrentInstruction(kUqsub16, kArithmetic);
   3548   os() << ToCString(kUqsub16) << ConditionPrinter(it_block_, cond);
   3549   os() << " ";
   3550   if (!rd.Is(rn)) {
   3551     os() << rd << ", ";
   3552   }
   3553   os() << rn << ", " << rm;
   3554 }
   3555 
   3556 void Disassembler::uqsub8(Condition cond,
   3557                           Register rd,
   3558                           Register rn,
   3559                           Register rm) {
   3560   os().SetCurrentInstruction(kUqsub8, kArithmetic);
   3561   os() << ToCString(kUqsub8) << ConditionPrinter(it_block_, cond);
   3562   os() << " ";
   3563   if (!rd.Is(rn)) {
   3564     os() << rd << ", ";
   3565   }
   3566   os() << rn << ", " << rm;
   3567 }
   3568 
   3569 void Disassembler::usad8(Condition cond,
   3570                          Register rd,
   3571                          Register rn,
   3572                          Register rm) {
   3573   os().SetCurrentInstruction(kUsad8, kArithmetic);
   3574   os() << ToCString(kUsad8) << ConditionPrinter(it_block_, cond);
   3575   os() << " ";
   3576   if (!rd.Is(rn)) {
   3577     os() << rd << ", ";
   3578   }
   3579   os() << rn << ", " << rm;
   3580 }
   3581 
   3582 void Disassembler::usada8(
   3583     Condition cond, Register rd, Register rn, Register rm, Register ra) {
   3584   os().SetCurrentInstruction(kUsada8, kArithmetic);
   3585   os() << ToCString(kUsada8) << ConditionPrinter(it_block_, cond) << " " << rd
   3586        << ", " << rn << ", " << rm << ", " << ra;
   3587 }
   3588 
   3589 void Disassembler::usat(Condition cond,
   3590                         Register rd,
   3591                         uint32_t imm,
   3592                         const Operand& operand) {
   3593   os().SetCurrentInstruction(kUsat, kArithmetic);
   3594   os() << ToCString(kUsat) << ConditionPrinter(it_block_, cond) << " " << rd
   3595        << ", "
   3596        << "#" << imm << ", " << operand;
   3597 }
   3598 
   3599 void Disassembler::usat16(Condition cond,
   3600                           Register rd,
   3601                           uint32_t imm,
   3602                           Register rn) {
   3603   os().SetCurrentInstruction(kUsat16, kArithmetic);
   3604   os() << ToCString(kUsat16) << ConditionPrinter(it_block_, cond) << " " << rd
   3605        << ", "
   3606        << "#" << imm << ", " << rn;
   3607 }
   3608 
   3609 void Disassembler::usax(Condition cond, Register rd, Register rn, Register rm) {
   3610   os().SetCurrentInstruction(kUsax, kArithmetic);
   3611   os() << ToCString(kUsax) << ConditionPrinter(it_block_, cond);
   3612   os() << " ";
   3613   if (!rd.Is(rn)) {
   3614     os() << rd << ", ";
   3615   }
   3616   os() << rn << ", " << rm;
   3617 }
   3618 
   3619 void Disassembler::usub16(Condition cond,
   3620                           Register rd,
   3621                           Register rn,
   3622                           Register rm) {
   3623   os().SetCurrentInstruction(kUsub16, kArithmetic);
   3624   os() << ToCString(kUsub16) << ConditionPrinter(it_block_, cond);
   3625   os() << " ";
   3626   if (!rd.Is(rn)) {
   3627     os() << rd << ", ";
   3628   }
   3629   os() << rn << ", " << rm;
   3630 }
   3631 
   3632 void Disassembler::usub8(Condition cond,
   3633                          Register rd,
   3634                          Register rn,
   3635                          Register rm) {
   3636   os().SetCurrentInstruction(kUsub8, kArithmetic);
   3637   os() << ToCString(kUsub8) << ConditionPrinter(it_block_, cond);
   3638   os() << " ";
   3639   if (!rd.Is(rn)) {
   3640     os() << rd << ", ";
   3641   }
   3642   os() << rn << ", " << rm;
   3643 }
   3644 
   3645 void Disassembler::uxtab(Condition cond,
   3646                          Register rd,
   3647                          Register rn,
   3648                          const Operand& operand) {
   3649   os().SetCurrentInstruction(kUxtab, kArithmetic);
   3650   os() << ToCString(kUxtab) << ConditionPrinter(it_block_, cond);
   3651   os() << " ";
   3652   if (!rd.Is(rn)) {
   3653     os() << rd << ", ";
   3654   }
   3655   os() << rn << ", " << operand;
   3656 }
   3657 
   3658 void Disassembler::uxtab16(Condition cond,
   3659                            Register rd,
   3660                            Register rn,
   3661                            const Operand& operand) {
   3662   os().SetCurrentInstruction(kUxtab16, kArithmetic);
   3663   os() << ToCString(kUxtab16) << ConditionPrinter(it_block_, cond);
   3664   os() << " ";
   3665   if (!rd.Is(rn)) {
   3666     os() << rd << ", ";
   3667   }
   3668   os() << rn << ", " << operand;
   3669 }
   3670 
   3671 void Disassembler::uxtah(Condition cond,
   3672                          Register rd,
   3673                          Register rn,
   3674                          const Operand& operand) {
   3675   os().SetCurrentInstruction(kUxtah, kArithmetic);
   3676   os() << ToCString(kUxtah) << ConditionPrinter(it_block_, cond);
   3677   os() << " ";
   3678   if (!rd.Is(rn)) {
   3679     os() << rd << ", ";
   3680   }
   3681   os() << rn << ", " << operand;
   3682 }
   3683 
   3684 void Disassembler::uxtb(Condition cond,
   3685                         EncodingSize size,
   3686                         Register rd,
   3687                         const Operand& operand) {
   3688   os().SetCurrentInstruction(kUxtb, kArithmetic);
   3689   os() << ToCString(kUxtb) << ConditionPrinter(it_block_, cond) << size;
   3690   os() << " ";
   3691   if (!rd.Is(operand.GetBaseRegister())) {
   3692     os() << rd << ", ";
   3693   }
   3694   os() << operand;
   3695 }
   3696 
   3697 void Disassembler::uxtb16(Condition cond, Register rd, const Operand& operand) {
   3698   os().SetCurrentInstruction(kUxtb16, kArithmetic);
   3699   os() << ToCString(kUxtb16) << ConditionPrinter(it_block_, cond);
   3700   os() << " ";
   3701   if (!rd.Is(operand.GetBaseRegister())) {
   3702     os() << rd << ", ";
   3703   }
   3704   os() << operand;
   3705 }
   3706 
   3707 void Disassembler::uxth(Condition cond,
   3708                         EncodingSize size,
   3709                         Register rd,
   3710                         const Operand& operand) {
   3711   os().SetCurrentInstruction(kUxth, kArithmetic);
   3712   os() << ToCString(kUxth) << ConditionPrinter(it_block_, cond) << size;
   3713   os() << " ";
   3714   if (!rd.Is(operand.GetBaseRegister())) {
   3715     os() << rd << ", ";
   3716   }
   3717   os() << operand;
   3718 }
   3719 
   3720 void Disassembler::vaba(
   3721     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   3722   os().SetCurrentInstruction(kVaba, kFpNeon);
   3723   os() << ToCString(kVaba) << ConditionPrinter(it_block_, cond) << dt << " "
   3724        << rd << ", " << rn << ", " << rm;
   3725 }
   3726 
   3727 void Disassembler::vaba(
   3728     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   3729   os().SetCurrentInstruction(kVaba, kFpNeon);
   3730   os() << ToCString(kVaba) << ConditionPrinter(it_block_, cond) << dt << " "
   3731        << rd << ", " << rn << ", " << rm;
   3732 }
   3733 
   3734 void Disassembler::vabal(
   3735     Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
   3736   os().SetCurrentInstruction(kVabal, kFpNeon);
   3737   os() << ToCString(kVabal) << ConditionPrinter(it_block_, cond) << dt << " "
   3738        << rd << ", " << rn << ", " << rm;
   3739 }
   3740 
   3741 void Disassembler::vabd(
   3742     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   3743   os().SetCurrentInstruction(kVabd, kFpNeon);
   3744   os() << ToCString(kVabd) << ConditionPrinter(it_block_, cond) << dt;
   3745   os() << " ";
   3746   if (!rd.Is(rn)) {
   3747     os() << rd << ", ";
   3748   }
   3749   os() << rn << ", " << rm;
   3750 }
   3751 
   3752 void Disassembler::vabd(
   3753     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   3754   os().SetCurrentInstruction(kVabd, kFpNeon);
   3755   os() << ToCString(kVabd) << ConditionPrinter(it_block_, cond) << dt;
   3756   os() << " ";
   3757   if (!rd.Is(rn)) {
   3758     os() << rd << ", ";
   3759   }
   3760   os() << rn << ", " << rm;
   3761 }
   3762 
   3763 void Disassembler::vabdl(
   3764     Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
   3765   os().SetCurrentInstruction(kVabdl, kFpNeon);
   3766   os() << ToCString(kVabdl) << ConditionPrinter(it_block_, cond) << dt << " "
   3767        << rd << ", " << rn << ", " << rm;
   3768 }
   3769 
   3770 void Disassembler::vabs(Condition cond,
   3771                         DataType dt,
   3772                         DRegister rd,
   3773                         DRegister rm) {
   3774   os().SetCurrentInstruction(kVabs, kFpNeon);
   3775   os() << ToCString(kVabs) << ConditionPrinter(it_block_, cond) << dt << " "
   3776        << rd << ", " << rm;
   3777 }
   3778 
   3779 void Disassembler::vabs(Condition cond,
   3780                         DataType dt,
   3781                         QRegister rd,
   3782                         QRegister rm) {
   3783   os().SetCurrentInstruction(kVabs, kFpNeon);
   3784   os() << ToCString(kVabs) << ConditionPrinter(it_block_, cond) << dt << " "
   3785        << rd << ", " << rm;
   3786 }
   3787 
   3788 void Disassembler::vabs(Condition cond,
   3789                         DataType dt,
   3790                         SRegister rd,
   3791                         SRegister rm) {
   3792   os().SetCurrentInstruction(kVabs, kFpNeon);
   3793   os() << ToCString(kVabs) << ConditionPrinter(it_block_, cond) << dt << " "
   3794        << rd << ", " << rm;
   3795 }
   3796 
   3797 void Disassembler::vacge(
   3798     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   3799   os().SetCurrentInstruction(kVacge, kFpNeon);
   3800   os() << ToCString(kVacge) << ConditionPrinter(it_block_, cond) << dt;
   3801   os() << " ";
   3802   if (!rd.Is(rn)) {
   3803     os() << rd << ", ";
   3804   }
   3805   os() << rn << ", " << rm;
   3806 }
   3807 
   3808 void Disassembler::vacge(
   3809     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   3810   os().SetCurrentInstruction(kVacge, kFpNeon);
   3811   os() << ToCString(kVacge) << ConditionPrinter(it_block_, cond) << dt;
   3812   os() << " ";
   3813   if (!rd.Is(rn)) {
   3814     os() << rd << ", ";
   3815   }
   3816   os() << rn << ", " << rm;
   3817 }
   3818 
   3819 void Disassembler::vacgt(
   3820     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   3821   os().SetCurrentInstruction(kVacgt, kFpNeon);
   3822   os() << ToCString(kVacgt) << ConditionPrinter(it_block_, cond) << dt;
   3823   os() << " ";
   3824   if (!rd.Is(rn)) {
   3825     os() << rd << ", ";
   3826   }
   3827   os() << rn << ", " << rm;
   3828 }
   3829 
   3830 void Disassembler::vacgt(
   3831     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   3832   os().SetCurrentInstruction(kVacgt, kFpNeon);
   3833   os() << ToCString(kVacgt) << ConditionPrinter(it_block_, cond) << dt;
   3834   os() << " ";
   3835   if (!rd.Is(rn)) {
   3836     os() << rd << ", ";
   3837   }
   3838   os() << rn << ", " << rm;
   3839 }
   3840 
   3841 void Disassembler::vacle(
   3842     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   3843   os().SetCurrentInstruction(kVacle, kFpNeon);
   3844   os() << ToCString(kVacle) << ConditionPrinter(it_block_, cond) << dt;
   3845   os() << " ";
   3846   if (!rd.Is(rn)) {
   3847     os() << rd << ", ";
   3848   }
   3849   os() << rn << ", " << rm;
   3850 }
   3851 
   3852 void Disassembler::vacle(
   3853     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   3854   os().SetCurrentInstruction(kVacle, kFpNeon);
   3855   os() << ToCString(kVacle) << ConditionPrinter(it_block_, cond) << dt;
   3856   os() << " ";
   3857   if (!rd.Is(rn)) {
   3858     os() << rd << ", ";
   3859   }
   3860   os() << rn << ", " << rm;
   3861 }
   3862 
   3863 void Disassembler::vaclt(
   3864     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   3865   os().SetCurrentInstruction(kVaclt, kFpNeon);
   3866   os() << ToCString(kVaclt) << ConditionPrinter(it_block_, cond) << dt;
   3867   os() << " ";
   3868   if (!rd.Is(rn)) {
   3869     os() << rd << ", ";
   3870   }
   3871   os() << rn << ", " << rm;
   3872 }
   3873 
   3874 void Disassembler::vaclt(
   3875     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   3876   os().SetCurrentInstruction(kVaclt, kFpNeon);
   3877   os() << ToCString(kVaclt) << ConditionPrinter(it_block_, cond) << dt;
   3878   os() << " ";
   3879   if (!rd.Is(rn)) {
   3880     os() << rd << ", ";
   3881   }
   3882   os() << rn << ", " << rm;
   3883 }
   3884 
   3885 void Disassembler::vadd(
   3886     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   3887   os().SetCurrentInstruction(kVadd, kFpNeon);
   3888   os() << ToCString(kVadd) << ConditionPrinter(it_block_, cond) << dt;
   3889   os() << " ";
   3890   if (!rd.Is(rn)) {
   3891     os() << rd << ", ";
   3892   }
   3893   os() << rn << ", " << rm;
   3894 }
   3895 
   3896 void Disassembler::vadd(
   3897     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   3898   os().SetCurrentInstruction(kVadd, kFpNeon);
   3899   os() << ToCString(kVadd) << ConditionPrinter(it_block_, cond) << dt;
   3900   os() << " ";
   3901   if (!rd.Is(rn)) {
   3902     os() << rd << ", ";
   3903   }
   3904   os() << rn << ", " << rm;
   3905 }
   3906 
   3907 void Disassembler::vadd(
   3908     Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
   3909   os().SetCurrentInstruction(kVadd, kFpNeon);
   3910   os() << ToCString(kVadd) << ConditionPrinter(it_block_, cond) << dt;
   3911   os() << " ";
   3912   if (!rd.Is(rn)) {
   3913     os() << rd << ", ";
   3914   }
   3915   os() << rn << ", " << rm;
   3916 }
   3917 
   3918 void Disassembler::vaddhn(
   3919     Condition cond, DataType dt, DRegister rd, QRegister rn, QRegister rm) {
   3920   os().SetCurrentInstruction(kVaddhn, kFpNeon);
   3921   os() << ToCString(kVaddhn) << ConditionPrinter(it_block_, cond) << dt << " "
   3922        << rd << ", " << rn << ", " << rm;
   3923 }
   3924 
   3925 void Disassembler::vaddl(
   3926     Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
   3927   os().SetCurrentInstruction(kVaddl, kFpNeon);
   3928   os() << ToCString(kVaddl) << ConditionPrinter(it_block_, cond) << dt << " "
   3929        << rd << ", " << rn << ", " << rm;
   3930 }
   3931 
   3932 void Disassembler::vaddw(
   3933     Condition cond, DataType dt, QRegister rd, QRegister rn, DRegister rm) {
   3934   os().SetCurrentInstruction(kVaddw, kFpNeon);
   3935   os() << ToCString(kVaddw) << ConditionPrinter(it_block_, cond) << dt;
   3936   os() << " ";
   3937   if (!rd.Is(rn)) {
   3938     os() << rd << ", ";
   3939   }
   3940   os() << rn << ", " << rm;
   3941 }
   3942 
   3943 void Disassembler::vand(Condition cond,
   3944                         DataType dt,
   3945                         DRegister rd,
   3946                         DRegister rn,
   3947                         const DOperand& operand) {
   3948   os().SetCurrentInstruction(kVand, kFpNeon);
   3949   os() << ToCString(kVand) << ConditionPrinter(it_block_, cond) << dt;
   3950   os() << " ";
   3951   if (!rd.Is(rn)) {
   3952     os() << rd << ", ";
   3953   }
   3954   os() << rn << ", " << operand;
   3955 }
   3956 
   3957 void Disassembler::vand(Condition cond,
   3958                         DataType dt,
   3959                         QRegister rd,
   3960                         QRegister rn,
   3961                         const QOperand& operand) {
   3962   os().SetCurrentInstruction(kVand, kFpNeon);
   3963   os() << ToCString(kVand) << ConditionPrinter(it_block_, cond) << dt;
   3964   os() << " ";
   3965   if (!rd.Is(rn)) {
   3966     os() << rd << ", ";
   3967   }
   3968   os() << rn << ", " << operand;
   3969 }
   3970 
   3971 void Disassembler::vbic(Condition cond,
   3972                         DataType dt,
   3973                         DRegister rd,
   3974                         DRegister rn,
   3975                         const DOperand& operand) {
   3976   os().SetCurrentInstruction(kVbic, kFpNeon);
   3977   os() << ToCString(kVbic) << ConditionPrinter(it_block_, cond) << dt;
   3978   os() << " ";
   3979   if (!rd.Is(rn)) {
   3980     os() << rd << ", ";
   3981   }
   3982   os() << rn << ", " << operand;
   3983 }
   3984 
   3985 void Disassembler::vbic(Condition cond,
   3986                         DataType dt,
   3987                         QRegister rd,
   3988                         QRegister rn,
   3989                         const QOperand& operand) {
   3990   os().SetCurrentInstruction(kVbic, kFpNeon);
   3991   os() << ToCString(kVbic) << ConditionPrinter(it_block_, cond) << dt;
   3992   os() << " ";
   3993   if (!rd.Is(rn)) {
   3994     os() << rd << ", ";
   3995   }
   3996   os() << rn << ", " << operand;
   3997 }
   3998 
   3999 void Disassembler::vbif(
   4000     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   4001   os().SetCurrentInstruction(kVbif, kFpNeon);
   4002   os() << ToCString(kVbif) << ConditionPrinter(it_block_, cond) << dt;
   4003   os() << " ";
   4004   if (!rd.Is(rn)) {
   4005     os() << rd << ", ";
   4006   }
   4007   os() << rn << ", " << rm;
   4008 }
   4009 
   4010 void Disassembler::vbif(
   4011     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   4012   os().SetCurrentInstruction(kVbif, kFpNeon);
   4013   os() << ToCString(kVbif) << ConditionPrinter(it_block_, cond) << dt;
   4014   os() << " ";
   4015   if (!rd.Is(rn)) {
   4016     os() << rd << ", ";
   4017   }
   4018   os() << rn << ", " << rm;
   4019 }
   4020 
   4021 void Disassembler::vbit(
   4022     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   4023   os().SetCurrentInstruction(kVbit, kFpNeon);
   4024   os() << ToCString(kVbit) << ConditionPrinter(it_block_, cond) << dt;
   4025   os() << " ";
   4026   if (!rd.Is(rn)) {
   4027     os() << rd << ", ";
   4028   }
   4029   os() << rn << ", " << rm;
   4030 }
   4031 
   4032 void Disassembler::vbit(
   4033     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   4034   os().SetCurrentInstruction(kVbit, kFpNeon);
   4035   os() << ToCString(kVbit) << ConditionPrinter(it_block_, cond) << dt;
   4036   os() << " ";
   4037   if (!rd.Is(rn)) {
   4038     os() << rd << ", ";
   4039   }
   4040   os() << rn << ", " << rm;
   4041 }
   4042 
   4043 void Disassembler::vbsl(
   4044     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   4045   os().SetCurrentInstruction(kVbsl, kFpNeon);
   4046   os() << ToCString(kVbsl) << ConditionPrinter(it_block_, cond) << dt;
   4047   os() << " ";
   4048   if (!rd.Is(rn)) {
   4049     os() << rd << ", ";
   4050   }
   4051   os() << rn << ", " << rm;
   4052 }
   4053 
   4054 void Disassembler::vbsl(
   4055     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   4056   os().SetCurrentInstruction(kVbsl, kFpNeon);
   4057   os() << ToCString(kVbsl) << ConditionPrinter(it_block_, cond) << dt;
   4058   os() << " ";
   4059   if (!rd.Is(rn)) {
   4060     os() << rd << ", ";
   4061   }
   4062   os() << rn << ", " << rm;
   4063 }
   4064 
   4065 void Disassembler::vceq(Condition cond,
   4066                         DataType dt,
   4067                         DRegister rd,
   4068                         DRegister rm,
   4069                         const DOperand& operand) {
   4070   os().SetCurrentInstruction(kVceq, kFpNeon);
   4071   os() << ToCString(kVceq) << ConditionPrinter(it_block_, cond) << dt;
   4072   os() << " ";
   4073   if (!rd.Is(rm)) {
   4074     os() << rd << ", ";
   4075   }
   4076   os() << rm << ", " << operand;
   4077 }
   4078 
   4079 void Disassembler::vceq(Condition cond,
   4080                         DataType dt,
   4081                         QRegister rd,
   4082                         QRegister rm,
   4083                         const QOperand& operand) {
   4084   os().SetCurrentInstruction(kVceq, kFpNeon);
   4085   os() << ToCString(kVceq) << ConditionPrinter(it_block_, cond) << dt;
   4086   os() << " ";
   4087   if (!rd.Is(rm)) {
   4088     os() << rd << ", ";
   4089   }
   4090   os() << rm << ", " << operand;
   4091 }
   4092 
   4093 void Disassembler::vceq(
   4094     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   4095   os().SetCurrentInstruction(kVceq, kFpNeon);
   4096   os() << ToCString(kVceq) << ConditionPrinter(it_block_, cond) << dt;
   4097   os() << " ";
   4098   if (!rd.Is(rn)) {
   4099     os() << rd << ", ";
   4100   }
   4101   os() << rn << ", " << rm;
   4102 }
   4103 
   4104 void Disassembler::vceq(
   4105     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   4106   os().SetCurrentInstruction(kVceq, kFpNeon);
   4107   os() << ToCString(kVceq) << ConditionPrinter(it_block_, cond) << dt;
   4108   os() << " ";
   4109   if (!rd.Is(rn)) {
   4110     os() << rd << ", ";
   4111   }
   4112   os() << rn << ", " << rm;
   4113 }
   4114 
   4115 void Disassembler::vcge(Condition cond,
   4116                         DataType dt,
   4117                         DRegister rd,
   4118                         DRegister rm,
   4119                         const DOperand& operand) {
   4120   os().SetCurrentInstruction(kVcge, kFpNeon);
   4121   os() << ToCString(kVcge) << ConditionPrinter(it_block_, cond) << dt;
   4122   os() << " ";
   4123   if (!rd.Is(rm)) {
   4124     os() << rd << ", ";
   4125   }
   4126   os() << rm << ", " << operand;
   4127 }
   4128 
   4129 void Disassembler::vcge(Condition cond,
   4130                         DataType dt,
   4131                         QRegister rd,
   4132                         QRegister rm,
   4133                         const QOperand& operand) {
   4134   os().SetCurrentInstruction(kVcge, kFpNeon);
   4135   os() << ToCString(kVcge) << ConditionPrinter(it_block_, cond) << dt;
   4136   os() << " ";
   4137   if (!rd.Is(rm)) {
   4138     os() << rd << ", ";
   4139   }
   4140   os() << rm << ", " << operand;
   4141 }
   4142 
   4143 void Disassembler::vcge(
   4144     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   4145   os().SetCurrentInstruction(kVcge, kFpNeon);
   4146   os() << ToCString(kVcge) << ConditionPrinter(it_block_, cond) << dt;
   4147   os() << " ";
   4148   if (!rd.Is(rn)) {
   4149     os() << rd << ", ";
   4150   }
   4151   os() << rn << ", " << rm;
   4152 }
   4153 
   4154 void Disassembler::vcge(
   4155     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   4156   os().SetCurrentInstruction(kVcge, kFpNeon);
   4157   os() << ToCString(kVcge) << ConditionPrinter(it_block_, cond) << dt;
   4158   os() << " ";
   4159   if (!rd.Is(rn)) {
   4160     os() << rd << ", ";
   4161   }
   4162   os() << rn << ", " << rm;
   4163 }
   4164 
   4165 void Disassembler::vcgt(Condition cond,
   4166                         DataType dt,
   4167                         DRegister rd,
   4168                         DRegister rm,
   4169                         const DOperand& operand) {
   4170   os().SetCurrentInstruction(kVcgt, kFpNeon);
   4171   os() << ToCString(kVcgt) << ConditionPrinter(it_block_, cond) << dt;
   4172   os() << " ";
   4173   if (!rd.Is(rm)) {
   4174     os() << rd << ", ";
   4175   }
   4176   os() << rm << ", " << operand;
   4177 }
   4178 
   4179 void Disassembler::vcgt(Condition cond,
   4180                         DataType dt,
   4181                         QRegister rd,
   4182                         QRegister rm,
   4183                         const QOperand& operand) {
   4184   os().SetCurrentInstruction(kVcgt, kFpNeon);
   4185   os() << ToCString(kVcgt) << ConditionPrinter(it_block_, cond) << dt;
   4186   os() << " ";
   4187   if (!rd.Is(rm)) {
   4188     os() << rd << ", ";
   4189   }
   4190   os() << rm << ", " << operand;
   4191 }
   4192 
   4193 void Disassembler::vcgt(
   4194     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   4195   os().SetCurrentInstruction(kVcgt, kFpNeon);
   4196   os() << ToCString(kVcgt) << ConditionPrinter(it_block_, cond) << dt;
   4197   os() << " ";
   4198   if (!rd.Is(rn)) {
   4199     os() << rd << ", ";
   4200   }
   4201   os() << rn << ", " << rm;
   4202 }
   4203 
   4204 void Disassembler::vcgt(
   4205     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   4206   os().SetCurrentInstruction(kVcgt, kFpNeon);
   4207   os() << ToCString(kVcgt) << ConditionPrinter(it_block_, cond) << dt;
   4208   os() << " ";
   4209   if (!rd.Is(rn)) {
   4210     os() << rd << ", ";
   4211   }
   4212   os() << rn << ", " << rm;
   4213 }
   4214 
   4215 void Disassembler::vcle(Condition cond,
   4216                         DataType dt,
   4217                         DRegister rd,
   4218                         DRegister rm,
   4219                         const DOperand& operand) {
   4220   os().SetCurrentInstruction(kVcle, kFpNeon);
   4221   os() << ToCString(kVcle) << ConditionPrinter(it_block_, cond) << dt;
   4222   os() << " ";
   4223   if (!rd.Is(rm)) {
   4224     os() << rd << ", ";
   4225   }
   4226   os() << rm << ", " << operand;
   4227 }
   4228 
   4229 void Disassembler::vcle(Condition cond,
   4230                         DataType dt,
   4231                         QRegister rd,
   4232                         QRegister rm,
   4233                         const QOperand& operand) {
   4234   os().SetCurrentInstruction(kVcle, kFpNeon);
   4235   os() << ToCString(kVcle) << ConditionPrinter(it_block_, cond) << dt;
   4236   os() << " ";
   4237   if (!rd.Is(rm)) {
   4238     os() << rd << ", ";
   4239   }
   4240   os() << rm << ", " << operand;
   4241 }
   4242 
   4243 void Disassembler::vcle(
   4244     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   4245   os().SetCurrentInstruction(kVcle, kFpNeon);
   4246   os() << ToCString(kVcle) << ConditionPrinter(it_block_, cond) << dt;
   4247   os() << " ";
   4248   if (!rd.Is(rn)) {
   4249     os() << rd << ", ";
   4250   }
   4251   os() << rn << ", " << rm;
   4252 }
   4253 
   4254 void Disassembler::vcle(
   4255     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   4256   os().SetCurrentInstruction(kVcle, kFpNeon);
   4257   os() << ToCString(kVcle) << ConditionPrinter(it_block_, cond) << dt;
   4258   os() << " ";
   4259   if (!rd.Is(rn)) {
   4260     os() << rd << ", ";
   4261   }
   4262   os() << rn << ", " << rm;
   4263 }
   4264 
   4265 void Disassembler::vcls(Condition cond,
   4266                         DataType dt,
   4267                         DRegister rd,
   4268                         DRegister rm) {
   4269   os().SetCurrentInstruction(kVcls, kFpNeon);
   4270   os() << ToCString(kVcls) << ConditionPrinter(it_block_, cond) << dt << " "
   4271        << rd << ", " << rm;
   4272 }
   4273 
   4274 void Disassembler::vcls(Condition cond,
   4275                         DataType dt,
   4276                         QRegister rd,
   4277                         QRegister rm) {
   4278   os().SetCurrentInstruction(kVcls, kFpNeon);
   4279   os() << ToCString(kVcls) << ConditionPrinter(it_block_, cond) << dt << " "
   4280        << rd << ", " << rm;
   4281 }
   4282 
   4283 void Disassembler::vclt(Condition cond,
   4284                         DataType dt,
   4285                         DRegister rd,
   4286                         DRegister rm,
   4287                         const DOperand& operand) {
   4288   os().SetCurrentInstruction(kVclt, kFpNeon);
   4289   os() << ToCString(kVclt) << ConditionPrinter(it_block_, cond) << dt;
   4290   os() << " ";
   4291   if (!rd.Is(rm)) {
   4292     os() << rd << ", ";
   4293   }
   4294   os() << rm << ", " << operand;
   4295 }
   4296 
   4297 void Disassembler::vclt(Condition cond,
   4298                         DataType dt,
   4299                         QRegister rd,
   4300                         QRegister rm,
   4301                         const QOperand& operand) {
   4302   os().SetCurrentInstruction(kVclt, kFpNeon);
   4303   os() << ToCString(kVclt) << ConditionPrinter(it_block_, cond) << dt;
   4304   os() << " ";
   4305   if (!rd.Is(rm)) {
   4306     os() << rd << ", ";
   4307   }
   4308   os() << rm << ", " << operand;
   4309 }
   4310 
   4311 void Disassembler::vclt(
   4312     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   4313   os().SetCurrentInstruction(kVclt, kFpNeon);
   4314   os() << ToCString(kVclt) << ConditionPrinter(it_block_, cond) << dt;
   4315   os() << " ";
   4316   if (!rd.Is(rn)) {
   4317     os() << rd << ", ";
   4318   }
   4319   os() << rn << ", " << rm;
   4320 }
   4321 
   4322 void Disassembler::vclt(
   4323     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   4324   os().SetCurrentInstruction(kVclt, kFpNeon);
   4325   os() << ToCString(kVclt) << ConditionPrinter(it_block_, cond) << dt;
   4326   os() << " ";
   4327   if (!rd.Is(rn)) {
   4328     os() << rd << ", ";
   4329   }
   4330   os() << rn << ", " << rm;
   4331 }
   4332 
   4333 void Disassembler::vclz(Condition cond,
   4334                         DataType dt,
   4335                         DRegister rd,
   4336                         DRegister rm) {
   4337   os().SetCurrentInstruction(kVclz, kFpNeon);
   4338   os() << ToCString(kVclz) << ConditionPrinter(it_block_, cond) << dt << " "
   4339        << rd << ", " << rm;
   4340 }
   4341 
   4342 void Disassembler::vclz(Condition cond,
   4343                         DataType dt,
   4344                         QRegister rd,
   4345                         QRegister rm) {
   4346   os().SetCurrentInstruction(kVclz, kFpNeon);
   4347   os() << ToCString(kVclz) << ConditionPrinter(it_block_, cond) << dt << " "
   4348        << rd << ", " << rm;
   4349 }
   4350 
   4351 void Disassembler::vcmp(Condition cond,
   4352                         DataType dt,
   4353                         SRegister rd,
   4354                         SRegister rm) {
   4355   os().SetCurrentInstruction(kVcmp, kFpNeon);
   4356   os() << ToCString(kVcmp) << ConditionPrinter(it_block_, cond) << dt << " "
   4357        << rd << ", " << rm;
   4358 }
   4359 
   4360 void Disassembler::vcmp(Condition cond,
   4361                         DataType dt,
   4362                         DRegister rd,
   4363                         DRegister rm) {
   4364   os().SetCurrentInstruction(kVcmp, kFpNeon);
   4365   os() << ToCString(kVcmp) << ConditionPrinter(it_block_, cond) << dt << " "
   4366        << rd << ", " << rm;
   4367 }
   4368 
   4369 void Disassembler::vcmp(Condition cond, DataType dt, SRegister rd, double imm) {
   4370   os().SetCurrentInstruction(kVcmp, kFpNeon);
   4371   os() << ToCString(kVcmp) << ConditionPrinter(it_block_, cond) << dt << " "
   4372        << rd << ", "
   4373        << "#" << std::fixed << std::setprecision(1) << imm
   4374        << std::resetiosflags(std::ios_base::floatfield);
   4375 }
   4376 
   4377 void Disassembler::vcmp(Condition cond, DataType dt, DRegister rd, double imm) {
   4378   os().SetCurrentInstruction(kVcmp, kFpNeon);
   4379   os() << ToCString(kVcmp) << ConditionPrinter(it_block_, cond) << dt << " "
   4380        << rd << ", "
   4381        << "#" << std::fixed << std::setprecision(1) << imm
   4382        << std::resetiosflags(std::ios_base::floatfield);
   4383 }
   4384 
   4385 void Disassembler::vcmpe(Condition cond,
   4386                          DataType dt,
   4387                          SRegister rd,
   4388                          SRegister rm) {
   4389   os().SetCurrentInstruction(kVcmpe, kFpNeon);
   4390   os() << ToCString(kVcmpe) << ConditionPrinter(it_block_, cond) << dt << " "
   4391        << rd << ", " << rm;
   4392 }
   4393 
   4394 void Disassembler::vcmpe(Condition cond,
   4395                          DataType dt,
   4396                          DRegister rd,
   4397                          DRegister rm) {
   4398   os().SetCurrentInstruction(kVcmpe, kFpNeon);
   4399   os() << ToCString(kVcmpe) << ConditionPrinter(it_block_, cond) << dt << " "
   4400        << rd << ", " << rm;
   4401 }
   4402 
   4403 void Disassembler::vcmpe(Condition cond,
   4404                          DataType dt,
   4405                          SRegister rd,
   4406                          double imm) {
   4407   os().SetCurrentInstruction(kVcmpe, kFpNeon);
   4408   os() << ToCString(kVcmpe) << ConditionPrinter(it_block_, cond) << dt << " "
   4409        << rd << ", "
   4410        << "#" << std::fixed << std::setprecision(1) << imm
   4411        << std::resetiosflags(std::ios_base::floatfield);
   4412 }
   4413 
   4414 void Disassembler::vcmpe(Condition cond,
   4415                          DataType dt,
   4416                          DRegister rd,
   4417                          double imm) {
   4418   os().SetCurrentInstruction(kVcmpe, kFpNeon);
   4419   os() << ToCString(kVcmpe) << ConditionPrinter(it_block_, cond) << dt << " "
   4420        << rd << ", "
   4421        << "#" << std::fixed << std::setprecision(1) << imm
   4422        << std::resetiosflags(std::ios_base::floatfield);
   4423 }
   4424 
   4425 void Disassembler::vcnt(Condition cond,
   4426                         DataType dt,
   4427                         DRegister rd,
   4428                         DRegister rm) {
   4429   os().SetCurrentInstruction(kVcnt, kFpNeon);
   4430   os() << ToCString(kVcnt) << ConditionPrinter(it_block_, cond) << dt << " "
   4431        << rd << ", " << rm;
   4432 }
   4433 
   4434 void Disassembler::vcnt(Condition cond,
   4435                         DataType dt,
   4436                         QRegister rd,
   4437                         QRegister rm) {
   4438   os().SetCurrentInstruction(kVcnt, kFpNeon);
   4439   os() << ToCString(kVcnt) << ConditionPrinter(it_block_, cond) << dt << " "
   4440        << rd << ", " << rm;
   4441 }
   4442 
   4443 void Disassembler::vcvt(
   4444     Condition cond, DataType dt1, DataType dt2, DRegister rd, SRegister rm) {
   4445   os().SetCurrentInstruction(kVcvt, kFpNeon);
   4446   os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2
   4447        << " " << rd << ", " << rm;
   4448 }
   4449 
   4450 void Disassembler::vcvt(
   4451     Condition cond, DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
   4452   os().SetCurrentInstruction(kVcvt, kFpNeon);
   4453   os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2
   4454        << " " << rd << ", " << rm;
   4455 }
   4456 
   4457 void Disassembler::vcvt(Condition cond,
   4458                         DataType dt1,
   4459                         DataType dt2,
   4460                         DRegister rd,
   4461                         DRegister rm,
   4462                         int32_t fbits) {
   4463   os().SetCurrentInstruction(kVcvt, kFpNeon);
   4464   os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2
   4465        << " " << rd << ", " << rm << ", "
   4466        << "#" << fbits;
   4467 }
   4468 
   4469 void Disassembler::vcvt(Condition cond,
   4470                         DataType dt1,
   4471                         DataType dt2,
   4472                         QRegister rd,
   4473                         QRegister rm,
   4474                         int32_t fbits) {
   4475   os().SetCurrentInstruction(kVcvt, kFpNeon);
   4476   os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2
   4477        << " " << rd << ", " << rm << ", "
   4478        << "#" << fbits;
   4479 }
   4480 
   4481 void Disassembler::vcvt(Condition cond,
   4482                         DataType dt1,
   4483                         DataType dt2,
   4484                         SRegister rd,
   4485                         SRegister rm,
   4486                         int32_t fbits) {
   4487   os().SetCurrentInstruction(kVcvt, kFpNeon);
   4488   os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2
   4489        << " " << rd << ", " << rm << ", "
   4490        << "#" << fbits;
   4491 }
   4492 
   4493 void Disassembler::vcvt(
   4494     Condition cond, DataType dt1, DataType dt2, DRegister rd, DRegister rm) {
   4495   os().SetCurrentInstruction(kVcvt, kFpNeon);
   4496   os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2
   4497        << " " << rd << ", " << rm;
   4498 }
   4499 
   4500 void Disassembler::vcvt(
   4501     Condition cond, DataType dt1, DataType dt2, QRegister rd, QRegister rm) {
   4502   os().SetCurrentInstruction(kVcvt, kFpNeon);
   4503   os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2
   4504        << " " << rd << ", " << rm;
   4505 }
   4506 
   4507 void Disassembler::vcvt(
   4508     Condition cond, DataType dt1, DataType dt2, DRegister rd, QRegister rm) {
   4509   os().SetCurrentInstruction(kVcvt, kFpNeon);
   4510   os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2
   4511        << " " << rd << ", " << rm;
   4512 }
   4513 
   4514 void Disassembler::vcvt(
   4515     Condition cond, DataType dt1, DataType dt2, QRegister rd, DRegister rm) {
   4516   os().SetCurrentInstruction(kVcvt, kFpNeon);
   4517   os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2
   4518        << " " << rd << ", " << rm;
   4519 }
   4520 
   4521 void Disassembler::vcvt(
   4522     Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
   4523   os().SetCurrentInstruction(kVcvt, kFpNeon);
   4524   os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2
   4525        << " " << rd << ", " << rm;
   4526 }
   4527 
   4528 void Disassembler::vcvta(DataType dt1,
   4529                          DataType dt2,
   4530                          DRegister rd,
   4531                          DRegister rm) {
   4532   os().SetCurrentInstruction(kVcvta, kFpNeon);
   4533   os() << ToCString(kVcvta) << dt1 << dt2 << " " << rd << ", " << rm;
   4534 }
   4535 
   4536 void Disassembler::vcvta(DataType dt1,
   4537                          DataType dt2,
   4538                          QRegister rd,
   4539                          QRegister rm) {
   4540   os().SetCurrentInstruction(kVcvta, kFpNeon);
   4541   os() << ToCString(kVcvta) << dt1 << dt2 << " " << rd << ", " << rm;
   4542 }
   4543 
   4544 void Disassembler::vcvta(DataType dt1,
   4545                          DataType dt2,
   4546                          SRegister rd,
   4547                          SRegister rm) {
   4548   os().SetCurrentInstruction(kVcvta, kFpNeon);
   4549   os() << ToCString(kVcvta) << dt1 << dt2 << " " << rd << ", " << rm;
   4550 }
   4551 
   4552 void Disassembler::vcvta(DataType dt1,
   4553                          DataType dt2,
   4554                          SRegister rd,
   4555                          DRegister rm) {
   4556   os().SetCurrentInstruction(kVcvta, kFpNeon);
   4557   os() << ToCString(kVcvta) << dt1 << dt2 << " " << rd << ", " << rm;
   4558 }
   4559 
   4560 void Disassembler::vcvtb(
   4561     Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
   4562   os().SetCurrentInstruction(kVcvtb, kFpNeon);
   4563   os() << ToCString(kVcvtb) << ConditionPrinter(it_block_, cond) << dt1 << dt2
   4564        << " " << rd << ", " << rm;
   4565 }
   4566 
   4567 void Disassembler::vcvtb(
   4568     Condition cond, DataType dt1, DataType dt2, DRegister rd, SRegister rm) {
   4569   os().SetCurrentInstruction(kVcvtb, kFpNeon);
   4570   os() << ToCString(kVcvtb) << ConditionPrinter(it_block_, cond) << dt1 << dt2
   4571        << " " << rd << ", " << rm;
   4572 }
   4573 
   4574 void Disassembler::vcvtb(
   4575     Condition cond, DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
   4576   os().SetCurrentInstruction(kVcvtb, kFpNeon);
   4577   os() << ToCString(kVcvtb) << ConditionPrinter(it_block_, cond) << dt1 << dt2
   4578        << " " << rd << ", " << rm;
   4579 }
   4580 
   4581 void Disassembler::vcvtm(DataType dt1,
   4582                          DataType dt2,
   4583                          DRegister rd,
   4584                          DRegister rm) {
   4585   os().SetCurrentInstruction(kVcvtm, kFpNeon);
   4586   os() << ToCString(kVcvtm) << dt1 << dt2 << " " << rd << ", " << rm;
   4587 }
   4588 
   4589 void Disassembler::vcvtm(DataType dt1,
   4590                          DataType dt2,
   4591                          QRegister rd,
   4592                          QRegister rm) {
   4593   os().SetCurrentInstruction(kVcvtm, kFpNeon);
   4594   os() << ToCString(kVcvtm) << dt1 << dt2 << " " << rd << ", " << rm;
   4595 }
   4596 
   4597 void Disassembler::vcvtm(DataType dt1,
   4598                          DataType dt2,
   4599                          SRegister rd,
   4600                          SRegister rm) {
   4601   os().SetCurrentInstruction(kVcvtm, kFpNeon);
   4602   os() << ToCString(kVcvtm) << dt1 << dt2 << " " << rd << ", " << rm;
   4603 }
   4604 
   4605 void Disassembler::vcvtm(DataType dt1,
   4606                          DataType dt2,
   4607                          SRegister rd,
   4608                          DRegister rm) {
   4609   os().SetCurrentInstruction(kVcvtm, kFpNeon);
   4610   os() << ToCString(kVcvtm) << dt1 << dt2 << " " << rd << ", " << rm;
   4611 }
   4612 
   4613 void Disassembler::vcvtn(DataType dt1,
   4614                          DataType dt2,
   4615                          DRegister rd,
   4616                          DRegister rm) {
   4617   os().SetCurrentInstruction(kVcvtn, kFpNeon);
   4618   os() << ToCString(kVcvtn) << dt1 << dt2 << " " << rd << ", " << rm;
   4619 }
   4620 
   4621 void Disassembler::vcvtn(DataType dt1,
   4622                          DataType dt2,
   4623                          QRegister rd,
   4624                          QRegister rm) {
   4625   os().SetCurrentInstruction(kVcvtn, kFpNeon);
   4626   os() << ToCString(kVcvtn) << dt1 << dt2 << " " << rd << ", " << rm;
   4627 }
   4628 
   4629 void Disassembler::vcvtn(DataType dt1,
   4630                          DataType dt2,
   4631                          SRegister rd,
   4632                          SRegister rm) {
   4633   os().SetCurrentInstruction(kVcvtn, kFpNeon);
   4634   os() << ToCString(kVcvtn) << dt1 << dt2 << " " << rd << ", " << rm;
   4635 }
   4636 
   4637 void Disassembler::vcvtn(DataType dt1,
   4638                          DataType dt2,
   4639                          SRegister rd,
   4640                          DRegister rm) {
   4641   os().SetCurrentInstruction(kVcvtn, kFpNeon);
   4642   os() << ToCString(kVcvtn) << dt1 << dt2 << " " << rd << ", " << rm;
   4643 }
   4644 
   4645 void Disassembler::vcvtp(DataType dt1,
   4646                          DataType dt2,
   4647                          DRegister rd,
   4648                          DRegister rm) {
   4649   os().SetCurrentInstruction(kVcvtp, kFpNeon);
   4650   os() << ToCString(kVcvtp) << dt1 << dt2 << " " << rd << ", " << rm;
   4651 }
   4652 
   4653 void Disassembler::vcvtp(DataType dt1,
   4654                          DataType dt2,
   4655                          QRegister rd,
   4656                          QRegister rm) {
   4657   os().SetCurrentInstruction(kVcvtp, kFpNeon);
   4658   os() << ToCString(kVcvtp) << dt1 << dt2 << " " << rd << ", " << rm;
   4659 }
   4660 
   4661 void Disassembler::vcvtp(DataType dt1,
   4662                          DataType dt2,
   4663                          SRegister rd,
   4664                          SRegister rm) {
   4665   os().SetCurrentInstruction(kVcvtp, kFpNeon);
   4666   os() << ToCString(kVcvtp) << dt1 << dt2 << " " << rd << ", " << rm;
   4667 }
   4668 
   4669 void Disassembler::vcvtp(DataType dt1,
   4670                          DataType dt2,
   4671                          SRegister rd,
   4672                          DRegister rm) {
   4673   os().SetCurrentInstruction(kVcvtp, kFpNeon);
   4674   os() << ToCString(kVcvtp) << dt1 << dt2 << " " << rd << ", " << rm;
   4675 }
   4676 
   4677 void Disassembler::vcvtr(
   4678     Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
   4679   os().SetCurrentInstruction(kVcvtr, kFpNeon);
   4680   os() << ToCString(kVcvtr) << ConditionPrinter(it_block_, cond) << dt1 << dt2
   4681        << " " << rd << ", " << rm;
   4682 }
   4683 
   4684 void Disassembler::vcvtr(
   4685     Condition cond, DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
   4686   os().SetCurrentInstruction(kVcvtr, kFpNeon);
   4687   os() << ToCString(kVcvtr) << ConditionPrinter(it_block_, cond) << dt1 << dt2
   4688        << " " << rd << ", " << rm;
   4689 }
   4690 
   4691 void Disassembler::vcvtt(
   4692     Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
   4693   os().SetCurrentInstruction(kVcvtt, kFpNeon);
   4694   os() << ToCString(kVcvtt) << ConditionPrinter(it_block_, cond) << dt1 << dt2
   4695        << " " << rd << ", " << rm;
   4696 }
   4697 
   4698 void Disassembler::vcvtt(
   4699     Condition cond, DataType dt1, DataType dt2, DRegister rd, SRegister rm) {
   4700   os().SetCurrentInstruction(kVcvtt, kFpNeon);
   4701   os() << ToCString(kVcvtt) << ConditionPrinter(it_block_, cond) << dt1 << dt2
   4702        << " " << rd << ", " << rm;
   4703 }
   4704 
   4705 void Disassembler::vcvtt(
   4706     Condition cond, DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
   4707   os().SetCurrentInstruction(kVcvtt, kFpNeon);
   4708   os() << ToCString(kVcvtt) << ConditionPrinter(it_block_, cond) << dt1 << dt2
   4709        << " " << rd << ", " << rm;
   4710 }
   4711 
   4712 void Disassembler::vdiv(
   4713     Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
   4714   os().SetCurrentInstruction(kVdiv, kFpNeon);
   4715   os() << ToCString(kVdiv) << ConditionPrinter(it_block_, cond) << dt;
   4716   os() << " ";
   4717   if (!rd.Is(rn)) {
   4718     os() << rd << ", ";
   4719   }
   4720   os() << rn << ", " << rm;
   4721 }
   4722 
   4723 void Disassembler::vdiv(
   4724     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   4725   os().SetCurrentInstruction(kVdiv, kFpNeon);
   4726   os() << ToCString(kVdiv) << ConditionPrinter(it_block_, cond) << dt;
   4727   os() << " ";
   4728   if (!rd.Is(rn)) {
   4729     os() << rd << ", ";
   4730   }
   4731   os() << rn << ", " << rm;
   4732 }
   4733 
   4734 void Disassembler::vdup(Condition cond,
   4735                         DataType dt,
   4736                         QRegister rd,
   4737                         Register rt) {
   4738   os().SetCurrentInstruction(kVdup, kFpNeon);
   4739   os() << ToCString(kVdup) << ConditionPrinter(it_block_, cond) << dt << " "
   4740        << rd << ", " << rt;
   4741 }
   4742 
   4743 void Disassembler::vdup(Condition cond,
   4744                         DataType dt,
   4745                         DRegister rd,
   4746                         Register rt) {
   4747   os().SetCurrentInstruction(kVdup, kFpNeon);
   4748   os() << ToCString(kVdup) << ConditionPrinter(it_block_, cond) << dt << " "
   4749        << rd << ", " << rt;
   4750 }
   4751 
   4752 void Disassembler::vdup(Condition cond,
   4753                         DataType dt,
   4754                         DRegister rd,
   4755                         DRegisterLane rm) {
   4756   os().SetCurrentInstruction(kVdup, kFpNeon);
   4757   os() << ToCString(kVdup) << ConditionPrinter(it_block_, cond) << dt << " "
   4758        << rd << ", " << rm;
   4759 }
   4760 
   4761 void Disassembler::vdup(Condition cond,
   4762                         DataType dt,
   4763                         QRegister rd,
   4764                         DRegisterLane rm) {
   4765   os().SetCurrentInstruction(kVdup, kFpNeon);
   4766   os() << ToCString(kVdup) << ConditionPrinter(it_block_, cond) << dt << " "
   4767        << rd << ", " << rm;
   4768 }
   4769 
   4770 void Disassembler::veor(
   4771     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   4772   os().SetCurrentInstruction(kVeor, kFpNeon);
   4773   os() << ToCString(kVeor) << ConditionPrinter(it_block_, cond) << dt;
   4774   os() << " ";
   4775   if (!rd.Is(rn)) {
   4776     os() << rd << ", ";
   4777   }
   4778   os() << rn << ", " << rm;
   4779 }
   4780 
   4781 void Disassembler::veor(
   4782     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   4783   os().SetCurrentInstruction(kVeor, kFpNeon);
   4784   os() << ToCString(kVeor) << ConditionPrinter(it_block_, cond) << dt;
   4785   os() << " ";
   4786   if (!rd.Is(rn)) {
   4787     os() << rd << ", ";
   4788   }
   4789   os() << rn << ", " << rm;
   4790 }
   4791 
   4792 void Disassembler::vext(Condition cond,
   4793                         DataType dt,
   4794                         DRegister rd,
   4795                         DRegister rn,
   4796                         DRegister rm,
   4797                         const DOperand& operand) {
   4798   os().SetCurrentInstruction(kVext, kFpNeon);
   4799   os() << ToCString(kVext) << ConditionPrinter(it_block_, cond) << dt;
   4800   os() << " ";
   4801   if (!rd.Is(rn)) {
   4802     os() << rd << ", ";
   4803   }
   4804   os() << rn << ", " << rm << ", " << operand;
   4805 }
   4806 
   4807 void Disassembler::vext(Condition cond,
   4808                         DataType dt,
   4809                         QRegister rd,
   4810                         QRegister rn,
   4811                         QRegister rm,
   4812                         const QOperand& operand) {
   4813   os().SetCurrentInstruction(kVext, kFpNeon);
   4814   os() << ToCString(kVext) << ConditionPrinter(it_block_, cond) << dt;
   4815   os() << " ";
   4816   if (!rd.Is(rn)) {
   4817     os() << rd << ", ";
   4818   }
   4819   os() << rn << ", " << rm << ", " << operand;
   4820 }
   4821 
   4822 void Disassembler::vfma(
   4823     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   4824   os().SetCurrentInstruction(kVfma, kFpNeon);
   4825   os() << ToCString(kVfma) << ConditionPrinter(it_block_, cond) << dt << " "
   4826        << rd << ", " << rn << ", " << rm;
   4827 }
   4828 
   4829 void Disassembler::vfma(
   4830     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   4831   os().SetCurrentInstruction(kVfma, kFpNeon);
   4832   os() << ToCString(kVfma) << ConditionPrinter(it_block_, cond) << dt << " "
   4833        << rd << ", " << rn << ", " << rm;
   4834 }
   4835 
   4836 void Disassembler::vfma(
   4837     Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
   4838   os().SetCurrentInstruction(kVfma, kFpNeon);
   4839   os() << ToCString(kVfma) << ConditionPrinter(it_block_, cond) << dt << " "
   4840        << rd << ", " << rn << ", " << rm;
   4841 }
   4842 
   4843 void Disassembler::vfms(
   4844     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   4845   os().SetCurrentInstruction(kVfms, kFpNeon);
   4846   os() << ToCString(kVfms) << ConditionPrinter(it_block_, cond) << dt << " "
   4847        << rd << ", " << rn << ", " << rm;
   4848 }
   4849 
   4850 void Disassembler::vfms(
   4851     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   4852   os().SetCurrentInstruction(kVfms, kFpNeon);
   4853   os() << ToCString(kVfms) << ConditionPrinter(it_block_, cond) << dt << " "
   4854        << rd << ", " << rn << ", " << rm;
   4855 }
   4856 
   4857 void Disassembler::vfms(
   4858     Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
   4859   os().SetCurrentInstruction(kVfms, kFpNeon);
   4860   os() << ToCString(kVfms) << ConditionPrinter(it_block_, cond) << dt << " "
   4861        << rd << ", " << rn << ", " << rm;
   4862 }
   4863 
   4864 void Disassembler::vfnma(
   4865     Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
   4866   os().SetCurrentInstruction(kVfnma, kFpNeon);
   4867   os() << ToCString(kVfnma) << ConditionPrinter(it_block_, cond) << dt << " "
   4868        << rd << ", " << rn << ", " << rm;
   4869 }
   4870 
   4871 void Disassembler::vfnma(
   4872     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   4873   os().SetCurrentInstruction(kVfnma, kFpNeon);
   4874   os() << ToCString(kVfnma) << ConditionPrinter(it_block_, cond) << dt << " "
   4875        << rd << ", " << rn << ", " << rm;
   4876 }
   4877 
   4878 void Disassembler::vfnms(
   4879     Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
   4880   os().SetCurrentInstruction(kVfnms, kFpNeon);
   4881   os() << ToCString(kVfnms) << ConditionPrinter(it_block_, cond) << dt << " "
   4882        << rd << ", " << rn << ", " << rm;
   4883 }
   4884 
   4885 void Disassembler::vfnms(
   4886     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   4887   os().SetCurrentInstruction(kVfnms, kFpNeon);
   4888   os() << ToCString(kVfnms) << ConditionPrinter(it_block_, cond) << dt << " "
   4889        << rd << ", " << rn << ", " << rm;
   4890 }
   4891 
   4892 void Disassembler::vhadd(
   4893     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   4894   os().SetCurrentInstruction(kVhadd, kFpNeon);
   4895   os() << ToCString(kVhadd) << ConditionPrinter(it_block_, cond) << dt;
   4896   os() << " ";
   4897   if (!rd.Is(rn)) {
   4898     os() << rd << ", ";
   4899   }
   4900   os() << rn << ", " << rm;
   4901 }
   4902 
   4903 void Disassembler::vhadd(
   4904     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   4905   os().SetCurrentInstruction(kVhadd, kFpNeon);
   4906   os() << ToCString(kVhadd) << ConditionPrinter(it_block_, cond) << dt;
   4907   os() << " ";
   4908   if (!rd.Is(rn)) {
   4909     os() << rd << ", ";
   4910   }
   4911   os() << rn << ", " << rm;
   4912 }
   4913 
   4914 void Disassembler::vhsub(
   4915     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   4916   os().SetCurrentInstruction(kVhsub, kFpNeon);
   4917   os() << ToCString(kVhsub) << ConditionPrinter(it_block_, cond) << dt;
   4918   os() << " ";
   4919   if (!rd.Is(rn)) {
   4920     os() << rd << ", ";
   4921   }
   4922   os() << rn << ", " << rm;
   4923 }
   4924 
   4925 void Disassembler::vhsub(
   4926     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   4927   os().SetCurrentInstruction(kVhsub, kFpNeon);
   4928   os() << ToCString(kVhsub) << ConditionPrinter(it_block_, cond) << dt;
   4929   os() << " ";
   4930   if (!rd.Is(rn)) {
   4931     os() << rd << ", ";
   4932   }
   4933   os() << rn << ", " << rm;
   4934 }
   4935 
   4936 void Disassembler::vld1(Condition cond,
   4937                         DataType dt,
   4938                         const NeonRegisterList& nreglist,
   4939                         const AlignedMemOperand& operand) {
   4940   os().SetCurrentInstruction(kVld1, kFpNeon);
   4941   os() << ToCString(kVld1) << ConditionPrinter(it_block_, cond) << dt << " "
   4942        << nreglist << ", " << PrintAlignedMemOperand(kVld1Location, operand);
   4943 }
   4944 
   4945 void Disassembler::vld2(Condition cond,
   4946                         DataType dt,
   4947                         const NeonRegisterList& nreglist,
   4948                         const AlignedMemOperand& operand) {
   4949   os().SetCurrentInstruction(kVld2, kFpNeon);
   4950   os() << ToCString(kVld2) << ConditionPrinter(it_block_, cond) << dt << " "
   4951        << nreglist << ", " << PrintAlignedMemOperand(kVld2Location, operand);
   4952 }
   4953 
   4954 void Disassembler::vld3(Condition cond,
   4955                         DataType dt,
   4956                         const NeonRegisterList& nreglist,
   4957                         const AlignedMemOperand& operand) {
   4958   os().SetCurrentInstruction(kVld3, kFpNeon);
   4959   os() << ToCString(kVld3) << ConditionPrinter(it_block_, cond) << dt << " "
   4960        << nreglist << ", " << PrintAlignedMemOperand(kVld3Location, operand);
   4961 }
   4962 
   4963 void Disassembler::vld3(Condition cond,
   4964                         DataType dt,
   4965                         const NeonRegisterList& nreglist,
   4966                         const MemOperand& operand) {
   4967   os().SetCurrentInstruction(kVld3, kFpNeon);
   4968   os() << ToCString(kVld3) << ConditionPrinter(it_block_, cond) << dt << " "
   4969        << nreglist << ", " << PrintMemOperand(kVld3Location, operand);
   4970 }
   4971 
   4972 void Disassembler::vld4(Condition cond,
   4973                         DataType dt,
   4974                         const NeonRegisterList& nreglist,
   4975                         const AlignedMemOperand& operand) {
   4976   os().SetCurrentInstruction(kVld4, kFpNeon);
   4977   os() << ToCString(kVld4) << ConditionPrinter(it_block_, cond) << dt << " "
   4978        << nreglist << ", " << PrintAlignedMemOperand(kVld4Location, operand);
   4979 }
   4980 
   4981 void Disassembler::vldm(Condition cond,
   4982                         DataType dt,
   4983                         Register rn,
   4984                         WriteBack write_back,
   4985                         DRegisterList dreglist) {
   4986   os().SetCurrentInstruction(kVldm, kLoadStore | kLoadStoreMultiple | kFpNeon);
   4987   os() << ToCString(kVldm) << ConditionPrinter(it_block_, cond) << dt << " "
   4988        << rn << write_back << ", " << dreglist;
   4989 }
   4990 
   4991 void Disassembler::vldm(Condition cond,
   4992                         DataType dt,
   4993                         Register rn,
   4994                         WriteBack write_back,
   4995                         SRegisterList sreglist) {
   4996   os().SetCurrentInstruction(kVldm, kLoadStore | kLoadStoreMultiple | kFpNeon);
   4997   os() << ToCString(kVldm) << ConditionPrinter(it_block_, cond) << dt << " "
   4998        << rn << write_back << ", " << sreglist;
   4999 }
   5000 
   5001 void Disassembler::vldmdb(Condition cond,
   5002                           DataType dt,
   5003                           Register rn,
   5004                           WriteBack write_back,
   5005                           DRegisterList dreglist) {
   5006   os().SetCurrentInstruction(kVldmdb,
   5007                              kLoadStore | kLoadStoreMultiple | kFpNeon);
   5008   os() << ToCString(kVldmdb) << ConditionPrinter(it_block_, cond) << dt << " "
   5009        << rn << write_back << ", " << dreglist;
   5010 }
   5011 
   5012 void Disassembler::vldmdb(Condition cond,
   5013                           DataType dt,
   5014                           Register rn,
   5015                           WriteBack write_back,
   5016                           SRegisterList sreglist) {
   5017   os().SetCurrentInstruction(kVldmdb,
   5018                              kLoadStore | kLoadStoreMultiple | kFpNeon);
   5019   os() << ToCString(kVldmdb) << ConditionPrinter(it_block_, cond) << dt << " "
   5020        << rn << write_back << ", " << sreglist;
   5021 }
   5022 
   5023 void Disassembler::vldmia(Condition cond,
   5024                           DataType dt,
   5025                           Register rn,
   5026                           WriteBack write_back,
   5027                           DRegisterList dreglist) {
   5028   os().SetCurrentInstruction(kVldmia,
   5029                              kLoadStore | kLoadStoreMultiple | kFpNeon);
   5030   os() << ToCString(kVldmia) << ConditionPrinter(it_block_, cond) << dt << " "
   5031        << rn << write_back << ", " << dreglist;
   5032 }
   5033 
   5034 void Disassembler::vldmia(Condition cond,
   5035                           DataType dt,
   5036                           Register rn,
   5037                           WriteBack write_back,
   5038                           SRegisterList sreglist) {
   5039   os().SetCurrentInstruction(kVldmia,
   5040                              kLoadStore | kLoadStoreMultiple | kFpNeon);
   5041   os() << ToCString(kVldmia) << ConditionPrinter(it_block_, cond) << dt << " "
   5042        << rn << write_back << ", " << sreglist;
   5043 }
   5044 
   5045 void Disassembler::vldr(Condition cond,
   5046                         DataType dt,
   5047                         DRegister rd,
   5048                         Label* label) {
   5049   os().SetCurrentInstruction(kVldr, kFpNeon);
   5050   os() << ToCString(kVldr) << ConditionPrinter(it_block_, cond) << dt << " "
   5051        << rd << ", " << PrintLabel(kLoadDoublePrecisionLocation,
   5052                                    label,
   5053                                    GetCodeAddress() & ~3);
   5054 }
   5055 
   5056 void Disassembler::vldr(Condition cond,
   5057                         DataType dt,
   5058                         DRegister rd,
   5059                         const MemOperand& operand) {
   5060   os().SetCurrentInstruction(kVldr, kFpNeon);
   5061   os() << ToCString(kVldr) << ConditionPrinter(it_block_, cond) << dt << " "
   5062        << rd << ", " << PrintMemOperand(kLoadDoublePrecisionLocation, operand);
   5063 }
   5064 
   5065 void Disassembler::vldr(Condition cond,
   5066                         DataType dt,
   5067                         SRegister rd,
   5068                         Label* label) {
   5069   os().SetCurrentInstruction(kVldr, kFpNeon);
   5070   os() << ToCString(kVldr) << ConditionPrinter(it_block_, cond) << dt << " "
   5071        << rd << ", " << PrintLabel(kLoadSinglePrecisionLocation,
   5072                                    label,
   5073                                    GetCodeAddress() & ~3);
   5074 }
   5075 
   5076 void Disassembler::vldr(Condition cond,
   5077                         DataType dt,
   5078                         SRegister rd,
   5079                         const MemOperand& operand) {
   5080   os().SetCurrentInstruction(kVldr, kFpNeon);
   5081   os() << ToCString(kVldr) << ConditionPrinter(it_block_, cond) << dt << " "
   5082        << rd << ", " << PrintMemOperand(kLoadSinglePrecisionLocation, operand);
   5083 }
   5084 
   5085 void Disassembler::vmax(
   5086     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   5087   os().SetCurrentInstruction(kVmax, kFpNeon);
   5088   os() << ToCString(kVmax) << ConditionPrinter(it_block_, cond) << dt;
   5089   os() << " ";
   5090   if (!rd.Is(rn)) {
   5091     os() << rd << ", ";
   5092   }
   5093   os() << rn << ", " << rm;
   5094 }
   5095 
   5096 void Disassembler::vmax(
   5097     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   5098   os().SetCurrentInstruction(kVmax, kFpNeon);
   5099   os() << ToCString(kVmax) << ConditionPrinter(it_block_, cond) << dt;
   5100   os() << " ";
   5101   if (!rd.Is(rn)) {
   5102     os() << rd << ", ";
   5103   }
   5104   os() << rn << ", " << rm;
   5105 }
   5106 
   5107 void Disassembler::vmaxnm(DataType dt,
   5108                           DRegister rd,
   5109                           DRegister rn,
   5110                           DRegister rm) {
   5111   os().SetCurrentInstruction(kVmaxnm, kFpNeon);
   5112   os() << ToCString(kVmaxnm) << dt << " " << rd << ", " << rn << ", " << rm;
   5113 }
   5114 
   5115 void Disassembler::vmaxnm(DataType dt,
   5116                           QRegister rd,
   5117                           QRegister rn,
   5118                           QRegister rm) {
   5119   os().SetCurrentInstruction(kVmaxnm, kFpNeon);
   5120   os() << ToCString(kVmaxnm) << dt << " " << rd << ", " << rn << ", " << rm;
   5121 }
   5122 
   5123 void Disassembler::vmaxnm(DataType dt,
   5124                           SRegister rd,
   5125                           SRegister rn,
   5126                           SRegister rm) {
   5127   os().SetCurrentInstruction(kVmaxnm, kFpNeon);
   5128   os() << ToCString(kVmaxnm) << dt << " " << rd << ", " << rn << ", " << rm;
   5129 }
   5130 
   5131 void Disassembler::vmin(
   5132     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   5133   os().SetCurrentInstruction(kVmin, kFpNeon);
   5134   os() << ToCString(kVmin) << ConditionPrinter(it_block_, cond) << dt;
   5135   os() << " ";
   5136   if (!rd.Is(rn)) {
   5137     os() << rd << ", ";
   5138   }
   5139   os() << rn << ", " << rm;
   5140 }
   5141 
   5142 void Disassembler::vmin(
   5143     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   5144   os().SetCurrentInstruction(kVmin, kFpNeon);
   5145   os() << ToCString(kVmin) << ConditionPrinter(it_block_, cond) << dt;
   5146   os() << " ";
   5147   if (!rd.Is(rn)) {
   5148     os() << rd << ", ";
   5149   }
   5150   os() << rn << ", " << rm;
   5151 }
   5152 
   5153 void Disassembler::vminnm(DataType dt,
   5154                           DRegister rd,
   5155                           DRegister rn,
   5156                           DRegister rm) {
   5157   os().SetCurrentInstruction(kVminnm, kFpNeon);
   5158   os() << ToCString(kVminnm) << dt << " " << rd << ", " << rn << ", " << rm;
   5159 }
   5160 
   5161 void Disassembler::vminnm(DataType dt,
   5162                           QRegister rd,
   5163                           QRegister rn,
   5164                           QRegister rm) {
   5165   os().SetCurrentInstruction(kVminnm, kFpNeon);
   5166   os() << ToCString(kVminnm) << dt << " " << rd << ", " << rn << ", " << rm;
   5167 }
   5168 
   5169 void Disassembler::vminnm(DataType dt,
   5170                           SRegister rd,
   5171                           SRegister rn,
   5172                           SRegister rm) {
   5173   os().SetCurrentInstruction(kVminnm, kFpNeon);
   5174   os() << ToCString(kVminnm) << dt << " " << rd << ", " << rn << ", " << rm;
   5175 }
   5176 
   5177 void Disassembler::vmla(
   5178     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegisterLane rm) {
   5179   os().SetCurrentInstruction(kVmla, kFpNeon);
   5180   os() << ToCString(kVmla) << ConditionPrinter(it_block_, cond) << dt << " "
   5181        << rd << ", " << rn << ", " << rm;
   5182 }
   5183 
   5184 void Disassembler::vmla(
   5185     Condition cond, DataType dt, QRegister rd, QRegister rn, DRegisterLane rm) {
   5186   os().SetCurrentInstruction(kVmla, kFpNeon);
   5187   os() << ToCString(kVmla) << ConditionPrinter(it_block_, cond) << dt << " "
   5188        << rd << ", " << rn << ", " << rm;
   5189 }
   5190 
   5191 void Disassembler::vmla(
   5192     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   5193   os().SetCurrentInstruction(kVmla, kFpNeon);
   5194   os() << ToCString(kVmla) << ConditionPrinter(it_block_, cond) << dt << " "
   5195        << rd << ", " << rn << ", " << rm;
   5196 }
   5197 
   5198 void Disassembler::vmla(
   5199     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   5200   os().SetCurrentInstruction(kVmla, kFpNeon);
   5201   os() << ToCString(kVmla) << ConditionPrinter(it_block_, cond) << dt << " "
   5202        << rd << ", " << rn << ", " << rm;
   5203 }
   5204 
   5205 void Disassembler::vmla(
   5206     Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
   5207   os().SetCurrentInstruction(kVmla, kFpNeon);
   5208   os() << ToCString(kVmla) << ConditionPrinter(it_block_, cond) << dt << " "
   5209        << rd << ", " << rn << ", " << rm;
   5210 }
   5211 
   5212 void Disassembler::vmlal(
   5213     Condition cond, DataType dt, QRegister rd, DRegister rn, DRegisterLane rm) {
   5214   os().SetCurrentInstruction(kVmlal, kFpNeon);
   5215   os() << ToCString(kVmlal) << ConditionPrinter(it_block_, cond) << dt << " "
   5216        << rd << ", " << rn << ", " << rm;
   5217 }
   5218 
   5219 void Disassembler::vmlal(
   5220     Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
   5221   os().SetCurrentInstruction(kVmlal, kFpNeon);
   5222   os() << ToCString(kVmlal) << ConditionPrinter(it_block_, cond) << dt << " "
   5223        << rd << ", " << rn << ", " << rm;
   5224 }
   5225 
   5226 void Disassembler::vmls(
   5227     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegisterLane rm) {
   5228   os().SetCurrentInstruction(kVmls, kFpNeon);
   5229   os() << ToCString(kVmls) << ConditionPrinter(it_block_, cond) << dt << " "
   5230        << rd << ", " << rn << ", " << rm;
   5231 }
   5232 
   5233 void Disassembler::vmls(
   5234     Condition cond, DataType dt, QRegister rd, QRegister rn, DRegisterLane rm) {
   5235   os().SetCurrentInstruction(kVmls, kFpNeon);
   5236   os() << ToCString(kVmls) << ConditionPrinter(it_block_, cond) << dt << " "
   5237        << rd << ", " << rn << ", " << rm;
   5238 }
   5239 
   5240 void Disassembler::vmls(
   5241     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   5242   os().SetCurrentInstruction(kVmls, kFpNeon);
   5243   os() << ToCString(kVmls) << ConditionPrinter(it_block_, cond) << dt << " "
   5244        << rd << ", " << rn << ", " << rm;
   5245 }
   5246 
   5247 void Disassembler::vmls(
   5248     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   5249   os().SetCurrentInstruction(kVmls, kFpNeon);
   5250   os() << ToCString(kVmls) << ConditionPrinter(it_block_, cond) << dt << " "
   5251        << rd << ", " << rn << ", " << rm;
   5252 }
   5253 
   5254 void Disassembler::vmls(
   5255     Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
   5256   os().SetCurrentInstruction(kVmls, kFpNeon);
   5257   os() << ToCString(kVmls) << ConditionPrinter(it_block_, cond) << dt << " "
   5258        << rd << ", " << rn << ", " << rm;
   5259 }
   5260 
   5261 void Disassembler::vmlsl(
   5262     Condition cond, DataType dt, QRegister rd, DRegister rn, DRegisterLane rm) {
   5263   os().SetCurrentInstruction(kVmlsl, kFpNeon);
   5264   os() << ToCString(kVmlsl) << ConditionPrinter(it_block_, cond) << dt << " "
   5265        << rd << ", " << rn << ", " << rm;
   5266 }
   5267 
   5268 void Disassembler::vmlsl(
   5269     Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
   5270   os().SetCurrentInstruction(kVmlsl, kFpNeon);
   5271   os() << ToCString(kVmlsl) << ConditionPrinter(it_block_, cond) << dt << " "
   5272        << rd << ", " << rn << ", " << rm;
   5273 }
   5274 
   5275 void Disassembler::vmov(Condition cond, Register rt, SRegister rn) {
   5276   os().SetCurrentInstruction(kVmov, kFpNeon);
   5277   os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << " " << rt
   5278        << ", " << rn;
   5279 }
   5280 
   5281 void Disassembler::vmov(Condition cond, SRegister rn, Register rt) {
   5282   os().SetCurrentInstruction(kVmov, kFpNeon);
   5283   os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << " " << rn
   5284        << ", " << rt;
   5285 }
   5286 
   5287 void Disassembler::vmov(Condition cond,
   5288                         Register rt,
   5289                         Register rt2,
   5290                         DRegister rm) {
   5291   os().SetCurrentInstruction(kVmov, kFpNeon);
   5292   os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << " " << rt
   5293        << ", " << rt2 << ", " << rm;
   5294 }
   5295 
   5296 void Disassembler::vmov(Condition cond,
   5297                         DRegister rm,
   5298                         Register rt,
   5299                         Register rt2) {
   5300   os().SetCurrentInstruction(kVmov, kFpNeon);
   5301   os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << " " << rm
   5302        << ", " << rt << ", " << rt2;
   5303 }
   5304 
   5305 void Disassembler::vmov(
   5306     Condition cond, Register rt, Register rt2, SRegister rm, SRegister rm1) {
   5307   os().SetCurrentInstruction(kVmov, kFpNeon);
   5308   os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << " " << rt
   5309        << ", " << rt2 << ", " << rm << ", " << rm1;
   5310 }
   5311 
   5312 void Disassembler::vmov(
   5313     Condition cond, SRegister rm, SRegister rm1, Register rt, Register rt2) {
   5314   os().SetCurrentInstruction(kVmov, kFpNeon);
   5315   os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << " " << rm
   5316        << ", " << rm1 << ", " << rt << ", " << rt2;
   5317 }
   5318 
   5319 void Disassembler::vmov(Condition cond,
   5320                         DataType dt,
   5321                         DRegisterLane rd,
   5322                         Register rt) {
   5323   os().SetCurrentInstruction(kVmov, kFpNeon);
   5324   os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << dt << " "
   5325        << rd << ", " << rt;
   5326 }
   5327 
   5328 void Disassembler::vmov(Condition cond,
   5329                         DataType dt,
   5330                         DRegister rd,
   5331                         const DOperand& operand) {
   5332   os().SetCurrentInstruction(kVmov, kFpNeon);
   5333   os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << dt << " "
   5334        << rd << ", " << operand;
   5335 }
   5336 
   5337 void Disassembler::vmov(Condition cond,
   5338                         DataType dt,
   5339                         QRegister rd,
   5340                         const QOperand& operand) {
   5341   os().SetCurrentInstruction(kVmov, kFpNeon);
   5342   os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << dt << " "
   5343        << rd << ", " << operand;
   5344 }
   5345 
   5346 void Disassembler::vmov(Condition cond,
   5347                         DataType dt,
   5348                         SRegister rd,
   5349                         const SOperand& operand) {
   5350   os().SetCurrentInstruction(kVmov, kFpNeon);
   5351   os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << dt << " "
   5352        << rd << ", " << operand;
   5353 }
   5354 
   5355 void Disassembler::vmov(Condition cond,
   5356                         DataType dt,
   5357                         Register rt,
   5358                         DRegisterLane rn) {
   5359   os().SetCurrentInstruction(kVmov, kFpNeon);
   5360   os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << dt << " "
   5361        << rt << ", " << rn;
   5362 }
   5363 
   5364 void Disassembler::vmovl(Condition cond,
   5365                          DataType dt,
   5366                          QRegister rd,
   5367                          DRegister rm) {
   5368   os().SetCurrentInstruction(kVmovl, kFpNeon);
   5369   os() << ToCString(kVmovl) << ConditionPrinter(it_block_, cond) << dt << " "
   5370        << rd << ", " << rm;
   5371 }
   5372 
   5373 void Disassembler::vmovn(Condition cond,
   5374                          DataType dt,
   5375                          DRegister rd,
   5376                          QRegister rm) {
   5377   os().SetCurrentInstruction(kVmovn, kFpNeon);
   5378   os() << ToCString(kVmovn) << ConditionPrinter(it_block_, cond) << dt << " "
   5379        << rd << ", " << rm;
   5380 }
   5381 
   5382 void Disassembler::vmrs(Condition cond,
   5383                         RegisterOrAPSR_nzcv rt,
   5384                         SpecialFPRegister spec_reg) {
   5385   os().SetCurrentInstruction(kVmrs, kFpNeon);
   5386   os() << ToCString(kVmrs) << ConditionPrinter(it_block_, cond) << " " << rt
   5387        << ", " << spec_reg;
   5388 }
   5389 
   5390 void Disassembler::vmsr(Condition cond,
   5391                         SpecialFPRegister spec_reg,
   5392                         Register rt) {
   5393   os().SetCurrentInstruction(kVmsr, kFpNeon);
   5394   os() << ToCString(kVmsr) << ConditionPrinter(it_block_, cond) << " "
   5395        << spec_reg << ", " << rt;
   5396 }
   5397 
   5398 void Disassembler::vmul(Condition cond,
   5399                         DataType dt,
   5400                         DRegister rd,
   5401                         DRegister rn,
   5402                         DRegister dm,
   5403                         unsigned index) {
   5404   os().SetCurrentInstruction(kVmul, kFpNeon);
   5405   os() << ToCString(kVmul) << ConditionPrinter(it_block_, cond) << dt;
   5406   os() << " ";
   5407   if (!rd.Is(rn)) {
   5408     os() << rd << ", ";
   5409   }
   5410   os() << rn << ", " << dm << "[" << index << "]";
   5411 }
   5412 
   5413 void Disassembler::vmul(Condition cond,
   5414                         DataType dt,
   5415                         QRegister rd,
   5416                         QRegister rn,
   5417                         DRegister dm,
   5418                         unsigned index) {
   5419   os().SetCurrentInstruction(kVmul, kFpNeon);
   5420   os() << ToCString(kVmul) << ConditionPrinter(it_block_, cond) << dt;
   5421   os() << " ";
   5422   if (!rd.Is(rn)) {
   5423     os() << rd << ", ";
   5424   }
   5425   os() << rn << ", " << dm << "[" << index << "]";
   5426 }
   5427 
   5428 void Disassembler::vmul(
   5429     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   5430   os().SetCurrentInstruction(kVmul, kFpNeon);
   5431   os() << ToCString(kVmul) << ConditionPrinter(it_block_, cond) << dt;
   5432   os() << " ";
   5433   if (!rd.Is(rn)) {
   5434     os() << rd << ", ";
   5435   }
   5436   os() << rn << ", " << rm;
   5437 }
   5438 
   5439 void Disassembler::vmul(
   5440     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   5441   os().SetCurrentInstruction(kVmul, kFpNeon);
   5442   os() << ToCString(kVmul) << ConditionPrinter(it_block_, cond) << dt;
   5443   os() << " ";
   5444   if (!rd.Is(rn)) {
   5445     os() << rd << ", ";
   5446   }
   5447   os() << rn << ", " << rm;
   5448 }
   5449 
   5450 void Disassembler::vmul(
   5451     Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
   5452   os().SetCurrentInstruction(kVmul, kFpNeon);
   5453   os() << ToCString(kVmul) << ConditionPrinter(it_block_, cond) << dt;
   5454   os() << " ";
   5455   if (!rd.Is(rn)) {
   5456     os() << rd << ", ";
   5457   }
   5458   os() << rn << ", " << rm;
   5459 }
   5460 
   5461 void Disassembler::vmull(Condition cond,
   5462                          DataType dt,
   5463                          QRegister rd,
   5464                          DRegister rn,
   5465                          DRegister dm,
   5466                          unsigned index) {
   5467   os().SetCurrentInstruction(kVmull, kFpNeon);
   5468   os() << ToCString(kVmull) << ConditionPrinter(it_block_, cond) << dt << " "
   5469        << rd << ", " << rn << ", " << dm << "[" << index << "]";
   5470 }
   5471 
   5472 void Disassembler::vmull(
   5473     Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
   5474   os().SetCurrentInstruction(kVmull, kFpNeon);
   5475   os() << ToCString(kVmull) << ConditionPrinter(it_block_, cond) << dt << " "
   5476        << rd << ", " << rn << ", " << rm;
   5477 }
   5478 
   5479 void Disassembler::vmvn(Condition cond,
   5480                         DataType dt,
   5481                         DRegister rd,
   5482                         const DOperand& operand) {
   5483   os().SetCurrentInstruction(kVmvn, kFpNeon);
   5484   os() << ToCString(kVmvn) << ConditionPrinter(it_block_, cond) << dt << " "
   5485        << rd << ", " << operand;
   5486 }
   5487 
   5488 void Disassembler::vmvn(Condition cond,
   5489                         DataType dt,
   5490                         QRegister rd,
   5491                         const QOperand& operand) {
   5492   os().SetCurrentInstruction(kVmvn, kFpNeon);
   5493   os() << ToCString(kVmvn) << ConditionPrinter(it_block_, cond) << dt << " "
   5494        << rd << ", " << operand;
   5495 }
   5496 
   5497 void Disassembler::vneg(Condition cond,
   5498                         DataType dt,
   5499                         DRegister rd,
   5500                         DRegister rm) {
   5501   os().SetCurrentInstruction(kVneg, kFpNeon);
   5502   os() << ToCString(kVneg) << ConditionPrinter(it_block_, cond) << dt << " "
   5503        << rd << ", " << rm;
   5504 }
   5505 
   5506 void Disassembler::vneg(Condition cond,
   5507                         DataType dt,
   5508                         QRegister rd,
   5509                         QRegister rm) {
   5510   os().SetCurrentInstruction(kVneg, kFpNeon);
   5511   os() << ToCString(kVneg) << ConditionPrinter(it_block_, cond) << dt << " "
   5512        << rd << ", " << rm;
   5513 }
   5514 
   5515 void Disassembler::vneg(Condition cond,
   5516                         DataType dt,
   5517                         SRegister rd,
   5518                         SRegister rm) {
   5519   os().SetCurrentInstruction(kVneg, kFpNeon);
   5520   os() << ToCString(kVneg) << ConditionPrinter(it_block_, cond) << dt << " "
   5521        << rd << ", " << rm;
   5522 }
   5523 
   5524 void Disassembler::vnmla(
   5525     Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
   5526   os().SetCurrentInstruction(kVnmla, kFpNeon);
   5527   os() << ToCString(kVnmla) << ConditionPrinter(it_block_, cond) << dt << " "
   5528        << rd << ", " << rn << ", " << rm;
   5529 }
   5530 
   5531 void Disassembler::vnmla(
   5532     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   5533   os().SetCurrentInstruction(kVnmla, kFpNeon);
   5534   os() << ToCString(kVnmla) << ConditionPrinter(it_block_, cond) << dt << " "
   5535        << rd << ", " << rn << ", " << rm;
   5536 }
   5537 
   5538 void Disassembler::vnmls(
   5539     Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
   5540   os().SetCurrentInstruction(kVnmls, kFpNeon);
   5541   os() << ToCString(kVnmls) << ConditionPrinter(it_block_, cond) << dt << " "
   5542        << rd << ", " << rn << ", " << rm;
   5543 }
   5544 
   5545 void Disassembler::vnmls(
   5546     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   5547   os().SetCurrentInstruction(kVnmls, kFpNeon);
   5548   os() << ToCString(kVnmls) << ConditionPrinter(it_block_, cond) << dt << " "
   5549        << rd << ", " << rn << ", " << rm;
   5550 }
   5551 
   5552 void Disassembler::vnmul(
   5553     Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
   5554   os().SetCurrentInstruction(kVnmul, kFpNeon);
   5555   os() << ToCString(kVnmul) << ConditionPrinter(it_block_, cond) << dt;
   5556   os() << " ";
   5557   if (!rd.Is(rn)) {
   5558     os() << rd << ", ";
   5559   }
   5560   os() << rn << ", " << rm;
   5561 }
   5562 
   5563 void Disassembler::vnmul(
   5564     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   5565   os().SetCurrentInstruction(kVnmul, kFpNeon);
   5566   os() << ToCString(kVnmul) << ConditionPrinter(it_block_, cond) << dt;
   5567   os() << " ";
   5568   if (!rd.Is(rn)) {
   5569     os() << rd << ", ";
   5570   }
   5571   os() << rn << ", " << rm;
   5572 }
   5573 
   5574 void Disassembler::vorn(Condition cond,
   5575                         DataType dt,
   5576                         DRegister rd,
   5577                         DRegister rn,
   5578                         const DOperand& operand) {
   5579   os().SetCurrentInstruction(kVorn, kFpNeon);
   5580   os() << ToCString(kVorn) << ConditionPrinter(it_block_, cond) << dt;
   5581   os() << " ";
   5582   if (!rd.Is(rn)) {
   5583     os() << rd << ", ";
   5584   }
   5585   os() << rn << ", " << operand;
   5586 }
   5587 
   5588 void Disassembler::vorn(Condition cond,
   5589                         DataType dt,
   5590                         QRegister rd,
   5591                         QRegister rn,
   5592                         const QOperand& operand) {
   5593   os().SetCurrentInstruction(kVorn, kFpNeon);
   5594   os() << ToCString(kVorn) << ConditionPrinter(it_block_, cond) << dt;
   5595   os() << " ";
   5596   if (!rd.Is(rn)) {
   5597     os() << rd << ", ";
   5598   }
   5599   os() << rn << ", " << operand;
   5600 }
   5601 
   5602 void Disassembler::vorr(Condition cond,
   5603                         DataType dt,
   5604                         DRegister rd,
   5605                         DRegister rn,
   5606                         const DOperand& operand) {
   5607   os().SetCurrentInstruction(kVorr, kFpNeon);
   5608   os() << ToCString(kVorr) << ConditionPrinter(it_block_, cond) << dt;
   5609   os() << " ";
   5610   if (!rd.Is(rn)) {
   5611     os() << rd << ", ";
   5612   }
   5613   os() << rn << ", " << operand;
   5614 }
   5615 
   5616 void Disassembler::vorr(Condition cond,
   5617                         DataType dt,
   5618                         QRegister rd,
   5619                         QRegister rn,
   5620                         const QOperand& operand) {
   5621   os().SetCurrentInstruction(kVorr, kFpNeon);
   5622   os() << ToCString(kVorr) << ConditionPrinter(it_block_, cond) << dt;
   5623   os() << " ";
   5624   if (!rd.Is(rn)) {
   5625     os() << rd << ", ";
   5626   }
   5627   os() << rn << ", " << operand;
   5628 }
   5629 
   5630 void Disassembler::vpadal(Condition cond,
   5631                           DataType dt,
   5632                           DRegister rd,
   5633                           DRegister rm) {
   5634   os().SetCurrentInstruction(kVpadal, kFpNeon);
   5635   os() << ToCString(kVpadal) << ConditionPrinter(it_block_, cond) << dt << " "
   5636        << rd << ", " << rm;
   5637 }
   5638 
   5639 void Disassembler::vpadal(Condition cond,
   5640                           DataType dt,
   5641                           QRegister rd,
   5642                           QRegister rm) {
   5643   os().SetCurrentInstruction(kVpadal, kFpNeon);
   5644   os() << ToCString(kVpadal) << ConditionPrinter(it_block_, cond) << dt << " "
   5645        << rd << ", " << rm;
   5646 }
   5647 
   5648 void Disassembler::vpadd(
   5649     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   5650   os().SetCurrentInstruction(kVpadd, kFpNeon);
   5651   os() << ToCString(kVpadd) << ConditionPrinter(it_block_, cond) << dt;
   5652   os() << " ";
   5653   if (!rd.Is(rn)) {
   5654     os() << rd << ", ";
   5655   }
   5656   os() << rn << ", " << rm;
   5657 }
   5658 
   5659 void Disassembler::vpaddl(Condition cond,
   5660                           DataType dt,
   5661                           DRegister rd,
   5662                           DRegister rm) {
   5663   os().SetCurrentInstruction(kVpaddl, kFpNeon);
   5664   os() << ToCString(kVpaddl) << ConditionPrinter(it_block_, cond) << dt << " "
   5665        << rd << ", " << rm;
   5666 }
   5667 
   5668 void Disassembler::vpaddl(Condition cond,
   5669                           DataType dt,
   5670                           QRegister rd,
   5671                           QRegister rm) {
   5672   os().SetCurrentInstruction(kVpaddl, kFpNeon);
   5673   os() << ToCString(kVpaddl) << ConditionPrinter(it_block_, cond) << dt << " "
   5674        << rd << ", " << rm;
   5675 }
   5676 
   5677 void Disassembler::vpmax(
   5678     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   5679   os().SetCurrentInstruction(kVpmax, kFpNeon);
   5680   os() << ToCString(kVpmax) << ConditionPrinter(it_block_, cond) << dt;
   5681   os() << " ";
   5682   if (!rd.Is(rn)) {
   5683     os() << rd << ", ";
   5684   }
   5685   os() << rn << ", " << rm;
   5686 }
   5687 
   5688 void Disassembler::vpmin(
   5689     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   5690   os().SetCurrentInstruction(kVpmin, kFpNeon);
   5691   os() << ToCString(kVpmin) << ConditionPrinter(it_block_, cond) << dt;
   5692   os() << " ";
   5693   if (!rd.Is(rn)) {
   5694     os() << rd << ", ";
   5695   }
   5696   os() << rn << ", " << rm;
   5697 }
   5698 
   5699 void Disassembler::vpop(Condition cond, DataType dt, DRegisterList dreglist) {
   5700   os().SetCurrentInstruction(kVpop, kLoadStore | kLoadStoreMultiple | kFpNeon);
   5701   os() << ToCString(kVpop) << ConditionPrinter(it_block_, cond) << dt << " "
   5702        << dreglist;
   5703 }
   5704 
   5705 void Disassembler::vpop(Condition cond, DataType dt, SRegisterList sreglist) {
   5706   os().SetCurrentInstruction(kVpop, kLoadStore | kLoadStoreMultiple | kFpNeon);
   5707   os() << ToCString(kVpop) << ConditionPrinter(it_block_, cond) << dt << " "
   5708        << sreglist;
   5709 }
   5710 
   5711 void Disassembler::vpush(Condition cond, DataType dt, DRegisterList dreglist) {
   5712   os().SetCurrentInstruction(kVpush, kLoadStore | kLoadStoreMultiple | kFpNeon);
   5713   os() << ToCString(kVpush) << ConditionPrinter(it_block_, cond) << dt << " "
   5714        << dreglist;
   5715 }
   5716 
   5717 void Disassembler::vpush(Condition cond, DataType dt, SRegisterList sreglist) {
   5718   os().SetCurrentInstruction(kVpush, kLoadStore | kLoadStoreMultiple | kFpNeon);
   5719   os() << ToCString(kVpush) << ConditionPrinter(it_block_, cond) << dt << " "
   5720        << sreglist;
   5721 }
   5722 
   5723 void Disassembler::vqabs(Condition cond,
   5724                          DataType dt,
   5725                          DRegister rd,
   5726                          DRegister rm) {
   5727   os().SetCurrentInstruction(kVqabs, kFpNeon);
   5728   os() << ToCString(kVqabs) << ConditionPrinter(it_block_, cond) << dt << " "
   5729        << rd << ", " << rm;
   5730 }
   5731 
   5732 void Disassembler::vqabs(Condition cond,
   5733                          DataType dt,
   5734                          QRegister rd,
   5735                          QRegister rm) {
   5736   os().SetCurrentInstruction(kVqabs, kFpNeon);
   5737   os() << ToCString(kVqabs) << ConditionPrinter(it_block_, cond) << dt << " "
   5738        << rd << ", " << rm;
   5739 }
   5740 
   5741 void Disassembler::vqadd(
   5742     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   5743   os().SetCurrentInstruction(kVqadd, kFpNeon);
   5744   os() << ToCString(kVqadd) << ConditionPrinter(it_block_, cond) << dt;
   5745   os() << " ";
   5746   if (!rd.Is(rn)) {
   5747     os() << rd << ", ";
   5748   }
   5749   os() << rn << ", " << rm;
   5750 }
   5751 
   5752 void Disassembler::vqadd(
   5753     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   5754   os().SetCurrentInstruction(kVqadd, kFpNeon);
   5755   os() << ToCString(kVqadd) << ConditionPrinter(it_block_, cond) << dt;
   5756   os() << " ";
   5757   if (!rd.Is(rn)) {
   5758     os() << rd << ", ";
   5759   }
   5760   os() << rn << ", " << rm;
   5761 }
   5762 
   5763 void Disassembler::vqdmlal(
   5764     Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
   5765   os().SetCurrentInstruction(kVqdmlal, kFpNeon);
   5766   os() << ToCString(kVqdmlal) << ConditionPrinter(it_block_, cond) << dt << " "
   5767        << rd << ", " << rn << ", " << rm;
   5768 }
   5769 
   5770 void Disassembler::vqdmlal(Condition cond,
   5771                            DataType dt,
   5772                            QRegister rd,
   5773                            DRegister rn,
   5774                            DRegister dm,
   5775                            unsigned index) {
   5776   os().SetCurrentInstruction(kVqdmlal, kFpNeon);
   5777   os() << ToCString(kVqdmlal) << ConditionPrinter(it_block_, cond) << dt << " "
   5778        << rd << ", " << rn << ", " << dm << "[" << index << "]";
   5779 }
   5780 
   5781 void Disassembler::vqdmlsl(
   5782     Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
   5783   os().SetCurrentInstruction(kVqdmlsl, kFpNeon);
   5784   os() << ToCString(kVqdmlsl) << ConditionPrinter(it_block_, cond) << dt << " "
   5785        << rd << ", " << rn << ", " << rm;
   5786 }
   5787 
   5788 void Disassembler::vqdmlsl(Condition cond,
   5789                            DataType dt,
   5790                            QRegister rd,
   5791                            DRegister rn,
   5792                            DRegister dm,
   5793                            unsigned index) {
   5794   os().SetCurrentInstruction(kVqdmlsl, kFpNeon);
   5795   os() << ToCString(kVqdmlsl) << ConditionPrinter(it_block_, cond) << dt << " "
   5796        << rd << ", " << rn << ", " << dm << "[" << index << "]";
   5797 }
   5798 
   5799 void Disassembler::vqdmulh(
   5800     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   5801   os().SetCurrentInstruction(kVqdmulh, kFpNeon);
   5802   os() << ToCString(kVqdmulh) << ConditionPrinter(it_block_, cond) << dt;
   5803   os() << " ";
   5804   if (!rd.Is(rn)) {
   5805     os() << rd << ", ";
   5806   }
   5807   os() << rn << ", " << rm;
   5808 }
   5809 
   5810 void Disassembler::vqdmulh(
   5811     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   5812   os().SetCurrentInstruction(kVqdmulh, kFpNeon);
   5813   os() << ToCString(kVqdmulh) << ConditionPrinter(it_block_, cond) << dt;
   5814   os() << " ";
   5815   if (!rd.Is(rn)) {
   5816     os() << rd << ", ";
   5817   }
   5818   os() << rn << ", " << rm;
   5819 }
   5820 
   5821 void Disassembler::vqdmulh(
   5822     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegisterLane rm) {
   5823   os().SetCurrentInstruction(kVqdmulh, kFpNeon);
   5824   os() << ToCString(kVqdmulh) << ConditionPrinter(it_block_, cond) << dt;
   5825   os() << " ";
   5826   if (!rd.Is(rn)) {
   5827     os() << rd << ", ";
   5828   }
   5829   os() << rn << ", " << rm;
   5830 }
   5831 
   5832 void Disassembler::vqdmulh(
   5833     Condition cond, DataType dt, QRegister rd, QRegister rn, DRegisterLane rm) {
   5834   os().SetCurrentInstruction(kVqdmulh, kFpNeon);
   5835   os() << ToCString(kVqdmulh) << ConditionPrinter(it_block_, cond) << dt;
   5836   os() << " ";
   5837   if (!rd.Is(rn)) {
   5838     os() << rd << ", ";
   5839   }
   5840   os() << rn << ", " << rm;
   5841 }
   5842 
   5843 void Disassembler::vqdmull(
   5844     Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
   5845   os().SetCurrentInstruction(kVqdmull, kFpNeon);
   5846   os() << ToCString(kVqdmull) << ConditionPrinter(it_block_, cond) << dt << " "
   5847        << rd << ", " << rn << ", " << rm;
   5848 }
   5849 
   5850 void Disassembler::vqdmull(
   5851     Condition cond, DataType dt, QRegister rd, DRegister rn, DRegisterLane rm) {
   5852   os().SetCurrentInstruction(kVqdmull, kFpNeon);
   5853   os() << ToCString(kVqdmull) << ConditionPrinter(it_block_, cond) << dt << " "
   5854        << rd << ", " << rn << ", " << rm;
   5855 }
   5856 
   5857 void Disassembler::vqmovn(Condition cond,
   5858                           DataType dt,
   5859                           DRegister rd,
   5860                           QRegister rm) {
   5861   os().SetCurrentInstruction(kVqmovn, kFpNeon);
   5862   os() << ToCString(kVqmovn) << ConditionPrinter(it_block_, cond) << dt << " "
   5863        << rd << ", " << rm;
   5864 }
   5865 
   5866 void Disassembler::vqmovun(Condition cond,
   5867                            DataType dt,
   5868                            DRegister rd,
   5869                            QRegister rm) {
   5870   os().SetCurrentInstruction(kVqmovun, kFpNeon);
   5871   os() << ToCString(kVqmovun) << ConditionPrinter(it_block_, cond) << dt << " "
   5872        << rd << ", " << rm;
   5873 }
   5874 
   5875 void Disassembler::vqneg(Condition cond,
   5876                          DataType dt,
   5877                          DRegister rd,
   5878                          DRegister rm) {
   5879   os().SetCurrentInstruction(kVqneg, kFpNeon);
   5880   os() << ToCString(kVqneg) << ConditionPrinter(it_block_, cond) << dt << " "
   5881        << rd << ", " << rm;
   5882 }
   5883 
   5884 void Disassembler::vqneg(Condition cond,
   5885                          DataType dt,
   5886                          QRegister rd,
   5887                          QRegister rm) {
   5888   os().SetCurrentInstruction(kVqneg, kFpNeon);
   5889   os() << ToCString(kVqneg) << ConditionPrinter(it_block_, cond) << dt << " "
   5890        << rd << ", " << rm;
   5891 }
   5892 
   5893 void Disassembler::vqrdmulh(
   5894     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   5895   os().SetCurrentInstruction(kVqrdmulh, kFpNeon);
   5896   os() << ToCString(kVqrdmulh) << ConditionPrinter(it_block_, cond) << dt;
   5897   os() << " ";
   5898   if (!rd.Is(rn)) {
   5899     os() << rd << ", ";
   5900   }
   5901   os() << rn << ", " << rm;
   5902 }
   5903 
   5904 void Disassembler::vqrdmulh(
   5905     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   5906   os().SetCurrentInstruction(kVqrdmulh, kFpNeon);
   5907   os() << ToCString(kVqrdmulh) << ConditionPrinter(it_block_, cond) << dt;
   5908   os() << " ";
   5909   if (!rd.Is(rn)) {
   5910     os() << rd << ", ";
   5911   }
   5912   os() << rn << ", " << rm;
   5913 }
   5914 
   5915 void Disassembler::vqrdmulh(
   5916     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegisterLane rm) {
   5917   os().SetCurrentInstruction(kVqrdmulh, kFpNeon);
   5918   os() << ToCString(kVqrdmulh) << ConditionPrinter(it_block_, cond) << dt;
   5919   os() << " ";
   5920   if (!rd.Is(rn)) {
   5921     os() << rd << ", ";
   5922   }
   5923   os() << rn << ", " << rm;
   5924 }
   5925 
   5926 void Disassembler::vqrdmulh(
   5927     Condition cond, DataType dt, QRegister rd, QRegister rn, DRegisterLane rm) {
   5928   os().SetCurrentInstruction(kVqrdmulh, kFpNeon);
   5929   os() << ToCString(kVqrdmulh) << ConditionPrinter(it_block_, cond) << dt;
   5930   os() << " ";
   5931   if (!rd.Is(rn)) {
   5932     os() << rd << ", ";
   5933   }
   5934   os() << rn << ", " << rm;
   5935 }
   5936 
   5937 void Disassembler::vqrshl(
   5938     Condition cond, DataType dt, DRegister rd, DRegister rm, DRegister rn) {
   5939   os().SetCurrentInstruction(kVqrshl, kFpNeon);
   5940   os() << ToCString(kVqrshl) << ConditionPrinter(it_block_, cond) << dt;
   5941   os() << " ";
   5942   if (!rd.Is(rm)) {
   5943     os() << rd << ", ";
   5944   }
   5945   os() << rm << ", " << rn;
   5946 }
   5947 
   5948 void Disassembler::vqrshl(
   5949     Condition cond, DataType dt, QRegister rd, QRegister rm, QRegister rn) {
   5950   os().SetCurrentInstruction(kVqrshl, kFpNeon);
   5951   os() << ToCString(kVqrshl) << ConditionPrinter(it_block_, cond) << dt;
   5952   os() << " ";
   5953   if (!rd.Is(rm)) {
   5954     os() << rd << ", ";
   5955   }
   5956   os() << rm << ", " << rn;
   5957 }
   5958 
   5959 void Disassembler::vqrshrn(Condition cond,
   5960                            DataType dt,
   5961                            DRegister rd,
   5962                            QRegister rm,
   5963                            const QOperand& operand) {
   5964   os().SetCurrentInstruction(kVqrshrn, kFpNeon);
   5965   os() << ToCString(kVqrshrn) << ConditionPrinter(it_block_, cond) << dt << " "
   5966        << rd << ", " << rm << ", " << operand;
   5967 }
   5968 
   5969 void Disassembler::vqrshrun(Condition cond,
   5970                             DataType dt,
   5971                             DRegister rd,
   5972                             QRegister rm,
   5973                             const QOperand& operand) {
   5974   os().SetCurrentInstruction(kVqrshrun, kFpNeon);
   5975   os() << ToCString(kVqrshrun) << ConditionPrinter(it_block_, cond) << dt << " "
   5976        << rd << ", " << rm << ", " << operand;
   5977 }
   5978 
   5979 void Disassembler::vqshl(Condition cond,
   5980                          DataType dt,
   5981                          DRegister rd,
   5982                          DRegister rm,
   5983                          const DOperand& operand) {
   5984   os().SetCurrentInstruction(kVqshl, kFpNeon);
   5985   os() << ToCString(kVqshl) << ConditionPrinter(it_block_, cond) << dt;
   5986   os() << " ";
   5987   if (!rd.Is(rm)) {
   5988     os() << rd << ", ";
   5989   }
   5990   os() << rm << ", " << operand;
   5991 }
   5992 
   5993 void Disassembler::vqshl(Condition cond,
   5994                          DataType dt,
   5995                          QRegister rd,
   5996                          QRegister rm,
   5997                          const QOperand& operand) {
   5998   os().SetCurrentInstruction(kVqshl, kFpNeon);
   5999   os() << ToCString(kVqshl) << ConditionPrinter(it_block_, cond) << dt;
   6000   os() << " ";
   6001   if (!rd.Is(rm)) {
   6002     os() << rd << ", ";
   6003   }
   6004   os() << rm << ", " << operand;
   6005 }
   6006 
   6007 void Disassembler::vqshlu(Condition cond,
   6008                           DataType dt,
   6009                           DRegister rd,
   6010                           DRegister rm,
   6011                           const DOperand& operand) {
   6012   os().SetCurrentInstruction(kVqshlu, kFpNeon);
   6013   os() << ToCString(kVqshlu) << ConditionPrinter(it_block_, cond) << dt;
   6014   os() << " ";
   6015   if (!rd.Is(rm)) {
   6016     os() << rd << ", ";
   6017   }
   6018   os() << rm << ", " << operand;
   6019 }
   6020 
   6021 void Disassembler::vqshlu(Condition cond,
   6022                           DataType dt,
   6023                           QRegister rd,
   6024                           QRegister rm,
   6025                           const QOperand& operand) {
   6026   os().SetCurrentInstruction(kVqshlu, kFpNeon);
   6027   os() << ToCString(kVqshlu) << ConditionPrinter(it_block_, cond) << dt;
   6028   os() << " ";
   6029   if (!rd.Is(rm)) {
   6030     os() << rd << ", ";
   6031   }
   6032   os() << rm << ", " << operand;
   6033 }
   6034 
   6035 void Disassembler::vqshrn(Condition cond,
   6036                           DataType dt,
   6037                           DRegister rd,
   6038                           QRegister rm,
   6039                           const QOperand& operand) {
   6040   os().SetCurrentInstruction(kVqshrn, kFpNeon);
   6041   os() << ToCString(kVqshrn) << ConditionPrinter(it_block_, cond) << dt << " "
   6042        << rd << ", " << rm << ", " << operand;
   6043 }
   6044 
   6045 void Disassembler::vqshrun(Condition cond,
   6046                            DataType dt,
   6047                            DRegister rd,
   6048                            QRegister rm,
   6049                            const QOperand& operand) {
   6050   os().SetCurrentInstruction(kVqshrun, kFpNeon);
   6051   os() << ToCString(kVqshrun) << ConditionPrinter(it_block_, cond) << dt << " "
   6052        << rd << ", " << rm << ", " << operand;
   6053 }
   6054 
   6055 void Disassembler::vqsub(
   6056     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   6057   os().SetCurrentInstruction(kVqsub, kFpNeon);
   6058   os() << ToCString(kVqsub) << ConditionPrinter(it_block_, cond) << dt;
   6059   os() << " ";
   6060   if (!rd.Is(rn)) {
   6061     os() << rd << ", ";
   6062   }
   6063   os() << rn << ", " << rm;
   6064 }
   6065 
   6066 void Disassembler::vqsub(
   6067     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   6068   os().SetCurrentInstruction(kVqsub, kFpNeon);
   6069   os() << ToCString(kVqsub) << ConditionPrinter(it_block_, cond) << dt;
   6070   os() << " ";
   6071   if (!rd.Is(rn)) {
   6072     os() << rd << ", ";
   6073   }
   6074   os() << rn << ", " << rm;
   6075 }
   6076 
   6077 void Disassembler::vraddhn(
   6078     Condition cond, DataType dt, DRegister rd, QRegister rn, QRegister rm) {
   6079   os().SetCurrentInstruction(kVraddhn, kFpNeon);
   6080   os() << ToCString(kVraddhn) << ConditionPrinter(it_block_, cond) << dt << " "
   6081        << rd << ", " << rn << ", " << rm;
   6082 }
   6083 
   6084 void Disassembler::vrecpe(Condition cond,
   6085                           DataType dt,
   6086                           DRegister rd,
   6087                           DRegister rm) {
   6088   os().SetCurrentInstruction(kVrecpe, kFpNeon);
   6089   os() << ToCString(kVrecpe) << ConditionPrinter(it_block_, cond) << dt << " "
   6090        << rd << ", " << rm;
   6091 }
   6092 
   6093 void Disassembler::vrecpe(Condition cond,
   6094                           DataType dt,
   6095                           QRegister rd,
   6096                           QRegister rm) {
   6097   os().SetCurrentInstruction(kVrecpe, kFpNeon);
   6098   os() << ToCString(kVrecpe) << ConditionPrinter(it_block_, cond) << dt << " "
   6099        << rd << ", " << rm;
   6100 }
   6101 
   6102 void Disassembler::vrecps(
   6103     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   6104   os().SetCurrentInstruction(kVrecps, kFpNeon);
   6105   os() << ToCString(kVrecps) << ConditionPrinter(it_block_, cond) << dt;
   6106   os() << " ";
   6107   if (!rd.Is(rn)) {
   6108     os() << rd << ", ";
   6109   }
   6110   os() << rn << ", " << rm;
   6111 }
   6112 
   6113 void Disassembler::vrecps(
   6114     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   6115   os().SetCurrentInstruction(kVrecps, kFpNeon);
   6116   os() << ToCString(kVrecps) << ConditionPrinter(it_block_, cond) << dt;
   6117   os() << " ";
   6118   if (!rd.Is(rn)) {
   6119     os() << rd << ", ";
   6120   }
   6121   os() << rn << ", " << rm;
   6122 }
   6123 
   6124 void Disassembler::vrev16(Condition cond,
   6125                           DataType dt,
   6126                           DRegister rd,
   6127                           DRegister rm) {
   6128   os().SetCurrentInstruction(kVrev16, kFpNeon);
   6129   os() << ToCString(kVrev16) << ConditionPrinter(it_block_, cond) << dt << " "
   6130        << rd << ", " << rm;
   6131 }
   6132 
   6133 void Disassembler::vrev16(Condition cond,
   6134                           DataType dt,
   6135                           QRegister rd,
   6136                           QRegister rm) {
   6137   os().SetCurrentInstruction(kVrev16, kFpNeon);
   6138   os() << ToCString(kVrev16) << ConditionPrinter(it_block_, cond) << dt << " "
   6139        << rd << ", " << rm;
   6140 }
   6141 
   6142 void Disassembler::vrev32(Condition cond,
   6143                           DataType dt,
   6144                           DRegister rd,
   6145                           DRegister rm) {
   6146   os().SetCurrentInstruction(kVrev32, kFpNeon);
   6147   os() << ToCString(kVrev32) << ConditionPrinter(it_block_, cond) << dt << " "
   6148        << rd << ", " << rm;
   6149 }
   6150 
   6151 void Disassembler::vrev32(Condition cond,
   6152                           DataType dt,
   6153                           QRegister rd,
   6154                           QRegister rm) {
   6155   os().SetCurrentInstruction(kVrev32, kFpNeon);
   6156   os() << ToCString(kVrev32) << ConditionPrinter(it_block_, cond) << dt << " "
   6157        << rd << ", " << rm;
   6158 }
   6159 
   6160 void Disassembler::vrev64(Condition cond,
   6161                           DataType dt,
   6162                           DRegister rd,
   6163                           DRegister rm) {
   6164   os().SetCurrentInstruction(kVrev64, kFpNeon);
   6165   os() << ToCString(kVrev64) << ConditionPrinter(it_block_, cond) << dt << " "
   6166        << rd << ", " << rm;
   6167 }
   6168 
   6169 void Disassembler::vrev64(Condition cond,
   6170                           DataType dt,
   6171                           QRegister rd,
   6172                           QRegister rm) {
   6173   os().SetCurrentInstruction(kVrev64, kFpNeon);
   6174   os() << ToCString(kVrev64) << ConditionPrinter(it_block_, cond) << dt << " "
   6175        << rd << ", " << rm;
   6176 }
   6177 
   6178 void Disassembler::vrhadd(
   6179     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   6180   os().SetCurrentInstruction(kVrhadd, kFpNeon);
   6181   os() << ToCString(kVrhadd) << ConditionPrinter(it_block_, cond) << dt;
   6182   os() << " ";
   6183   if (!rd.Is(rn)) {
   6184     os() << rd << ", ";
   6185   }
   6186   os() << rn << ", " << rm;
   6187 }
   6188 
   6189 void Disassembler::vrhadd(
   6190     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   6191   os().SetCurrentInstruction(kVrhadd, kFpNeon);
   6192   os() << ToCString(kVrhadd) << ConditionPrinter(it_block_, cond) << dt;
   6193   os() << " ";
   6194   if (!rd.Is(rn)) {
   6195     os() << rd << ", ";
   6196   }
   6197   os() << rn << ", " << rm;
   6198 }
   6199 
   6200 void Disassembler::vrinta(DataType dt1,
   6201                           DataType dt2,
   6202                           DRegister rd,
   6203                           DRegister rm) {
   6204   os().SetCurrentInstruction(kVrinta, kFpNeon);
   6205   os() << ToCString(kVrinta) << dt1 << dt2 << " " << rd << ", " << rm;
   6206 }
   6207 
   6208 void Disassembler::vrinta(DataType dt1,
   6209                           DataType dt2,
   6210                           QRegister rd,
   6211                           QRegister rm) {
   6212   os().SetCurrentInstruction(kVrinta, kFpNeon);
   6213   os() << ToCString(kVrinta) << dt1 << dt2 << " " << rd << ", " << rm;
   6214 }
   6215 
   6216 void Disassembler::vrinta(DataType dt1,
   6217                           DataType dt2,
   6218                           SRegister rd,
   6219                           SRegister rm) {
   6220   os().SetCurrentInstruction(kVrinta, kFpNeon);
   6221   os() << ToCString(kVrinta) << dt1 << dt2 << " " << rd << ", " << rm;
   6222 }
   6223 
   6224 void Disassembler::vrintm(DataType dt1,
   6225                           DataType dt2,
   6226                           DRegister rd,
   6227                           DRegister rm) {
   6228   os().SetCurrentInstruction(kVrintm, kFpNeon);
   6229   os() << ToCString(kVrintm) << dt1 << dt2 << " " << rd << ", " << rm;
   6230 }
   6231 
   6232 void Disassembler::vrintm(DataType dt1,
   6233                           DataType dt2,
   6234                           QRegister rd,
   6235                           QRegister rm) {
   6236   os().SetCurrentInstruction(kVrintm, kFpNeon);
   6237   os() << ToCString(kVrintm) << dt1 << dt2 << " " << rd << ", " << rm;
   6238 }
   6239 
   6240 void Disassembler::vrintm(DataType dt1,
   6241                           DataType dt2,
   6242                           SRegister rd,
   6243                           SRegister rm) {
   6244   os().SetCurrentInstruction(kVrintm, kFpNeon);
   6245   os() << ToCString(kVrintm) << dt1 << dt2 << " " << rd << ", " << rm;
   6246 }
   6247 
   6248 void Disassembler::vrintn(DataType dt1,
   6249                           DataType dt2,
   6250                           DRegister rd,
   6251                           DRegister rm) {
   6252   os().SetCurrentInstruction(kVrintn, kFpNeon);
   6253   os() << ToCString(kVrintn) << dt1 << dt2 << " " << rd << ", " << rm;
   6254 }
   6255 
   6256 void Disassembler::vrintn(DataType dt1,
   6257                           DataType dt2,
   6258                           QRegister rd,
   6259                           QRegister rm) {
   6260   os().SetCurrentInstruction(kVrintn, kFpNeon);
   6261   os() << ToCString(kVrintn) << dt1 << dt2 << " " << rd << ", " << rm;
   6262 }
   6263 
   6264 void Disassembler::vrintn(DataType dt1,
   6265                           DataType dt2,
   6266                           SRegister rd,
   6267                           SRegister rm) {
   6268   os().SetCurrentInstruction(kVrintn, kFpNeon);
   6269   os() << ToCString(kVrintn) << dt1 << dt2 << " " << rd << ", " << rm;
   6270 }
   6271 
   6272 void Disassembler::vrintp(DataType dt1,
   6273                           DataType dt2,
   6274                           DRegister rd,
   6275                           DRegister rm) {
   6276   os().SetCurrentInstruction(kVrintp, kFpNeon);
   6277   os() << ToCString(kVrintp) << dt1 << dt2 << " " << rd << ", " << rm;
   6278 }
   6279 
   6280 void Disassembler::vrintp(DataType dt1,
   6281                           DataType dt2,
   6282                           QRegister rd,
   6283                           QRegister rm) {
   6284   os().SetCurrentInstruction(kVrintp, kFpNeon);
   6285   os() << ToCString(kVrintp) << dt1 << dt2 << " " << rd << ", " << rm;
   6286 }
   6287 
   6288 void Disassembler::vrintp(DataType dt1,
   6289                           DataType dt2,
   6290                           SRegister rd,
   6291                           SRegister rm) {
   6292   os().SetCurrentInstruction(kVrintp, kFpNeon);
   6293   os() << ToCString(kVrintp) << dt1 << dt2 << " " << rd << ", " << rm;
   6294 }
   6295 
   6296 void Disassembler::vrintr(
   6297     Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
   6298   os().SetCurrentInstruction(kVrintr, kFpNeon);
   6299   os() << ToCString(kVrintr) << ConditionPrinter(it_block_, cond) << dt1 << dt2
   6300        << " " << rd << ", " << rm;
   6301 }
   6302 
   6303 void Disassembler::vrintr(
   6304     Condition cond, DataType dt1, DataType dt2, DRegister rd, DRegister rm) {
   6305   os().SetCurrentInstruction(kVrintr, kFpNeon);
   6306   os() << ToCString(kVrintr) << ConditionPrinter(it_block_, cond) << dt1 << dt2
   6307        << " " << rd << ", " << rm;
   6308 }
   6309 
   6310 void Disassembler::vrintx(
   6311     Condition cond, DataType dt1, DataType dt2, DRegister rd, DRegister rm) {
   6312   os().SetCurrentInstruction(kVrintx, kFpNeon);
   6313   os() << ToCString(kVrintx) << ConditionPrinter(it_block_, cond) << dt1 << dt2
   6314        << " " << rd << ", " << rm;
   6315 }
   6316 
   6317 void Disassembler::vrintx(DataType dt1,
   6318                           DataType dt2,
   6319                           QRegister rd,
   6320                           QRegister rm) {
   6321   os().SetCurrentInstruction(kVrintx, kFpNeon);
   6322   os() << ToCString(kVrintx) << dt1 << dt2 << " " << rd << ", " << rm;
   6323 }
   6324 
   6325 void Disassembler::vrintx(
   6326     Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
   6327   os().SetCurrentInstruction(kVrintx, kFpNeon);
   6328   os() << ToCString(kVrintx) << ConditionPrinter(it_block_, cond) << dt1 << dt2
   6329        << " " << rd << ", " << rm;
   6330 }
   6331 
   6332 void Disassembler::vrintz(
   6333     Condition cond, DataType dt1, DataType dt2, DRegister rd, DRegister rm) {
   6334   os().SetCurrentInstruction(kVrintz, kFpNeon);
   6335   os() << ToCString(kVrintz) << ConditionPrinter(it_block_, cond) << dt1 << dt2
   6336        << " " << rd << ", " << rm;
   6337 }
   6338 
   6339 void Disassembler::vrintz(DataType dt1,
   6340                           DataType dt2,
   6341                           QRegister rd,
   6342                           QRegister rm) {
   6343   os().SetCurrentInstruction(kVrintz, kFpNeon);
   6344   os() << ToCString(kVrintz) << dt1 << dt2 << " " << rd << ", " << rm;
   6345 }
   6346 
   6347 void Disassembler::vrintz(
   6348     Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
   6349   os().SetCurrentInstruction(kVrintz, kFpNeon);
   6350   os() << ToCString(kVrintz) << ConditionPrinter(it_block_, cond) << dt1 << dt2
   6351        << " " << rd << ", " << rm;
   6352 }
   6353 
   6354 void Disassembler::vrshl(
   6355     Condition cond, DataType dt, DRegister rd, DRegister rm, DRegister rn) {
   6356   os().SetCurrentInstruction(kVrshl, kFpNeon);
   6357   os() << ToCString(kVrshl) << ConditionPrinter(it_block_, cond) << dt;
   6358   os() << " ";
   6359   if (!rd.Is(rm)) {
   6360     os() << rd << ", ";
   6361   }
   6362   os() << rm << ", " << rn;
   6363 }
   6364 
   6365 void Disassembler::vrshl(
   6366     Condition cond, DataType dt, QRegister rd, QRegister rm, QRegister rn) {
   6367   os().SetCurrentInstruction(kVrshl, kFpNeon);
   6368   os() << ToCString(kVrshl) << ConditionPrinter(it_block_, cond) << dt;
   6369   os() << " ";
   6370   if (!rd.Is(rm)) {
   6371     os() << rd << ", ";
   6372   }
   6373   os() << rm << ", " << rn;
   6374 }
   6375 
   6376 void Disassembler::vrshr(Condition cond,
   6377                          DataType dt,
   6378                          DRegister rd,
   6379                          DRegister rm,
   6380                          const DOperand& operand) {
   6381   os().SetCurrentInstruction(kVrshr, kFpNeon);
   6382   os() << ToCString(kVrshr) << ConditionPrinter(it_block_, cond) << dt;
   6383   os() << " ";
   6384   if (!rd.Is(rm)) {
   6385     os() << rd << ", ";
   6386   }
   6387   os() << rm << ", " << operand;
   6388 }
   6389 
   6390 void Disassembler::vrshr(Condition cond,
   6391                          DataType dt,
   6392                          QRegister rd,
   6393                          QRegister rm,
   6394                          const QOperand& operand) {
   6395   os().SetCurrentInstruction(kVrshr, kFpNeon);
   6396   os() << ToCString(kVrshr) << ConditionPrinter(it_block_, cond) << dt;
   6397   os() << " ";
   6398   if (!rd.Is(rm)) {
   6399     os() << rd << ", ";
   6400   }
   6401   os() << rm << ", " << operand;
   6402 }
   6403 
   6404 void Disassembler::vrshrn(Condition cond,
   6405                           DataType dt,
   6406                           DRegister rd,
   6407                           QRegister rm,
   6408                           const QOperand& operand) {
   6409   os().SetCurrentInstruction(kVrshrn, kFpNeon);
   6410   os() << ToCString(kVrshrn) << ConditionPrinter(it_block_, cond) << dt << " "
   6411        << rd << ", " << rm << ", " << operand;
   6412 }
   6413 
   6414 void Disassembler::vrsqrte(Condition cond,
   6415                            DataType dt,
   6416                            DRegister rd,
   6417                            DRegister rm) {
   6418   os().SetCurrentInstruction(kVrsqrte, kFpNeon);
   6419   os() << ToCString(kVrsqrte) << ConditionPrinter(it_block_, cond) << dt << " "
   6420        << rd << ", " << rm;
   6421 }
   6422 
   6423 void Disassembler::vrsqrte(Condition cond,
   6424                            DataType dt,
   6425                            QRegister rd,
   6426                            QRegister rm) {
   6427   os().SetCurrentInstruction(kVrsqrte, kFpNeon);
   6428   os() << ToCString(kVrsqrte) << ConditionPrinter(it_block_, cond) << dt << " "
   6429        << rd << ", " << rm;
   6430 }
   6431 
   6432 void Disassembler::vrsqrts(
   6433     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   6434   os().SetCurrentInstruction(kVrsqrts, kFpNeon);
   6435   os() << ToCString(kVrsqrts) << ConditionPrinter(it_block_, cond) << dt;
   6436   os() << " ";
   6437   if (!rd.Is(rn)) {
   6438     os() << rd << ", ";
   6439   }
   6440   os() << rn << ", " << rm;
   6441 }
   6442 
   6443 void Disassembler::vrsqrts(
   6444     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   6445   os().SetCurrentInstruction(kVrsqrts, kFpNeon);
   6446   os() << ToCString(kVrsqrts) << ConditionPrinter(it_block_, cond) << dt;
   6447   os() << " ";
   6448   if (!rd.Is(rn)) {
   6449     os() << rd << ", ";
   6450   }
   6451   os() << rn << ", " << rm;
   6452 }
   6453 
   6454 void Disassembler::vrsra(Condition cond,
   6455                          DataType dt,
   6456                          DRegister rd,
   6457                          DRegister rm,
   6458                          const DOperand& operand) {
   6459   os().SetCurrentInstruction(kVrsra, kFpNeon);
   6460   os() << ToCString(kVrsra) << ConditionPrinter(it_block_, cond) << dt;
   6461   os() << " ";
   6462   if (!rd.Is(rm)) {
   6463     os() << rd << ", ";
   6464   }
   6465   os() << rm << ", " << operand;
   6466 }
   6467 
   6468 void Disassembler::vrsra(Condition cond,
   6469                          DataType dt,
   6470                          QRegister rd,
   6471                          QRegister rm,
   6472                          const QOperand& operand) {
   6473   os().SetCurrentInstruction(kVrsra, kFpNeon);
   6474   os() << ToCString(kVrsra) << ConditionPrinter(it_block_, cond) << dt;
   6475   os() << " ";
   6476   if (!rd.Is(rm)) {
   6477     os() << rd << ", ";
   6478   }
   6479   os() << rm << ", " << operand;
   6480 }
   6481 
   6482 void Disassembler::vrsubhn(
   6483     Condition cond, DataType dt, DRegister rd, QRegister rn, QRegister rm) {
   6484   os().SetCurrentInstruction(kVrsubhn, kFpNeon);
   6485   os() << ToCString(kVrsubhn) << ConditionPrinter(it_block_, cond) << dt << " "
   6486        << rd << ", " << rn << ", " << rm;
   6487 }
   6488 
   6489 void Disassembler::vseleq(DataType dt,
   6490                           DRegister rd,
   6491                           DRegister rn,
   6492                           DRegister rm) {
   6493   os().SetCurrentInstruction(kVseleq, kFpNeon);
   6494   os() << ToCString(kVseleq) << dt << " " << rd << ", " << rn << ", " << rm;
   6495 }
   6496 
   6497 void Disassembler::vseleq(DataType dt,
   6498                           SRegister rd,
   6499                           SRegister rn,
   6500                           SRegister rm) {
   6501   os().SetCurrentInstruction(kVseleq, kFpNeon);
   6502   os() << ToCString(kVseleq) << dt << " " << rd << ", " << rn << ", " << rm;
   6503 }
   6504 
   6505 void Disassembler::vselge(DataType dt,
   6506                           DRegister rd,
   6507                           DRegister rn,
   6508                           DRegister rm) {
   6509   os().SetCurrentInstruction(kVselge, kFpNeon);
   6510   os() << ToCString(kVselge) << dt << " " << rd << ", " << rn << ", " << rm;
   6511 }
   6512 
   6513 void Disassembler::vselge(DataType dt,
   6514                           SRegister rd,
   6515                           SRegister rn,
   6516                           SRegister rm) {
   6517   os().SetCurrentInstruction(kVselge, kFpNeon);
   6518   os() << ToCString(kVselge) << dt << " " << rd << ", " << rn << ", " << rm;
   6519 }
   6520 
   6521 void Disassembler::vselgt(DataType dt,
   6522                           DRegister rd,
   6523                           DRegister rn,
   6524                           DRegister rm) {
   6525   os().SetCurrentInstruction(kVselgt, kFpNeon);
   6526   os() << ToCString(kVselgt) << dt << " " << rd << ", " << rn << ", " << rm;
   6527 }
   6528 
   6529 void Disassembler::vselgt(DataType dt,
   6530                           SRegister rd,
   6531                           SRegister rn,
   6532                           SRegister rm) {
   6533   os().SetCurrentInstruction(kVselgt, kFpNeon);
   6534   os() << ToCString(kVselgt) << dt << " " << rd << ", " << rn << ", " << rm;
   6535 }
   6536 
   6537 void Disassembler::vselvs(DataType dt,
   6538                           DRegister rd,
   6539                           DRegister rn,
   6540                           DRegister rm) {
   6541   os().SetCurrentInstruction(kVselvs, kFpNeon);
   6542   os() << ToCString(kVselvs) << dt << " " << rd << ", " << rn << ", " << rm;
   6543 }
   6544 
   6545 void Disassembler::vselvs(DataType dt,
   6546                           SRegister rd,
   6547                           SRegister rn,
   6548                           SRegister rm) {
   6549   os().SetCurrentInstruction(kVselvs, kFpNeon);
   6550   os() << ToCString(kVselvs) << dt << " " << rd << ", " << rn << ", " << rm;
   6551 }
   6552 
   6553 void Disassembler::vshl(Condition cond,
   6554                         DataType dt,
   6555                         DRegister rd,
   6556                         DRegister rm,
   6557                         const DOperand& operand) {
   6558   os().SetCurrentInstruction(kVshl, kFpNeon);
   6559   os() << ToCString(kVshl) << ConditionPrinter(it_block_, cond) << dt;
   6560   os() << " ";
   6561   if (!rd.Is(rm)) {
   6562     os() << rd << ", ";
   6563   }
   6564   os() << rm << ", " << operand;
   6565 }
   6566 
   6567 void Disassembler::vshl(Condition cond,
   6568                         DataType dt,
   6569                         QRegister rd,
   6570                         QRegister rm,
   6571                         const QOperand& operand) {
   6572   os().SetCurrentInstruction(kVshl, kFpNeon);
   6573   os() << ToCString(kVshl) << ConditionPrinter(it_block_, cond) << dt;
   6574   os() << " ";
   6575   if (!rd.Is(rm)) {
   6576     os() << rd << ", ";
   6577   }
   6578   os() << rm << ", " << operand;
   6579 }
   6580 
   6581 void Disassembler::vshll(Condition cond,
   6582                          DataType dt,
   6583                          QRegister rd,
   6584                          DRegister rm,
   6585                          const DOperand& operand) {
   6586   os().SetCurrentInstruction(kVshll, kFpNeon);
   6587   os() << ToCString(kVshll) << ConditionPrinter(it_block_, cond) << dt << " "
   6588        << rd << ", " << rm << ", " << operand;
   6589 }
   6590 
   6591 void Disassembler::vshr(Condition cond,
   6592                         DataType dt,
   6593                         DRegister rd,
   6594                         DRegister rm,
   6595                         const DOperand& operand) {
   6596   os().SetCurrentInstruction(kVshr, kFpNeon);
   6597   os() << ToCString(kVshr) << ConditionPrinter(it_block_, cond) << dt;
   6598   os() << " ";
   6599   if (!rd.Is(rm)) {
   6600     os() << rd << ", ";
   6601   }
   6602   os() << rm << ", " << operand;
   6603 }
   6604 
   6605 void Disassembler::vshr(Condition cond,
   6606                         DataType dt,
   6607                         QRegister rd,
   6608                         QRegister rm,
   6609                         const QOperand& operand) {
   6610   os().SetCurrentInstruction(kVshr, kFpNeon);
   6611   os() << ToCString(kVshr) << ConditionPrinter(it_block_, cond) << dt;
   6612   os() << " ";
   6613   if (!rd.Is(rm)) {
   6614     os() << rd << ", ";
   6615   }
   6616   os() << rm << ", " << operand;
   6617 }
   6618 
   6619 void Disassembler::vshrn(Condition cond,
   6620                          DataType dt,
   6621                          DRegister rd,
   6622                          QRegister rm,
   6623                          const QOperand& operand) {
   6624   os().SetCurrentInstruction(kVshrn, kFpNeon);
   6625   os() << ToCString(kVshrn) << ConditionPrinter(it_block_, cond) << dt << " "
   6626        << rd << ", " << rm << ", " << operand;
   6627 }
   6628 
   6629 void Disassembler::vsli(Condition cond,
   6630                         DataType dt,
   6631                         DRegister rd,
   6632                         DRegister rm,
   6633                         const DOperand& operand) {
   6634   os().SetCurrentInstruction(kVsli, kFpNeon);
   6635   os() << ToCString(kVsli) << ConditionPrinter(it_block_, cond) << dt;
   6636   os() << " ";
   6637   if (!rd.Is(rm)) {
   6638     os() << rd << ", ";
   6639   }
   6640   os() << rm << ", " << operand;
   6641 }
   6642 
   6643 void Disassembler::vsli(Condition cond,
   6644                         DataType dt,
   6645                         QRegister rd,
   6646                         QRegister rm,
   6647                         const QOperand& operand) {
   6648   os().SetCurrentInstruction(kVsli, kFpNeon);
   6649   os() << ToCString(kVsli) << ConditionPrinter(it_block_, cond) << dt;
   6650   os() << " ";
   6651   if (!rd.Is(rm)) {
   6652     os() << rd << ", ";
   6653   }
   6654   os() << rm << ", " << operand;
   6655 }
   6656 
   6657 void Disassembler::vsqrt(Condition cond,
   6658                          DataType dt,
   6659                          SRegister rd,
   6660                          SRegister rm) {
   6661   os().SetCurrentInstruction(kVsqrt, kFpNeon);
   6662   os() << ToCString(kVsqrt) << ConditionPrinter(it_block_, cond) << dt << " "
   6663        << rd << ", " << rm;
   6664 }
   6665 
   6666 void Disassembler::vsqrt(Condition cond,
   6667                          DataType dt,
   6668                          DRegister rd,
   6669                          DRegister rm) {
   6670   os().SetCurrentInstruction(kVsqrt, kFpNeon);
   6671   os() << ToCString(kVsqrt) << ConditionPrinter(it_block_, cond) << dt << " "
   6672        << rd << ", " << rm;
   6673 }
   6674 
   6675 void Disassembler::vsra(Condition cond,
   6676                         DataType dt,
   6677                         DRegister rd,
   6678                         DRegister rm,
   6679                         const DOperand& operand) {
   6680   os().SetCurrentInstruction(kVsra, kFpNeon);
   6681   os() << ToCString(kVsra) << ConditionPrinter(it_block_, cond) << dt;
   6682   os() << " ";
   6683   if (!rd.Is(rm)) {
   6684     os() << rd << ", ";
   6685   }
   6686   os() << rm << ", " << operand;
   6687 }
   6688 
   6689 void Disassembler::vsra(Condition cond,
   6690                         DataType dt,
   6691                         QRegister rd,
   6692                         QRegister rm,
   6693                         const QOperand& operand) {
   6694   os().SetCurrentInstruction(kVsra, kFpNeon);
   6695   os() << ToCString(kVsra) << ConditionPrinter(it_block_, cond) << dt;
   6696   os() << " ";
   6697   if (!rd.Is(rm)) {
   6698     os() << rd << ", ";
   6699   }
   6700   os() << rm << ", " << operand;
   6701 }
   6702 
   6703 void Disassembler::vsri(Condition cond,
   6704                         DataType dt,
   6705                         DRegister rd,
   6706                         DRegister rm,
   6707                         const DOperand& operand) {
   6708   os().SetCurrentInstruction(kVsri, kFpNeon);
   6709   os() << ToCString(kVsri) << ConditionPrinter(it_block_, cond) << dt;
   6710   os() << " ";
   6711   if (!rd.Is(rm)) {
   6712     os() << rd << ", ";
   6713   }
   6714   os() << rm << ", " << operand;
   6715 }
   6716 
   6717 void Disassembler::vsri(Condition cond,
   6718                         DataType dt,
   6719                         QRegister rd,
   6720                         QRegister rm,
   6721                         const QOperand& operand) {
   6722   os().SetCurrentInstruction(kVsri, kFpNeon);
   6723   os() << ToCString(kVsri) << ConditionPrinter(it_block_, cond) << dt;
   6724   os() << " ";
   6725   if (!rd.Is(rm)) {
   6726     os() << rd << ", ";
   6727   }
   6728   os() << rm << ", " << operand;
   6729 }
   6730 
   6731 void Disassembler::vst1(Condition cond,
   6732                         DataType dt,
   6733                         const NeonRegisterList& nreglist,
   6734                         const AlignedMemOperand& operand) {
   6735   os().SetCurrentInstruction(kVst1, kFpNeon);
   6736   os() << ToCString(kVst1) << ConditionPrinter(it_block_, cond) << dt << " "
   6737        << nreglist << ", " << PrintAlignedMemOperand(kVst1Location, operand);
   6738 }
   6739 
   6740 void Disassembler::vst2(Condition cond,
   6741                         DataType dt,
   6742                         const NeonRegisterList& nreglist,
   6743                         const AlignedMemOperand& operand) {
   6744   os().SetCurrentInstruction(kVst2, kFpNeon);
   6745   os() << ToCString(kVst2) << ConditionPrinter(it_block_, cond) << dt << " "
   6746        << nreglist << ", " << PrintAlignedMemOperand(kVst2Location, operand);
   6747 }
   6748 
   6749 void Disassembler::vst3(Condition cond,
   6750                         DataType dt,
   6751                         const NeonRegisterList& nreglist,
   6752                         const AlignedMemOperand& operand) {
   6753   os().SetCurrentInstruction(kVst3, kFpNeon);
   6754   os() << ToCString(kVst3) << ConditionPrinter(it_block_, cond) << dt << " "
   6755        << nreglist << ", " << PrintAlignedMemOperand(kVst3Location, operand);
   6756 }
   6757 
   6758 void Disassembler::vst3(Condition cond,
   6759                         DataType dt,
   6760                         const NeonRegisterList& nreglist,
   6761                         const MemOperand& operand) {
   6762   os().SetCurrentInstruction(kVst3, kFpNeon);
   6763   os() << ToCString(kVst3) << ConditionPrinter(it_block_, cond) << dt << " "
   6764        << nreglist << ", " << PrintMemOperand(kVst3Location, operand);
   6765 }
   6766 
   6767 void Disassembler::vst4(Condition cond,
   6768                         DataType dt,
   6769                         const NeonRegisterList& nreglist,
   6770                         const AlignedMemOperand& operand) {
   6771   os().SetCurrentInstruction(kVst4, kFpNeon);
   6772   os() << ToCString(kVst4) << ConditionPrinter(it_block_, cond) << dt << " "
   6773        << nreglist << ", " << PrintAlignedMemOperand(kVst4Location, operand);
   6774 }
   6775 
   6776 void Disassembler::vstm(Condition cond,
   6777                         DataType dt,
   6778                         Register rn,
   6779                         WriteBack write_back,
   6780                         DRegisterList dreglist) {
   6781   os().SetCurrentInstruction(kVstm, kLoadStore | kLoadStoreMultiple | kFpNeon);
   6782   os() << ToCString(kVstm) << ConditionPrinter(it_block_, cond) << dt << " "
   6783        << rn << write_back << ", " << dreglist;
   6784 }
   6785 
   6786 void Disassembler::vstm(Condition cond,
   6787                         DataType dt,
   6788                         Register rn,
   6789                         WriteBack write_back,
   6790                         SRegisterList sreglist) {
   6791   os().SetCurrentInstruction(kVstm, kLoadStore | kLoadStoreMultiple | kFpNeon);
   6792   os() << ToCString(kVstm) << ConditionPrinter(it_block_, cond) << dt << " "
   6793        << rn << write_back << ", " << sreglist;
   6794 }
   6795 
   6796 void Disassembler::vstmdb(Condition cond,
   6797                           DataType dt,
   6798                           Register rn,
   6799                           WriteBack write_back,
   6800                           DRegisterList dreglist) {
   6801   os().SetCurrentInstruction(kVstmdb,
   6802                              kLoadStore | kLoadStoreMultiple | kFpNeon);
   6803   os() << ToCString(kVstmdb) << ConditionPrinter(it_block_, cond) << dt << " "
   6804        << rn << write_back << ", " << dreglist;
   6805 }
   6806 
   6807 void Disassembler::vstmdb(Condition cond,
   6808                           DataType dt,
   6809                           Register rn,
   6810                           WriteBack write_back,
   6811                           SRegisterList sreglist) {
   6812   os().SetCurrentInstruction(kVstmdb,
   6813                              kLoadStore | kLoadStoreMultiple | kFpNeon);
   6814   os() << ToCString(kVstmdb) << ConditionPrinter(it_block_, cond) << dt << " "
   6815        << rn << write_back << ", " << sreglist;
   6816 }
   6817 
   6818 void Disassembler::vstmia(Condition cond,
   6819                           DataType dt,
   6820                           Register rn,
   6821                           WriteBack write_back,
   6822                           DRegisterList dreglist) {
   6823   os().SetCurrentInstruction(kVstmia,
   6824                              kLoadStore | kLoadStoreMultiple | kFpNeon);
   6825   os() << ToCString(kVstmia) << ConditionPrinter(it_block_, cond) << dt << " "
   6826        << rn << write_back << ", " << dreglist;
   6827 }
   6828 
   6829 void Disassembler::vstmia(Condition cond,
   6830                           DataType dt,
   6831                           Register rn,
   6832                           WriteBack write_back,
   6833                           SRegisterList sreglist) {
   6834   os().SetCurrentInstruction(kVstmia,
   6835                              kLoadStore | kLoadStoreMultiple | kFpNeon);
   6836   os() << ToCString(kVstmia) << ConditionPrinter(it_block_, cond) << dt << " "
   6837        << rn << write_back << ", " << sreglist;
   6838 }
   6839 
   6840 void Disassembler::vstr(Condition cond,
   6841                         DataType dt,
   6842                         DRegister rd,
   6843                         const MemOperand& operand) {
   6844   os().SetCurrentInstruction(kVstr, kFpNeon);
   6845   os() << ToCString(kVstr) << ConditionPrinter(it_block_, cond) << dt << " "
   6846        << rd << ", " << PrintMemOperand(kStoreDoublePrecisionLocation, operand);
   6847 }
   6848 
   6849 void Disassembler::vstr(Condition cond,
   6850                         DataType dt,
   6851                         SRegister rd,
   6852                         const MemOperand& operand) {
   6853   os().SetCurrentInstruction(kVstr, kFpNeon);
   6854   os() << ToCString(kVstr) << ConditionPrinter(it_block_, cond) << dt << " "
   6855        << rd << ", " << PrintMemOperand(kStoreSinglePrecisionLocation, operand);
   6856 }
   6857 
   6858 void Disassembler::vsub(
   6859     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   6860   os().SetCurrentInstruction(kVsub, kFpNeon);
   6861   os() << ToCString(kVsub) << ConditionPrinter(it_block_, cond) << dt;
   6862   os() << " ";
   6863   if (!rd.Is(rn)) {
   6864     os() << rd << ", ";
   6865   }
   6866   os() << rn << ", " << rm;
   6867 }
   6868 
   6869 void Disassembler::vsub(
   6870     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   6871   os().SetCurrentInstruction(kVsub, kFpNeon);
   6872   os() << ToCString(kVsub) << ConditionPrinter(it_block_, cond) << dt;
   6873   os() << " ";
   6874   if (!rd.Is(rn)) {
   6875     os() << rd << ", ";
   6876   }
   6877   os() << rn << ", " << rm;
   6878 }
   6879 
   6880 void Disassembler::vsub(
   6881     Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
   6882   os().SetCurrentInstruction(kVsub, kFpNeon);
   6883   os() << ToCString(kVsub) << ConditionPrinter(it_block_, cond) << dt;
   6884   os() << " ";
   6885   if (!rd.Is(rn)) {
   6886     os() << rd << ", ";
   6887   }
   6888   os() << rn << ", " << rm;
   6889 }
   6890 
   6891 void Disassembler::vsubhn(
   6892     Condition cond, DataType dt, DRegister rd, QRegister rn, QRegister rm) {
   6893   os().SetCurrentInstruction(kVsubhn, kFpNeon);
   6894   os() << ToCString(kVsubhn) << ConditionPrinter(it_block_, cond) << dt << " "
   6895        << rd << ", " << rn << ", " << rm;
   6896 }
   6897 
   6898 void Disassembler::vsubl(
   6899     Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
   6900   os().SetCurrentInstruction(kVsubl, kFpNeon);
   6901   os() << ToCString(kVsubl) << ConditionPrinter(it_block_, cond) << dt << " "
   6902        << rd << ", " << rn << ", " << rm;
   6903 }
   6904 
   6905 void Disassembler::vsubw(
   6906     Condition cond, DataType dt, QRegister rd, QRegister rn, DRegister rm) {
   6907   os().SetCurrentInstruction(kVsubw, kFpNeon);
   6908   os() << ToCString(kVsubw) << ConditionPrinter(it_block_, cond) << dt;
   6909   os() << " ";
   6910   if (!rd.Is(rn)) {
   6911     os() << rd << ", ";
   6912   }
   6913   os() << rn << ", " << rm;
   6914 }
   6915 
   6916 void Disassembler::vswp(Condition cond,
   6917                         DataType dt,
   6918                         DRegister rd,
   6919                         DRegister rm) {
   6920   os().SetCurrentInstruction(kVswp, kFpNeon);
   6921   os() << ToCString(kVswp) << ConditionPrinter(it_block_, cond) << dt << " "
   6922        << rd << ", " << rm;
   6923 }
   6924 
   6925 void Disassembler::vswp(Condition cond,
   6926                         DataType dt,
   6927                         QRegister rd,
   6928                         QRegister rm) {
   6929   os().SetCurrentInstruction(kVswp, kFpNeon);
   6930   os() << ToCString(kVswp) << ConditionPrinter(it_block_, cond) << dt << " "
   6931        << rd << ", " << rm;
   6932 }
   6933 
   6934 void Disassembler::vtbl(Condition cond,
   6935                         DataType dt,
   6936                         DRegister rd,
   6937                         const NeonRegisterList& nreglist,
   6938                         DRegister rm) {
   6939   os().SetCurrentInstruction(kVtbl, kFpNeon);
   6940   os() << ToCString(kVtbl) << ConditionPrinter(it_block_, cond) << dt << " "
   6941        << rd << ", " << nreglist << ", " << rm;
   6942 }
   6943 
   6944 void Disassembler::vtbx(Condition cond,
   6945                         DataType dt,
   6946                         DRegister rd,
   6947                         const NeonRegisterList& nreglist,
   6948                         DRegister rm) {
   6949   os().SetCurrentInstruction(kVtbx, kFpNeon);
   6950   os() << ToCString(kVtbx) << ConditionPrinter(it_block_, cond) << dt << " "
   6951        << rd << ", " << nreglist << ", " << rm;
   6952 }
   6953 
   6954 void Disassembler::vtrn(Condition cond,
   6955                         DataType dt,
   6956                         DRegister rd,
   6957                         DRegister rm) {
   6958   os().SetCurrentInstruction(kVtrn, kFpNeon);
   6959   os() << ToCString(kVtrn) << ConditionPrinter(it_block_, cond) << dt << " "
   6960        << rd << ", " << rm;
   6961 }
   6962 
   6963 void Disassembler::vtrn(Condition cond,
   6964                         DataType dt,
   6965                         QRegister rd,
   6966                         QRegister rm) {
   6967   os().SetCurrentInstruction(kVtrn, kFpNeon);
   6968   os() << ToCString(kVtrn) << ConditionPrinter(it_block_, cond) << dt << " "
   6969        << rd << ", " << rm;
   6970 }
   6971 
   6972 void Disassembler::vtst(
   6973     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   6974   os().SetCurrentInstruction(kVtst, kFpNeon);
   6975   os() << ToCString(kVtst) << ConditionPrinter(it_block_, cond) << dt;
   6976   os() << " ";
   6977   if (!rd.Is(rn)) {
   6978     os() << rd << ", ";
   6979   }
   6980   os() << rn << ", " << rm;
   6981 }
   6982 
   6983 void Disassembler::vtst(
   6984     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   6985   os().SetCurrentInstruction(kVtst, kFpNeon);
   6986   os() << ToCString(kVtst) << ConditionPrinter(it_block_, cond) << dt;
   6987   os() << " ";
   6988   if (!rd.Is(rn)) {
   6989     os() << rd << ", ";
   6990   }
   6991   os() << rn << ", " << rm;
   6992 }
   6993 
   6994 void Disassembler::vuzp(Condition cond,
   6995                         DataType dt,
   6996                         DRegister rd,
   6997                         DRegister rm) {
   6998   os().SetCurrentInstruction(kVuzp, kFpNeon);
   6999   os() << ToCString(kVuzp) << ConditionPrinter(it_block_, cond) << dt << " "
   7000        << rd << ", " << rm;
   7001 }
   7002 
   7003 void Disassembler::vuzp(Condition cond,
   7004                         DataType dt,
   7005                         QRegister rd,
   7006                         QRegister rm) {
   7007   os().SetCurrentInstruction(kVuzp, kFpNeon);
   7008   os() << ToCString(kVuzp) << ConditionPrinter(it_block_, cond) << dt << " "
   7009        << rd << ", " << rm;
   7010 }
   7011 
   7012 void Disassembler::vzip(Condition cond,
   7013                         DataType dt,
   7014                         DRegister rd,
   7015                         DRegister rm) {
   7016   os().SetCurrentInstruction(kVzip, kFpNeon);
   7017   os() << ToCString(kVzip) << ConditionPrinter(it_block_, cond) << dt << " "
   7018        << rd << ", " << rm;
   7019 }
   7020 
   7021 void Disassembler::vzip(Condition cond,
   7022                         DataType dt,
   7023                         QRegister rd,
   7024                         QRegister rm) {
   7025   os().SetCurrentInstruction(kVzip, kFpNeon);
   7026   os() << ToCString(kVzip) << ConditionPrinter(it_block_, cond) << dt << " "
   7027        << rd << ", " << rm;
   7028 }
   7029 
   7030 void Disassembler::yield(Condition cond, EncodingSize size) {
   7031   os().SetCurrentInstruction(kYield, kNoAttribute);
   7032   os() << ToCString(kYield) << ConditionPrinter(it_block_, cond) << size;
   7033 }
   7034 
   7035 int Disassembler::T32Size(uint32_t instr) {
   7036   if ((instr & 0xe0000000) == 0xe0000000) {
   7037     switch (instr & 0x08000000) {
   7038       case 0x00000000:
   7039         if ((instr & 0x10000000) == 0x10000000) return 4;
   7040         return 2;
   7041       case 0x08000000:
   7042         return 4;
   7043       default:
   7044         return 2;
   7045     }
   7046   }
   7047   return 2;
   7048 }
   7049 
   7050 void Disassembler::DecodeT32(uint32_t instr) {
   7051   T32CodeAddressIncrementer incrementer(instr, &code_address_);
   7052   ITBlockScope it_scope(&it_block_);
   7053 
   7054   switch (instr & 0xe0000000) {
   7055     case 0x00000000: {
   7056       // 0x00000000
   7057       switch (instr & 0x18000000) {
   7058         case 0x18000000: {
   7059           // 0x18000000
   7060           switch (instr & 0x06000000) {
   7061             case 0x00000000: {
   7062               // 0x18000000
   7063               unsigned rd = (instr >> 16) & 0x7;
   7064               unsigned rn = (instr >> 19) & 0x7;
   7065               unsigned rm = (instr >> 22) & 0x7;
   7066               if (InITBlock()) {
   7067                 // ADD<c>{<q>} <Rd>, <Rn>, <Rm> ; T1
   7068                 add(CurrentCond(),
   7069                     Best,
   7070                     Register(rd),
   7071                     Register(rn),
   7072                     Register(rm));
   7073               } else {
   7074                 VIXL_ASSERT(OutsideITBlock());
   7075                 // ADDS{<q>} {<Rd>}, <Rn>, <Rm> ; T1
   7076                 adds(Condition::None(),
   7077                      Best,
   7078                      Register(rd),
   7079                      Register(rn),
   7080                      Register(rm));
   7081               }
   7082               break;
   7083             }
   7084             case 0x02000000: {
   7085               // 0x1a000000
   7086               unsigned rd = (instr >> 16) & 0x7;
   7087               unsigned rn = (instr >> 19) & 0x7;
   7088               unsigned rm = (instr >> 22) & 0x7;
   7089               if (InITBlock()) {
   7090                 // SUB<c>{<q>} <Rd>, <Rn>, <Rm> ; T1
   7091                 sub(CurrentCond(),
   7092                     Best,
   7093                     Register(rd),
   7094                     Register(rn),
   7095                     Register(rm));
   7096               } else {
   7097                 VIXL_ASSERT(OutsideITBlock());
   7098                 // SUBS{<q>} {<Rd>}, <Rn>, <Rm> ; T1
   7099                 subs(Condition::None(),
   7100                      Best,
   7101                      Register(rd),
   7102                      Register(rn),
   7103                      Register(rm));
   7104               }
   7105               break;
   7106             }
   7107             case 0x04000000: {
   7108               // 0x1c000000
   7109               unsigned rd = (instr >> 16) & 0x7;
   7110               unsigned rn = (instr >> 19) & 0x7;
   7111               uint32_t imm = (instr >> 22) & 0x7;
   7112               if (InITBlock()) {
   7113                 // ADD<c>{<q>} <Rd>, <Rn>, #<imm3> ; T1
   7114                 add(CurrentCond(), Best, Register(rd), Register(rn), imm);
   7115               } else {
   7116                 VIXL_ASSERT(OutsideITBlock());
   7117                 // ADDS{<q>} <Rd>, <Rn>, #<imm3> ; T1
   7118                 adds(Condition::None(), Best, Register(rd), Register(rn), imm);
   7119               }
   7120               break;
   7121             }
   7122             case 0x06000000: {
   7123               // 0x1e000000
   7124               unsigned rd = (instr >> 16) & 0x7;
   7125               unsigned rn = (instr >> 19) & 0x7;
   7126               uint32_t imm = (instr >> 22) & 0x7;
   7127               if (InITBlock()) {
   7128                 // SUB<c>{<q>} <Rd>, <Rn>, #<imm3> ; T1
   7129                 sub(CurrentCond(), Best, Register(rd), Register(rn), imm);
   7130               } else {
   7131                 VIXL_ASSERT(OutsideITBlock());
   7132                 // SUBS{<q>} <Rd>, <Rn>, #<imm3> ; T1
   7133                 subs(Condition::None(), Best, Register(rd), Register(rn), imm);
   7134               }
   7135               break;
   7136             }
   7137           }
   7138           break;
   7139         }
   7140         default: {
   7141           if (((instr & 0x18000000) == 0x18000000)) {
   7142             UnallocatedT32(instr);
   7143             return;
   7144           }
   7145           if (((Uint32((instr >> 27)) & Uint32(0x3)) == Uint32(0x2)) &&
   7146               InITBlock()) {
   7147             unsigned rd = (instr >> 16) & 0x7;
   7148             unsigned rm = (instr >> 19) & 0x7;
   7149             uint32_t amount = (instr >> 22) & 0x1f;
   7150             if (amount == 0) amount = 32;
   7151             // ASR<c>{<q>} {<Rd>}, <Rm>, #<imm> ; T2
   7152             asr(CurrentCond(), Best, Register(rd), Register(rm), amount);
   7153             return;
   7154           }
   7155           if (((Uint32((instr >> 27)) & Uint32(0x3)) == Uint32(0x2)) &&
   7156               !InITBlock()) {
   7157             unsigned rd = (instr >> 16) & 0x7;
   7158             unsigned rm = (instr >> 19) & 0x7;
   7159             uint32_t amount = (instr >> 22) & 0x1f;
   7160             if (amount == 0) amount = 32;
   7161             // ASRS{<q>} {<Rd>}, <Rm>, #<imm> ; T2
   7162             asrs(Condition::None(), Best, Register(rd), Register(rm), amount);
   7163             return;
   7164           }
   7165           if (((Uint32((instr >> 27)) & Uint32(0x3)) == Uint32(0x0)) &&
   7166               ((instr & 0x07c00000) != 0x00000000) && InITBlock()) {
   7167             unsigned rd = (instr >> 16) & 0x7;
   7168             unsigned rm = (instr >> 19) & 0x7;
   7169             uint32_t amount = (instr >> 22) & 0x1f;
   7170             // LSL<c>{<q>} {<Rd>}, <Rm>, #<imm> ; T2
   7171             lsl(CurrentCond(), Best, Register(rd), Register(rm), amount);
   7172             return;
   7173           }
   7174           if (((Uint32((instr >> 27)) & Uint32(0x3)) == Uint32(0x0)) &&
   7175               ((instr & 0x07c00000) != 0x00000000) && !InITBlock()) {
   7176             unsigned rd = (instr >> 16) & 0x7;
   7177             unsigned rm = (instr >> 19) & 0x7;
   7178             uint32_t amount = (instr >> 22) & 0x1f;
   7179             // LSLS{<q>} {<Rd>}, <Rm>, #<imm> ; T2
   7180             lsls(Condition::None(), Best, Register(rd), Register(rm), amount);
   7181             return;
   7182           }
   7183           if (((Uint32((instr >> 27)) & Uint32(0x3)) == Uint32(0x1)) &&
   7184               InITBlock()) {
   7185             unsigned rd = (instr >> 16) & 0x7;
   7186             unsigned rm = (instr >> 19) & 0x7;
   7187             uint32_t amount = (instr >> 22) & 0x1f;
   7188             if (amount == 0) amount = 32;
   7189             // LSR<c>{<q>} {<Rd>}, <Rm>, #<imm> ; T2
   7190             lsr(CurrentCond(), Best, Register(rd), Register(rm), amount);
   7191             return;
   7192           }
   7193           if (((Uint32((instr >> 27)) & Uint32(0x3)) == Uint32(0x1)) &&
   7194               !InITBlock()) {
   7195             unsigned rd = (instr >> 16) & 0x7;
   7196             unsigned rm = (instr >> 19) & 0x7;
   7197             uint32_t amount = (instr >> 22) & 0x1f;
   7198             if (amount == 0) amount = 32;
   7199             // LSRS{<q>} {<Rd>}, <Rm>, #<imm> ; T2
   7200             lsrs(Condition::None(), Best, Register(rd), Register(rm), amount);
   7201             return;
   7202           }
   7203           unsigned rd = (instr >> 16) & 0x7;
   7204           unsigned rm = (instr >> 19) & 0x7;
   7205           ImmediateShiftOperand shift_operand((instr >> 27) & 0x3,
   7206                                               (instr >> 22) & 0x1f);
   7207           if (InITBlock()) {
   7208             // MOV<c>{<q>} <Rd>, <Rm> {, <shift> #<amount> } ; T2
   7209             mov(CurrentCond(),
   7210                 Best,
   7211                 Register(rd),
   7212                 Operand(Register(rm),
   7213                         shift_operand.GetType(),
   7214                         shift_operand.GetAmount()));
   7215           } else {
   7216             VIXL_ASSERT(OutsideITBlock());
   7217             // MOVS{<q>} <Rd>, <Rm> {, <shift> #<amount> } ; T2
   7218             movs(Condition::None(),
   7219                  Best,
   7220                  Register(rd),
   7221                  Operand(Register(rm),
   7222                          shift_operand.GetType(),
   7223                          shift_operand.GetAmount()));
   7224           }
   7225           break;
   7226         }
   7227       }
   7228       break;
   7229     }
   7230     case 0x20000000: {
   7231       // 0x20000000
   7232       switch (instr & 0x18000000) {
   7233         case 0x00000000: {
   7234           // 0x20000000
   7235           unsigned rd = (instr >> 24) & 0x7;
   7236           uint32_t imm = (instr >> 16) & 0xff;
   7237           if (InITBlock()) {
   7238             // MOV<c>{<q>} <Rd>, #<imm8> ; T1
   7239             mov(CurrentCond(), Best, Register(rd), imm);
   7240           } else {
   7241             VIXL_ASSERT(OutsideITBlock());
   7242             // MOVS{<q>} <Rd>, #<imm8> ; T1
   7243             movs(Condition::None(), Best, Register(rd), imm);
   7244           }
   7245           break;
   7246         }
   7247         case 0x08000000: {
   7248           // 0x28000000
   7249           unsigned rn = (instr >> 24) & 0x7;
   7250           uint32_t imm = (instr >> 16) & 0xff;
   7251           // CMP{<c>}{<q>} <Rn>, #<imm8> ; T1
   7252           cmp(CurrentCond(), Best, Register(rn), imm);
   7253           break;
   7254         }
   7255         case 0x10000000: {
   7256           // 0x30000000
   7257           unsigned rd = (instr >> 24) & 0x7;
   7258           uint32_t imm = (instr >> 16) & 0xff;
   7259           if (InITBlock() && ((imm <= 7))) {
   7260             // ADD<c>{<q>} <Rdn>, #<imm8> ; T2
   7261             add(CurrentCond(), Register(rd), imm);
   7262           } else if (InITBlock() && ((imm > 7))) {
   7263             // ADD<c>{<q>} {<Rdn>}, <Rdn>, #<imm8> ; T2
   7264             add(CurrentCond(), Best, Register(rd), Register(rd), imm);
   7265           } else if (OutsideITBlock() && ((imm <= 7))) {
   7266             // ADDS{<q>} <Rdn>, #<imm8> ; T2
   7267             adds(Register(rd), imm);
   7268           } else {
   7269             VIXL_ASSERT(OutsideITBlock() && ((imm > 7)));
   7270             // ADDS{<q>} {<Rdn>}, <Rdn>, #<imm8> ; T2
   7271             adds(Condition::None(), Best, Register(rd), Register(rd), imm);
   7272           }
   7273           break;
   7274         }
   7275         case 0x18000000: {
   7276           // 0x38000000
   7277           unsigned rd = (instr >> 24) & 0x7;
   7278           uint32_t imm = (instr >> 16) & 0xff;
   7279           if (InITBlock() && ((imm <= 7))) {
   7280             // SUB<c>{<q>} <Rdn>, #<imm8> ; T2
   7281             sub(CurrentCond(), Register(rd), imm);
   7282           } else if (InITBlock() && ((imm > 7))) {
   7283             // SUB<c>{<q>} {<Rdn>}, <Rdn>, #<imm8> ; T2
   7284             sub(CurrentCond(), Best, Register(rd), Register(rd), imm);
   7285           } else if (OutsideITBlock() && ((imm <= 7))) {
   7286             // SUBS{<q>} <Rdn>, #<imm8> ; T2
   7287             subs(Register(rd), imm);
   7288           } else {
   7289             VIXL_ASSERT(OutsideITBlock() && ((imm > 7)));
   7290             // SUBS{<q>} {<Rdn>}, <Rdn>, #<imm8> ; T2
   7291             subs(Condition::None(), Best, Register(rd), Register(rd), imm);
   7292           }
   7293           break;
   7294         }
   7295       }
   7296       break;
   7297     }
   7298     case 0x40000000: {
   7299       // 0x40000000
   7300       switch (instr & 0x18000000) {
   7301         case 0x00000000: {
   7302           // 0x40000000
   7303           switch (instr & 0x07000000) {
   7304             case 0x00000000: {
   7305               // 0x40000000
   7306               switch (instr & 0x00c00000) {
   7307                 case 0x00000000: {
   7308                   // 0x40000000
   7309                   unsigned rd = (instr >> 16) & 0x7;
   7310                   unsigned rm = (instr >> 19) & 0x7;
   7311                   if (InITBlock()) {
   7312                     // AND<c>{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1
   7313                     and_(CurrentCond(),
   7314                          Best,
   7315                          Register(rd),
   7316                          Register(rd),
   7317                          Register(rm));
   7318                   } else {
   7319                     VIXL_ASSERT(OutsideITBlock());
   7320                     // ANDS{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1
   7321                     ands(Condition::None(),
   7322                          Best,
   7323                          Register(rd),
   7324                          Register(rd),
   7325                          Register(rm));
   7326                   }
   7327                   break;
   7328                 }
   7329                 case 0x00400000: {
   7330                   // 0x40400000
   7331                   unsigned rd = (instr >> 16) & 0x7;
   7332                   unsigned rm = (instr >> 19) & 0x7;
   7333                   if (InITBlock()) {
   7334                     // EOR<c>{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1
   7335                     eor(CurrentCond(),
   7336                         Best,
   7337                         Register(rd),
   7338                         Register(rd),
   7339                         Register(rm));
   7340                   } else {
   7341                     VIXL_ASSERT(OutsideITBlock());
   7342                     // EORS{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1
   7343                     eors(Condition::None(),
   7344                          Best,
   7345                          Register(rd),
   7346                          Register(rd),
   7347                          Register(rm));
   7348                   }
   7349                   break;
   7350                 }
   7351                 case 0x00800000: {
   7352                   // 0x40800000
   7353                   if (InITBlock()) {
   7354                     unsigned rd = (instr >> 16) & 0x7;
   7355                     unsigned rs = (instr >> 19) & 0x7;
   7356                     // LSL<c>{<q>} {<Rdm>}, <Rdm>, <Rs> ; T1
   7357                     lsl(CurrentCond(),
   7358                         Best,
   7359                         Register(rd),
   7360                         Register(rd),
   7361                         Register(rs));
   7362                     return;
   7363                   }
   7364                   if (!InITBlock()) {
   7365                     unsigned rd = (instr >> 16) & 0x7;
   7366                     unsigned rs = (instr >> 19) & 0x7;
   7367                     // LSLS{<q>} {<Rdm>}, <Rdm>, <Rs> ; T1
   7368                     lsls(Condition::None(),
   7369                          Best,
   7370                          Register(rd),
   7371                          Register(rd),
   7372                          Register(rs));
   7373                     return;
   7374                   }
   7375                   unsigned rd = (instr >> 16) & 0x7;
   7376                   unsigned rm = (instr >> 16) & 0x7;
   7377                   unsigned rs = (instr >> 19) & 0x7;
   7378                   if (InITBlock()) {
   7379                     // MOV<c>{<q>} <Rdm>, <Rdm>, LSL <Rs> ; T1
   7380                     mov(CurrentCond(),
   7381                         Best,
   7382                         Register(rd),
   7383                         Operand(Register(rm), LSL, Register(rs)));
   7384                   } else {
   7385                     VIXL_ASSERT(OutsideITBlock());
   7386                     // MOVS{<q>} <Rdm>, <Rdm>, LSL <Rs> ; T1
   7387                     movs(Condition::None(),
   7388                          Best,
   7389                          Register(rd),
   7390                          Operand(Register(rm), LSL, Register(rs)));
   7391                   }
   7392                   break;
   7393                 }
   7394                 case 0x00c00000: {
   7395                   // 0x40c00000
   7396                   if (InITBlock()) {
   7397                     unsigned rd = (instr >> 16) & 0x7;
   7398                     unsigned rs = (instr >> 19) & 0x7;
   7399                     // LSR<c>{<q>} {<Rdm>}, <Rdm>, <Rs> ; T1
   7400                     lsr(CurrentCond(),
   7401                         Best,
   7402                         Register(rd),
   7403                         Register(rd),
   7404                         Register(rs));
   7405                     return;
   7406                   }
   7407                   if (!InITBlock()) {
   7408                     unsigned rd = (instr >> 16) & 0x7;
   7409                     unsigned rs = (instr >> 19) & 0x7;
   7410                     // LSRS{<q>} {<Rdm>}, <Rdm>, <Rs> ; T1
   7411                     lsrs(Condition::None(),
   7412                          Best,
   7413                          Register(rd),
   7414                          Register(rd),
   7415                          Register(rs));
   7416                     return;
   7417                   }
   7418                   unsigned rd = (instr >> 16) & 0x7;
   7419                   unsigned rm = (instr >> 16) & 0x7;
   7420                   unsigned rs = (instr >> 19) & 0x7;
   7421                   if (InITBlock()) {
   7422                     // MOV<c>{<q>} <Rdm>, <Rdm>, LSR <Rs> ; T1
   7423                     mov(CurrentCond(),
   7424                         Best,
   7425                         Register(rd),
   7426                         Operand(Register(rm), LSR, Register(rs)));
   7427                   } else {
   7428                     VIXL_ASSERT(OutsideITBlock());
   7429                     // MOVS{<q>} <Rdm>, <Rdm>, LSR <Rs> ; T1
   7430                     movs(Condition::None(),
   7431                          Best,
   7432                          Register(rd),
   7433                          Operand(Register(rm), LSR, Register(rs)));
   7434                   }
   7435                   break;
   7436                 }
   7437               }
   7438               break;
   7439             }
   7440             case 0x01000000: {
   7441               // 0x41000000
   7442               switch (instr & 0x00c00000) {
   7443                 case 0x00000000: {
   7444                   // 0x41000000
   7445                   if (InITBlock()) {
   7446                     unsigned rd = (instr >> 16) & 0x7;
   7447                     unsigned rs = (instr >> 19) & 0x7;
   7448                     // ASR<c>{<q>} {<Rdm>}, <Rdm>, <Rs> ; T1
   7449                     asr(CurrentCond(),
   7450                         Best,
   7451                         Register(rd),
   7452                         Register(rd),
   7453                         Register(rs));
   7454                     return;
   7455                   }
   7456                   if (!InITBlock()) {
   7457                     unsigned rd = (instr >> 16) & 0x7;
   7458                     unsigned rs = (instr >> 19) & 0x7;
   7459                     // ASRS{<q>} {<Rdm>}, <Rdm>, <Rs> ; T1
   7460                     asrs(Condition::None(),
   7461                          Best,
   7462                          Register(rd),
   7463                          Register(rd),
   7464                          Register(rs));
   7465                     return;
   7466                   }
   7467                   unsigned rd = (instr >> 16) & 0x7;
   7468                   unsigned rm = (instr >> 16) & 0x7;
   7469                   unsigned rs = (instr >> 19) & 0x7;
   7470                   if (InITBlock()) {
   7471                     // MOV<c>{<q>} <Rdm>, <Rdm>, ASR <Rs> ; T1
   7472                     mov(CurrentCond(),
   7473                         Best,
   7474                         Register(rd),
   7475                         Operand(Register(rm), ASR, Register(rs)));
   7476                   } else {
   7477                     VIXL_ASSERT(OutsideITBlock());
   7478                     // MOVS{<q>} <Rdm>, <Rdm>, ASR <Rs> ; T1
   7479                     movs(Condition::None(),
   7480                          Best,
   7481                          Register(rd),
   7482                          Operand(Register(rm), ASR, Register(rs)));
   7483                   }
   7484                   break;
   7485                 }
   7486                 case 0x00400000: {
   7487                   // 0x41400000
   7488                   unsigned rd = (instr >> 16) & 0x7;
   7489                   unsigned rm = (instr >> 19) & 0x7;
   7490                   if (InITBlock()) {
   7491                     // ADC<c>{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1
   7492                     adc(CurrentCond(),
   7493                         Best,
   7494                         Register(rd),
   7495                         Register(rd),
   7496                         Register(rm));
   7497                   } else {
   7498                     VIXL_ASSERT(OutsideITBlock());
   7499                     // ADCS{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1
   7500                     adcs(Condition::None(),
   7501                          Best,
   7502                          Register(rd),
   7503                          Register(rd),
   7504                          Register(rm));
   7505                   }
   7506                   break;
   7507                 }
   7508                 case 0x00800000: {
   7509                   // 0x41800000
   7510                   unsigned rd = (instr >> 16) & 0x7;
   7511                   unsigned rm = (instr >> 19) & 0x7;
   7512                   if (InITBlock()) {
   7513                     // SBC<c>{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1
   7514                     sbc(CurrentCond(),
   7515                         Best,
   7516                         Register(rd),
   7517                         Register(rd),
   7518                         Register(rm));
   7519                   } else {
   7520                     VIXL_ASSERT(OutsideITBlock());
   7521                     // SBCS{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1
   7522                     sbcs(Condition::None(),
   7523                          Best,
   7524                          Register(rd),
   7525                          Register(rd),
   7526                          Register(rm));
   7527                   }
   7528                   break;
   7529                 }
   7530                 case 0x00c00000: {
   7531                   // 0x41c00000
   7532                   if (InITBlock()) {
   7533                     unsigned rd = (instr >> 16) & 0x7;
   7534                     unsigned rs = (instr >> 19) & 0x7;
   7535                     // ROR<c>{<q>} {<Rdm>}, <Rdm>, <Rs> ; T1
   7536                     ror(CurrentCond(),
   7537                         Best,
   7538                         Register(rd),
   7539                         Register(rd),
   7540                         Register(rs));
   7541                     return;
   7542                   }
   7543                   if (!InITBlock()) {
   7544                     unsigned rd = (instr >> 16) & 0x7;
   7545                     unsigned rs = (instr >> 19) & 0x7;
   7546                     // RORS{<q>} {<Rdm>}, <Rdm>, <Rs> ; T1
   7547                     rors(Condition::None(),
   7548                          Best,
   7549                          Register(rd),
   7550                          Register(rd),
   7551                          Register(rs));
   7552                     return;
   7553                   }
   7554                   unsigned rd = (instr >> 16) & 0x7;
   7555                   unsigned rm = (instr >> 16) & 0x7;
   7556                   unsigned rs = (instr >> 19) & 0x7;
   7557                   if (InITBlock()) {
   7558                     // MOV<c>{<q>} <Rdm>, <Rdm>, ROR <Rs> ; T1
   7559                     mov(CurrentCond(),
   7560                         Best,
   7561                         Register(rd),
   7562                         Operand(Register(rm), ROR, Register(rs)));
   7563                   } else {
   7564                     VIXL_ASSERT(OutsideITBlock());
   7565                     // MOVS{<q>} <Rdm>, <Rdm>, ROR <Rs> ; T1
   7566                     movs(Condition::None(),
   7567                          Best,
   7568                          Register(rd),
   7569                          Operand(Register(rm), ROR, Register(rs)));
   7570                   }
   7571                   break;
   7572                 }
   7573               }
   7574               break;
   7575             }
   7576             case 0x02000000: {
   7577               // 0x42000000
   7578               switch (instr & 0x00c00000) {
   7579                 case 0x00000000: {
   7580                   // 0x42000000
   7581                   unsigned rn = (instr >> 16) & 0x7;
   7582                   unsigned rm = (instr >> 19) & 0x7;
   7583                   // TST{<c>}{<q>} <Rn>, <Rm> ; T1
   7584                   tst(CurrentCond(), Best, Register(rn), Register(rm));
   7585                   break;
   7586                 }
   7587                 case 0x00400000: {
   7588                   // 0x42400000
   7589                   unsigned rd = (instr >> 16) & 0x7;
   7590                   unsigned rn = (instr >> 19) & 0x7;
   7591                   if (InITBlock()) {
   7592                     // RSB<c>{<q>} {<Rd>}, <Rn>, #0 ; T1
   7593                     rsb(CurrentCond(),
   7594                         Best,
   7595                         Register(rd),
   7596                         Register(rn),
   7597                         UINT32_C(0));
   7598                   } else {
   7599                     VIXL_ASSERT(OutsideITBlock());
   7600                     // RSBS{<q>} {<Rd>}, <Rn>, #0 ; T1
   7601                     rsbs(Condition::None(),
   7602                          Best,
   7603                          Register(rd),
   7604                          Register(rn),
   7605                          UINT32_C(0));
   7606                   }
   7607                   break;
   7608                 }
   7609                 case 0x00800000: {
   7610                   // 0x42800000
   7611                   unsigned rn = (instr >> 16) & 0x7;
   7612                   unsigned rm = (instr >> 19) & 0x7;
   7613                   // CMP{<c>}{<q>} <Rn>, <Rm> ; T1
   7614                   cmp(CurrentCond(), Best, Register(rn), Register(rm));
   7615                   break;
   7616                 }
   7617                 case 0x00c00000: {
   7618                   // 0x42c00000
   7619                   unsigned rn = (instr >> 16) & 0x7;
   7620                   unsigned rm = (instr >> 19) & 0x7;
   7621                   // CMN{<c>}{<q>} <Rn>, <Rm> ; T1
   7622                   cmn(CurrentCond(), Best, Register(rn), Register(rm));
   7623                   break;
   7624                 }
   7625               }
   7626               break;
   7627             }
   7628             case 0x03000000: {
   7629               // 0x43000000
   7630               switch (instr & 0x00c00000) {
   7631                 case 0x00000000: {
   7632                   // 0x43000000
   7633                   unsigned rd = (instr >> 16) & 0x7;
   7634                   unsigned rm = (instr >> 19) & 0x7;
   7635                   if (InITBlock()) {
   7636                     // ORR<c>{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1
   7637                     orr(CurrentCond(),
   7638                         Best,
   7639                         Register(rd),
   7640                         Register(rd),
   7641                         Register(rm));
   7642                   } else {
   7643                     VIXL_ASSERT(OutsideITBlock());
   7644                     // ORRS{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1
   7645                     orrs(Condition::None(),
   7646                          Best,
   7647                          Register(rd),
   7648                          Register(rd),
   7649                          Register(rm));
   7650                   }
   7651                   break;
   7652                 }
   7653                 case 0x00400000: {
   7654                   // 0x43400000
   7655                   unsigned rd = (instr >> 16) & 0x7;
   7656                   unsigned rn = (instr >> 19) & 0x7;
   7657                   if (InITBlock()) {
   7658                     // MUL<c>{<q>} <Rdm>, <Rn>, {<Rdm>} ; T1
   7659                     mul(CurrentCond(),
   7660                         Best,
   7661                         Register(rd),
   7662                         Register(rn),
   7663                         Register(rd));
   7664                   } else {
   7665                     VIXL_ASSERT(OutsideITBlock());
   7666                     // MULS{<q>} <Rdm>, <Rn>, {<Rdm>} ; T1
   7667                     muls(Condition::None(),
   7668                          Register(rd),
   7669                          Register(rn),
   7670                          Register(rd));
   7671                   }
   7672                   break;
   7673                 }
   7674                 case 0x00800000: {
   7675                   // 0x43800000
   7676                   unsigned rd = (instr >> 16) & 0x7;
   7677                   unsigned rm = (instr >> 19) & 0x7;
   7678                   if (InITBlock()) {
   7679                     // BIC<c>{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1
   7680                     bic(CurrentCond(),
   7681                         Best,
   7682                         Register(rd),
   7683                         Register(rd),
   7684                         Register(rm));
   7685                   } else {
   7686                     VIXL_ASSERT(OutsideITBlock());
   7687                     // BICS{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1
   7688                     bics(Condition::None(),
   7689                          Best,
   7690                          Register(rd),
   7691                          Register(rd),
   7692                          Register(rm));
   7693                   }
   7694                   break;
   7695                 }
   7696                 case 0x00c00000: {
   7697                   // 0x43c00000
   7698                   unsigned rd = (instr >> 16) & 0x7;
   7699                   unsigned rm = (instr >> 19) & 0x7;
   7700                   if (InITBlock()) {
   7701                     // MVN<c>{<q>} <Rd>, <Rm> ; T1
   7702                     mvn(CurrentCond(), Best, Register(rd), Register(rm));
   7703                   } else {
   7704                     VIXL_ASSERT(OutsideITBlock());
   7705                     // MVNS{<q>} <Rd>, <Rm> ; T1
   7706                     mvns(Condition::None(), Best, Register(rd), Register(rm));
   7707                   }
   7708                   break;
   7709                 }
   7710               }
   7711               break;
   7712             }
   7713             case 0x04000000: {
   7714               // 0x44000000
   7715               switch (instr & 0x00780000) {
   7716                 case 0x00680000: {
   7717                   // 0x44680000
   7718                   unsigned rd = ((instr >> 16) & 0x7) | ((instr >> 20) & 0x8);
   7719                   // ADD{<c>}{<q>} {<Rdm>}, SP, <Rdm> ; T1
   7720                   add(CurrentCond(), Best, Register(rd), sp, Register(rd));
   7721                   break;
   7722                 }
   7723                 default: {
   7724                   switch (instr & 0x00870000) {
   7725                     case 0x00850000: {
   7726                       // 0x44850000
   7727                       if (((instr & 0x780000) == 0x680000)) {
   7728                         UnallocatedT32(instr);
   7729                         return;
   7730                       }
   7731                       unsigned rm = (instr >> 19) & 0xf;
   7732                       // ADD{<c>}{<q>} {SP}, SP, <Rm> ; T2
   7733                       add(CurrentCond(), Best, sp, sp, Register(rm));
   7734                       break;
   7735                     }
   7736                     default: {
   7737                       if (((instr & 0x780000) == 0x680000) ||
   7738                           ((instr & 0x870000) == 0x850000)) {
   7739                         UnallocatedT32(instr);
   7740                         return;
   7741                       }
   7742                       unsigned rd =
   7743                           ((instr >> 16) & 0x7) | ((instr >> 20) & 0x8);
   7744                       unsigned rm = (instr >> 19) & 0xf;
   7745                       if (InITBlock()) {
   7746                         // ADD<c>{<q>} <Rdn>, <Rm> ; T2
   7747                         add(CurrentCond(), Register(rd), Register(rm));
   7748                       } else {
   7749                         // ADD{<c>}{<q>} {<Rdn>}, <Rdn>, <Rm> ; T2
   7750                         add(CurrentCond(),
   7751                             Best,
   7752                             Register(rd),
   7753                             Register(rd),
   7754                             Register(rm));
   7755                       }
   7756                       break;
   7757                     }
   7758                   }
   7759                   break;
   7760                 }
   7761               }
   7762               break;
   7763             }
   7764             case 0x05000000: {
   7765               // 0x45000000
   7766               unsigned rn = ((instr >> 16) & 0x7) | ((instr >> 20) & 0x8);
   7767               unsigned rm = (instr >> 19) & 0xf;
   7768               // CMP{<c>}{<q>} <Rn>, <Rm> ; T2
   7769               cmp(CurrentCond(), Best, Register(rn), Register(rm));
   7770               break;
   7771             }
   7772             case 0x06000000: {
   7773               // 0x46000000
   7774               unsigned rd = ((instr >> 16) & 0x7) | ((instr >> 20) & 0x8);
   7775               unsigned rm = (instr >> 19) & 0xf;
   7776               // MOV{<c>}{<q>} <Rd>, <Rm> ; T1
   7777               mov(CurrentCond(), Best, Register(rd), Register(rm));
   7778               break;
   7779             }
   7780             case 0x07000000: {
   7781               // 0x47000000
   7782               switch (instr & 0x00800000) {
   7783                 case 0x00000000: {
   7784                   // 0x47000000
   7785                   unsigned rm = (instr >> 19) & 0xf;
   7786                   // BX{<c>}{<q>} <Rm> ; T1
   7787                   bx(CurrentCond(), Register(rm));
   7788                   if (((instr & 0xff870000) != 0x47000000)) {
   7789                     UnpredictableT32(instr);
   7790                   }
   7791                   break;
   7792                 }
   7793                 case 0x00800000: {
   7794                   // 0x47800000
   7795                   unsigned rm = (instr >> 19) & 0xf;
   7796                   // BLX{<c>}{<q>} <Rm> ; T1
   7797                   blx(CurrentCond(), Register(rm));
   7798                   if (((instr & 0xff870000) != 0x47800000)) {
   7799                     UnpredictableT32(instr);
   7800                   }
   7801                   break;
   7802                 }
   7803               }
   7804               break;
   7805             }
   7806           }
   7807           break;
   7808         }
   7809         case 0x08000000: {
   7810           // 0x48000000
   7811           unsigned rt = (instr >> 24) & 0x7;
   7812           int32_t imm = ((instr >> 16) & 0xff) << 2;
   7813           Label label(imm, kT32PcDelta);
   7814           // LDR{<c>}{<q>} <Rt>, <label> ; T1
   7815           ldr(CurrentCond(), Best, Register(rt), &label);
   7816           break;
   7817         }
   7818         case 0x10000000: {
   7819           // 0x50000000
   7820           switch (instr & 0x06000000) {
   7821             case 0x00000000: {
   7822               // 0x50000000
   7823               unsigned rt = (instr >> 16) & 0x7;
   7824               unsigned rn = (instr >> 19) & 0x7;
   7825               Sign sign(plus);
   7826               unsigned rm = (instr >> 22) & 0x7;
   7827               AddrMode addrmode = Offset;
   7828               // STR{<c>}{<q>} <Rt>, [<Rn>, #{+}<Rm>] ; T1
   7829               str(CurrentCond(),
   7830                   Best,
   7831                   Register(rt),
   7832                   MemOperand(Register(rn), sign, Register(rm), addrmode));
   7833               break;
   7834             }
   7835             case 0x02000000: {
   7836               // 0x52000000
   7837               unsigned rt = (instr >> 16) & 0x7;
   7838               unsigned rn = (instr >> 19) & 0x7;
   7839               Sign sign(plus);
   7840               unsigned rm = (instr >> 22) & 0x7;
   7841               AddrMode addrmode = Offset;
   7842               // STRH{<c>}{<q>} <Rt>, [<Rn>, #{+}<Rm>] ; T1
   7843               strh(CurrentCond(),
   7844                    Best,
   7845                    Register(rt),
   7846                    MemOperand(Register(rn), sign, Register(rm), addrmode));
   7847               break;
   7848             }
   7849             case 0x04000000: {
   7850               // 0x54000000
   7851               unsigned rt = (instr >> 16) & 0x7;
   7852               unsigned rn = (instr >> 19) & 0x7;
   7853               Sign sign(plus);
   7854               unsigned rm = (instr >> 22) & 0x7;
   7855               AddrMode addrmode = Offset;
   7856               // STRB{<c>}{<q>} <Rt>, [<Rn>, #{+}<Rm>] ; T1
   7857               strb(CurrentCond(),
   7858                    Best,
   7859                    Register(rt),
   7860                    MemOperand(Register(rn), sign, Register(rm), addrmode));
   7861               break;
   7862             }
   7863             case 0x06000000: {
   7864               // 0x56000000
   7865               unsigned rt = (instr >> 16) & 0x7;
   7866               unsigned rn = (instr >> 19) & 0x7;
   7867               Sign sign(plus);
   7868               unsigned rm = (instr >> 22) & 0x7;
   7869               AddrMode addrmode = Offset;
   7870               // LDRSB{<c>}{<q>} <Rt>, [<Rn>, #{+}<Rm>] ; T1
   7871               ldrsb(CurrentCond(),
   7872                     Best,
   7873                     Register(rt),
   7874                     MemOperand(Register(rn), sign, Register(rm), addrmode));
   7875               break;
   7876             }
   7877           }
   7878           break;
   7879         }
   7880         case 0x18000000: {
   7881           // 0x58000000
   7882           switch (instr & 0x06000000) {
   7883             case 0x00000000: {
   7884               // 0x58000000
   7885               unsigned rt = (instr >> 16) & 0x7;
   7886               unsigned rn = (instr >> 19) & 0x7;
   7887               Sign sign(plus);
   7888               unsigned rm = (instr >> 22) & 0x7;
   7889               AddrMode addrmode = Offset;
   7890               // LDR{<c>}{<q>} <Rt>, [<Rn>, #{+}<Rm>] ; T1
   7891               ldr(CurrentCond(),
   7892                   Best,
   7893                   Register(rt),
   7894                   MemOperand(Register(rn), sign, Register(rm), addrmode));
   7895               break;
   7896             }
   7897             case 0x02000000: {
   7898               // 0x5a000000
   7899               unsigned rt = (instr >> 16) & 0x7;
   7900               unsigned rn = (instr >> 19) & 0x7;
   7901               Sign sign(plus);
   7902               unsigned rm = (instr >> 22) & 0x7;
   7903               AddrMode addrmode = Offset;
   7904               // LDRH{<c>}{<q>} <Rt>, [<Rn>, #{+}<Rm>] ; T1
   7905               ldrh(CurrentCond(),
   7906                    Best,
   7907                    Register(rt),
   7908                    MemOperand(Register(rn), sign, Register(rm), addrmode));
   7909               break;
   7910             }
   7911             case 0x04000000: {
   7912               // 0x5c000000
   7913               unsigned rt = (instr >> 16) & 0x7;
   7914               unsigned rn = (instr >> 19) & 0x7;
   7915               Sign sign(plus);
   7916               unsigned rm = (instr >> 22) & 0x7;
   7917               AddrMode addrmode = Offset;
   7918               // LDRB{<c>}{<q>} <Rt>, [<Rn>, #{+}<Rm>] ; T1
   7919               ldrb(CurrentCond(),
   7920                    Best,
   7921                    Register(rt),
   7922                    MemOperand(Register(rn), sign, Register(rm), addrmode));
   7923               break;
   7924             }
   7925             case 0x06000000: {
   7926               // 0x5e000000
   7927               unsigned rt = (instr >> 16) & 0x7;
   7928               unsigned rn = (instr >> 19) & 0x7;
   7929               Sign sign(plus);
   7930               unsigned rm = (instr >> 22) & 0x7;
   7931               AddrMode addrmode = Offset;
   7932               // LDRSH{<c>}{<q>} <Rt>, [<Rn>, #{+}<Rm>] ; T1
   7933               ldrsh(CurrentCond(),
   7934                     Best,
   7935                     Register(rt),
   7936                     MemOperand(Register(rn), sign, Register(rm), addrmode));
   7937               break;
   7938             }
   7939           }
   7940           break;
   7941         }
   7942       }
   7943       break;
   7944     }
   7945     case 0x60000000: {
   7946       // 0x60000000
   7947       switch (instr & 0x18000000) {
   7948         case 0x00000000: {
   7949           // 0x60000000
   7950           unsigned rt = (instr >> 16) & 0x7;
   7951           unsigned rn = (instr >> 19) & 0x7;
   7952           int32_t offset = ((instr >> 22) & 0x1f) << 2;
   7953           // STR{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm>}] ; T1
   7954           str(CurrentCond(),
   7955               Best,
   7956               Register(rt),
   7957               MemOperand(Register(rn), plus, offset, Offset));
   7958           break;
   7959         }
   7960         case 0x08000000: {
   7961           // 0x68000000
   7962           unsigned rt = (instr >> 16) & 0x7;
   7963           unsigned rn = (instr >> 19) & 0x7;
   7964           int32_t offset = ((instr >> 22) & 0x1f) << 2;
   7965           // LDR{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm>}] ; T1
   7966           ldr(CurrentCond(),
   7967               Best,
   7968               Register(rt),
   7969               MemOperand(Register(rn), plus, offset, Offset));
   7970           break;
   7971         }
   7972         case 0x10000000: {
   7973           // 0x70000000
   7974           unsigned rt = (instr >> 16) & 0x7;
   7975           unsigned rn = (instr >> 19) & 0x7;
   7976           int32_t offset = (instr >> 22) & 0x1f;
   7977           // STRB{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm>}] ; T1
   7978           strb(CurrentCond(),
   7979                Best,
   7980                Register(rt),
   7981                MemOperand(Register(rn), plus, offset, Offset));
   7982           break;
   7983         }
   7984         case 0x18000000: {
   7985           // 0x78000000
   7986           unsigned rt = (instr >> 16) & 0x7;
   7987           unsigned rn = (instr >> 19) & 0x7;
   7988           int32_t offset = (instr >> 22) & 0x1f;
   7989           // LDRB{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm>}] ; T1
   7990           ldrb(CurrentCond(),
   7991                Best,
   7992                Register(rt),
   7993                MemOperand(Register(rn), plus, offset, Offset));
   7994           break;
   7995         }
   7996       }
   7997       break;
   7998     }
   7999     case 0x80000000: {
   8000       // 0x80000000
   8001       switch (instr & 0x18000000) {
   8002         case 0x00000000: {
   8003           // 0x80000000
   8004           unsigned rt = (instr >> 16) & 0x7;
   8005           unsigned rn = (instr >> 19) & 0x7;
   8006           int32_t offset = ((instr >> 22) & 0x1f) << 1;
   8007           // STRH{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm>}] ; T1
   8008           strh(CurrentCond(),
   8009                Best,
   8010                Register(rt),
   8011                MemOperand(Register(rn), plus, offset, Offset));
   8012           break;
   8013         }
   8014         case 0x08000000: {
   8015           // 0x88000000
   8016           unsigned rt = (instr >> 16) & 0x7;
   8017           unsigned rn = (instr >> 19) & 0x7;
   8018           int32_t offset = ((instr >> 22) & 0x1f) << 1;
   8019           // LDRH{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm>}] ; T1
   8020           ldrh(CurrentCond(),
   8021                Best,
   8022                Register(rt),
   8023                MemOperand(Register(rn), plus, offset, Offset));
   8024           break;
   8025         }
   8026         case 0x10000000: {
   8027           // 0x90000000
   8028           unsigned rt = (instr >> 24) & 0x7;
   8029           int32_t offset = ((instr >> 16) & 0xff) << 2;
   8030           // STR{<c>}{<q>} <Rt>, [SP{, #{+}<imm>}] ; T2
   8031           str(CurrentCond(),
   8032               Best,
   8033               Register(rt),
   8034               MemOperand(sp, plus, offset, Offset));
   8035           break;
   8036         }
   8037         case 0x18000000: {
   8038           // 0x98000000
   8039           unsigned rt = (instr >> 24) & 0x7;
   8040           int32_t offset = ((instr >> 16) & 0xff) << 2;
   8041           // LDR{<c>}{<q>} <Rt>, [SP{, #{+}<imm>}] ; T2
   8042           ldr(CurrentCond(),
   8043               Best,
   8044               Register(rt),
   8045               MemOperand(sp, plus, offset, Offset));
   8046           break;
   8047         }
   8048       }
   8049       break;
   8050     }
   8051     case 0xa0000000: {
   8052       // 0xa0000000
   8053       switch (instr & 0x18000000) {
   8054         case 0x00000000: {
   8055           // 0xa0000000
   8056           unsigned rd = (instr >> 24) & 0x7;
   8057           int32_t imm = ((instr >> 16) & 0xff) << 2;
   8058           Label label(imm, kT32PcDelta);
   8059           // ADR{<c>}{<q>} <Rd>, <label> ; T1
   8060           adr(CurrentCond(), Best, Register(rd), &label);
   8061           break;
   8062         }
   8063         case 0x08000000: {
   8064           // 0xa8000000
   8065           unsigned rd = (instr >> 24) & 0x7;
   8066           uint32_t imm = ((instr >> 16) & 0xff) << 2;
   8067           // ADD{<c>}{<q>} <Rd>, SP, #<imm8> ; T1
   8068           add(CurrentCond(), Best, Register(rd), sp, imm);
   8069           break;
   8070         }
   8071         case 0x10000000: {
   8072           // 0xb0000000
   8073           switch (instr & 0x04000000) {
   8074             case 0x00000000: {
   8075               // 0xb0000000
   8076               switch (instr & 0x01000000) {
   8077                 case 0x00000000: {
   8078                   // 0xb0000000
   8079                   switch (instr & 0x02800000) {
   8080                     case 0x00000000: {
   8081                       // 0xb0000000
   8082                       uint32_t imm = ((instr >> 16) & 0x7f) << 2;
   8083                       // ADD{<c>}{<q>} {SP}, SP, #<imm7> ; T2
   8084                       add(CurrentCond(), Best, sp, sp, imm);
   8085                       break;
   8086                     }
   8087                     case 0x00800000: {
   8088                       // 0xb0800000
   8089                       uint32_t imm = ((instr >> 16) & 0x7f) << 2;
   8090                       // SUB{<c>}{<q>} {SP}, SP, #<imm7> ; T1
   8091                       sub(CurrentCond(), Best, sp, sp, imm);
   8092                       break;
   8093                     }
   8094                     case 0x02000000: {
   8095                       // 0xb2000000
   8096                       switch (instr & 0x00400000) {
   8097                         case 0x00000000: {
   8098                           // 0xb2000000
   8099                           unsigned rd = (instr >> 16) & 0x7;
   8100                           unsigned rm = (instr >> 19) & 0x7;
   8101                           // SXTH{<c>}{<q>} {<Rd>}, <Rm> ; T1
   8102                           sxth(CurrentCond(), Best, Register(rd), Register(rm));
   8103                           break;
   8104                         }
   8105                         case 0x00400000: {
   8106                           // 0xb2400000
   8107                           unsigned rd = (instr >> 16) & 0x7;
   8108                           unsigned rm = (instr >> 19) & 0x7;
   8109                           // SXTB{<c>}{<q>} {<Rd>}, <Rm> ; T1
   8110                           sxtb(CurrentCond(), Best, Register(rd), Register(rm));
   8111                           break;
   8112                         }
   8113                       }
   8114                       break;
   8115                     }
   8116                     case 0x02800000: {
   8117                       // 0xb2800000
   8118                       switch (instr & 0x00400000) {
   8119                         case 0x00000000: {
   8120                           // 0xb2800000
   8121                           unsigned rd = (instr >> 16) & 0x7;
   8122                           unsigned rm = (instr >> 19) & 0x7;
   8123                           // UXTH{<c>}{<q>} {<Rd>}, <Rm> ; T1
   8124                           uxth(CurrentCond(), Best, Register(rd), Register(rm));
   8125                           break;
   8126                         }
   8127                         case 0x00400000: {
   8128                           // 0xb2c00000
   8129                           unsigned rd = (instr >> 16) & 0x7;
   8130                           unsigned rm = (instr >> 19) & 0x7;
   8131                           // UXTB{<c>}{<q>} {<Rd>}, <Rm> ; T1
   8132                           uxtb(CurrentCond(), Best, Register(rd), Register(rm));
   8133                           break;
   8134                         }
   8135                       }
   8136                       break;
   8137                     }
   8138                   }
   8139                   break;
   8140                 }
   8141                 case 0x01000000: {
   8142                   // 0xb1000000
   8143                   unsigned rn = (instr >> 16) & 0x7;
   8144                   int32_t imm =
   8145                       (((instr >> 19) & 0x1f) | ((instr >> 20) & 0x20)) << 1;
   8146                   Label label(imm, kT32PcDelta);
   8147                   // CBZ{<q>} <Rn>, <label> ; T1
   8148                   cbz(Register(rn), &label);
   8149                   break;
   8150                 }
   8151               }
   8152               break;
   8153             }
   8154             case 0x04000000: {
   8155               // 0xb4000000
   8156               switch (instr & 0x02000000) {
   8157                 case 0x00000000: {
   8158                   // 0xb4000000
   8159                   RegisterList registers((((instr >> 24) & 0x1) << kLRRegNum) |
   8160                                          ((instr >> 16) & 0xff));
   8161                   // PUSH{<c>}{<q>} <registers> ; T1
   8162                   push(CurrentCond(), Best, registers);
   8163                   break;
   8164                 }
   8165                 case 0x02000000: {
   8166                   // 0xb6000000
   8167                   switch (instr & 0x01e00000) {
   8168                     case 0x00400000: {
   8169                       // 0xb6400000
   8170                       UnimplementedT32_16("SETEND", instr);
   8171                       break;
   8172                     }
   8173                     case 0x00600000: {
   8174                       // 0xb6600000
   8175                       switch (instr & 0x00100000) {
   8176                         case 0x00000000: {
   8177                           // 0xb6600000
   8178                           UnimplementedT32_16("CPSIE", instr);
   8179                           break;
   8180                         }
   8181                         case 0x00100000: {
   8182                           // 0xb6700000
   8183                           UnimplementedT32_16("CPSID", instr);
   8184                           break;
   8185                         }
   8186                       }
   8187                       break;
   8188                     }
   8189                     default:
   8190                       UnallocatedT32(instr);
   8191                       break;
   8192                   }
   8193                   break;
   8194                 }
   8195               }
   8196               break;
   8197             }
   8198           }
   8199           break;
   8200         }
   8201         case 0x18000000: {
   8202           // 0xb8000000
   8203           switch (instr & 0x04000000) {
   8204             case 0x00000000: {
   8205               // 0xb8000000
   8206               switch (instr & 0x01000000) {
   8207                 case 0x00000000: {
   8208                   // 0xb8000000
   8209                   switch (instr & 0x02c00000) {
   8210                     case 0x02000000: {
   8211                       // 0xba000000
   8212                       unsigned rd = (instr >> 16) & 0x7;
   8213                       unsigned rm = (instr >> 19) & 0x7;
   8214                       // REV{<c>}{<q>} <Rd>, <Rm> ; T1
   8215                       rev(CurrentCond(), Best, Register(rd), Register(rm));
   8216                       break;
   8217                     }
   8218                     case 0x02400000: {
   8219                       // 0xba400000
   8220                       unsigned rd = (instr >> 16) & 0x7;
   8221                       unsigned rm = (instr >> 19) & 0x7;
   8222                       // REV16{<c>}{<q>} <Rd>, <Rm> ; T1
   8223                       rev16(CurrentCond(), Best, Register(rd), Register(rm));
   8224                       break;
   8225                     }
   8226                     case 0x02800000: {
   8227                       // 0xba800000
   8228                       uint32_t imm = (instr >> 16) & 0x3f;
   8229                       // HLT{<q>} {#}<imm> ; T1
   8230                       hlt(Condition::None(), imm);
   8231                       break;
   8232                     }
   8233                     case 0x02c00000: {
   8234                       // 0xbac00000
   8235                       unsigned rd = (instr >> 16) & 0x7;
   8236                       unsigned rm = (instr >> 19) & 0x7;
   8237                       // REVSH{<c>}{<q>} <Rd>, <Rm> ; T1
   8238                       revsh(CurrentCond(), Best, Register(rd), Register(rm));
   8239                       break;
   8240                     }
   8241                     default:
   8242                       UnallocatedT32(instr);
   8243                       break;
   8244                   }
   8245                   break;
   8246                 }
   8247                 case 0x01000000: {
   8248                   // 0xb9000000
   8249                   unsigned rn = (instr >> 16) & 0x7;
   8250                   int32_t imm =
   8251                       (((instr >> 19) & 0x1f) | ((instr >> 20) & 0x20)) << 1;
   8252                   Label label(imm, kT32PcDelta);
   8253                   // CBNZ{<q>} <Rn>, <label> ; T1
   8254                   cbnz(Register(rn), &label);
   8255                   break;
   8256                 }
   8257               }
   8258               break;
   8259             }
   8260             case 0x04000000: {
   8261               // 0xbc000000
   8262               switch (instr & 0x02000000) {
   8263                 case 0x00000000: {
   8264                   // 0xbc000000
   8265                   RegisterList registers((((instr >> 24) & 0x1) << kPCRegNum) |
   8266                                          ((instr >> 16) & 0xff));
   8267                   // POP{<c>}{<q>} <registers> ; T1
   8268                   pop(CurrentCond(), Best, registers);
   8269                   break;
   8270                 }
   8271                 case 0x02000000: {
   8272                   // 0xbe000000
   8273                   switch (instr & 0x01000000) {
   8274                     case 0x00000000: {
   8275                       // 0xbe000000
   8276                       uint32_t imm = (instr >> 16) & 0xff;
   8277                       // BKPT{<q>} {#}<imm> ; T1
   8278                       bkpt(Condition::None(), imm);
   8279                       break;
   8280                     }
   8281                     case 0x01000000: {
   8282                       // 0xbf000000
   8283                       switch (instr & 0x000f0000) {
   8284                         case 0x00000000: {
   8285                           // 0xbf000000
   8286                           switch (instr & 0x00f00000) {
   8287                             case 0x00000000: {
   8288                               // 0xbf000000
   8289                               // NOP{<c>}{<q>} ; T1
   8290                               nop(CurrentCond(), Best);
   8291                               break;
   8292                             }
   8293                             case 0x00100000: {
   8294                               // 0xbf100000
   8295                               // YIELD{<c>}{<q>} ; T1
   8296                               yield(CurrentCond(), Best);
   8297                               break;
   8298                             }
   8299                             case 0x00200000: {
   8300                               // 0xbf200000
   8301                               UnimplementedT32_16("WFE", instr);
   8302                               break;
   8303                             }
   8304                             case 0x00300000: {
   8305                               // 0xbf300000
   8306                               UnimplementedT32_16("WFI", instr);
   8307                               break;
   8308                             }
   8309                             case 0x00400000: {
   8310                               // 0xbf400000
   8311                               UnimplementedT32_16("SEV", instr);
   8312                               break;
   8313                             }
   8314                             case 0x00500000: {
   8315                               // 0xbf500000
   8316                               UnimplementedT32_16("SEVL", instr);
   8317                               break;
   8318                             }
   8319                             default:
   8320                               UnallocatedT32(instr);
   8321                               break;
   8322                           }
   8323                           break;
   8324                         }
   8325                         default: {
   8326                           if (((instr & 0xf0000) == 0x0)) {
   8327                             UnallocatedT32(instr);
   8328                             return;
   8329                           }
   8330                           unsigned firstcond = (instr >> 20) & 0xf;
   8331                           unsigned mask = (instr >> 16) & 0xf;
   8332                           bool wasInITBlock = InITBlock();
   8333                           SetIT(Condition(firstcond), mask);
   8334                           it(Condition(firstcond), mask);
   8335                           if (wasInITBlock || (firstcond == 15) ||
   8336                               ((firstcond == al) &&
   8337                                (BitCount(Uint32(mask)) != 1))) {
   8338                             UnpredictableT32(instr);
   8339                           }
   8340                           break;
   8341                         }
   8342                       }
   8343                       break;
   8344                     }
   8345                   }
   8346                   break;
   8347                 }
   8348               }
   8349               break;
   8350             }
   8351           }
   8352           break;
   8353         }
   8354       }
   8355       break;
   8356     }
   8357     case 0xc0000000: {
   8358       // 0xc0000000
   8359       switch (instr & 0x10000000) {
   8360         case 0x00000000: {
   8361           // 0xc0000000
   8362           switch (instr & 0x08000000) {
   8363             case 0x00000000: {
   8364               // 0xc0000000
   8365               unsigned rn = (instr >> 24) & 0x7;
   8366               RegisterList registers(((instr >> 16) & 0xff));
   8367               // STM{<c>}{<q>} <Rn>!, <registers> ; T1
   8368               stm(CurrentCond(),
   8369                   Best,
   8370                   Register(rn),
   8371                   WriteBack(WRITE_BACK),
   8372                   registers);
   8373               break;
   8374             }
   8375             case 0x08000000: {
   8376               // 0xc8000000
   8377               unsigned rn = (instr >> 24) & 0x7;
   8378               RegisterList registers(((instr >> 16) & 0xff));
   8379               // LDM{<c>}{<q>} <Rn>{!}, <registers> ; T1
   8380               ldm(CurrentCond(),
   8381                   Best,
   8382                   Register(rn),
   8383                   WriteBack(!registers.Includes(Register(rn))),
   8384                   registers);
   8385               break;
   8386             }
   8387           }
   8388           break;
   8389         }
   8390         case 0x10000000: {
   8391           // 0xd0000000
   8392           switch (instr & 0x0e000000) {
   8393             case 0x0e000000: {
   8394               // 0xde000000
   8395               switch (instr & 0x01000000) {
   8396                 case 0x00000000: {
   8397                   // 0xde000000
   8398                   uint32_t imm = (instr >> 16) & 0xff;
   8399                   // UDF{<c>}{<q>} {#}<imm> ; T1
   8400                   udf(CurrentCond(), Best, imm);
   8401                   break;
   8402                 }
   8403                 case 0x01000000: {
   8404                   // 0xdf000000
   8405                   uint32_t imm = (instr >> 16) & 0xff;
   8406                   // SVC{<c>}{<q>} {#}<imm> ; T1
   8407                   svc(CurrentCond(), imm);
   8408                   break;
   8409                 }
   8410               }
   8411               break;
   8412             }
   8413             default: {
   8414               if (((instr & 0xe000000) == 0xe000000)) {
   8415                 UnallocatedT32(instr);
   8416                 return;
   8417               }
   8418               Condition condition((instr >> 24) & 0xf);
   8419               int32_t imm = SignExtend<int32_t>((instr >> 16) & 0xff, 8) << 1;
   8420               Label label(imm, kT32PcDelta);
   8421               // B<c>{<q>} <label> ; T1
   8422               b(condition, Best, &label);
   8423               break;
   8424             }
   8425           }
   8426           break;
   8427         }
   8428       }
   8429       break;
   8430     }
   8431     case 0xe0000000: {
   8432       // 0xe0000000
   8433       switch (instr & 0x08000000) {
   8434         case 0x00000000: {
   8435           // 0xe0000000
   8436           switch (instr & 0x10000000) {
   8437             case 0x00000000: {
   8438               // 0xe0000000
   8439               int32_t imm = SignExtend<int32_t>((instr >> 16) & 0x7ff, 11) << 1;
   8440               Label label(imm, kT32PcDelta);
   8441               // B{<c>}{<q>} <label> ; T2
   8442               b(CurrentCond(), Best, &label);
   8443               break;
   8444             }
   8445             case 0x10000000: {
   8446               // 0xf0000000
   8447               switch (instr & 0x00008000) {
   8448                 case 0x00000000: {
   8449                   // 0xf0000000
   8450                   switch (instr & 0x03f00000) {
   8451                     case 0x00000000: {
   8452                       // 0xf0000000
   8453                       unsigned rd = (instr >> 8) & 0xf;
   8454                       unsigned rn = (instr >> 16) & 0xf;
   8455                       uint32_t imm = ImmediateT32::Decode(
   8456                           (instr & 0xff) | ((instr >> 4) & 0x700) |
   8457                           ((instr >> 15) & 0x800));
   8458                       // AND{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
   8459                       and_(CurrentCond(),
   8460                            Best,
   8461                            Register(rd),
   8462                            Register(rn),
   8463                            imm);
   8464                       break;
   8465                     }
   8466                     case 0x00100000: {
   8467                       // 0xf0100000
   8468                       switch (instr & 0x00000f00) {
   8469                         case 0x00000f00: {
   8470                           // 0xf0100f00
   8471                           unsigned rn = (instr >> 16) & 0xf;
   8472                           uint32_t imm = ImmediateT32::Decode(
   8473                               (instr & 0xff) | ((instr >> 4) & 0x700) |
   8474                               ((instr >> 15) & 0x800));
   8475                           // TST{<c>}{<q>} <Rn>, #<const> ; T1
   8476                           tst(CurrentCond(), Best, Register(rn), imm);
   8477                           break;
   8478                         }
   8479                         default: {
   8480                           if (((instr & 0xf00) == 0xf00)) {
   8481                             UnallocatedT32(instr);
   8482                             return;
   8483                           }
   8484                           unsigned rd = (instr >> 8) & 0xf;
   8485                           unsigned rn = (instr >> 16) & 0xf;
   8486                           uint32_t imm = ImmediateT32::Decode(
   8487                               (instr & 0xff) | ((instr >> 4) & 0x700) |
   8488                               ((instr >> 15) & 0x800));
   8489                           // ANDS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
   8490                           ands(CurrentCond(),
   8491                                Best,
   8492                                Register(rd),
   8493                                Register(rn),
   8494                                imm);
   8495                           break;
   8496                         }
   8497                       }
   8498                       break;
   8499                     }
   8500                     case 0x00200000: {
   8501                       // 0xf0200000
   8502                       unsigned rd = (instr >> 8) & 0xf;
   8503                       unsigned rn = (instr >> 16) & 0xf;
   8504                       uint32_t imm = ImmediateT32::Decode(
   8505                           (instr & 0xff) | ((instr >> 4) & 0x700) |
   8506                           ((instr >> 15) & 0x800));
   8507                       // BIC{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
   8508                       bic(CurrentCond(), Best, Register(rd), Register(rn), imm);
   8509                       break;
   8510                     }
   8511                     case 0x00300000: {
   8512                       // 0xf0300000
   8513                       unsigned rd = (instr >> 8) & 0xf;
   8514                       unsigned rn = (instr >> 16) & 0xf;
   8515                       uint32_t imm = ImmediateT32::Decode(
   8516                           (instr & 0xff) | ((instr >> 4) & 0x700) |
   8517                           ((instr >> 15) & 0x800));
   8518                       // BICS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
   8519                       bics(CurrentCond(),
   8520                            Best,
   8521                            Register(rd),
   8522                            Register(rn),
   8523                            imm);
   8524                       break;
   8525                     }
   8526                     case 0x00400000: {
   8527                       // 0xf0400000
   8528                       switch (instr & 0x000f0000) {
   8529                         case 0x000f0000: {
   8530                           // 0xf04f0000
   8531                           unsigned rd = (instr >> 8) & 0xf;
   8532                           uint32_t imm = ImmediateT32::Decode(
   8533                               (instr & 0xff) | ((instr >> 4) & 0x700) |
   8534                               ((instr >> 15) & 0x800));
   8535                           if (InITBlock() &&
   8536                               (instr & 0x00100000) == 0x00000000 &&
   8537                               ((rd < kNumberOfT32LowRegisters) &&
   8538                                (imm <= 255))) {
   8539                             // MOV<c>.W <Rd>, #<const> ; T2
   8540                             mov(CurrentCond(), Wide, Register(rd), imm);
   8541                           } else {
   8542                             VIXL_ASSERT((instr & 0x00100000) == 0x00000000);
   8543                             // MOV{<c>}{<q>} <Rd>, #<const> ; T2
   8544                             mov(CurrentCond(), Best, Register(rd), imm);
   8545                           }
   8546                           break;
   8547                         }
   8548                         default: {
   8549                           if (((instr & 0xf0000) == 0xf0000)) {
   8550                             UnallocatedT32(instr);
   8551                             return;
   8552                           }
   8553                           unsigned rd = (instr >> 8) & 0xf;
   8554                           unsigned rn = (instr >> 16) & 0xf;
   8555                           uint32_t imm = ImmediateT32::Decode(
   8556                               (instr & 0xff) | ((instr >> 4) & 0x700) |
   8557                               ((instr >> 15) & 0x800));
   8558                           // ORR{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
   8559                           orr(CurrentCond(),
   8560                               Best,
   8561                               Register(rd),
   8562                               Register(rn),
   8563                               imm);
   8564                           break;
   8565                         }
   8566                       }
   8567                       break;
   8568                     }
   8569                     case 0x00500000: {
   8570                       // 0xf0500000
   8571                       switch (instr & 0x000f0000) {
   8572                         case 0x000f0000: {
   8573                           // 0xf05f0000
   8574                           unsigned rd = (instr >> 8) & 0xf;
   8575                           uint32_t imm = ImmediateT32::Decode(
   8576                               (instr & 0xff) | ((instr >> 4) & 0x700) |
   8577                               ((instr >> 15) & 0x800));
   8578                           if (OutsideITBlock() &&
   8579                               (instr & 0x00100000) == 0x00100000 &&
   8580                               ((rd < kNumberOfT32LowRegisters) &&
   8581                                (imm <= 255))) {
   8582                             // MOVS.W <Rd>, #<const> ; T2
   8583                             movs(Condition::None(), Wide, Register(rd), imm);
   8584                           } else {
   8585                             VIXL_ASSERT((instr & 0x00100000) == 0x00100000);
   8586                             // MOVS{<c>}{<q>} <Rd>, #<const> ; T2
   8587                             movs(CurrentCond(), Best, Register(rd), imm);
   8588                           }
   8589                           break;
   8590                         }
   8591                         default: {
   8592                           if (((instr & 0xf0000) == 0xf0000)) {
   8593                             UnallocatedT32(instr);
   8594                             return;
   8595                           }
   8596                           unsigned rd = (instr >> 8) & 0xf;
   8597                           unsigned rn = (instr >> 16) & 0xf;
   8598                           uint32_t imm = ImmediateT32::Decode(
   8599                               (instr & 0xff) | ((instr >> 4) & 0x700) |
   8600                               ((instr >> 15) & 0x800));
   8601                           // ORRS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
   8602                           orrs(CurrentCond(),
   8603                                Best,
   8604                                Register(rd),
   8605                                Register(rn),
   8606                                imm);
   8607                           break;
   8608                         }
   8609                       }
   8610                       break;
   8611                     }
   8612                     case 0x00600000: {
   8613                       // 0xf0600000
   8614                       switch (instr & 0x000f0000) {
   8615                         case 0x000f0000: {
   8616                           // 0xf06f0000
   8617                           unsigned rd = (instr >> 8) & 0xf;
   8618                           uint32_t imm = ImmediateT32::Decode(
   8619                               (instr & 0xff) | ((instr >> 4) & 0x700) |
   8620                               ((instr >> 15) & 0x800));
   8621                           // MVN{<c>}{<q>} <Rd>, #<const> ; T1
   8622                           mvn(CurrentCond(), Best, Register(rd), imm);
   8623                           break;
   8624                         }
   8625                         default: {
   8626                           if (((instr & 0xf0000) == 0xf0000)) {
   8627                             UnallocatedT32(instr);
   8628                             return;
   8629                           }
   8630                           unsigned rd = (instr >> 8) & 0xf;
   8631                           unsigned rn = (instr >> 16) & 0xf;
   8632                           uint32_t imm = ImmediateT32::Decode(
   8633                               (instr & 0xff) | ((instr >> 4) & 0x700) |
   8634                               ((instr >> 15) & 0x800));
   8635                           // ORN{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
   8636                           orn(CurrentCond(), Register(rd), Register(rn), imm);
   8637                           break;
   8638                         }
   8639                       }
   8640                       break;
   8641                     }
   8642                     case 0x00700000: {
   8643                       // 0xf0700000
   8644                       switch (instr & 0x000f0000) {
   8645                         case 0x000f0000: {
   8646                           // 0xf07f0000
   8647                           unsigned rd = (instr >> 8) & 0xf;
   8648                           uint32_t imm = ImmediateT32::Decode(
   8649                               (instr & 0xff) | ((instr >> 4) & 0x700) |
   8650                               ((instr >> 15) & 0x800));
   8651                           // MVNS{<c>}{<q>} <Rd>, #<const> ; T1
   8652                           mvns(CurrentCond(), Best, Register(rd), imm);
   8653                           break;
   8654                         }
   8655                         default: {
   8656                           if (((instr & 0xf0000) == 0xf0000)) {
   8657                             UnallocatedT32(instr);
   8658                             return;
   8659                           }
   8660                           unsigned rd = (instr >> 8) & 0xf;
   8661                           unsigned rn = (instr >> 16) & 0xf;
   8662                           uint32_t imm = ImmediateT32::Decode(
   8663                               (instr & 0xff) | ((instr >> 4) & 0x700) |
   8664                               ((instr >> 15) & 0x800));
   8665                           // ORNS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
   8666                           orns(CurrentCond(), Register(rd), Register(rn), imm);
   8667                           break;
   8668                         }
   8669                       }
   8670                       break;
   8671                     }
   8672                     case 0x00800000: {
   8673                       // 0xf0800000
   8674                       unsigned rd = (instr >> 8) & 0xf;
   8675                       unsigned rn = (instr >> 16) & 0xf;
   8676                       uint32_t imm = ImmediateT32::Decode(
   8677                           (instr & 0xff) | ((instr >> 4) & 0x700) |
   8678                           ((instr >> 15) & 0x800));
   8679                       // EOR{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
   8680                       eor(CurrentCond(), Best, Register(rd), Register(rn), imm);
   8681                       break;
   8682                     }
   8683                     case 0x00900000: {
   8684                       // 0xf0900000
   8685                       switch (instr & 0x00000f00) {
   8686                         case 0x00000f00: {
   8687                           // 0xf0900f00
   8688                           unsigned rn = (instr >> 16) & 0xf;
   8689                           uint32_t imm = ImmediateT32::Decode(
   8690                               (instr & 0xff) | ((instr >> 4) & 0x700) |
   8691                               ((instr >> 15) & 0x800));
   8692                           // TEQ{<c>}{<q>} <Rn>, #<const> ; T1
   8693                           teq(CurrentCond(), Register(rn), imm);
   8694                           break;
   8695                         }
   8696                         default: {
   8697                           if (((instr & 0xf00) == 0xf00)) {
   8698                             UnallocatedT32(instr);
   8699                             return;
   8700                           }
   8701                           unsigned rd = (instr >> 8) & 0xf;
   8702                           unsigned rn = (instr >> 16) & 0xf;
   8703                           uint32_t imm = ImmediateT32::Decode(
   8704                               (instr & 0xff) | ((instr >> 4) & 0x700) |
   8705                               ((instr >> 15) & 0x800));
   8706                           // EORS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
   8707                           eors(CurrentCond(),
   8708                                Best,
   8709                                Register(rd),
   8710                                Register(rn),
   8711                                imm);
   8712                           break;
   8713                         }
   8714                       }
   8715                       break;
   8716                     }
   8717                     case 0x01000000: {
   8718                       // 0xf1000000
   8719                       switch (instr & 0x000f0000) {
   8720                         case 0x000d0000: {
   8721                           // 0xf10d0000
   8722                           unsigned rd = (instr >> 8) & 0xf;
   8723                           uint32_t imm = ImmediateT32::Decode(
   8724                               (instr & 0xff) | ((instr >> 4) & 0x700) |
   8725                               ((instr >> 15) & 0x800));
   8726                           if ((instr & 0x00100000) == 0x00000000 &&
   8727                               (((rd < kNumberOfT32LowRegisters) &&
   8728                                 ((imm <= 1020) && ((imm & 3) == 0))) ||
   8729                                ((rd == sp.GetCode()) &&
   8730                                 ((imm <= 508) && ((imm & 3) == 0))))) {
   8731                             // ADD{<c>}.W {<Rd>}, SP, #<const> ; T3
   8732                             add(CurrentCond(), Wide, Register(rd), sp, imm);
   8733                           } else {
   8734                             VIXL_ASSERT((instr & 0x00100000) == 0x00000000);
   8735                             // ADD{<c>}{<q>} {<Rd>}, SP, #<const> ; T3
   8736                             add(CurrentCond(), Best, Register(rd), sp, imm);
   8737                           }
   8738                           break;
   8739                         }
   8740                         default: {
   8741                           if (((instr & 0xf0000) == 0xd0000)) {
   8742                             UnallocatedT32(instr);
   8743                             return;
   8744                           }
   8745                           unsigned rd = (instr >> 8) & 0xf;
   8746                           unsigned rn = (instr >> 16) & 0xf;
   8747                           uint32_t imm = ImmediateT32::Decode(
   8748                               (instr & 0xff) | ((instr >> 4) & 0x700) |
   8749                               ((instr >> 15) & 0x800));
   8750                           if (InITBlock() &&
   8751                               (instr & 0x00100000) == 0x00000000 &&
   8752                               (((rd < kNumberOfT32LowRegisters) &&
   8753                                 (rn < kNumberOfT32LowRegisters) &&
   8754                                 (imm <= 7)) ||
   8755                                ((rd == rn) && (rd < kNumberOfT32LowRegisters) &&
   8756                                 (imm <= 255)))) {
   8757                             // ADD<c>.W {<Rd>}, <Rn>, #<const> ; T3
   8758                             add(CurrentCond(),
   8759                                 Wide,
   8760                                 Register(rd),
   8761                                 Register(rn),
   8762                                 imm);
   8763                           } else {
   8764                             VIXL_ASSERT((instr & 0x00100000) == 0x00000000);
   8765                             // ADD{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T3
   8766                             add(CurrentCond(),
   8767                                 Best,
   8768                                 Register(rd),
   8769                                 Register(rn),
   8770                                 imm);
   8771                           }
   8772                           break;
   8773                         }
   8774                       }
   8775                       break;
   8776                     }
   8777                     case 0x01100000: {
   8778                       // 0xf1100000
   8779                       switch (instr & 0x00000f00) {
   8780                         case 0x00000f00: {
   8781                           // 0xf1100f00
   8782                           unsigned rn = (instr >> 16) & 0xf;
   8783                           uint32_t imm = ImmediateT32::Decode(
   8784                               (instr & 0xff) | ((instr >> 4) & 0x700) |
   8785                               ((instr >> 15) & 0x800));
   8786                           // CMN{<c>}{<q>} <Rn>, #<const> ; T1
   8787                           cmn(CurrentCond(), Best, Register(rn), imm);
   8788                           break;
   8789                         }
   8790                         default: {
   8791                           switch (instr & 0x000f0000) {
   8792                             case 0x000d0000: {
   8793                               // 0xf11d0000
   8794                               if (((instr & 0xf00) == 0xf00)) {
   8795                                 UnallocatedT32(instr);
   8796                                 return;
   8797                               }
   8798                               unsigned rd = (instr >> 8) & 0xf;
   8799                               uint32_t imm = ImmediateT32::Decode(
   8800                                   (instr & 0xff) | ((instr >> 4) & 0x700) |
   8801                                   ((instr >> 15) & 0x800));
   8802                               // ADDS{<c>}{<q>} {<Rd>}, SP, #<const> ; T3
   8803                               adds(CurrentCond(), Best, Register(rd), sp, imm);
   8804                               break;
   8805                             }
   8806                             default: {
   8807                               if (((instr & 0xf0000) == 0xd0000) ||
   8808                                   ((instr & 0xf00) == 0xf00)) {
   8809                                 UnallocatedT32(instr);
   8810                                 return;
   8811                               }
   8812                               unsigned rd = (instr >> 8) & 0xf;
   8813                               unsigned rn = (instr >> 16) & 0xf;
   8814                               uint32_t imm = ImmediateT32::Decode(
   8815                                   (instr & 0xff) | ((instr >> 4) & 0x700) |
   8816                                   ((instr >> 15) & 0x800));
   8817                               if (OutsideITBlock() &&
   8818                                   (instr & 0x00100000) == 0x00100000 &&
   8819                                   (((rd < kNumberOfT32LowRegisters) &&
   8820                                     (rn < kNumberOfT32LowRegisters) &&
   8821                                     (imm <= 7)) ||
   8822                                    ((rd == rn) &&
   8823                                     (rd < kNumberOfT32LowRegisters) &&
   8824                                     (imm <= 255)))) {
   8825                                 // ADDS.W {<Rd>}, <Rn>, #<const> ; T3
   8826                                 adds(Condition::None(),
   8827                                      Wide,
   8828                                      Register(rd),
   8829                                      Register(rn),
   8830                                      imm);
   8831                               } else {
   8832                                 VIXL_ASSERT((instr & 0x00100000) == 0x00100000);
   8833                                 // ADDS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T3
   8834                                 adds(CurrentCond(),
   8835                                      Best,
   8836                                      Register(rd),
   8837                                      Register(rn),
   8838                                      imm);
   8839                               }
   8840                               break;
   8841                             }
   8842                           }
   8843                           break;
   8844                         }
   8845                       }
   8846                       break;
   8847                     }
   8848                     case 0x01400000: {
   8849                       // 0xf1400000
   8850                       unsigned rd = (instr >> 8) & 0xf;
   8851                       unsigned rn = (instr >> 16) & 0xf;
   8852                       uint32_t imm = ImmediateT32::Decode(
   8853                           (instr & 0xff) | ((instr >> 4) & 0x700) |
   8854                           ((instr >> 15) & 0x800));
   8855                       // ADC{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
   8856                       adc(CurrentCond(), Best, Register(rd), Register(rn), imm);
   8857                       break;
   8858                     }
   8859                     case 0x01500000: {
   8860                       // 0xf1500000
   8861                       unsigned rd = (instr >> 8) & 0xf;
   8862                       unsigned rn = (instr >> 16) & 0xf;
   8863                       uint32_t imm = ImmediateT32::Decode(
   8864                           (instr & 0xff) | ((instr >> 4) & 0x700) |
   8865                           ((instr >> 15) & 0x800));
   8866                       // ADCS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
   8867                       adcs(CurrentCond(),
   8868                            Best,
   8869                            Register(rd),
   8870                            Register(rn),
   8871                            imm);
   8872                       break;
   8873                     }
   8874                     case 0x01600000: {
   8875                       // 0xf1600000
   8876                       unsigned rd = (instr >> 8) & 0xf;
   8877                       unsigned rn = (instr >> 16) & 0xf;
   8878                       uint32_t imm = ImmediateT32::Decode(
   8879                           (instr & 0xff) | ((instr >> 4) & 0x700) |
   8880                           ((instr >> 15) & 0x800));
   8881                       // SBC{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
   8882                       sbc(CurrentCond(), Best, Register(rd), Register(rn), imm);
   8883                       break;
   8884                     }
   8885                     case 0x01700000: {
   8886                       // 0xf1700000
   8887                       unsigned rd = (instr >> 8) & 0xf;
   8888                       unsigned rn = (instr >> 16) & 0xf;
   8889                       uint32_t imm = ImmediateT32::Decode(
   8890                           (instr & 0xff) | ((instr >> 4) & 0x700) |
   8891                           ((instr >> 15) & 0x800));
   8892                       // SBCS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
   8893                       sbcs(CurrentCond(),
   8894                            Best,
   8895                            Register(rd),
   8896                            Register(rn),
   8897                            imm);
   8898                       break;
   8899                     }
   8900                     case 0x01a00000: {
   8901                       // 0xf1a00000
   8902                       switch (instr & 0x000f0000) {
   8903                         case 0x000d0000: {
   8904                           // 0xf1ad0000
   8905                           unsigned rd = (instr >> 8) & 0xf;
   8906                           uint32_t imm = ImmediateT32::Decode(
   8907                               (instr & 0xff) | ((instr >> 4) & 0x700) |
   8908                               ((instr >> 15) & 0x800));
   8909                           if ((instr & 0x00100000) == 0x00000000 &&
   8910                               ((rd == sp.GetCode()) &&
   8911                                ((imm <= 508) && ((imm & 3) == 0)))) {
   8912                             // SUB{<c>}.W {<Rd>}, SP, #<const> ; T2
   8913                             sub(CurrentCond(), Wide, Register(rd), sp, imm);
   8914                           } else {
   8915                             VIXL_ASSERT((instr & 0x00100000) == 0x00000000);
   8916                             // SUB{<c>}{<q>} {<Rd>}, SP, #<const> ; T2
   8917                             sub(CurrentCond(), Best, Register(rd), sp, imm);
   8918                           }
   8919                           break;
   8920                         }
   8921                         default: {
   8922                           if (((instr & 0xf0000) == 0xd0000)) {
   8923                             UnallocatedT32(instr);
   8924                             return;
   8925                           }
   8926                           unsigned rd = (instr >> 8) & 0xf;
   8927                           unsigned rn = (instr >> 16) & 0xf;
   8928                           uint32_t imm = ImmediateT32::Decode(
   8929                               (instr & 0xff) | ((instr >> 4) & 0x700) |
   8930                               ((instr >> 15) & 0x800));
   8931                           if (InITBlock() &&
   8932                               (instr & 0x00100000) == 0x00000000 &&
   8933                               (((rd < kNumberOfT32LowRegisters) &&
   8934                                 (rn < kNumberOfT32LowRegisters) &&
   8935                                 (imm <= 7)) ||
   8936                                ((rd == rn) && (rd < kNumberOfT32LowRegisters) &&
   8937                                 (imm <= 255)))) {
   8938                             // SUB<c>.W {<Rd>}, <Rn>, #<const> ; T3
   8939                             sub(CurrentCond(),
   8940                                 Wide,
   8941                                 Register(rd),
   8942                                 Register(rn),
   8943                                 imm);
   8944                           } else {
   8945                             VIXL_ASSERT((instr & 0x00100000) == 0x00000000);
   8946                             // SUB{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T3
   8947                             sub(CurrentCond(),
   8948                                 Best,
   8949                                 Register(rd),
   8950                                 Register(rn),
   8951                                 imm);
   8952                           }
   8953                           break;
   8954                         }
   8955                       }
   8956                       break;
   8957                     }
   8958                     case 0x01b00000: {
   8959                       // 0xf1b00000
   8960                       switch (instr & 0x00000f00) {
   8961                         case 0x00000f00: {
   8962                           // 0xf1b00f00
   8963                           unsigned rn = (instr >> 16) & 0xf;
   8964                           uint32_t imm = ImmediateT32::Decode(
   8965                               (instr & 0xff) | ((instr >> 4) & 0x700) |
   8966                               ((instr >> 15) & 0x800));
   8967                           if ((rn < kNumberOfT32LowRegisters) && (imm <= 255)) {
   8968                             // CMP{<c>}.W <Rn>, #<const> ; T2
   8969                             cmp(CurrentCond(), Wide, Register(rn), imm);
   8970                           } else {
   8971                             // CMP{<c>}{<q>} <Rn>, #<const> ; T2
   8972                             cmp(CurrentCond(), Best, Register(rn), imm);
   8973                           }
   8974                           break;
   8975                         }
   8976                         default: {
   8977                           switch (instr & 0x000f0000) {
   8978                             case 0x000d0000: {
   8979                               // 0xf1bd0000
   8980                               if (((instr & 0xf00) == 0xf00)) {
   8981                                 UnallocatedT32(instr);
   8982                                 return;
   8983                               }
   8984                               unsigned rd = (instr >> 8) & 0xf;
   8985                               uint32_t imm = ImmediateT32::Decode(
   8986                                   (instr & 0xff) | ((instr >> 4) & 0x700) |
   8987                                   ((instr >> 15) & 0x800));
   8988                               // SUBS{<c>}{<q>} {<Rd>}, SP, #<const> ; T2
   8989                               subs(CurrentCond(), Best, Register(rd), sp, imm);
   8990                               break;
   8991                             }
   8992                             default: {
   8993                               if (((instr & 0xf0000) == 0xd0000) ||
   8994                                   ((instr & 0xf00) == 0xf00)) {
   8995                                 UnallocatedT32(instr);
   8996                                 return;
   8997                               }
   8998                               unsigned rd = (instr >> 8) & 0xf;
   8999                               unsigned rn = (instr >> 16) & 0xf;
   9000                               uint32_t imm = ImmediateT32::Decode(
   9001                                   (instr & 0xff) | ((instr >> 4) & 0x700) |
   9002                                   ((instr >> 15) & 0x800));
   9003                               if (OutsideITBlock() &&
   9004                                   (instr & 0x00100000) == 0x00100000 &&
   9005                                   (((rd < kNumberOfT32LowRegisters) &&
   9006                                     (rn < kNumberOfT32LowRegisters) &&
   9007                                     (imm <= 7)) ||
   9008                                    ((rd == rn) &&
   9009                                     (rd < kNumberOfT32LowRegisters) &&
   9010                                     (imm <= 255)))) {
   9011                                 // SUBS.W {<Rd>}, <Rn>, #<const> ; T3
   9012                                 subs(Condition::None(),
   9013                                      Wide,
   9014                                      Register(rd),
   9015                                      Register(rn),
   9016                                      imm);
   9017                               } else {
   9018                                 VIXL_ASSERT((instr & 0x00100000) == 0x00100000);
   9019                                 // SUBS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T3
   9020                                 subs(CurrentCond(),
   9021                                      Best,
   9022                                      Register(rd),
   9023                                      Register(rn),
   9024                                      imm);
   9025                               }
   9026                               break;
   9027                             }
   9028                           }
   9029                           break;
   9030                         }
   9031                       }
   9032                       break;
   9033                     }
   9034                     case 0x01c00000: {
   9035                       // 0xf1c00000
   9036                       unsigned rd = (instr >> 8) & 0xf;
   9037                       unsigned rn = (instr >> 16) & 0xf;
   9038                       uint32_t imm = ImmediateT32::Decode(
   9039                           (instr & 0xff) | ((instr >> 4) & 0x700) |
   9040                           ((instr >> 15) & 0x800));
   9041                       if (InITBlock() && (instr & 0x00100000) == 0x00000000 &&
   9042                           (imm == 0) &&
   9043                           ((rd < kNumberOfT32LowRegisters) &&
   9044                            (rn < kNumberOfT32LowRegisters) && (imm == 0))) {
   9045                         // RSB<c>.W {<Rd>}, <Rn>, #0 ; T2
   9046                         rsb(CurrentCond(),
   9047                             Wide,
   9048                             Register(rd),
   9049                             Register(rn),
   9050                             UINT32_C(0));
   9051                       } else {
   9052                         VIXL_ASSERT((instr & 0x00100000) == 0x00000000);
   9053                         // RSB{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T2
   9054                         rsb(CurrentCond(),
   9055                             Best,
   9056                             Register(rd),
   9057                             Register(rn),
   9058                             imm);
   9059                       }
   9060                       break;
   9061                     }
   9062                     case 0x01d00000: {
   9063                       // 0xf1d00000
   9064                       unsigned rd = (instr >> 8) & 0xf;
   9065                       unsigned rn = (instr >> 16) & 0xf;
   9066                       uint32_t imm = ImmediateT32::Decode(
   9067                           (instr & 0xff) | ((instr >> 4) & 0x700) |
   9068                           ((instr >> 15) & 0x800));
   9069                       if (OutsideITBlock() &&
   9070                           (instr & 0x00100000) == 0x00100000 && (imm == 0) &&
   9071                           ((rd < kNumberOfT32LowRegisters) &&
   9072                            (rn < kNumberOfT32LowRegisters) && (imm == 0))) {
   9073                         // RSBS.W {<Rd>}, <Rn>, #0 ; T2
   9074                         rsbs(Condition::None(),
   9075                              Wide,
   9076                              Register(rd),
   9077                              Register(rn),
   9078                              UINT32_C(0));
   9079                       } else {
   9080                         VIXL_ASSERT((instr & 0x00100000) == 0x00100000);
   9081                         // RSBS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T2
   9082                         rsbs(CurrentCond(),
   9083                              Best,
   9084                              Register(rd),
   9085                              Register(rn),
   9086                              imm);
   9087                       }
   9088                       break;
   9089                     }
   9090                     case 0x02000000: {
   9091                       // 0xf2000000
   9092                       switch (instr & 0x000d0000) {
   9093                         case 0x000d0000: {
   9094                           // 0xf20d0000
   9095                           switch (instr & 0x00020000) {
   9096                             case 0x00000000: {
   9097                               // 0xf20d0000
   9098                               unsigned rd = (instr >> 8) & 0xf;
   9099                               uint32_t imm = (instr & 0xff) |
   9100                                              ((instr >> 4) & 0x700) |
   9101                                              ((instr >> 15) & 0x800);
   9102                               if (((rd >= kNumberOfT32LowRegisters) ||
   9103                                    ((imm > 1020) || ((imm & 3) != 0))) &&
   9104                                   ((rd != sp.GetCode()) ||
   9105                                    ((imm > 508) || ((imm & 3) != 0))) &&
   9106                                   (!ImmediateT32::IsImmediateT32(imm))) {
   9107                                 // ADD{<c>}{<q>} {<Rd>}, SP, #<imm12> ; T4
   9108                                 add(CurrentCond(), Best, Register(rd), sp, imm);
   9109                               } else {
   9110                                 // ADDW{<c>}{<q>} {<Rd>}, SP, #<imm12> ; T4
   9111                                 addw(CurrentCond(), Register(rd), sp, imm);
   9112                               }
   9113                               break;
   9114                             }
   9115                             case 0x00020000: {
   9116                               // 0xf20f0000
   9117                               unsigned rd = (instr >> 8) & 0xf;
   9118                               int32_t imm = (instr & 0xff) |
   9119                                             ((instr >> 4) & 0x700) |
   9120                                             ((instr >> 15) & 0x800);
   9121                               Label label(imm, kT32PcDelta);
   9122                               if ((imm >= 0) && (imm <= 4095) &&
   9123                                   ((rd < kNumberOfT32LowRegisters) &&
   9124                                    (imm >= 0) && (imm <= 1020) &&
   9125                                    ((imm & 3) == 0))) {
   9126                                 // ADR{<c>}.W <Rd>, <label> ; T3
   9127                                 adr(CurrentCond(), Wide, Register(rd), &label);
   9128                               } else {
   9129                                 // ADR{<c>}{<q>} <Rd>, <label> ; T3
   9130                                 adr(CurrentCond(), Best, Register(rd), &label);
   9131                               }
   9132                               break;
   9133                             }
   9134                           }
   9135                           break;
   9136                         }
   9137                         default: {
   9138                           if (((instr & 0xd0000) == 0xd0000)) {
   9139                             UnallocatedT32(instr);
   9140                             return;
   9141                           }
   9142                           unsigned rd = (instr >> 8) & 0xf;
   9143                           unsigned rn = (instr >> 16) & 0xf;
   9144                           uint32_t imm = (instr & 0xff) |
   9145                                          ((instr >> 4) & 0x700) |
   9146                                          ((instr >> 15) & 0x800);
   9147                           if ((InITBlock() ||
   9148                                (rd >= kNumberOfT32LowRegisters) ||
   9149                                (rn >= kNumberOfT32LowRegisters) || (imm > 7)) &&
   9150                               (InITBlock() || (rd != rn) ||
   9151                                (rd >= kNumberOfT32LowRegisters) ||
   9152                                (imm > 255)) &&
   9153                               (!ImmediateT32::IsImmediateT32(imm))) {
   9154                             // ADD{<c>}{<q>} {<Rd>}, <Rn>, #<imm12> ; T4
   9155                             add(CurrentCond(),
   9156                                 Best,
   9157                                 Register(rd),
   9158                                 Register(rn),
   9159                                 imm);
   9160                           } else {
   9161                             // ADDW{<c>}{<q>} {<Rd>}, <Rn>, #<imm12> ; T4
   9162                             addw(CurrentCond(),
   9163                                  Register(rd),
   9164                                  Register(rn),
   9165                                  imm);
   9166                           }
   9167                           break;
   9168                         }
   9169                       }
   9170                       break;
   9171                     }
   9172                     case 0x02400000: {
   9173                       // 0xf2400000
   9174                       unsigned rd = (instr >> 8) & 0xf;
   9175                       uint32_t imm = (instr & 0xff) | ((instr >> 4) & 0x700) |
   9176                                      ((instr >> 15) & 0x800) |
   9177                                      ((instr >> 4) & 0xf000);
   9178                       if ((InITBlock() || (rd >= kNumberOfT32LowRegisters) ||
   9179                            (imm > 255)) &&
   9180                           (!ImmediateT32::IsImmediateT32(imm))) {
   9181                         // MOV{<c>}{<q>} <Rd>, #<imm16> ; T3
   9182                         mov(CurrentCond(), Best, Register(rd), imm);
   9183                       } else {
   9184                         // MOVW{<c>}{<q>} <Rd>, #<imm16> ; T3
   9185                         movw(CurrentCond(), Register(rd), imm);
   9186                       }
   9187                       break;
   9188                     }
   9189                     case 0x02a00000: {
   9190                       // 0xf2a00000
   9191                       switch (instr & 0x000d0000) {
   9192                         case 0x000d0000: {
   9193                           // 0xf2ad0000
   9194                           switch (instr & 0x00020000) {
   9195                             case 0x00000000: {
   9196                               // 0xf2ad0000
   9197                               unsigned rd = (instr >> 8) & 0xf;
   9198                               uint32_t imm = (instr & 0xff) |
   9199                                              ((instr >> 4) & 0x700) |
   9200                                              ((instr >> 15) & 0x800);
   9201                               if (((rd != sp.GetCode()) ||
   9202                                    ((imm > 508) || ((imm & 3) != 0))) &&
   9203                                   (!ImmediateT32::IsImmediateT32(imm))) {
   9204                                 // SUB{<c>}{<q>} {<Rd>}, SP, #<imm12> ; T3
   9205                                 sub(CurrentCond(), Best, Register(rd), sp, imm);
   9206                               } else {
   9207                                 // SUBW{<c>}{<q>} {<Rd>}, SP, #<imm12> ; T3
   9208                                 subw(CurrentCond(), Register(rd), sp, imm);
   9209                               }
   9210                               break;
   9211                             }
   9212                             case 0x00020000: {
   9213                               // 0xf2af0000
   9214                               if (((((Uint32((instr >> 26)) & Uint32(0x1))
   9215                                      << 11) |
   9216                                     ((Uint32((instr >> 12)) & Uint32(0x7))
   9217                                      << 8) |
   9218                                     (Uint32(instr) & Uint32(0xff))) ==
   9219                                    Uint32(0x0))) {
   9220                                 unsigned rd = (instr >> 8) & 0xf;
   9221                                 uint32_t imm = (instr & 0xff) |
   9222                                                ((instr >> 4) & 0x700) |
   9223                                                ((instr >> 15) & 0x800);
   9224                                 // SUB{<c>}{<q>} <Rd>, PC, #<imm12> ; T2
   9225                                 sub(CurrentCond(), Best, Register(rd), pc, imm);
   9226                                 return;
   9227                               }
   9228                               unsigned rd = (instr >> 8) & 0xf;
   9229                               int32_t imm = (instr & 0xff) |
   9230                                             ((instr >> 4) & 0x700) |
   9231                                             ((instr >> 15) & 0x800);
   9232                               Label label(-imm, kT32PcDelta);
   9233                               // ADR{<c>}{<q>} <Rd>, <label> ; T2
   9234                               adr(CurrentCond(), Best, Register(rd), &label);
   9235                               break;
   9236                             }
   9237                           }
   9238                           break;
   9239                         }
   9240                         default: {
   9241                           if (((instr & 0xd0000) == 0xd0000)) {
   9242                             UnallocatedT32(instr);
   9243                             return;
   9244                           }
   9245                           unsigned rd = (instr >> 8) & 0xf;
   9246                           unsigned rn = (instr >> 16) & 0xf;
   9247                           uint32_t imm = (instr & 0xff) |
   9248                                          ((instr >> 4) & 0x700) |
   9249                                          ((instr >> 15) & 0x800);
   9250                           if ((InITBlock() ||
   9251                                (rd >= kNumberOfT32LowRegisters) ||
   9252                                (rn >= kNumberOfT32LowRegisters) || (imm > 7)) &&
   9253                               (InITBlock() || (rd != rn) ||
   9254                                (rd >= kNumberOfT32LowRegisters) ||
   9255                                (imm > 255)) &&
   9256                               (!ImmediateT32::IsImmediateT32(imm))) {
   9257                             // SUB{<c>}{<q>} {<Rd>}, <Rn>, #<imm12> ; T4
   9258                             sub(CurrentCond(),
   9259                                 Best,
   9260                                 Register(rd),
   9261                                 Register(rn),
   9262                                 imm);
   9263                           } else {
   9264                             // SUBW{<c>}{<q>} {<Rd>}, <Rn>, #<imm12> ; T4
   9265                             subw(CurrentCond(),
   9266                                  Register(rd),
   9267                                  Register(rn),
   9268                                  imm);
   9269                           }
   9270                           break;
   9271                         }
   9272                       }
   9273                       break;
   9274                     }
   9275                     case 0x02c00000: {
   9276                       // 0xf2c00000
   9277                       unsigned rd = (instr >> 8) & 0xf;
   9278                       uint32_t imm = (instr & 0xff) | ((instr >> 4) & 0x700) |
   9279                                      ((instr >> 15) & 0x800) |
   9280                                      ((instr >> 4) & 0xf000);
   9281                       // MOVT{<c>}{<q>} <Rd>, #<imm16> ; T1
   9282                       movt(CurrentCond(), Register(rd), imm);
   9283                       break;
   9284                     }
   9285                     case 0x03000000: {
   9286                       // 0xf3000000
   9287                       unsigned rd = (instr >> 8) & 0xf;
   9288                       uint32_t imm = (instr & 0x1f) + 1;
   9289                       unsigned rn = (instr >> 16) & 0xf;
   9290                       uint32_t amount =
   9291                           ((instr >> 6) & 0x3) | ((instr >> 10) & 0x1c);
   9292                       // SSAT{<c>}{<q>} <Rd>, #<imm>, <Rn> {, LSL #<amount> } ; T1 NOLINT(whitespace/line_length)
   9293                       ssat(CurrentCond(),
   9294                            Register(rd),
   9295                            imm,
   9296                            Operand(Register(rn), LSL, amount));
   9297                       if (((instr & 0xfff08020) != 0xf3000000)) {
   9298                         UnpredictableT32(instr);
   9299                       }
   9300                       break;
   9301                     }
   9302                     case 0x03200000: {
   9303                       // 0xf3200000
   9304                       switch (instr & 0x000070c0) {
   9305                         case 0x00000000: {
   9306                           // 0xf3200000
   9307                           unsigned rd = (instr >> 8) & 0xf;
   9308                           uint32_t imm = (instr & 0xf) + 1;
   9309                           unsigned rn = (instr >> 16) & 0xf;
   9310                           // SSAT16{<c>}{<q>} <Rd>, #<imm>, <Rn> ; T1
   9311                           ssat16(CurrentCond(),
   9312                                  Register(rd),
   9313                                  imm,
   9314                                  Register(rn));
   9315                           if (((instr & 0xfff0f0f0) != 0xf3200000)) {
   9316                             UnpredictableT32(instr);
   9317                           }
   9318                           break;
   9319                         }
   9320                         default: {
   9321                           if (((instr & 0x70c0) == 0x0)) {
   9322                             UnallocatedT32(instr);
   9323                             return;
   9324                           }
   9325                           unsigned rd = (instr >> 8) & 0xf;
   9326                           uint32_t imm = (instr & 0x1f) + 1;
   9327                           unsigned rn = (instr >> 16) & 0xf;
   9328                           uint32_t amount =
   9329                               ((instr >> 6) & 0x3) | ((instr >> 10) & 0x1c);
   9330                           // SSAT{<c>}{<q>} <Rd>, #<imm>, <Rn>, ASR #<amount> ; T1 NOLINT(whitespace/line_length)
   9331                           ssat(CurrentCond(),
   9332                                Register(rd),
   9333                                imm,
   9334                                Operand(Register(rn), ASR, amount));
   9335                           if (((instr & 0xfff08020) != 0xf3200000)) {
   9336                             UnpredictableT32(instr);
   9337                           }
   9338                           break;
   9339                         }
   9340                       }
   9341                       break;
   9342                     }
   9343                     case 0x03400000: {
   9344                       // 0xf3400000
   9345                       unsigned rd = (instr >> 8) & 0xf;
   9346                       unsigned rn = (instr >> 16) & 0xf;
   9347                       uint32_t lsb =
   9348                           ((instr >> 6) & 0x3) | ((instr >> 10) & 0x1c);
   9349                       uint32_t widthm1 = instr & 0x1f;
   9350                       uint32_t width = widthm1 + 1;
   9351                       // SBFX{<c>}{<q>} <Rd>, <Rn>, #<lsb>, #<width> ; T1
   9352                       sbfx(CurrentCond(),
   9353                            Register(rd),
   9354                            Register(rn),
   9355                            lsb,
   9356                            width);
   9357                       if (((instr & 0xfff08020) != 0xf3400000)) {
   9358                         UnpredictableT32(instr);
   9359                       }
   9360                       break;
   9361                     }
   9362                     case 0x03600000: {
   9363                       // 0xf3600000
   9364                       switch (instr & 0x000f0000) {
   9365                         case 0x000f0000: {
   9366                           // 0xf36f0000
   9367                           unsigned rd = (instr >> 8) & 0xf;
   9368                           uint32_t lsb =
   9369                               ((instr >> 6) & 0x3) | ((instr >> 10) & 0x1c);
   9370                           uint32_t msb = instr & 0x1f;
   9371                           uint32_t width = msb - lsb + 1;
   9372                           // BFC{<c>}{<q>} <Rd>, #<lsb>, #<width> ; T1
   9373                           bfc(CurrentCond(), Register(rd), lsb, width);
   9374                           if (((instr & 0xffff8020) != 0xf36f0000)) {
   9375                             UnpredictableT32(instr);
   9376                           }
   9377                           break;
   9378                         }
   9379                         default: {
   9380                           if (((instr & 0xf0000) == 0xf0000)) {
   9381                             UnallocatedT32(instr);
   9382                             return;
   9383                           }
   9384                           unsigned rd = (instr >> 8) & 0xf;
   9385                           unsigned rn = (instr >> 16) & 0xf;
   9386                           uint32_t lsb =
   9387                               ((instr >> 6) & 0x3) | ((instr >> 10) & 0x1c);
   9388                           uint32_t msb = instr & 0x1f;
   9389                           uint32_t width = msb - lsb + 1;
   9390                           // BFI{<c>}{<q>} <Rd>, <Rn>, #<lsb>, #<width> ; T1
   9391                           bfi(CurrentCond(),
   9392                               Register(rd),
   9393                               Register(rn),
   9394                               lsb,
   9395                               width);
   9396                           if (((instr & 0xfff08020) != 0xf3600000)) {
   9397                             UnpredictableT32(instr);
   9398                           }
   9399                           break;
   9400                         }
   9401                       }
   9402                       break;
   9403                     }
   9404                     case 0x03800000: {
   9405                       // 0xf3800000
   9406                       unsigned rd = (instr >> 8) & 0xf;
   9407                       uint32_t imm = instr & 0x1f;
   9408                       unsigned rn = (instr >> 16) & 0xf;
   9409                       uint32_t amount =
   9410                           ((instr >> 6) & 0x3) | ((instr >> 10) & 0x1c);
   9411                       // USAT{<c>}{<q>} <Rd>, #<imm>, <Rn> {, LSL #<amount> } ; T1 NOLINT(whitespace/line_length)
   9412                       usat(CurrentCond(),
   9413                            Register(rd),
   9414                            imm,
   9415                            Operand(Register(rn), LSL, amount));
   9416                       if (((instr & 0xfff08020) != 0xf3800000)) {
   9417                         UnpredictableT32(instr);
   9418                       }
   9419                       break;
   9420                     }
   9421                     case 0x03a00000: {
   9422                       // 0xf3a00000
   9423                       switch (instr & 0x000070c0) {
   9424                         case 0x00000000: {
   9425                           // 0xf3a00000
   9426                           unsigned rd = (instr >> 8) & 0xf;
   9427                           uint32_t imm = instr & 0xf;
   9428                           unsigned rn = (instr >> 16) & 0xf;
   9429                           // USAT16{<c>}{<q>} <Rd>, #<imm>, <Rn> ; T1
   9430                           usat16(CurrentCond(),
   9431                                  Register(rd),
   9432                                  imm,
   9433                                  Register(rn));
   9434                           if (((instr & 0xfff0f0f0) != 0xf3a00000)) {
   9435                             UnpredictableT32(instr);
   9436                           }
   9437                           break;
   9438                         }
   9439                         default: {
   9440                           if (((instr & 0x70c0) == 0x0)) {
   9441                             UnallocatedT32(instr);
   9442                             return;
   9443                           }
   9444                           unsigned rd = (instr >> 8) & 0xf;
   9445                           uint32_t imm = instr & 0x1f;
   9446                           unsigned rn = (instr >> 16) & 0xf;
   9447                           uint32_t amount =
   9448                               ((instr >> 6) & 0x3) | ((instr >> 10) & 0x1c);
   9449                           // USAT{<c>}{<q>} <Rd>, #<imm>, <Rn>, ASR #<amount> ; T1 NOLINT(whitespace/line_length)
   9450                           usat(CurrentCond(),
   9451                                Register(rd),
   9452                                imm,
   9453                                Operand(Register(rn), ASR, amount));
   9454                           if (((instr & 0xfff08020) != 0xf3a00000)) {
   9455                             UnpredictableT32(instr);
   9456                           }
   9457                           break;
   9458                         }
   9459                       }
   9460                       break;
   9461                     }
   9462                     case 0x03c00000: {
   9463                       // 0xf3c00000
   9464                       unsigned rd = (instr >> 8) & 0xf;
   9465                       unsigned rn = (instr >> 16) & 0xf;
   9466                       uint32_t lsb =
   9467                           ((instr >> 6) & 0x3) | ((instr >> 10) & 0x1c);
   9468                       uint32_t widthm1 = instr & 0x1f;
   9469                       uint32_t width = widthm1 + 1;
   9470                       // UBFX{<c>}{<q>} <Rd>, <Rn>, #<lsb>, #<width> ; T1
   9471                       ubfx(CurrentCond(),
   9472                            Register(rd),
   9473                            Register(rn),
   9474                            lsb,
   9475                            width);
   9476                       if (((instr & 0xfff08020) != 0xf3c00000)) {
   9477                         UnpredictableT32(instr);
   9478                       }
   9479                       break;
   9480                     }
   9481                     default:
   9482                       UnallocatedT32(instr);
   9483                       break;
   9484                   }
   9485                   break;
   9486                 }
   9487                 case 0x00008000: {
   9488                   // 0xf0008000
   9489                   switch (instr & 0x00005000) {
   9490                     case 0x00000000: {
   9491                       // 0xf0008000
   9492                       switch (instr & 0x03800000) {
   9493                         case 0x03800000: {
   9494                           // 0xf3808000
   9495                           switch (instr & 0x04600000) {
   9496                             case 0x00000000: {
   9497                               // 0xf3808000
   9498                               switch (instr & 0x00000020) {
   9499                                 case 0x00000000: {
   9500                                   // 0xf3808000
   9501                                   unsigned spec_reg = ((instr >> 8) & 0xf) |
   9502                                                       ((instr >> 16) & 0x10);
   9503                                   unsigned rn = (instr >> 16) & 0xf;
   9504                                   // MSR{<c>}{<q>} <spec_reg>, <Rn> ; T1
   9505                                   msr(CurrentCond(),
   9506                                       MaskedSpecialRegister(spec_reg),
   9507                                       Register(rn));
   9508                                   if (((instr & 0xffe0f0ff) != 0xf3808000)) {
   9509                                     UnpredictableT32(instr);
   9510                                   }
   9511                                   break;
   9512                                 }
   9513                                 case 0x00000020: {
   9514                                   // 0xf3808020
   9515                                   UnimplementedT32_32("MSR", instr);
   9516                                   break;
   9517                                 }
   9518                               }
   9519                               break;
   9520                             }
   9521                             case 0x00200000: {
   9522                               // 0xf3a08000
   9523                               switch (instr & 0x00100000) {
   9524                                 case 0x00000000: {
   9525                                   // 0xf3a08000
   9526                                   switch (instr & 0x00000700) {
   9527                                     case 0x00000000: {
   9528                                       // 0xf3a08000
   9529                                       switch (instr & 0x000000f0) {
   9530                                         case 0x00000000: {
   9531                                           // 0xf3a08000
   9532                                           switch (instr & 0x0000000f) {
   9533                                             case 0x00000000: {
   9534                                               // 0xf3a08000
   9535                                               // NOP{<c>}.W ; T2
   9536                                               nop(CurrentCond(), Wide);
   9537                                               if (((instr & 0xffffffff) !=
   9538                                                    0xf3af8000)) {
   9539                                                 UnpredictableT32(instr);
   9540                                               }
   9541                                               break;
   9542                                             }
   9543                                             case 0x00000001: {
   9544                                               // 0xf3a08001
   9545                                               // YIELD{<c>}.W ; T2
   9546                                               yield(CurrentCond(), Wide);
   9547                                               if (((instr & 0xffffffff) !=
   9548                                                    0xf3af8001)) {
   9549                                                 UnpredictableT32(instr);
   9550                                               }
   9551                                               break;
   9552                                             }
   9553                                             case 0x00000002: {
   9554                                               // 0xf3a08002
   9555                                               UnimplementedT32_32("WFE", instr);
   9556                                               break;
   9557                                             }
   9558                                             case 0x00000003: {
   9559                                               // 0xf3a08003
   9560                                               UnimplementedT32_32("WFI", instr);
   9561                                               break;
   9562                                             }
   9563                                             case 0x00000004: {
   9564                                               // 0xf3a08004
   9565                                               UnimplementedT32_32("SEV", instr);
   9566                                               break;
   9567                                             }
   9568                                             case 0x00000005: {
   9569                                               // 0xf3a08005
   9570                                               UnimplementedT32_32("SEVL",
   9571                                                                   instr);
   9572                                               break;
   9573                                             }
   9574                                             default:
   9575                                               UnallocatedT32(instr);
   9576                                               break;
   9577                                           }
   9578                                           break;
   9579                                         }
   9580                                         case 0x000000f0: {
   9581                                           // 0xf3a080f0
   9582                                           UnimplementedT32_32("DBG", instr);
   9583                                           break;
   9584                                         }
   9585                                         default:
   9586                                           UnallocatedT32(instr);
   9587                                           break;
   9588                                       }
   9589                                       break;
   9590                                     }
   9591                                     case 0x00000100: {
   9592                                       // 0xf3a08100
   9593                                       if ((instr & 0x000000e0) == 0x00000000) {
   9594                                         UnimplementedT32_32("CPS", instr);
   9595                                       } else {
   9596                                         UnallocatedT32(instr);
   9597                                       }
   9598                                       break;
   9599                                     }
   9600                                     case 0x00000400: {
   9601                                       // 0xf3a08400
   9602                                       if ((instr & 0x0000001f) == 0x00000000) {
   9603                                         UnimplementedT32_32("CPSIE", instr);
   9604                                       } else {
   9605                                         UnallocatedT32(instr);
   9606                                       }
   9607                                       break;
   9608                                     }
   9609                                     case 0x00000500: {
   9610                                       // 0xf3a08500
   9611                                       UnimplementedT32_32("CPSIE", instr);
   9612                                       break;
   9613                                     }
   9614                                     case 0x00000600: {
   9615                                       // 0xf3a08600
   9616                                       if ((instr & 0x0000001f) == 0x00000000) {
   9617                                         UnimplementedT32_32("CPSID", instr);
   9618                                       } else {
   9619                                         UnallocatedT32(instr);
   9620                                       }
   9621                                       break;
   9622                                     }
   9623                                     case 0x00000700: {
   9624                                       // 0xf3a08700
   9625                                       UnimplementedT32_32("CPSID", instr);
   9626                                       break;
   9627                                     }
   9628                                     default:
   9629                                       UnallocatedT32(instr);
   9630                                       break;
   9631                                   }
   9632                                   break;
   9633                                 }
   9634                                 case 0x00100000: {
   9635                                   // 0xf3b08000
   9636                                   switch (instr & 0x000000f0) {
   9637                                     case 0x00000020: {
   9638                                       // 0xf3b08020
   9639                                       // CLREX{<c>}{<q>} ; T1
   9640                                       clrex(CurrentCond());
   9641                                       if (((instr & 0xffffffff) !=
   9642                                            0xf3bf8f2f)) {
   9643                                         UnpredictableT32(instr);
   9644                                       }
   9645                                       break;
   9646                                     }
   9647                                     case 0x00000040: {
   9648                                       // 0xf3b08040
   9649                                       MemoryBarrier option(instr & 0xf);
   9650                                       // DSB{<c>}{<q>} {<option>} ; T1
   9651                                       dsb(CurrentCond(), option);
   9652                                       if (((instr & 0xfffffff0) !=
   9653                                            0xf3bf8f40)) {
   9654                                         UnpredictableT32(instr);
   9655                                       }
   9656                                       break;
   9657                                     }
   9658                                     case 0x00000050: {
   9659                                       // 0xf3b08050
   9660                                       MemoryBarrier option(instr & 0xf);
   9661                                       // DMB{<c>}{<q>} {<option>} ; T1
   9662                                       dmb(CurrentCond(), option);
   9663                                       if (((instr & 0xfffffff0) !=
   9664                                            0xf3bf8f50)) {
   9665                                         UnpredictableT32(instr);
   9666                                       }
   9667                                       break;
   9668                                     }
   9669                                     case 0x00000060: {
   9670                                       // 0xf3b08060
   9671                                       MemoryBarrier option(instr & 0xf);
   9672                                       // ISB{<c>}{<q>} {<option>} ; T1
   9673                                       isb(CurrentCond(), option);
   9674                                       if (((instr & 0xfffffff0) !=
   9675                                            0xf3bf8f60)) {
   9676                                         UnpredictableT32(instr);
   9677                                       }
   9678                                       break;
   9679                                     }
   9680                                     default:
   9681                                       UnallocatedT32(instr);
   9682                                       break;
   9683                                   }
   9684                                   break;
   9685                                 }
   9686                               }
   9687                               break;
   9688                             }
   9689                             case 0x00400000: {
   9690                               // 0xf3c08000
   9691                               switch (instr & 0x00100000) {
   9692                                 case 0x00000000: {
   9693                                   // 0xf3c08000
   9694                                   unsigned rm = (instr >> 16) & 0xf;
   9695                                   // BXJ{<c>}{<q>} <Rm> ; T1
   9696                                   bxj(CurrentCond(), Register(rm));
   9697                                   if (((instr & 0xfff0ffff) != 0xf3c08f00)) {
   9698                                     UnpredictableT32(instr);
   9699                                   }
   9700                                   break;
   9701                                 }
   9702                                 case 0x00100000: {
   9703                                   // 0xf3d08000
   9704                                   switch (instr & 0x000000ff) {
   9705                                     case 0x00000000: {
   9706                                       // 0xf3d08000
   9707                                       if ((instr & 0x000f0000) == 0x000e0000) {
   9708                                         UnimplementedT32_32("ERET", instr);
   9709                                       } else {
   9710                                         UnallocatedT32(instr);
   9711                                       }
   9712                                       break;
   9713                                     }
   9714                                     default: {
   9715                                       if (((instr & 0xff) == 0x0)) {
   9716                                         UnallocatedT32(instr);
   9717                                         return;
   9718                                       }
   9719                                       uint32_t imm = instr & 0xff;
   9720                                       // SUBS{<c>}{<q>} PC, LR, #<imm8> ; T5
   9721                                       subs(CurrentCond(), Best, pc, lr, imm);
   9722                                       if (((instr & 0xffffff00) !=
   9723                                            0xf3de8f00)) {
   9724                                         UnpredictableT32(instr);
   9725                                       }
   9726                                       break;
   9727                                     }
   9728                                   }
   9729                                   break;
   9730                                 }
   9731                               }
   9732                               break;
   9733                             }
   9734                             case 0x00600000: {
   9735                               // 0xf3e08000
   9736                               switch (instr & 0x00000020) {
   9737                                 case 0x00000000: {
   9738                                   // 0xf3e08000
   9739                                   unsigned rd = (instr >> 8) & 0xf;
   9740                                   unsigned spec_reg = (instr >> 20) & 0x1;
   9741                                   // MRS{<c>}{<q>} <Rd>, <spec_reg> ; T1
   9742                                   mrs(CurrentCond(),
   9743                                       Register(rd),
   9744                                       SpecialRegister(spec_reg));
   9745                                   if (((instr & 0xffeff0ff) != 0xf3ef8000)) {
   9746                                     UnpredictableT32(instr);
   9747                                   }
   9748                                   break;
   9749                                 }
   9750                                 case 0x00000020: {
   9751                                   // 0xf3e08020
   9752                                   UnimplementedT32_32("MRS", instr);
   9753                                   break;
   9754                                 }
   9755                               }
   9756                               break;
   9757                             }
   9758                             case 0x04000000: {
   9759                               // 0xf7808000
   9760                               switch (instr & 0x001f2fff) {
   9761                                 case 0x000f0001: {
   9762                                   // 0xf78f8001
   9763                                   UnimplementedT32_32("DCPS1", instr);
   9764                                   break;
   9765                                 }
   9766                                 case 0x000f0002: {
   9767                                   // 0xf78f8002
   9768                                   UnimplementedT32_32("DCPS2", instr);
   9769                                   break;
   9770                                 }
   9771                                 case 0x000f0003: {
   9772                                   // 0xf78f8003
   9773                                   UnimplementedT32_32("DCPS3", instr);
   9774                                   break;
   9775                                 }
   9776                                 default:
   9777                                   UnallocatedT32(instr);
   9778                                   break;
   9779                               }
   9780                               break;
   9781                             }
   9782                             case 0x04600000: {
   9783                               // 0xf7e08000
   9784                               switch (instr & 0x00102000) {
   9785                                 case 0x00000000: {
   9786                                   // 0xf7e08000
   9787                                   uint32_t imm =
   9788                                       (instr & 0xfff) | ((instr >> 4) & 0xf000);
   9789                                   // HVC{<q>} {#}<imm16> ; T1
   9790                                   hvc(Condition::None(), imm);
   9791                                   break;
   9792                                 }
   9793                                 case 0x00100000: {
   9794                                   // 0xf7f08000
   9795                                   UnimplementedT32_32("SMC", instr);
   9796                                   break;
   9797                                 }
   9798                                 case 0x00102000: {
   9799                                   // 0xf7f0a000
   9800                                   uint32_t imm =
   9801                                       (instr & 0xfff) | ((instr >> 4) & 0xf000);
   9802                                   if ((imm <= 255)) {
   9803                                     // UDF{<c>}.W {#}<imm> ; T2
   9804                                     udf(CurrentCond(), Wide, imm);
   9805                                   } else {
   9806                                     // UDF{<c>}{<q>} {#}<imm> ; T2
   9807                                     udf(CurrentCond(), Best, imm);
   9808                                   }
   9809                                   break;
   9810                                 }
   9811                                 default:
   9812                                   UnallocatedT32(instr);
   9813                                   break;
   9814                               }
   9815                               break;
   9816                             }
   9817                             default:
   9818                               UnallocatedT32(instr);
   9819                               break;
   9820                           }
   9821                           break;
   9822                         }
   9823                         default: {
   9824                           if (((instr & 0x3800000) == 0x3800000)) {
   9825                             UnallocatedT32(instr);
   9826                             return;
   9827                           }
   9828                           Condition condition((instr >> 22) & 0xf);
   9829                           int32_t imm =
   9830                               SignExtend<int32_t>((instr & 0x7ff) |
   9831                                                       ((instr >> 5) & 0x1f800) |
   9832                                                       ((instr << 4) & 0x20000) |
   9833                                                       ((instr << 7) & 0x40000) |
   9834                                                       ((instr >> 7) & 0x80000),
   9835                                                   20)
   9836                               << 1;
   9837                           Label label(imm, kT32PcDelta);
   9838                           if (OutsideITBlock() && (imm >= -1048576) &&
   9839                               (imm <= 1048574) && ((imm & 1) == 0) &&
   9840                               ((imm >= -256) && (imm <= 254) &&
   9841                                ((imm & 1) == 0))) {
   9842                             // B<c>.W <label> ; T3
   9843                             b(condition, Wide, &label);
   9844                           } else {
   9845                             VIXL_ASSERT(OutsideITBlock() && (imm >= -1048576) &&
   9846                                         (imm <= 1048574) && ((imm & 1) == 0));
   9847                             // B<c>{<q>} <label> ; T3
   9848                             b(condition, Best, &label);
   9849                           }
   9850                           break;
   9851                         }
   9852                       }
   9853                       break;
   9854                     }
   9855                     case 0x00001000: {
   9856                       // 0xf0009000
   9857                       uint32_t encoded_imm =
   9858                           (instr & 0x7ff) | ((instr >> 5) & 0x1ff800) |
   9859                           ((instr << 10) & 0x200000) |
   9860                           ((instr << 9) & 0x400000) | ((instr >> 3) & 0x800000);
   9861                       uint32_t S = encoded_imm & (1 << 23);
   9862                       encoded_imm ^= ((S >> 1) | (S >> 2)) ^ (3 << 21);
   9863                       int32_t imm = SignExtend<int32_t>(encoded_imm << 1, 25);
   9864                       Label label(imm, kT32PcDelta);
   9865                       if ((imm >= -16777216) && (imm <= 16777214) &&
   9866                           ((imm & 1) == 0) &&
   9867                           (OutsideITBlockOrLast() && (imm >= -2048) &&
   9868                            (imm <= 2046) && ((imm & 1) == 0))) {
   9869                         // B{<c>}.W <label> ; T4
   9870                         b(CurrentCond(), Wide, &label);
   9871                       } else {
   9872                         VIXL_ASSERT(OutsideITBlockOrLast() &&
   9873                                     (imm >= -16777216) && (imm <= 16777214) &&
   9874                                     ((imm & 1) == 0));
   9875                         // B{<c>}{<q>} <label> ; T4
   9876                         b(CurrentCond(), Best, &label);
   9877                       }
   9878                       break;
   9879                     }
   9880                     case 0x00004000: {
   9881                       // 0xf000c000
   9882                       if ((instr & 0x00000001) == 0x00000000) {
   9883                         uint32_t encoded_imm = ((instr >> 1) & 0x3ff) |
   9884                                                ((instr >> 6) & 0xffc00) |
   9885                                                ((instr << 9) & 0x100000) |
   9886                                                ((instr << 8) & 0x200000) |
   9887                                                ((instr >> 4) & 0x400000);
   9888                         uint32_t S = encoded_imm & (1 << 22);
   9889                         encoded_imm ^= ((S >> 1) | (S >> 2)) ^ (3 << 20);
   9890                         int32_t imm = SignExtend<int32_t>(encoded_imm << 2, 25);
   9891                         Label label(imm, kT32PcDelta);
   9892                         // BLX{<c>}{<q>} <label> ; T2
   9893                         blx(CurrentCond(), &label);
   9894                       } else {
   9895                         UnallocatedT32(instr);
   9896                       }
   9897                       break;
   9898                     }
   9899                     case 0x00005000: {
   9900                       // 0xf000d000
   9901                       uint32_t encoded_imm =
   9902                           (instr & 0x7ff) | ((instr >> 5) & 0x1ff800) |
   9903                           ((instr << 10) & 0x200000) |
   9904                           ((instr << 9) & 0x400000) | ((instr >> 3) & 0x800000);
   9905                       uint32_t S = encoded_imm & (1 << 23);
   9906                       encoded_imm ^= ((S >> 1) | (S >> 2)) ^ (3 << 21);
   9907                       int32_t imm = SignExtend<int32_t>(encoded_imm << 1, 25);
   9908                       Label label(imm, kT32PcDelta);
   9909                       // BL{<c>}{<q>} <label> ; T1
   9910                       bl(CurrentCond(), &label);
   9911                       break;
   9912                     }
   9913                   }
   9914                   break;
   9915                 }
   9916               }
   9917               break;
   9918             }
   9919           }
   9920           break;
   9921         }
   9922         case 0x08000000: {
   9923           // 0xe8000000
   9924           switch (instr & 0x06000000) {
   9925             case 0x00000000: {
   9926               // 0xe8000000
   9927               switch (instr & 0x10100000) {
   9928                 case 0x00000000: {
   9929                   // 0xe8000000
   9930                   switch (instr & 0x01400000) {
   9931                     case 0x00000000: {
   9932                       // 0xe8000000
   9933                       switch (instr & 0x00800000) {
   9934                         case 0x00000000: {
   9935                           // 0xe8000000
   9936                           UnimplementedT32_32("SRSDB", instr);
   9937                           break;
   9938                         }
   9939                         case 0x00800000: {
   9940                           // 0xe8800000
   9941                           unsigned rn = (instr >> 16) & 0xf;
   9942                           WriteBack write_back((instr >> 21) & 0x1);
   9943                           RegisterList registers(
   9944                               (((instr >> 14) & 0x1) << kLRRegNum) |
   9945                               (instr & 0x1fff));
   9946                           if ((rn < kNumberOfT32LowRegisters) &&
   9947                               write_back.DoesWriteBack() &&
   9948                               ((registers.GetList() & ~0xff) == 0)) {
   9949                             // STM{<c>}.W <Rn>{!}, <registers> ; T2
   9950                             stm(CurrentCond(),
   9951                                 Wide,
   9952                                 Register(rn),
   9953                                 write_back,
   9954                                 registers);
   9955                             if (((instr & 0xffd0a000) != 0xe8800000)) {
   9956                               UnpredictableT32(instr);
   9957                             }
   9958                           } else {
   9959                             // STM{<c>}{<q>} <Rn>{!}, <registers> ; T2
   9960                             stm(CurrentCond(),
   9961                                 Best,
   9962                                 Register(rn),
   9963                                 write_back,
   9964                                 registers);
   9965                             if (((instr & 0xffd0a000) != 0xe8800000)) {
   9966                               UnpredictableT32(instr);
   9967                             }
   9968                           }
   9969                           break;
   9970                         }
   9971                       }
   9972                       break;
   9973                     }
   9974                     case 0x00400000: {
   9975                       // 0xe8400000
   9976                       switch (instr & 0x00200000) {
   9977                         case 0x00000000: {
   9978                           // 0xe8400000
   9979                           switch (instr & 0x00800000) {
   9980                             case 0x00000000: {
   9981                               // 0xe8400000
   9982                               unsigned rd = (instr >> 8) & 0xf;
   9983                               unsigned rt = (instr >> 12) & 0xf;
   9984                               unsigned rn = (instr >> 16) & 0xf;
   9985                               int32_t offset = (instr & 0xff) << 2;
   9986                               // STREX{<c>}{<q>} <Rd>, <Rt>, [<Rn>{, #<imm>}] ; T1 NOLINT(whitespace/line_length)
   9987                               strex(CurrentCond(),
   9988                                     Register(rd),
   9989                                     Register(rt),
   9990                                     MemOperand(Register(rn),
   9991                                                plus,
   9992                                                offset,
   9993                                                Offset));
   9994                               break;
   9995                             }
   9996                             case 0x00800000: {
   9997                               // 0xe8c00000
   9998                               switch (instr & 0x000000f0) {
   9999                                 case 0x00000040: {
   10000                                   // 0xe8c00040
   10001                                   unsigned rd = instr & 0xf;
   10002                                   unsigned rt = (instr >> 12) & 0xf;
   10003                                   unsigned rn = (instr >> 16) & 0xf;
   10004                                   // STREXB{<c>}{<q>} <Rd>, <Rt>, [<Rn>] ; T1
   10005                                   strexb(CurrentCond(),
   10006                                          Register(rd),
   10007                                          Register(rt),
   10008                                          MemOperand(Register(rn), Offset));
   10009                                   if (((instr & 0xfff00ff0) != 0xe8c00f40)) {
   10010                                     UnpredictableT32(instr);
   10011                                   }
   10012                                   break;
   10013                                 }
   10014                                 case 0x00000050: {
   10015                                   // 0xe8c00050
   10016                                   unsigned rd = instr & 0xf;
   10017                                   unsigned rt = (instr >> 12) & 0xf;
   10018                                   unsigned rn = (instr >> 16) & 0xf;
   10019                                   // STREXH{<c>}{<q>} <Rd>, <Rt>, [<Rn>] ; T1
   10020                                   strexh(CurrentCond(),
   10021                                          Register(rd),
   10022                                          Register(rt),
   10023                                          MemOperand(Register(rn), Offset));
   10024                                   if (((instr & 0xfff00ff0) != 0xe8c00f50)) {
   10025                                     UnpredictableT32(instr);
   10026                                   }
   10027                                   break;
   10028                                 }
   10029                                 case 0x00000070: {
   10030                                   // 0xe8c00070
   10031                                   unsigned rd = instr & 0xf;
   10032                                   unsigned rt = (instr >> 12) & 0xf;
   10033                                   unsigned rt2 = (instr >> 8) & 0xf;
   10034                                   unsigned rn = (instr >> 16) & 0xf;
   10035                                   // STREXD{<c>}{<q>} <Rd>, <Rt>, <Rt2>, [<Rn>] ; T1 NOLINT(whitespace/line_length)
   10036                                   strexd(CurrentCond(),
   10037                                          Register(rd),
   10038                                          Register(rt),
   10039                                          Register(rt2),
   10040                                          MemOperand(Register(rn), Offset));
   10041                                   break;
   10042                                 }
   10043                                 case 0x00000080: {
   10044                                   // 0xe8c00080
   10045                                   unsigned rt = (instr >> 12) & 0xf;
   10046                                   unsigned rn = (instr >> 16) & 0xf;
   10047                                   // STLB{<c>}{<q>} <Rt>, [<Rn>] ; T1
   10048                                   stlb(CurrentCond(),
   10049                                        Register(rt),
   10050                                        MemOperand(Register(rn), Offset));
   10051                                   if (((instr & 0xfff00fff) != 0xe8c00f8f)) {
   10052                                     UnpredictableT32(instr);
   10053                                   }
   10054                                   break;
   10055                                 }
   10056                                 case 0x00000090: {
   10057                                   // 0xe8c00090
   10058                                   unsigned rt = (instr >> 12) & 0xf;
   10059                                   unsigned rn = (instr >> 16) & 0xf;
   10060                                   // STLH{<c>}{<q>} <Rt>, [<Rn>] ; T1
   10061                                   stlh(CurrentCond(),
   10062                                        Register(rt),
   10063                                        MemOperand(Register(rn), Offset));
   10064                                   if (((instr & 0xfff00fff) != 0xe8c00f9f)) {
   10065                                     UnpredictableT32(instr);
   10066                                   }
   10067                                   break;
   10068                                 }
   10069                                 case 0x000000a0: {
   10070                                   // 0xe8c000a0
   10071                                   unsigned rt = (instr >> 12) & 0xf;
   10072                                   unsigned rn = (instr >> 16) & 0xf;
   10073                                   // STL{<c>}{<q>} <Rt>, [<Rn>] ; T1
   10074                                   stl(CurrentCond(),
   10075                                       Register(rt),
   10076                                       MemOperand(Register(rn), Offset));
   10077                                   if (((instr & 0xfff00fff) != 0xe8c00faf)) {
   10078                                     UnpredictableT32(instr);
   10079                                   }
   10080                                   break;
   10081                                 }
   10082                                 case 0x000000c0: {
   10083                                   // 0xe8c000c0
   10084                                   unsigned rd = instr & 0xf;
   10085                                   unsigned rt = (instr >> 12) & 0xf;
   10086                                   unsigned rn = (instr >> 16) & 0xf;
   10087                                   // STLEXB{<c>}{<q>} <Rd>, <Rt>, [<Rn>] ; T1
   10088                                   stlexb(CurrentCond(),
   10089                                          Register(rd),
   10090                                          Register(rt),
   10091                                          MemOperand(Register(rn), Offset));
   10092                                   if (((instr & 0xfff00ff0) != 0xe8c00fc0)) {
   10093                                     UnpredictableT32(instr);
   10094                                   }
   10095                                   break;
   10096                                 }
   10097                                 case 0x000000d0: {
   10098                                   // 0xe8c000d0
   10099                                   unsigned rd = instr & 0xf;
   10100                                   unsigned rt = (instr >> 12) & 0xf;
   10101                                   unsigned rn = (instr >> 16) & 0xf;
   10102                                   // STLEXH{<c>}{<q>} <Rd>, <Rt>, [<Rn>] ; T1
   10103                                   stlexh(CurrentCond(),
   10104                                          Register(rd),
   10105                                          Register(rt),
   10106                                          MemOperand(Register(rn), Offset));
   10107                                   if (((instr & 0xfff00ff0) != 0xe8c00fd0)) {
   10108                                     UnpredictableT32(instr);
   10109                                   }
   10110                                   break;
   10111                                 }
   10112                                 case 0x000000e0: {
   10113                                   // 0xe8c000e0
   10114                                   unsigned rd = instr & 0xf;
   10115                                   unsigned rt = (instr >> 12) & 0xf;
   10116                                   unsigned rn = (instr >> 16) & 0xf;
   10117                                   // STLEX{<c>}{<q>} <Rd>, <Rt>, [<Rn>] ; T1
   10118                                   stlex(CurrentCond(),
   10119                                         Register(rd),
   10120                                         Register(rt),
   10121                                         MemOperand(Register(rn), Offset));
   10122                                   if (((instr & 0xfff00ff0) != 0xe8c00fe0)) {
   10123                                     UnpredictableT32(instr);
   10124                                   }
   10125                                   break;
   10126                                 }
   10127                                 case 0x000000f0: {
   10128                                   // 0xe8c000f0
   10129                                   unsigned rd = instr & 0xf;
   10130                                   unsigned rt = (instr >> 12) & 0xf;
   10131                                   unsigned rt2 = (instr >> 8) & 0xf;
   10132                                   unsigned rn = (instr >> 16) & 0xf;
   10133                                   // STLEXD{<c>}{<q>} <Rd>, <Rt>, <Rt2>, [<Rn>] ; T1 NOLINT(whitespace/line_length)
   10134                                   stlexd(CurrentCond(),
   10135                                          Register(rd),
   10136                                          Register(rt),
   10137                                          Register(rt2),
   10138                                          MemOperand(Register(rn), Offset));
   10139                                   break;
   10140                                 }
   10141                                 default:
   10142                                   UnallocatedT32(instr);
   10143                                   break;
   10144                               }
   10145                               break;
   10146                             }
   10147                           }
   10148                           break;
   10149                         }
   10150                         case 0x00200000: {
   10151                           // 0xe8600000
   10152                           if (((instr & 0xf0000) == 0xf0000)) {
   10153                             UnallocatedT32(instr);
   10154                             return;
   10155                           }
   10156                           unsigned rt = (instr >> 12) & 0xf;
   10157                           unsigned rt2 = (instr >> 8) & 0xf;
   10158                           unsigned rn = (instr >> 16) & 0xf;
   10159                           Sign sign((((instr >> 23) & 0x1) == 0) ? minus
   10160                                                                  : plus);
   10161                           int32_t offset = (instr & 0xff) << 2;
   10162                           // STRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>], #{+/-}<imm> ; T1 NOLINT(whitespace/line_length)
   10163                           strd(CurrentCond(),
   10164                                Register(rt),
   10165                                Register(rt2),
   10166                                MemOperand(Register(rn),
   10167                                           sign,
   10168                                           offset,
   10169                                           PostIndex));
   10170                           break;
   10171                         }
   10172                       }
   10173                       break;
   10174                     }
   10175                     case 0x01000000: {
   10176                       // 0xe9000000
   10177                       switch (instr & 0x00800000) {
   10178                         case 0x00000000: {
   10179                           // 0xe9000000
   10180                           if (((Uint32((instr >> 21)) & Uint32(0x1)) ==
   10181                                Uint32(0x1)) &&
   10182                               ((Uint32((instr >> 16)) & Uint32(0xf)) ==
   10183                                Uint32(0xd)) &&
   10184                               (BitCount(((Uint32((instr >> 14)) & Uint32(0x1))
   10185                                          << 13) |
   10186                                         (Uint32(instr) & Uint32(0x1fff))) >
   10187                                Int64(1))) {
   10188                             RegisterList registers(
   10189                                 (((instr >> 14) & 0x1) << kLRRegNum) |
   10190                                 (instr & 0x1fff));
   10191                             if (registers.IsR0toR7orLR()) {
   10192                               // PUSH{<c>}.W <registers> ; T1
   10193                               push(CurrentCond(), Wide, registers);
   10194                               if (((instr & 0xffffa000) != 0xe92d0000)) {
   10195                                 UnpredictableT32(instr);
   10196                               }
   10197                             } else {
   10198                               // PUSH{<c>}{<q>} <registers> ; T1
   10199                               push(CurrentCond(), Best, registers);
   10200                               if (((instr & 0xffffa000) != 0xe92d0000)) {
   10201                                 UnpredictableT32(instr);
   10202                               }
   10203                             }
   10204                             return;
   10205                           }
   10206                           unsigned rn = (instr >> 16) & 0xf;
   10207                           WriteBack write_back((instr >> 21) & 0x1);
   10208                           RegisterList registers(
   10209                               (((instr >> 14) & 0x1) << kLRRegNum) |
   10210                               (instr & 0x1fff));
   10211                           // STMDB{<c>}{<q>} <Rn>{!}, <registers> ; T1
   10212                           stmdb(CurrentCond(),
   10213                                 Best,
   10214                                 Register(rn),
   10215                                 write_back,
   10216                                 registers);
   10217                           if (((instr & 0xffd0a000) != 0xe9000000)) {
   10218                             UnpredictableT32(instr);
   10219                           }
   10220                           break;
   10221                         }
   10222                         case 0x00800000: {
   10223                           // 0xe9800000
   10224                           UnimplementedT32_32("SRS{IA}", instr);
   10225                           break;
   10226                         }
   10227                       }
   10228                       break;
   10229                     }
   10230                     case 0x01400000: {
   10231                       // 0xe9400000
   10232                       switch (instr & 0x00200000) {
   10233                         case 0x00000000: {
   10234                           // 0xe9400000
   10235                           if (((instr & 0xf0000) == 0xf0000)) {
   10236                             UnallocatedT32(instr);
   10237                             return;
   10238                           }
   10239                           unsigned rt = (instr >> 12) & 0xf;
   10240                           unsigned rt2 = (instr >> 8) & 0xf;
   10241                           unsigned rn = (instr >> 16) & 0xf;
   10242                           Sign sign((((instr >> 23) & 0x1) == 0) ? minus
   10243                                                                  : plus);
   10244                           int32_t offset = (instr & 0xff) << 2;
   10245                           // STRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>{, #{+/-}<imm>}] ; T1 NOLINT(whitespace/line_length)
   10246                           strd(CurrentCond(),
   10247                                Register(rt),
   10248                                Register(rt2),
   10249                                MemOperand(Register(rn), sign, offset, Offset));
   10250                           break;
   10251                         }
   10252                         case 0x00200000: {
   10253                           // 0xe9600000
   10254                           if (((instr & 0xf0000) == 0xf0000)) {
   10255                             UnallocatedT32(instr);
   10256                             return;
   10257                           }
   10258                           unsigned rt = (instr >> 12) & 0xf;
   10259                           unsigned rt2 = (instr >> 8) & 0xf;
   10260                           unsigned rn = (instr >> 16) & 0xf;
   10261                           Sign sign((((instr >> 23) & 0x1) == 0) ? minus
   10262                                                                  : plus);
   10263                           int32_t offset = (instr & 0xff) << 2;
   10264                           // STRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>{, #{+/-}<imm>}]! ; T1 NOLINT(whitespace/line_length)
   10265                           strd(CurrentCond(),
   10266                                Register(rt),
   10267                                Register(rt2),
   10268                                MemOperand(Register(rn),
   10269                                           sign,
   10270                                           offset,
   10271                                           PreIndex));
   10272                           break;
   10273                         }
   10274                       }
   10275                       break;
   10276                     }
   10277                   }
   10278                   break;
   10279                 }
   10280                 case 0x00100000: {
   10281                   // 0xe8100000
   10282                   switch (instr & 0x00400000) {
   10283                     case 0x00000000: {
   10284                       // 0xe8100000
   10285                       switch (instr & 0x01800000) {
   10286                         case 0x00000000: {
   10287                           // 0xe8100000
   10288                           UnimplementedT32_32("RFEDB", instr);
   10289                           break;
   10290                         }
   10291                         case 0x00800000: {
   10292                           // 0xe8900000
   10293                           if (((Uint32((instr >> 21)) & Uint32(0x1)) ==
   10294                                Uint32(0x1)) &&
   10295                               ((Uint32((instr >> 16)) & Uint32(0xf)) ==
   10296                                Uint32(0xd)) &&
   10297                               (BitCount(((Uint32((instr >> 15)) & Uint32(0x1))
   10298                                          << 14) |
   10299                                         ((Uint32((instr >> 14)) & Uint32(0x1))
   10300                                          << 13) |
   10301                                         (Uint32(instr) & Uint32(0x1fff))) >
   10302                                Int64(1))) {
   10303                             RegisterList registers(
   10304                                 (((instr >> 15) & 0x1) << kPCRegNum) |
   10305                                 (((instr >> 14) & 0x1) << kLRRegNum) |
   10306                                 (instr & 0x1fff));
   10307                             if (registers.IsR0toR7orPC()) {
   10308                               // POP{<c>}.W <registers> ; T2
   10309                               pop(CurrentCond(), Wide, registers);
   10310                               if (((instr & 0xffff2000) != 0xe8bd0000)) {
   10311                                 UnpredictableT32(instr);
   10312                               }
   10313                             } else {
   10314                               // POP{<c>}{<q>} <registers> ; T2
   10315                               pop(CurrentCond(), Best, registers);
   10316                               if (((instr & 0xffff2000) != 0xe8bd0000)) {
   10317                                 UnpredictableT32(instr);
   10318                               }
   10319                             }
   10320                             return;
   10321                           }
   10322                           unsigned rn = (instr >> 16) & 0xf;
   10323                           WriteBack write_back((instr >> 21) & 0x1);
   10324                           RegisterList registers(
   10325                               (((instr >> 15) & 0x1) << kPCRegNum) |
   10326                               (((instr >> 14) & 0x1) << kLRRegNum) |
   10327                               (instr & 0x1fff));
   10328                           if ((rn < kNumberOfT32LowRegisters) &&
   10329                               (((registers.GetList() & (1 << rn)) == 0) ==
   10330                                write_back.DoesWriteBack()) &&
   10331                               ((registers.GetList() & ~0xff) == 0)) {
   10332                             // LDM{<c>}.W <Rn>{!}, <registers> ; T2
   10333                             ldm(CurrentCond(),
   10334                                 Wide,
   10335                                 Register(rn),
   10336                                 write_back,
   10337                                 registers);
   10338                             if (((instr & 0xffd02000) != 0xe8900000)) {
   10339                               UnpredictableT32(instr);
   10340                             }
   10341                           } else {
   10342                             // LDM{<c>}{<q>} <Rn>{!}, <registers> ; T2
   10343                             ldm(CurrentCond(),
   10344                                 Best,
   10345                                 Register(rn),
   10346                                 write_back,
   10347                                 registers);
   10348                             if (((instr & 0xffd02000) != 0xe8900000)) {
   10349                               UnpredictableT32(instr);
   10350                             }
   10351                           }
   10352                           break;
   10353                         }
   10354                         case 0x01000000: {
   10355                           // 0xe9100000
   10356                           unsigned rn = (instr >> 16) & 0xf;
   10357                           WriteBack write_back((instr >> 21) & 0x1);
   10358                           RegisterList registers(
   10359                               (((instr >> 15) & 0x1) << kPCRegNum) |
   10360                               (((instr >> 14) & 0x1) << kLRRegNum) |
   10361                               (instr & 0x1fff));
   10362                           // LDMDB{<c>}{<q>} <Rn>{!}, <registers> ; T1
   10363                           ldmdb(CurrentCond(),
   10364                                 Register(rn),
   10365                                 write_back,
   10366                                 registers);
   10367                           if (((instr & 0xffd02000) != 0xe9100000)) {
   10368                             UnpredictableT32(instr);
   10369                           }
   10370                           break;
   10371                         }
   10372                         case 0x01800000: {
   10373                           // 0xe9900000
   10374                           UnimplementedT32_32("RFE{IA}", instr);
   10375                           break;
   10376                         }
   10377                       }
   10378                       break;
   10379                     }
   10380                     case 0x00400000: {
   10381                       // 0xe8500000
   10382                       switch (instr & 0x01200000) {
   10383                         case 0x00000000: {
   10384                           // 0xe8500000
   10385                           switch (instr & 0x00800000) {
   10386                             case 0x00000000: {
   10387                               // 0xe8500000
   10388                               unsigned rt = (instr >> 12) & 0xf;
   10389                               unsigned rn = (instr >> 16) & 0xf;
   10390                               int32_t offset = (instr & 0xff) << 2;
   10391                               // LDREX{<c>}{<q>} <Rt>, [<Rn>{, #<imm>}] ; T1
   10392                               ldrex(CurrentCond(),
   10393                                     Register(rt),
   10394                                     MemOperand(Register(rn),
   10395                                                plus,
   10396                                                offset,
   10397                                                Offset));
   10398                               if (((instr & 0xfff00f00) != 0xe8500f00)) {
   10399                                 UnpredictableT32(instr);
   10400                               }
   10401                               break;
   10402                             }
   10403                             case 0x00800000: {
   10404                               // 0xe8d00000
   10405                               switch (instr & 0x000000f0) {
   10406                                 case 0x00000000: {
   10407                                   // 0xe8d00000
   10408                                   unsigned rn = (instr >> 16) & 0xf;
   10409                                   unsigned rm = instr & 0xf;
   10410                                   // TBB{<c>}{<q>} [<Rn>, <Rm>] ; T1
   10411                                   tbb(CurrentCond(),
   10412                                       Register(rn),
   10413                                       Register(rm));
   10414                                   if (((instr & 0xfff0fff0) != 0xe8d0f000)) {
   10415                                     UnpredictableT32(instr);
   10416                                   }
   10417                                   break;
   10418                                 }
   10419                                 case 0x00000010: {
   10420                                   // 0xe8d00010
   10421                                   unsigned rn = (instr >> 16) & 0xf;
   10422                                   unsigned rm = instr & 0xf;
   10423                                   // TBH{<c>}{<q>} [<Rn>, <Rm>, LSL #1] ; T1
   10424                                   tbh(CurrentCond(),
   10425                                       Register(rn),
   10426                                       Register(rm));
   10427                                   if (((instr & 0xfff0fff0) != 0xe8d0f010)) {
   10428                                     UnpredictableT32(instr);
   10429                                   }
   10430                                   break;
   10431                                 }
   10432                                 case 0x00000040: {
   10433                                   // 0xe8d00040
   10434                                   unsigned rt = (instr >> 12) & 0xf;
   10435                                   unsigned rn = (instr >> 16) & 0xf;
   10436                                   // LDREXB{<c>}{<q>} <Rt>, [<Rn>] ; T1
   10437                                   ldrexb(CurrentCond(),
   10438                                          Register(rt),
   10439                                          MemOperand(Register(rn), Offset));
   10440                                   if (((instr & 0xfff00fff) != 0xe8d00f4f)) {
   10441                                     UnpredictableT32(instr);
   10442                                   }
   10443                                   break;
   10444                                 }
   10445                                 case 0x00000050: {
   10446                                   // 0xe8d00050
   10447                                   unsigned rt = (instr >> 12) & 0xf;
   10448                                   unsigned rn = (instr >> 16) & 0xf;
   10449                                   // LDREXH{<c>}{<q>} <Rt>, [<Rn>] ; T1
   10450                                   ldrexh(CurrentCond(),
   10451                                          Register(rt),
   10452                                          MemOperand(Register(rn), Offset));
   10453                                   if (((instr & 0xfff00fff) != 0xe8d00f5f)) {
   10454                                     UnpredictableT32(instr);
   10455                                   }
   10456                                   break;
   10457                                 }
   10458                                 case 0x00000070: {
   10459                                   // 0xe8d00070
   10460                                   unsigned rt = (instr >> 12) & 0xf;
   10461                                   unsigned rt2 = (instr >> 8) & 0xf;
   10462                                   unsigned rn = (instr >> 16) & 0xf;
   10463                                   // LDREXD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>] ; T1
   10464                                   ldrexd(CurrentCond(),
   10465                                          Register(rt),
   10466                                          Register(rt2),
   10467                                          MemOperand(Register(rn), Offset));
   10468                                   if (((instr & 0xfff000ff) != 0xe8d0007f)) {
   10469                                     UnpredictableT32(instr);
   10470                                   }
   10471                                   break;
   10472                                 }
   10473                                 case 0x00000080: {
   10474                                   // 0xe8d00080
   10475                                   unsigned rt = (instr >> 12) & 0xf;
   10476                                   unsigned rn = (instr >> 16) & 0xf;
   10477                                   // LDAB{<c>}{<q>} <Rt>, [<Rn>] ; T1
   10478                                   ldab(CurrentCond(),
   10479                                        Register(rt),
   10480                                        MemOperand(Register(rn), Offset));
   10481                                   if (((instr & 0xfff00fff) != 0xe8d00f8f)) {
   10482                                     UnpredictableT32(instr);
   10483                                   }
   10484                                   break;
   10485                                 }
   10486                                 case 0x00000090: {
   10487                                   // 0xe8d00090
   10488                                   unsigned rt = (instr >> 12) & 0xf;
   10489                                   unsigned rn = (instr >> 16) & 0xf;
   10490                                   // LDAH{<c>}{<q>} <Rt>, [<Rn>] ; T1
   10491                                   ldah(CurrentCond(),
   10492                                        Register(rt),
   10493                                        MemOperand(Register(rn), Offset));
   10494                                   if (((instr & 0xfff00fff) != 0xe8d00f9f)) {
   10495                                     UnpredictableT32(instr);
   10496                                   }
   10497                                   break;
   10498                                 }
   10499                                 case 0x000000a0: {
   10500                                   // 0xe8d000a0
   10501                                   unsigned rt = (instr >> 12) & 0xf;
   10502                                   unsigned rn = (instr >> 16) & 0xf;
   10503                                   // LDA{<c>}{<q>} <Rt>, [<Rn>] ; T1
   10504                                   lda(CurrentCond(),
   10505                                       Register(rt),
   10506                                       MemOperand(Register(rn), Offset));
   10507                                   if (((instr & 0xfff00fff) != 0xe8d00faf)) {
   10508                                     UnpredictableT32(instr);
   10509                                   }
   10510                                   break;
   10511                                 }
   10512                                 case 0x000000c0: {
   10513                                   // 0xe8d000c0
   10514                                   unsigned rt = (instr >> 12) & 0xf;
   10515                                   unsigned rn = (instr >> 16) & 0xf;
   10516                                   // LDAEXB{<c>}{<q>} <Rt>, [<Rn>] ; T1
   10517                                   ldaexb(CurrentCond(),
   10518                                          Register(rt),
   10519                                          MemOperand(Register(rn), Offset));
   10520                                   if (((instr & 0xfff00fff) != 0xe8d00fcf)) {
   10521                                     UnpredictableT32(instr);
   10522                                   }
   10523                                   break;
   10524                                 }
   10525                                 case 0x000000d0: {
   10526                                   // 0xe8d000d0
   10527                                   unsigned rt = (instr >> 12) & 0xf;
   10528                                   unsigned rn = (instr >> 16) & 0xf;
   10529                                   // LDAEXH{<c>}{<q>} <Rt>, [<Rn>] ; T1
   10530                                   ldaexh(CurrentCond(),
   10531                                          Register(rt),
   10532                                          MemOperand(Register(rn), Offset));
   10533                                   if (((instr & 0xfff00fff) != 0xe8d00fdf)) {
   10534                                     UnpredictableT32(instr);
   10535                                   }
   10536                                   break;
   10537                                 }
   10538                                 case 0x000000e0: {
   10539                                   // 0xe8d000e0
   10540                                   unsigned rt = (instr >> 12) & 0xf;
   10541                                   unsigned rn = (instr >> 16) & 0xf;
   10542                                   // LDAEX{<c>}{<q>} <Rt>, [<Rn>] ; T1
   10543                                   ldaex(CurrentCond(),
   10544                                         Register(rt),
   10545                                         MemOperand(Register(rn), Offset));
   10546                                   if (((instr & 0xfff00fff) != 0xe8d00fef)) {
   10547                                     UnpredictableT32(instr);
   10548                                   }
   10549                                   break;
   10550                                 }
   10551                                 case 0x000000f0: {
   10552                                   // 0xe8d000f0
   10553                                   unsigned rt = (instr >> 12) & 0xf;
   10554                                   unsigned rt2 = (instr >> 8) & 0xf;
   10555                                   unsigned rn = (instr >> 16) & 0xf;
   10556                                   // LDAEXD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>] ; T1
   10557                                   ldaexd(CurrentCond(),
   10558                                          Register(rt),
   10559                                          Register(rt2),
   10560                                          MemOperand(Register(rn), Offset));
   10561                                   if (((instr & 0xfff000ff) != 0xe8d000ff)) {
   10562                                     UnpredictableT32(instr);
   10563                                   }
   10564                                   break;
   10565                                 }
   10566                                 default:
   10567                                   UnallocatedT32(instr);
   10568                                   break;
   10569                               }
   10570                               break;
   10571                             }
   10572                           }
   10573                           break;
   10574                         }
   10575                         case 0x00200000: {
   10576                           // 0xe8700000
   10577                           switch (instr & 0x000f0000) {
   10578                             case 0x000f0000: {
   10579                               // 0xe87f0000
   10580                               if (((instr & 0x1200000) == 0x0)) {
   10581                                 UnallocatedT32(instr);
   10582                                 return;
   10583                               }
   10584                               unsigned rt = (instr >> 12) & 0xf;
   10585                               unsigned rt2 = (instr >> 8) & 0xf;
   10586                               uint32_t U = (instr >> 23) & 0x1;
   10587                               int32_t imm = instr & 0xff;
   10588                               imm <<= 2;
   10589                               if (U == 0) imm = -imm;
   10590                               bool minus_zero = (imm == 0) && (U == 0);
   10591                               Label label(imm, kT32PcDelta, minus_zero);
   10592                               // LDRD{<c>}{<q>} <Rt>, <Rt2>, <label> ; T1
   10593                               ldrd(CurrentCond(),
   10594                                    Register(rt),
   10595                                    Register(rt2),
   10596                                    &label);
   10597                               if (((instr & 0xff7f0000) != 0xe95f0000)) {
   10598                                 UnpredictableT32(instr);
   10599                               }
   10600                               break;
   10601                             }
   10602                             default: {
   10603                               if (((instr & 0xf0000) == 0xf0000)) {
   10604                                 UnallocatedT32(instr);
   10605                                 return;
   10606                               }
   10607                               unsigned rt = (instr >> 12) & 0xf;
   10608                               unsigned rt2 = (instr >> 8) & 0xf;
   10609                               unsigned rn = (instr >> 16) & 0xf;
   10610                               Sign sign((((instr >> 23) & 0x1) == 0) ? minus
   10611                                                                      : plus);
   10612                               int32_t offset = (instr & 0xff) << 2;
   10613                               // LDRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>], #{+/-}<imm> ; T1 NOLINT(whitespace/line_length)
   10614                               ldrd(CurrentCond(),
   10615                                    Register(rt),
   10616                                    Register(rt2),
   10617                                    MemOperand(Register(rn),
   10618                                               sign,
   10619                                               offset,
   10620                                               PostIndex));
   10621                               break;
   10622                             }
   10623                           }
   10624                           break;
   10625                         }
   10626                         case 0x01000000: {
   10627                           // 0xe9500000
   10628                           switch (instr & 0x000f0000) {
   10629                             case 0x000f0000: {
   10630                               // 0xe95f0000
   10631                               if (((instr & 0x1200000) == 0x0)) {
   10632                                 UnallocatedT32(instr);
   10633                                 return;
   10634                               }
   10635                               unsigned rt = (instr >> 12) & 0xf;
   10636                               unsigned rt2 = (instr >> 8) & 0xf;
   10637                               uint32_t U = (instr >> 23) & 0x1;
   10638                               int32_t imm = instr & 0xff;
   10639                               imm <<= 2;
   10640                               if (U == 0) imm = -imm;
   10641                               bool minus_zero = (imm == 0) && (U == 0);
   10642                               Label label(imm, kT32PcDelta, minus_zero);
   10643                               // LDRD{<c>}{<q>} <Rt>, <Rt2>, <label> ; T1
   10644                               ldrd(CurrentCond(),
   10645                                    Register(rt),
   10646                                    Register(rt2),
   10647                                    &label);
   10648                               if (((instr & 0xff7f0000) != 0xe95f0000)) {
   10649                                 UnpredictableT32(instr);
   10650                               }
   10651                               break;
   10652                             }
   10653                             default: {
   10654                               if (((instr & 0xf0000) == 0xf0000)) {
   10655                                 UnallocatedT32(instr);
   10656                                 return;
   10657                               }
   10658                               unsigned rt = (instr >> 12) & 0xf;
   10659                               unsigned rt2 = (instr >> 8) & 0xf;
   10660                               unsigned rn = (instr >> 16) & 0xf;
   10661                               Sign sign((((instr >> 23) & 0x1) == 0) ? minus
   10662                                                                      : plus);
   10663                               int32_t offset = (instr & 0xff) << 2;
   10664                               // LDRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>{, #{+/-}<imm>}] ; T1 NOLINT(whitespace/line_length)
   10665                               ldrd(CurrentCond(),
   10666                                    Register(rt),
   10667                                    Register(rt2),
   10668                                    MemOperand(Register(rn),
   10669                                               sign,
   10670                                               offset,
   10671                                               Offset));
   10672                               break;
   10673                             }
   10674                           }
   10675                           break;
   10676                         }
   10677                         case 0x01200000: {
   10678                           // 0xe9700000
   10679                           switch (instr & 0x000f0000) {
   10680                             case 0x000f0000: {
   10681                               // 0xe97f0000
   10682                               if (((instr & 0x1200000) == 0x0)) {
   10683                                 UnallocatedT32(instr);
   10684                                 return;
   10685                               }
   10686                               unsigned rt = (instr >> 12) & 0xf;
   10687                               unsigned rt2 = (instr >> 8) & 0xf;
   10688                               uint32_t U = (instr >> 23) & 0x1;
   10689                               int32_t imm = instr & 0xff;
   10690                               imm <<= 2;
   10691                               if (U == 0) imm = -imm;
   10692                               bool minus_zero = (imm == 0) && (U == 0);
   10693                               Label label(imm, kT32PcDelta, minus_zero);
   10694                               // LDRD{<c>}{<q>} <Rt>, <Rt2>, <label> ; T1
   10695                               ldrd(CurrentCond(),
   10696                                    Register(rt),
   10697                                    Register(rt2),
   10698                                    &label);
   10699                               if (((instr & 0xff7f0000) != 0xe95f0000)) {
   10700                                 UnpredictableT32(instr);
   10701                               }
   10702                               break;
   10703                             }
   10704                             default: {
   10705                               if (((instr & 0xf0000) == 0xf0000)) {
   10706                                 UnallocatedT32(instr);
   10707                                 return;
   10708                               }
   10709                               unsigned rt = (instr >> 12) & 0xf;
   10710                               unsigned rt2 = (instr >> 8) & 0xf;
   10711                               unsigned rn = (instr >> 16) & 0xf;
   10712                               Sign sign((((instr >> 23) & 0x1) == 0) ? minus
   10713                                                                      : plus);
   10714                               int32_t offset = (instr & 0xff) << 2;
   10715                               // LDRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>{, #{+/-}<imm>}]! ; T1 NOLINT(whitespace/line_length)
   10716                               ldrd(CurrentCond(),
   10717                                    Register(rt),
   10718                                    Register(rt2),
   10719                                    MemOperand(Register(rn),
   10720                                               sign,
   10721                                               offset,
   10722                                               PreIndex));
   10723                               break;
   10724                             }
   10725                           }
   10726                           break;
   10727                         }
   10728                       }
   10729                       break;
   10730                     }
   10731                   }
   10732                   break;
   10733                 }
   10734                 case 0x10000000: {
   10735                   // 0xf8000000
   10736                   switch (instr & 0x01a00000) {
   10737                     case 0x00000000: {
   10738                       // 0xf8000000
   10739                       switch (instr & 0x00400d00) {
   10740                         case 0x00000000: {
   10741                           // 0xf8000000
   10742                           if ((instr & 0x000002c0) == 0x00000000) {
   10743                             if (((instr & 0xf0000) == 0xf0000)) {
   10744                               UnallocatedT32(instr);
   10745                               return;
   10746                             }
   10747                             unsigned rt = (instr >> 12) & 0xf;
   10748                             unsigned rn = (instr >> 16) & 0xf;
   10749                             Sign sign(plus);
   10750                             unsigned rm = instr & 0xf;
   10751                             Shift shift = LSL;
   10752                             uint32_t amount = (instr >> 4) & 0x3;
   10753                             AddrMode addrmode = Offset;
   10754                             if ((rt < kNumberOfT32LowRegisters) &&
   10755                                 (rn < kNumberOfT32LowRegisters) &&
   10756                                 (rm < kNumberOfT32LowRegisters) &&
   10757                                 shift.IsLSL() && (amount == 0) &&
   10758                                 sign.IsPlus()) {
   10759                               // STRB{<c>}.W <Rt>, [<Rn>, #{+}<Rm>] ; T2
   10760                               strb(CurrentCond(),
   10761                                    Wide,
   10762                                    Register(rt),
   10763                                    MemOperand(Register(rn),
   10764                                               sign,
   10765                                               Register(rm),
   10766                                               addrmode));
   10767                             } else {
   10768                               // STRB{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>{, LSL #<imm>}] ; T2 NOLINT(whitespace/line_length)
   10769                               strb(CurrentCond(),
   10770                                    Best,
   10771                                    Register(rt),
   10772                                    MemOperand(Register(rn),
   10773                                               sign,
   10774                                               Register(rm),
   10775                                               shift,
   10776                                               amount,
   10777                                               addrmode));
   10778                             }
   10779                           } else {
   10780                             UnallocatedT32(instr);
   10781                           }
   10782                           break;
   10783                         }
   10784                         case 0x00000900: {
   10785                           // 0xf8000900
   10786                           if (((instr & 0xf0000) == 0xf0000)) {
   10787                             UnallocatedT32(instr);
   10788                             return;
   10789                           }
   10790                           unsigned rt = (instr >> 12) & 0xf;
   10791                           unsigned rn = (instr >> 16) & 0xf;
   10792                           Sign sign((((instr >> 9) & 0x1) == 0) ? minus : plus);
   10793                           int32_t offset = instr & 0xff;
   10794                           // STRB{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_2> ; T3
   10795                           strb(CurrentCond(),
   10796                                Best,
   10797                                Register(rt),
   10798                                MemOperand(Register(rn),
   10799                                           sign,
   10800                                           offset,
   10801                                           PostIndex));
   10802                           break;
   10803                         }
   10804                         case 0x00000c00: {
   10805                           // 0xf8000c00
   10806                           switch (instr & 0x00000200) {
   10807                             case 0x00000000: {
   10808                               // 0xf8000c00
   10809                               if (((instr & 0xf0000) == 0xf0000)) {
   10810                                 UnallocatedT32(instr);
   10811                                 return;
   10812                               }
   10813                               unsigned rt = (instr >> 12) & 0xf;
   10814                               unsigned rn = (instr >> 16) & 0xf;
   10815                               int32_t offset = instr & 0xff;
   10816                               // STRB{<c>}{<q>} <Rt>, [<Rn>{, #-<imm_2>}] ; T3
   10817                               strb(CurrentCond(),
   10818                                    Best,
   10819                                    Register(rt),
   10820                                    MemOperand(Register(rn),
   10821                                               minus,
   10822                                               offset,
   10823                                               Offset));
   10824                               break;
   10825                             }
   10826                             case 0x00000200: {
   10827                               // 0xf8000e00
   10828                               if (((instr & 0xf0000) == 0xf0000)) {
   10829                                 UnallocatedT32(instr);
   10830                                 return;
   10831                               }
   10832                               UnimplementedT32_32("STRBT", instr);
   10833                               break;
   10834                             }
   10835                           }
   10836                           break;
   10837                         }
   10838                         case 0x00000d00: {
   10839                           // 0xf8000d00
   10840                           if (((instr & 0xf0000) == 0xf0000)) {
   10841                             UnallocatedT32(instr);
   10842                             return;
   10843                           }
   10844                           unsigned rt = (instr >> 12) & 0xf;
   10845                           unsigned rn = (instr >> 16) & 0xf;
   10846                           Sign sign((((instr >> 9) & 0x1) == 0) ? minus : plus);
   10847                           int32_t offset = instr & 0xff;
   10848                           // STRB{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_2>}]! ; T3
   10849                           strb(CurrentCond(),
   10850                                Best,
   10851                                Register(rt),
   10852                                MemOperand(Register(rn),
   10853                                           sign,
   10854                                           offset,
   10855                                           PreIndex));
   10856                           break;
   10857                         }
   10858                         case 0x00400000: {
   10859                           // 0xf8400000
   10860                           if ((instr & 0x000002c0) == 0x00000000) {
   10861                             if (((instr & 0xf0000) == 0xf0000)) {
   10862                               UnallocatedT32(instr);
   10863                               return;
   10864                             }
   10865                             unsigned rt = (instr >> 12) & 0xf;
   10866                             unsigned rn = (instr >> 16) & 0xf;
   10867                             Sign sign(plus);
   10868                             unsigned rm = instr & 0xf;
   10869                             Shift shift = LSL;
   10870                             uint32_t amount = (instr >> 4) & 0x3;
   10871                             AddrMode addrmode = Offset;
   10872                             if ((rt < kNumberOfT32LowRegisters) &&
   10873                                 (rn < kNumberOfT32LowRegisters) &&
   10874                                 (rm < kNumberOfT32LowRegisters) &&
   10875                                 shift.IsLSL() && (amount == 0) &&
   10876                                 sign.IsPlus()) {
   10877                               // STR{<c>}.W <Rt>, [<Rn>, #{+}<Rm>] ; T2
   10878                               str(CurrentCond(),
   10879                                   Wide,
   10880                                   Register(rt),
   10881                                   MemOperand(Register(rn),
   10882                                              sign,
   10883                                              Register(rm),
   10884                                              addrmode));
   10885                             } else {
   10886                               // STR{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>{, LSL #<imm>}] ; T2 NOLINT(whitespace/line_length)
   10887                               str(CurrentCond(),
   10888                                   Best,
   10889                                   Register(rt),
   10890                                   MemOperand(Register(rn),
   10891                                              sign,
   10892                                              Register(rm),
   10893                                              shift,
   10894                                              amount,
   10895                                              addrmode));
   10896                             }
   10897                           } else {
   10898                             UnallocatedT32(instr);
   10899                           }
   10900                           break;
   10901                         }
   10902                         case 0x00400900: {
   10903                           // 0xf8400900
   10904                           if (((instr & 0xf0000) == 0xf0000)) {
   10905                             UnallocatedT32(instr);
   10906                             return;
   10907                           }
   10908                           unsigned rt = (instr >> 12) & 0xf;
   10909                           unsigned rn = (instr >> 16) & 0xf;
   10910                           Sign sign((((instr >> 9) & 0x1) == 0) ? minus : plus);
   10911                           int32_t offset = instr & 0xff;
   10912                           // STR{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_2> ; T4
   10913                           str(CurrentCond(),
   10914                               Best,
   10915                               Register(rt),
   10916                               MemOperand(Register(rn),
   10917                                          sign,
   10918                                          offset,
   10919                                          PostIndex));
   10920                           break;
   10921                         }
   10922                         case 0x00400c00: {
   10923                           // 0xf8400c00
   10924                           switch (instr & 0x00000200) {
   10925                             case 0x00000000: {
   10926                               // 0xf8400c00
   10927                               if (((instr & 0xf0000) == 0xf0000)) {
   10928                                 UnallocatedT32(instr);
   10929                                 return;
   10930                               }
   10931                               unsigned rt = (instr >> 12) & 0xf;
   10932                               unsigned rn = (instr >> 16) & 0xf;
   10933                               int32_t offset = instr & 0xff;
   10934                               // STR{<c>}{<q>} <Rt>, [<Rn>{, #-<imm_2>}] ; T4
   10935                               str(CurrentCond(),
   10936                                   Best,
   10937                                   Register(rt),
   10938                                   MemOperand(Register(rn),
   10939                                              minus,
   10940                                              offset,
   10941                                              Offset));
   10942                               break;
   10943                             }
   10944                             case 0x00000200: {
   10945                               // 0xf8400e00
   10946                               if (((instr & 0xf0000) == 0xf0000)) {
   10947                                 UnallocatedT32(instr);
   10948                                 return;
   10949                               }
   10950                               UnimplementedT32_32("STRT", instr);
   10951                               break;
   10952                             }
   10953                           }
   10954                           break;
   10955                         }
   10956                         case 0x00400d00: {
   10957                           // 0xf8400d00
   10958                           if (((instr & 0xf0000) == 0xf0000)) {
   10959                             UnallocatedT32(instr);
   10960                             return;
   10961                           }
   10962                           if (((Uint32((instr >> 16)) & Uint32(0xf)) ==
   10963                                Uint32(0xd)) &&
   10964                               ((Uint32((instr >> 9)) & Uint32(0x1)) ==
   10965                                Uint32(0x0)) &&
   10966                               ((Uint32(instr) & Uint32(0xff)) == Uint32(0x4))) {
   10967                             unsigned rt = (instr >> 12) & 0xf;
   10968                             if ((rt <= 7) || (rt == kLRRegNum)) {
   10969                               // PUSH{<c>}.W <single_register_list> ; T4
   10970                               push(CurrentCond(), Wide, Register(rt));
   10971                             } else {
   10972                               // PUSH{<c>}{<q>} <single_register_list> ; T4
   10973                               push(CurrentCond(), Best, Register(rt));
   10974                             }
   10975                             return;
   10976                           }
   10977                           unsigned rt = (instr >> 12) & 0xf;
   10978                           unsigned rn = (instr >> 16) & 0xf;
   10979                           Sign sign((((instr >> 9) & 0x1) == 0) ? minus : plus);
   10980                           int32_t offset = instr & 0xff;
   10981                           // STR{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_2>}]! ; T4
   10982                           str(CurrentCond(),
   10983                               Best,
   10984                               Register(rt),
   10985                               MemOperand(Register(rn), sign, offset, PreIndex));
   10986                           break;
   10987                         }
   10988                         default:
   10989                           UnallocatedT32(instr);
   10990                           break;
   10991                       }
   10992                       break;
   10993                     }
   10994                     case 0x00200000: {
   10995                       // 0xf8200000
   10996                       switch (instr & 0x00400d00) {
   10997                         case 0x00000000: {
   10998                           // 0xf8200000
   10999                           if ((instr & 0x000002c0) == 0x00000000) {
   11000                             if (((instr & 0xf0000) == 0xf0000)) {
   11001                               UnallocatedT32(instr);
   11002                               return;
   11003                             }
   11004                             unsigned rt = (instr >> 12) & 0xf;
   11005                             unsigned rn = (instr >> 16) & 0xf;
   11006                             Sign sign(plus);
   11007                             unsigned rm = instr & 0xf;
   11008                             Shift shift = LSL;
   11009                             uint32_t amount = (instr >> 4) & 0x3;
   11010                             AddrMode addrmode = Offset;
   11011                             if ((rt < kNumberOfT32LowRegisters) &&
   11012                                 (rn < kNumberOfT32LowRegisters) &&
   11013                                 (rm < kNumberOfT32LowRegisters) &&
   11014                                 shift.IsLSL() && (amount == 0) &&
   11015                                 sign.IsPlus()) {
   11016                               // STRH{<c>}.W <Rt>, [<Rn>, #{+}<Rm>] ; T2
   11017                               strh(CurrentCond(),
   11018                                    Wide,
   11019                                    Register(rt),
   11020                                    MemOperand(Register(rn),
   11021                                               sign,
   11022                                               Register(rm),
   11023                                               addrmode));
   11024                             } else {
   11025                               // STRH{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>{, LSL #<imm>}] ; T2 NOLINT(whitespace/line_length)
   11026                               strh(CurrentCond(),
   11027                                    Best,
   11028                                    Register(rt),
   11029                                    MemOperand(Register(rn),
   11030                                               sign,
   11031                                               Register(rm),
   11032                                               shift,
   11033                                               amount,
   11034                                               addrmode));
   11035                             }
   11036                           } else {
   11037                             UnallocatedT32(instr);
   11038                           }
   11039                           break;
   11040                         }
   11041                         case 0x00000900: {
   11042                           // 0xf8200900
   11043                           if (((instr & 0xf0000) == 0xf0000)) {
   11044                             UnallocatedT32(instr);
   11045                             return;
   11046                           }
   11047                           unsigned rt = (instr >> 12) & 0xf;
   11048                           unsigned rn = (instr >> 16) & 0xf;
   11049                           Sign sign((((instr >> 9) & 0x1) == 0) ? minus : plus);
   11050                           int32_t offset = instr & 0xff;
   11051                           // STRH{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_2> ; T3
   11052                           strh(CurrentCond(),
   11053                                Best,
   11054                                Register(rt),
   11055                                MemOperand(Register(rn),
   11056                                           sign,
   11057                                           offset,
   11058                                           PostIndex));
   11059                           break;
   11060                         }
   11061                         case 0x00000c00: {
   11062                           // 0xf8200c00
   11063                           switch (instr & 0x00000200) {
   11064                             case 0x00000000: {
   11065                               // 0xf8200c00
   11066                               if (((instr & 0xf0000) == 0xf0000)) {
   11067                                 UnallocatedT32(instr);
   11068                                 return;
   11069                               }
   11070                               unsigned rt = (instr >> 12) & 0xf;
   11071                               unsigned rn = (instr >> 16) & 0xf;
   11072                               int32_t offset = instr & 0xff;
   11073                               // STRH{<c>}{<q>} <Rt>, [<Rn>{, #-<imm_2>}] ; T3
   11074                               strh(CurrentCond(),
   11075                                    Best,
   11076                                    Register(rt),
   11077                                    MemOperand(Register(rn),
   11078                                               minus,
   11079                                               offset,
   11080                                               Offset));
   11081                               break;
   11082                             }
   11083                             case 0x00000200: {
   11084                               // 0xf8200e00
   11085                               if (((instr & 0xf0000) == 0xf0000)) {
   11086                                 UnallocatedT32(instr);
   11087                                 return;
   11088                               }
   11089                               UnimplementedT32_32("STRHT", instr);
   11090                               break;
   11091                             }
   11092                           }
   11093                           break;
   11094                         }
   11095                         case 0x00000d00: {
   11096                           // 0xf8200d00
   11097                           if (((instr & 0xf0000) == 0xf0000)) {
   11098                             UnallocatedT32(instr);
   11099                             return;
   11100                           }
   11101                           unsigned rt = (instr >> 12) & 0xf;
   11102                           unsigned rn = (instr >> 16) & 0xf;
   11103                           Sign sign((((instr >> 9) & 0x1) == 0) ? minus : plus);
   11104                           int32_t offset = instr & 0xff;
   11105                           // STRH{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_2>}]! ; T3
   11106                           strh(CurrentCond(),
   11107                                Best,
   11108                                Register(rt),
   11109                                MemOperand(Register(rn),
   11110                                           sign,
   11111                                           offset,
   11112                                           PreIndex));
   11113                           break;
   11114                         }
   11115                         default:
   11116                           UnallocatedT32(instr);
   11117                           break;
   11118                       }
   11119                       break;
   11120                     }
   11121                     case 0x00800000: {
   11122                       // 0xf8800000
   11123                       switch (instr & 0x00400000) {
   11124                         case 0x00000000: {
   11125                           // 0xf8800000
   11126                           if (((instr & 0xf0000) == 0xf0000)) {
   11127                             UnallocatedT32(instr);
   11128                             return;
   11129                           }
   11130                           unsigned rt = (instr >> 12) & 0xf;
   11131                           unsigned rn = (instr >> 16) & 0xf;
   11132                           int32_t offset = instr & 0xfff;
   11133                           if ((rt < kNumberOfT32LowRegisters) &&
   11134                               (rn < kNumberOfT32LowRegisters) &&
   11135                               ((offset >= 0) && (offset <= 31))) {
   11136                             // STRB{<c>}.W <Rt>, [<Rn>{, #{+}<imm_1>}] ; T2
   11137                             strb(CurrentCond(),
   11138                                  Wide,
   11139                                  Register(rt),
   11140                                  MemOperand(Register(rn),
   11141                                             plus,
   11142                                             offset,
   11143                                             Offset));
   11144                           } else {
   11145                             // STRB{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm_1>}] ; T2
   11146                             strb(CurrentCond(),
   11147                                  Best,
   11148                                  Register(rt),
   11149                                  MemOperand(Register(rn),
   11150                                             plus,
   11151                                             offset,
   11152                                             Offset));
   11153                           }
   11154                           break;
   11155                         }
   11156                         case 0x00400000: {
   11157                           // 0xf8c00000
   11158                           if (((instr & 0xf0000) == 0xf0000)) {
   11159                             UnallocatedT32(instr);
   11160                             return;
   11161                           }
   11162                           unsigned rt = (instr >> 12) & 0xf;
   11163                           unsigned rn = (instr >> 16) & 0xf;
   11164                           int32_t offset = instr & 0xfff;
   11165                           if (((rt < kNumberOfT32LowRegisters) &&
   11166                                (rn < kNumberOfT32LowRegisters) &&
   11167                                ((offset >= 0) && (offset <= 124) &&
   11168                                 ((offset & 3) == 0))) ||
   11169                               ((rt < kNumberOfT32LowRegisters) &&
   11170                                (rn == sp.GetCode()) &&
   11171                                ((offset >= 0) && (offset <= 1020) &&
   11172                                 ((offset & 3) == 0)))) {
   11173                             // STR{<c>}.W <Rt>, [<Rn>{, #{+}<imm_1>}] ; T3
   11174                             str(CurrentCond(),
   11175                                 Wide,
   11176                                 Register(rt),
   11177                                 MemOperand(Register(rn), plus, offset, Offset));
   11178                           } else {
   11179                             // STR{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm_1>}] ; T3
   11180                             str(CurrentCond(),
   11181                                 Best,
   11182                                 Register(rt),
   11183                                 MemOperand(Register(rn), plus, offset, Offset));
   11184                           }
   11185                           break;
   11186                         }
   11187                       }
   11188                       break;
   11189                     }
   11190                     case 0x00a00000: {
   11191                       // 0xf8a00000
   11192                       if ((instr & 0x00400000) == 0x00000000) {
   11193                         if (((instr & 0xf0000) == 0xf0000)) {
   11194                           UnallocatedT32(instr);
   11195                           return;
   11196                         }
   11197                         unsigned rt = (instr >> 12) & 0xf;
   11198                         unsigned rn = (instr >> 16) & 0xf;
   11199                         int32_t offset = instr & 0xfff;
   11200                         if ((rt < kNumberOfT32LowRegisters) &&
   11201                             (rn < kNumberOfT32LowRegisters) &&
   11202                             ((offset >= 0) && (offset <= 62) &&
   11203                              ((offset & 1) == 0))) {
   11204                           // STRH{<c>}.W <Rt>, [<Rn>{, #{+}<imm_1>}] ; T2
   11205                           strh(CurrentCond(),
   11206                                Wide,
   11207                                Register(rt),
   11208                                MemOperand(Register(rn), plus, offset, Offset));
   11209                         } else {
   11210                           // STRH{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm_1>}] ; T2
   11211                           strh(CurrentCond(),
   11212                                Best,
   11213                                Register(rt),
   11214                                MemOperand(Register(rn), plus, offset, Offset));
   11215                         }
   11216                       } else {
   11217                         UnallocatedT32(instr);
   11218                       }
   11219                       break;
   11220                     }
   11221                     case 0x01000000: {
   11222                       // 0xf9000000
   11223                       switch (instr & 0x0000000d) {
   11224                         case 0x0000000d: {
   11225                           // 0xf900000d
   11226                           switch (instr & 0x00000002) {
   11227                             case 0x00000000: {
   11228                               // 0xf900000d
   11229                               switch (instr & 0x00000f00) {
   11230                                 case 0x00000000: {
   11231                                   // 0xf900000d
   11232                                   DataType dt =
   11233                                       Dt_size_7_Decode((instr >> 6) & 0x3);
   11234                                   if (dt.Is(kDataTypeValueInvalid)) {
   11235                                     UnallocatedT32(instr);
   11236                                     return;
   11237                                   }
   11238                                   Alignment align =
   11239                                       Align_align_4_Decode((instr >> 4) & 0x3);
   11240                                   if (dt.Is(kDataTypeValueInvalid) ||
   11241                                       align.Is(kBadAlignment)) {
   11242                                     UnallocatedT32(instr);
   11243                                     return;
   11244                                   }
   11245                                   unsigned first =
   11246                                       ExtractDRegister(instr, 22, 12);
   11247                                   unsigned length;
   11248                                   SpacingType spacing;
   11249                                   switch ((instr >> 8) & 0xf) {
   11250                                     default:
   11251                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
   11252                                     case 0x0:
   11253                                       length = 4;
   11254                                       spacing = kSingle;
   11255                                       break;
   11256                                     case 0x1:
   11257                                       length = 4;
   11258                                       spacing = kDouble;
   11259                                       break;
   11260                                   }
   11261                                   unsigned last =
   11262                                       first +
   11263                                       (length - 1) *
   11264                                           (spacing == kSingle ? 1 : 2);
   11265                                   TransferType transfer = kMultipleLanes;
   11266                                   unsigned rn = (instr >> 16) & 0xf;
   11267                                   // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
   11268                                   vst4(CurrentCond(),
   11269                                        dt,
   11270                                        NeonRegisterList(DRegister(first),
   11271                                                         DRegister(last),
   11272                                                         spacing,
   11273                                                         transfer),
   11274                                        AlignedMemOperand(Register(rn),
   11275                                                          align,
   11276                                                          PostIndex));
   11277                                   break;
   11278                                 }
   11279                                 case 0x00000100: {
   11280                                   // 0xf900010d
   11281                                   DataType dt =
   11282                                       Dt_size_7_Decode((instr >> 6) & 0x3);
   11283                                   if (dt.Is(kDataTypeValueInvalid)) {
   11284                                     UnallocatedT32(instr);
   11285                                     return;
   11286                                   }
   11287                                   Alignment align =
   11288                                       Align_align_4_Decode((instr >> 4) & 0x3);
   11289                                   if (dt.Is(kDataTypeValueInvalid) ||
   11290                                       align.Is(kBadAlignment)) {
   11291                                     UnallocatedT32(instr);
   11292                                     return;
   11293                                   }
   11294                                   unsigned first =
   11295                                       ExtractDRegister(instr, 22, 12);
   11296                                   unsigned length;
   11297                                   SpacingType spacing;
   11298                                   switch ((instr >> 8) & 0xf) {
   11299                                     default:
   11300                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
   11301                                     case 0x0:
   11302                                       length = 4;
   11303                                       spacing = kSingle;
   11304                                       break;
   11305                                     case 0x1:
   11306                                       length = 4;
   11307                                       spacing = kDouble;
   11308                                       break;
   11309                                   }
   11310                                   unsigned last =
   11311                                       first +
   11312                                       (length - 1) *
   11313                                           (spacing == kSingle ? 1 : 2);
   11314                                   TransferType transfer = kMultipleLanes;
   11315                                   unsigned rn = (instr >> 16) & 0xf;
   11316                                   // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
   11317                                   vst4(CurrentCond(),
   11318                                        dt,
   11319                                        NeonRegisterList(DRegister(first),
   11320                                                         DRegister(last),
   11321                                                         spacing,
   11322                                                         transfer),
   11323                                        AlignedMemOperand(Register(rn),
   11324                                                          align,
   11325                                                          PostIndex));
   11326                                   break;
   11327                                 }
   11328                                 case 0x00000200: {
   11329                                   // 0xf900020d
   11330                                   if (((instr & 0xe20) == 0x620) ||
   11331                                       ((instr & 0xf30) == 0xa30)) {
   11332                                     UnallocatedT32(instr);
   11333                                     return;
   11334                                   }
   11335                                   DataType dt =
   11336                                       Dt_size_6_Decode((instr >> 6) & 0x3);
   11337                                   if (dt.Is(kDataTypeValueInvalid)) {
   11338                                     UnallocatedT32(instr);
   11339                                     return;
   11340                                   }
   11341                                   Alignment align =
   11342                                       Align_align_5_Decode((instr >> 4) & 0x3);
   11343                                   if (dt.Is(kDataTypeValueInvalid) ||
   11344                                       align.Is(kBadAlignment)) {
   11345                                     UnallocatedT32(instr);
   11346                                     return;
   11347                                   }
   11348                                   unsigned first =
   11349                                       ExtractDRegister(instr, 22, 12);
   11350                                   unsigned length;
   11351                                   SpacingType spacing = kSingle;
   11352                                   switch ((instr >> 8) & 0xf) {
   11353                                     default:
   11354                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
   11355                                     case 0x7:
   11356                                       length = 1;
   11357                                       break;
   11358                                     case 0xa:
   11359                                       length = 2;
   11360                                       break;
   11361                                     case 0x6:
   11362                                       length = 3;
   11363                                       break;
   11364                                     case 0x2:
   11365                                       length = 4;
   11366                                       break;
   11367                                   }
   11368                                   unsigned last = first + length - 1;
   11369                                   TransferType transfer = kMultipleLanes;
   11370                                   unsigned rn = (instr >> 16) & 0xf;
   11371                                   // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
   11372                                   vst1(CurrentCond(),
   11373                                        dt,
   11374                                        NeonRegisterList(DRegister(first),
   11375                                                         DRegister(last),
   11376                                                         spacing,
   11377                                                         transfer),
   11378                                        AlignedMemOperand(Register(rn),
   11379                                                          align,
   11380                                                          PostIndex));
   11381                                   break;
   11382                                 }
   11383                                 case 0x00000300: {
   11384                                   // 0xf900030d
   11385                                   if (((instr & 0xe30) == 0x830)) {
   11386                                     UnallocatedT32(instr);
   11387                                     return;
   11388                                   }
   11389                                   DataType dt =
   11390                                       Dt_size_7_Decode((instr >> 6) & 0x3);
   11391                                   if (dt.Is(kDataTypeValueInvalid)) {
   11392                                     UnallocatedT32(instr);
   11393                                     return;
   11394                                   }
   11395                                   Alignment align =
   11396                                       Align_align_2_Decode((instr >> 4) & 0x3);
   11397                                   if (dt.Is(kDataTypeValueInvalid) ||
   11398                                       align.Is(kBadAlignment)) {
   11399                                     UnallocatedT32(instr);
   11400                                     return;
   11401                                   }
   11402                                   unsigned first =
   11403                                       ExtractDRegister(instr, 22, 12);
   11404                                   unsigned length;
   11405                                   SpacingType spacing;
   11406                                   switch ((instr >> 8) & 0xf) {
   11407                                     default:
   11408                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
   11409                                     case 0x8:
   11410                                       length = 2;
   11411                                       spacing = kSingle;
   11412                                       break;
   11413                                     case 0x9:
   11414                                       length = 2;
   11415                                       spacing = kDouble;
   11416                                       break;
   11417                                     case 0x3:
   11418                                       length = 4;
   11419                                       spacing = kSingle;
   11420                                       break;
   11421                                   }
   11422                                   unsigned last =
   11423                                       first +
   11424                                       (length - 1) *
   11425                                           (spacing == kSingle ? 1 : 2);
   11426                                   TransferType transfer = kMultipleLanes;
   11427                                   unsigned rn = (instr >> 16) & 0xf;
   11428                                   // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
   11429                                   vst2(CurrentCond(),
   11430                                        dt,
   11431                                        NeonRegisterList(DRegister(first),
   11432                                                         DRegister(last),
   11433                                                         spacing,
   11434                                                         transfer),
   11435                                        AlignedMemOperand(Register(rn),
   11436                                                          align,
   11437                                                          PostIndex));
   11438                                   break;
   11439                                 }
   11440                                 case 0x00000400: {
   11441                                   // 0xf900040d
   11442                                   if (((instr & 0x20) == 0x20)) {
   11443                                     UnallocatedT32(instr);
   11444                                     return;
   11445                                   }
   11446                                   DataType dt =
   11447                                       Dt_size_7_Decode((instr >> 6) & 0x3);
   11448                                   if (dt.Is(kDataTypeValueInvalid)) {
   11449                                     UnallocatedT32(instr);
   11450                                     return;
   11451                                   }
   11452                                   Alignment align =
   11453                                       Align_align_3_Decode((instr >> 4) & 0x3);
   11454                                   if (dt.Is(kDataTypeValueInvalid) ||
   11455                                       align.Is(kBadAlignment)) {
   11456                                     UnallocatedT32(instr);
   11457                                     return;
   11458                                   }
   11459                                   unsigned first =
   11460                                       ExtractDRegister(instr, 22, 12);
   11461                                   unsigned length;
   11462                                   SpacingType spacing;
   11463                                   switch ((instr >> 8) & 0xf) {
   11464                                     default:
   11465                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
   11466                                     case 0x4:
   11467                                       length = 3;
   11468                                       spacing = kSingle;
   11469                                       break;
   11470                                     case 0x5:
   11471                                       length = 3;
   11472                                       spacing = kDouble;
   11473                                       break;
   11474                                   }
   11475                                   unsigned last =
   11476                                       first +
   11477                                       (length - 1) *
   11478                                           (spacing == kSingle ? 1 : 2);
   11479                                   TransferType transfer = kMultipleLanes;
   11480                                   unsigned rn = (instr >> 16) & 0xf;
   11481                                   // VST3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
   11482                                   vst3(CurrentCond(),
   11483                                        dt,
   11484                                        NeonRegisterList(DRegister(first),
   11485                                                         DRegister(last),
   11486                                                         spacing,
   11487                                                         transfer),
   11488                                        AlignedMemOperand(Register(rn),
   11489                                                          align,
   11490                                                          PostIndex));
   11491                                   break;
   11492                                 }
   11493                                 case 0x00000500: {
   11494                                   // 0xf900050d
   11495                                   if (((instr & 0x20) == 0x20)) {
   11496                                     UnallocatedT32(instr);
   11497                                     return;
   11498                                   }
   11499                                   DataType dt =
   11500                                       Dt_size_7_Decode((instr >> 6) & 0x3);
   11501                                   if (dt.Is(kDataTypeValueInvalid)) {
   11502                                     UnallocatedT32(instr);
   11503                                     return;
   11504                                   }
   11505                                   Alignment align =
   11506                                       Align_align_3_Decode((instr >> 4) & 0x3);
   11507                                   if (dt.Is(kDataTypeValueInvalid) ||
   11508                                       align.Is(kBadAlignment)) {
   11509                                     UnallocatedT32(instr);
   11510                                     return;
   11511                                   }
   11512                                   unsigned first =
   11513                                       ExtractDRegister(instr, 22, 12);
   11514                                   unsigned length;
   11515                                   SpacingType spacing;
   11516                                   switch ((instr >> 8) & 0xf) {
   11517                                     default:
   11518                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
   11519                                     case 0x4:
   11520                                       length = 3;
   11521                                       spacing = kSingle;
   11522                                       break;
   11523                                     case 0x5:
   11524                                       length = 3;
   11525                                       spacing = kDouble;
   11526                                       break;
   11527                                   }
   11528                                   unsigned last =
   11529                                       first +
   11530                                       (length - 1) *
   11531                                           (spacing == kSingle ? 1 : 2);
   11532                                   TransferType transfer = kMultipleLanes;
   11533                                   unsigned rn = (instr >> 16) & 0xf;
   11534                                   // VST3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
   11535                                   vst3(CurrentCond(),
   11536                                        dt,
   11537                                        NeonRegisterList(DRegister(first),
   11538                                                         DRegister(last),
   11539                                                         spacing,
   11540                                                         transfer),
   11541                                        AlignedMemOperand(Register(rn),
   11542                                                          align,
   11543                                                          PostIndex));
   11544                                   break;
   11545                                 }
   11546                                 case 0x00000600: {
   11547                                   // 0xf900060d
   11548                                   if (((instr & 0xe20) == 0x620) ||
   11549                                       ((instr & 0xf30) == 0xa30)) {
   11550                                     UnallocatedT32(instr);
   11551                                     return;
   11552                                   }
   11553                                   DataType dt =
   11554                                       Dt_size_6_Decode((instr >> 6) & 0x3);
   11555                                   if (dt.Is(kDataTypeValueInvalid)) {
   11556                                     UnallocatedT32(instr);
   11557                                     return;
   11558                                   }
   11559                                   Alignment align =
   11560                                       Align_align_5_Decode((instr >> 4) & 0x3);
   11561                                   if (dt.Is(kDataTypeValueInvalid) ||
   11562                                       align.Is(kBadAlignment)) {
   11563                                     UnallocatedT32(instr);
   11564                                     return;
   11565                                   }
   11566                                   unsigned first =
   11567                                       ExtractDRegister(instr, 22, 12);
   11568                                   unsigned length;
   11569                                   SpacingType spacing = kSingle;
   11570                                   switch ((instr >> 8) & 0xf) {
   11571                                     default:
   11572                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
   11573                                     case 0x7:
   11574                                       length = 1;
   11575                                       break;
   11576                                     case 0xa:
   11577                                       length = 2;
   11578                                       break;
   11579                                     case 0x6:
   11580                                       length = 3;
   11581                                       break;
   11582                                     case 0x2:
   11583                                       length = 4;
   11584                                       break;
   11585                                   }
   11586                                   unsigned last = first + length - 1;
   11587                                   TransferType transfer = kMultipleLanes;
   11588                                   unsigned rn = (instr >> 16) & 0xf;
   11589                                   // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
   11590                                   vst1(CurrentCond(),
   11591                                        dt,
   11592                                        NeonRegisterList(DRegister(first),
   11593                                                         DRegister(last),
   11594                                                         spacing,
   11595                                                         transfer),
   11596                                        AlignedMemOperand(Register(rn),
   11597                                                          align,
   11598                                                          PostIndex));
   11599                                   break;
   11600                                 }
   11601                                 case 0x00000700: {
   11602                                   // 0xf900070d
   11603                                   if (((instr & 0xe20) == 0x620) ||
   11604                                       ((instr & 0xf30) == 0xa30)) {
   11605                                     UnallocatedT32(instr);
   11606                                     return;
   11607                                   }
   11608                                   DataType dt =
   11609                                       Dt_size_6_Decode((instr >> 6) & 0x3);
   11610                                   if (dt.Is(kDataTypeValueInvalid)) {
   11611                                     UnallocatedT32(instr);
   11612                                     return;
   11613                                   }
   11614                                   Alignment align =
   11615                                       Align_align_5_Decode((instr >> 4) & 0x3);
   11616                                   if (dt.Is(kDataTypeValueInvalid) ||
   11617                                       align.Is(kBadAlignment)) {
   11618                                     UnallocatedT32(instr);
   11619                                     return;
   11620                                   }
   11621                                   unsigned first =
   11622                                       ExtractDRegister(instr, 22, 12);
   11623                                   unsigned length;
   11624                                   SpacingType spacing = kSingle;
   11625                                   switch ((instr >> 8) & 0xf) {
   11626                                     default:
   11627                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
   11628                                     case 0x7:
   11629                                       length = 1;
   11630                                       break;
   11631                                     case 0xa:
   11632                                       length = 2;
   11633                                       break;
   11634                                     case 0x6:
   11635                                       length = 3;
   11636                                       break;
   11637                                     case 0x2:
   11638                                       length = 4;
   11639                                       break;
   11640                                   }
   11641                                   unsigned last = first + length - 1;
   11642                                   TransferType transfer = kMultipleLanes;
   11643                                   unsigned rn = (instr >> 16) & 0xf;
   11644                                   // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
   11645                                   vst1(CurrentCond(),
   11646                                        dt,
   11647                                        NeonRegisterList(DRegister(first),
   11648                                                         DRegister(last),
   11649                                                         spacing,
   11650                                                         transfer),
   11651                                        AlignedMemOperand(Register(rn),
   11652                                                          align,
   11653                                                          PostIndex));
   11654                                   break;
   11655                                 }
   11656                                 case 0x00000800: {
   11657                                   // 0xf900080d
   11658                                   if (((instr & 0xe30) == 0x830)) {
   11659                                     UnallocatedT32(instr);
   11660                                     return;
   11661                                   }
   11662                                   DataType dt =
   11663                                       Dt_size_7_Decode((instr >> 6) & 0x3);
   11664                                   if (dt.Is(kDataTypeValueInvalid)) {
   11665                                     UnallocatedT32(instr);
   11666                                     return;
   11667                                   }
   11668                                   Alignment align =
   11669                                       Align_align_2_Decode((instr >> 4) & 0x3);
   11670                                   if (dt.Is(kDataTypeValueInvalid) ||
   11671                                       align.Is(kBadAlignment)) {
   11672                                     UnallocatedT32(instr);
   11673                                     return;
   11674                                   }
   11675                                   unsigned first =
   11676                                       ExtractDRegister(instr, 22, 12);
   11677                                   unsigned length;
   11678                                   SpacingType spacing;
   11679                                   switch ((instr >> 8) & 0xf) {
   11680                                     default:
   11681                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
   11682                                     case 0x8:
   11683                                       length = 2;
   11684                                       spacing = kSingle;
   11685                                       break;
   11686                                     case 0x9:
   11687                                       length = 2;
   11688                                       spacing = kDouble;
   11689                                       break;
   11690                                     case 0x3:
   11691                                       length = 4;
   11692                                       spacing = kSingle;
   11693                                       break;
   11694                                   }
   11695                                   unsigned last =
   11696                                       first +
   11697                                       (length - 1) *
   11698                                           (spacing == kSingle ? 1 : 2);
   11699                                   TransferType transfer = kMultipleLanes;
   11700                                   unsigned rn = (instr >> 16) & 0xf;
   11701                                   // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
   11702                                   vst2(CurrentCond(),
   11703                                        dt,
   11704                                        NeonRegisterList(DRegister(first),
   11705                                                         DRegister(last),
   11706                                                         spacing,
   11707                                                         transfer),
   11708                                        AlignedMemOperand(Register(rn),
   11709                                                          align,
   11710                                                          PostIndex));
   11711                                   break;
   11712                                 }
   11713                                 case 0x00000900: {
   11714                                   // 0xf900090d
   11715                                   if (((instr & 0xe30) == 0x830)) {
   11716                                     UnallocatedT32(instr);
   11717                                     return;
   11718                                   }
   11719                                   DataType dt =
   11720                                       Dt_size_7_Decode((instr >> 6) & 0x3);
   11721                                   if (dt.Is(kDataTypeValueInvalid)) {
   11722                                     UnallocatedT32(instr);
   11723                                     return;
   11724                                   }
   11725                                   Alignment align =
   11726                                       Align_align_2_Decode((instr >> 4) & 0x3);
   11727                                   if (dt.Is(kDataTypeValueInvalid) ||
   11728                                       align.Is(kBadAlignment)) {
   11729                                     UnallocatedT32(instr);
   11730                                     return;
   11731                                   }
   11732                                   unsigned first =
   11733                                       ExtractDRegister(instr, 22, 12);
   11734                                   unsigned length;
   11735                                   SpacingType spacing;
   11736                                   switch ((instr >> 8) & 0xf) {
   11737                                     default:
   11738                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
   11739                                     case 0x8:
   11740                                       length = 2;
   11741                                       spacing = kSingle;
   11742                                       break;
   11743                                     case 0x9:
   11744                                       length = 2;
   11745                                       spacing = kDouble;
   11746                                       break;
   11747                                     case 0x3:
   11748                                       length = 4;
   11749                                       spacing = kSingle;
   11750                                       break;
   11751                                   }
   11752                                   unsigned last =
   11753                                       first +
   11754                                       (length - 1) *
   11755                                           (spacing == kSingle ? 1 : 2);
   11756                                   TransferType transfer = kMultipleLanes;
   11757                                   unsigned rn = (instr >> 16) & 0xf;
   11758                                   // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
   11759                                   vst2(CurrentCond(),
   11760                                        dt,
   11761                                        NeonRegisterList(DRegister(first),
   11762                                                         DRegister(last),
   11763                                                         spacing,
   11764                                                         transfer),
   11765                                        AlignedMemOperand(Register(rn),
   11766                                                          align,
   11767                                                          PostIndex));
   11768                                   break;
   11769                                 }
   11770                                 case 0x00000a00: {
   11771                                   // 0xf9000a0d
   11772                                   if (((instr & 0xe20) == 0x620) ||
   11773                                       ((instr & 0xf30) == 0xa30)) {
   11774                                     UnallocatedT32(instr);
   11775                                     return;
   11776                                   }
   11777                                   DataType dt =
   11778                                       Dt_size_6_Decode((instr >> 6) & 0x3);
   11779                                   if (dt.Is(kDataTypeValueInvalid)) {
   11780                                     UnallocatedT32(instr);
   11781                                     return;
   11782                                   }
   11783                                   Alignment align =
   11784                                       Align_align_5_Decode((instr >> 4) & 0x3);
   11785                                   if (dt.Is(kDataTypeValueInvalid) ||
   11786                                       align.Is(kBadAlignment)) {
   11787                                     UnallocatedT32(instr);
   11788                                     return;
   11789                                   }
   11790                                   unsigned first =
   11791                                       ExtractDRegister(instr, 22, 12);
   11792                                   unsigned length;
   11793                                   SpacingType spacing = kSingle;
   11794                                   switch ((instr >> 8) & 0xf) {
   11795                                     default:
   11796                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
   11797                                     case 0x7:
   11798                                       length = 1;
   11799                                       break;
   11800                                     case 0xa:
   11801                                       length = 2;
   11802                                       break;
   11803                                     case 0x6:
   11804                                       length = 3;
   11805                                       break;
   11806                                     case 0x2:
   11807                                       length = 4;
   11808                                       break;
   11809                                   }
   11810                                   unsigned last = first + length - 1;
   11811                                   TransferType transfer = kMultipleLanes;
   11812                                   unsigned rn = (instr >> 16) & 0xf;
   11813                                   // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
   11814                                   vst1(CurrentCond(),
   11815                                        dt,
   11816                                        NeonRegisterList(DRegister(first),
   11817                                                         DRegister(last),
   11818                                                         spacing,
   11819                                                         transfer),
   11820                                        AlignedMemOperand(Register(rn),
   11821                                                          align,
   11822                                                          PostIndex));
   11823                                   break;
   11824                                 }
   11825                                 default:
   11826                                   UnallocatedT32(instr);
   11827                                   break;
   11828                               }
   11829                               break;
   11830                             }
   11831                             case 0x00000002: {
   11832                               // 0xf900000f
   11833                               switch (instr & 0x00000f00) {
   11834                                 case 0x00000000: {
   11835                                   // 0xf900000d
   11836                                   DataType dt =
   11837                                       Dt_size_7_Decode((instr >> 6) & 0x3);
   11838                                   if (dt.Is(kDataTypeValueInvalid)) {
   11839                                     UnallocatedT32(instr);
   11840                                     return;
   11841                                   }
   11842                                   Alignment align =
   11843                                       Align_align_4_Decode((instr >> 4) & 0x3);
   11844                                   if (dt.Is(kDataTypeValueInvalid) ||
   11845                                       align.Is(kBadAlignment)) {
   11846                                     UnallocatedT32(instr);
   11847                                     return;
   11848                                   }
   11849                                   unsigned first =
   11850                                       ExtractDRegister(instr, 22, 12);
   11851                                   unsigned length;
   11852                                   SpacingType spacing;
   11853                                   switch ((instr >> 8) & 0xf) {
   11854                                     default:
   11855                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
   11856                                     case 0x0:
   11857                                       length = 4;
   11858                                       spacing = kSingle;
   11859                                       break;
   11860                                     case 0x1:
   11861                                       length = 4;
   11862                                       spacing = kDouble;
   11863                                       break;
   11864                                   }
   11865                                   unsigned last =
   11866                                       first +
   11867                                       (length - 1) *
   11868                                           (spacing == kSingle ? 1 : 2);
   11869                                   TransferType transfer = kMultipleLanes;
   11870                                   unsigned rn = (instr >> 16) & 0xf;
   11871                                   // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
   11872                                   vst4(CurrentCond(),
   11873                                        dt,
   11874                                        NeonRegisterList(DRegister(first),
   11875                                                         DRegister(last),
   11876                                                         spacing,
   11877                                                         transfer),
   11878                                        AlignedMemOperand(Register(rn),
   11879                                                          align,
   11880                                                          Offset));
   11881                                   break;
   11882                                 }
   11883                                 case 0x00000100: {
   11884                                   // 0xf900010d
   11885                                   DataType dt =
   11886                                       Dt_size_7_Decode((instr >> 6) & 0x3);
   11887                                   if (dt.Is(kDataTypeValueInvalid)) {
   11888                                     UnallocatedT32(instr);
   11889                                     return;
   11890                                   }
   11891                                   Alignment align =
   11892                                       Align_align_4_Decode((instr >> 4) & 0x3);
   11893                                   if (dt.Is(kDataTypeValueInvalid) ||
   11894                                       align.Is(kBadAlignment)) {
   11895                                     UnallocatedT32(instr);
   11896                                     return;
   11897                                   }
   11898                                   unsigned first =
   11899                                       ExtractDRegister(instr, 22, 12);
   11900                                   unsigned length;
   11901                                   SpacingType spacing;
   11902                                   switch ((instr >> 8) & 0xf) {
   11903                                     default:
   11904                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
   11905                                     case 0x0:
   11906                                       length = 4;
   11907                                       spacing = kSingle;
   11908                                       break;
   11909                                     case 0x1:
   11910                                       length = 4;
   11911                                       spacing = kDouble;
   11912                                       break;
   11913                                   }
   11914                                   unsigned last =
   11915                                       first +
   11916                                       (length - 1) *
   11917                                           (spacing == kSingle ? 1 : 2);
   11918                                   TransferType transfer = kMultipleLanes;
   11919                                   unsigned rn = (instr >> 16) & 0xf;
   11920                                   // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
   11921                                   vst4(CurrentCond(),
   11922                                        dt,
   11923                                        NeonRegisterList(DRegister(first),
   11924                                                         DRegister(last),
   11925                                                         spacing,
   11926                                                         transfer),
   11927                                        AlignedMemOperand(Register(rn),
   11928                                                          align,
   11929                                                          Offset));
   11930                                   break;
   11931                                 }
   11932                                 case 0x00000200: {
   11933                                   // 0xf900020d
   11934                                   if (((instr & 0xe20) == 0x620) ||
   11935                                       ((instr & 0xf30) == 0xa30)) {
   11936                                     UnallocatedT32(instr);
   11937                                     return;
   11938                                   }
   11939                                   DataType dt =
   11940                                       Dt_size_6_Decode((instr >> 6) & 0x3);
   11941                                   if (dt.Is(kDataTypeValueInvalid)) {
   11942                                     UnallocatedT32(instr);
   11943                                     return;
   11944                                   }
   11945                                   Alignment align =
   11946                                       Align_align_5_Decode((instr >> 4) & 0x3);
   11947                                   if (dt.Is(kDataTypeValueInvalid) ||
   11948                                       align.Is(kBadAlignment)) {
   11949                                     UnallocatedT32(instr);
   11950                                     return;
   11951                                   }
   11952                                   unsigned first =
   11953                                       ExtractDRegister(instr, 22, 12);
   11954                                   unsigned length;
   11955                                   SpacingType spacing = kSingle;
   11956                                   switch ((instr >> 8) & 0xf) {
   11957                                     default:
   11958                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
   11959                                     case 0x7:
   11960                                       length = 1;
   11961                                       break;
   11962                                     case 0xa:
   11963                                       length = 2;
   11964                                       break;
   11965                                     case 0x6:
   11966                                       length = 3;
   11967                                       break;
   11968                                     case 0x2:
   11969                                       length = 4;
   11970                                       break;
   11971                                   }
   11972                                   unsigned last = first + length - 1;
   11973                                   TransferType transfer = kMultipleLanes;
   11974                                   unsigned rn = (instr >> 16) & 0xf;
   11975                                   // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
   11976                                   vst1(CurrentCond(),
   11977                                        dt,
   11978                                        NeonRegisterList(DRegister(first),
   11979                                                         DRegister(last),
   11980                                                         spacing,
   11981                                                         transfer),
   11982                                        AlignedMemOperand(Register(rn),
   11983                                                          align,
   11984                                                          Offset));
   11985                                   break;
   11986                                 }
   11987                                 case 0x00000300: {
   11988                                   // 0xf900030d
   11989                                   if (((instr & 0xe30) == 0x830)) {
   11990                                     UnallocatedT32(instr);
   11991                                     return;
   11992                                   }
   11993                                   DataType dt =
   11994                                       Dt_size_7_Decode((instr >> 6) & 0x3);
   11995                                   if (dt.Is(kDataTypeValueInvalid)) {
   11996                                     UnallocatedT32(instr);
   11997                                     return;
   11998                                   }
   11999                                   Alignment align =
   12000                                       Align_align_2_Decode((instr >> 4) & 0x3);
   12001                                   if (dt.Is(kDataTypeValueInvalid) ||
   12002                                       align.Is(kBadAlignment)) {
   12003                                     UnallocatedT32(instr);
   12004                                     return;
   12005                                   }
   12006                                   unsigned first =
   12007                                       ExtractDRegister(instr, 22, 12);
   12008                                   unsigned length;
   12009                                   SpacingType spacing;
   12010                                   switch ((instr >> 8) & 0xf) {
   12011                                     default:
   12012                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
   12013                                     case 0x8:
   12014                                       length = 2;
   12015                                       spacing = kSingle;
   12016                                       break;
   12017                                     case 0x9:
   12018                                       length = 2;
   12019                                       spacing = kDouble;
   12020                                       break;
   12021                                     case 0x3:
   12022                                       length = 4;
   12023                                       spacing = kSingle;
   12024                                       break;
   12025                                   }
   12026                                   unsigned last =
   12027                                       first +
   12028                                       (length - 1) *
   12029                                           (spacing == kSingle ? 1 : 2);
   12030                                   TransferType transfer = kMultipleLanes;
   12031                                   unsigned rn = (instr >> 16) & 0xf;
   12032                                   // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
   12033                                   vst2(CurrentCond(),
   12034                                        dt,
   12035                                        NeonRegisterList(DRegister(first),
   12036                                                         DRegister(last),
   12037                                                         spacing,
   12038                                                         transfer),
   12039                                        AlignedMemOperand(Register(rn),
   12040                                                          align,
   12041                                                          Offset));
   12042                                   break;
   12043                                 }
   12044                                 case 0x00000400: {
   12045                                   // 0xf900040d
   12046                                   if (((instr & 0x20) == 0x20)) {
   12047                                     UnallocatedT32(instr);
   12048                                     return;
   12049                                   }
   12050                                   DataType dt =
   12051                                       Dt_size_7_Decode((instr >> 6) & 0x3);
   12052                                   if (dt.Is(kDataTypeValueInvalid)) {
   12053                                     UnallocatedT32(instr);
   12054                                     return;
   12055                                   }
   12056                                   Alignment align =
   12057                                       Align_align_3_Decode((instr >> 4) & 0x3);
   12058                                   if (dt.Is(kDataTypeValueInvalid) ||
   12059                                       align.Is(kBadAlignment)) {
   12060                                     UnallocatedT32(instr);
   12061                                     return;
   12062                                   }
   12063                                   unsigned first =
   12064                                       ExtractDRegister(instr, 22, 12);
   12065                                   unsigned length;
   12066                                   SpacingType spacing;
   12067                                   switch ((instr >> 8) & 0xf) {
   12068                                     default:
   12069                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
   12070                                     case 0x4:
   12071                                       length = 3;
   12072                                       spacing = kSingle;
   12073                                       break;
   12074                                     case 0x5:
   12075                                       length = 3;
   12076                                       spacing = kDouble;
   12077                                       break;
   12078                                   }
   12079                                   unsigned last =
   12080                                       first +
   12081                                       (length - 1) *
   12082                                           (spacing == kSingle ? 1 : 2);
   12083                                   TransferType transfer = kMultipleLanes;
   12084                                   unsigned rn = (instr >> 16) & 0xf;
   12085                                   // VST3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
   12086                                   vst3(CurrentCond(),
   12087                                        dt,
   12088                                        NeonRegisterList(DRegister(first),
   12089                                                         DRegister(last),
   12090                                                         spacing,
   12091                                                         transfer),
   12092                                        AlignedMemOperand(Register(rn),
   12093                                                          align,
   12094                                                          Offset));
   12095                                   break;
   12096                                 }
   12097                                 case 0x00000500: {
   12098                                   // 0xf900050d
   12099                                   if (((instr & 0x20) == 0x20)) {
   12100                                     UnallocatedT32(instr);
   12101                                     return;
   12102                                   }
   12103                                   DataType dt =
   12104                                       Dt_size_7_Decode((instr >> 6) & 0x3);
   12105                                   if (dt.Is(kDataTypeValueInvalid)) {
   12106                                     UnallocatedT32(instr);
   12107                                     return;
   12108                                   }
   12109                                   Alignment align =
   12110                                       Align_align_3_Decode((instr >> 4) & 0x3);
   12111                                   if (dt.Is(kDataTypeValueInvalid) ||
   12112                                       align.Is(kBadAlignment)) {
   12113                                     UnallocatedT32(instr);
   12114                                     return;
   12115                                   }
   12116                                   unsigned first =
   12117                                       ExtractDRegister(instr, 22, 12);
   12118                                   unsigned length;
   12119                                   SpacingType spacing;
   12120                                   switch ((instr >> 8) & 0xf) {
   12121                                     default:
   12122                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
   12123                                     case 0x4:
   12124                                       length = 3;
   12125                                       spacing = kSingle;
   12126                                       break;
   12127                                     case 0x5:
   12128                                       length = 3;
   12129                                       spacing = kDouble;
   12130                                       break;
   12131                                   }
   12132                                   unsigned last =
   12133                                       first +
   12134                                       (length - 1) *
   12135                                           (spacing == kSingle ? 1 : 2);
   12136                                   TransferType transfer = kMultipleLanes;
   12137                                   unsigned rn = (instr >> 16) & 0xf;
   12138                                   // VST3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
   12139                                   vst3(CurrentCond(),
   12140                                        dt,
   12141                                        NeonRegisterList(DRegister(first),
   12142                                                         DRegister(last),
   12143                                                         spacing,
   12144                                                         transfer),
   12145                                        AlignedMemOperand(Register(rn),
   12146                                                          align,
   12147                                                          Offset));
   12148                                   break;
   12149                                 }
   12150                                 case 0x00000600: {
   12151                                   // 0xf900060d
   12152                                   if (((instr & 0xe20) == 0x620) ||
   12153                                       ((instr & 0xf30) == 0xa30)) {
   12154                                     UnallocatedT32(instr);
   12155                                     return;
   12156                                   }
   12157                                   DataType dt =
   12158                                       Dt_size_6_Decode((instr >> 6) & 0x3);
   12159                                   if (dt.Is(kDataTypeValueInvalid)) {
   12160                                     UnallocatedT32(instr);
   12161                                     return;
   12162                                   }
   12163                                   Alignment align =
   12164                                       Align_align_5_Decode((instr >> 4) & 0x3);
   12165                                   if (dt.Is(kDataTypeValueInvalid) ||
   12166                                       align.Is(kBadAlignment)) {
   12167                                     UnallocatedT32(instr);
   12168                                     return;
   12169                                   }
   12170                                   unsigned first =
   12171                                       ExtractDRegister(instr, 22, 12);
   12172                                   unsigned length;
   12173                                   SpacingType spacing = kSingle;
   12174                                   switch ((instr >> 8) & 0xf) {
   12175                                     default:
   12176                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
   12177                                     case 0x7:
   12178                                       length = 1;
   12179                                       break;
   12180                                     case 0xa:
   12181                                       length = 2;
   12182                                       break;
   12183                                     case 0x6:
   12184                                       length = 3;
   12185                                       break;
   12186                                     case 0x2:
   12187                                       length = 4;
   12188                                       break;
   12189                                   }
   12190                                   unsigned last = first + length - 1;
   12191                                   TransferType transfer = kMultipleLanes;
   12192                                   unsigned rn = (instr >> 16) & 0xf;
   12193                                   // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
   12194                                   vst1(CurrentCond(),
   12195                                        dt,
   12196                                        NeonRegisterList(DRegister(first),
   12197                                                         DRegister(last),
   12198                                                         spacing,
   12199                                                         transfer),
   12200                                        AlignedMemOperand(Register(rn),
   12201                                                          align,
   12202                                                          Offset));
   12203                                   break;
   12204                                 }
   12205                                 case 0x00000700: {
   12206                                   // 0xf900070d
   12207                                   if (((instr & 0xe20) == 0x620) ||
   12208                                       ((instr & 0xf30) == 0xa30)) {
   12209                                     UnallocatedT32(instr);
   12210                                     return;
   12211                                   }
   12212                                   DataType dt =
   12213                                       Dt_size_6_Decode((instr >> 6) & 0x3);
   12214                                   if (dt.Is(kDataTypeValueInvalid)) {
   12215                                     UnallocatedT32(instr);
   12216                                     return;
   12217                                   }
   12218                                   Alignment align =
   12219                                       Align_align_5_Decode((instr >> 4) & 0x3);
   12220                                   if (dt.Is(kDataTypeValueInvalid) ||
   12221                                       align.Is(kBadAlignment)) {
   12222                                     UnallocatedT32(instr);
   12223                                     return;
   12224                                   }
   12225                                   unsigned first =
   12226                                       ExtractDRegister(instr, 22, 12);
   12227                                   unsigned length;
   12228                                   SpacingType spacing = kSingle;
   12229                                   switch ((instr >> 8) & 0xf) {
   12230                                     default:
   12231                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
   12232                                     case 0x7:
   12233                                       length = 1;
   12234                                       break;
   12235                                     case 0xa:
   12236                                       length = 2;
   12237                                       break;
   12238                                     case 0x6:
   12239                                       length = 3;
   12240                                       break;
   12241                                     case 0x2:
   12242                                       length = 4;
   12243                                       break;
   12244                                   }
   12245                                   unsigned last = first + length - 1;
   12246                                   TransferType transfer = kMultipleLanes;
   12247                                   unsigned rn = (instr >> 16) & 0xf;
   12248                                   // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
   12249                                   vst1(CurrentCond(),
   12250                                        dt,
   12251                                        NeonRegisterList(DRegister(first),
   12252                                                         DRegister(last),
   12253                                                         spacing,
   12254                                                         transfer),
   12255                                        AlignedMemOperand(Register(rn),
   12256                                                          align,
   12257                                                          Offset));
   12258                                   break;
   12259                                 }
   12260                                 case 0x00000800: {
   12261                                   // 0xf900080d
   12262                                   if (((instr & 0xe30) == 0x830)) {
   12263                                     UnallocatedT32(instr);
   12264                                     return;
   12265                                   }
   12266                                   DataType dt =
   12267                                       Dt_size_7_Decode((instr >> 6) & 0x3);
   12268                                   if (dt.Is(kDataTypeValueInvalid)) {
   12269                                     UnallocatedT32(instr);
   12270                                     return;
   12271                                   }
   12272                                   Alignment align =
   12273                                       Align_align_2_Decode((instr >> 4) & 0x3);
   12274                                   if (dt.Is(kDataTypeValueInvalid) ||
   12275                                       align.Is(kBadAlignment)) {
   12276                                     UnallocatedT32(instr);
   12277                                     return;
   12278                                   }
   12279                                   unsigned first =
   12280                                       ExtractDRegister(instr, 22, 12);
   12281                                   unsigned length;
   12282                                   SpacingType spacing;
   12283                                   switch ((instr >> 8) & 0xf) {
   12284                                     default:
   12285                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
   12286                                     case 0x8:
   12287                                       length = 2;
   12288                                       spacing = kSingle;
   12289                                       break;
   12290                                     case 0x9:
   12291                                       length = 2;
   12292                                       spacing = kDouble;
   12293                                       break;
   12294                                     case 0x3:
   12295                                       length = 4;
   12296                                       spacing = kSingle;
   12297                                       break;
   12298                                   }
   12299                                   unsigned last =
   12300                                       first +
   12301                                       (length - 1) *
   12302                                           (spacing == kSingle ? 1 : 2);
   12303                                   TransferType transfer = kMultipleLanes;
   12304                                   unsigned rn = (instr >> 16) & 0xf;
   12305                                   // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
   12306                                   vst2(CurrentCond(),
   12307                                        dt,
   12308                                        NeonRegisterList(DRegister(first),
   12309                                                         DRegister(last),
   12310                                                         spacing,
   12311                                                         transfer),
   12312                                        AlignedMemOperand(Register(rn),
   12313                                                          align,
   12314                                                          Offset));
   12315                                   break;
   12316                                 }
   12317                                 case 0x00000900: {
   12318                                   // 0xf900090d
   12319                                   if (((instr & 0xe30) == 0x830)) {
   12320                                     UnallocatedT32(instr);
   12321                                     return;
   12322                                   }
   12323                                   DataType dt =
   12324                                       Dt_size_7_Decode((instr >> 6) & 0x3);
   12325                                   if (dt.Is(kDataTypeValueInvalid)) {
   12326                                     UnallocatedT32(instr);
   12327                                     return;
   12328                                   }
   12329                                   Alignment align =
   12330                                       Align_align_2_Decode((instr >> 4) & 0x3);
   12331                                   if (dt.Is(kDataTypeValueInvalid) ||
   12332                                       align.Is(kBadAlignment)) {
   12333                                     UnallocatedT32(instr);
   12334                                     return;
   12335                                   }
   12336                                   unsigned first =
   12337                                       ExtractDRegister(instr, 22, 12);
   12338                                   unsigned length;
   12339                                   SpacingType spacing;
   12340                                   switch ((instr >> 8) & 0xf) {
   12341                                     default:
   12342                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
   12343                                     case 0x8:
   12344                                       length = 2;
   12345                                       spacing = kSingle;
   12346                                       break;
   12347                                     case 0x9:
   12348                                       length = 2;
   12349                                       spacing = kDouble;
   12350                                       break;
   12351                                     case 0x3:
   12352                                       length = 4;
   12353                                       spacing = kSingle;
   12354                                       break;
   12355                                   }
   12356                                   unsigned last =
   12357                                       first +
   12358                                       (length - 1) *
   12359                                           (spacing == kSingle ? 1 : 2);
   12360                                   TransferType transfer = kMultipleLanes;
   12361                                   unsigned rn = (instr >> 16) & 0xf;
   12362                                   // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
   12363                                   vst2(CurrentCond(),
   12364                                        dt,
   12365                                        NeonRegisterList(DRegister(first),
   12366                                                         DRegister(last),
   12367                                                         spacing,
   12368                                                         transfer),
   12369                                        AlignedMemOperand(Register(rn),
   12370                                                          align,
   12371                                                          Offset));
   12372                                   break;
   12373                                 }
   12374                                 case 0x00000a00: {
   12375                                   // 0xf9000a0d
   12376                                   if (((instr & 0xe20) == 0x620) ||
   12377                                       ((instr & 0xf30) == 0xa30)) {
   12378                                     UnallocatedT32(instr);
   12379                                     return;
   12380                                   }
   12381                                   DataType dt =
   12382                                       Dt_size_6_Decode((instr >> 6) & 0x3);
   12383                                   if (dt.Is(kDataTypeValueInvalid)) {
   12384                                     UnallocatedT32(instr);
   12385                                     return;
   12386                                   }
   12387                                   Alignment align =
   12388                                       Align_align_5_Decode((instr >> 4) & 0x3);
   12389                                   if (dt.Is(kDataTypeValueInvalid) ||
   12390                                       align.Is(kBadAlignment)) {
   12391                                     UnallocatedT32(instr);
   12392                                     return;
   12393                                   }
   12394                                   unsigned first =
   12395                                       ExtractDRegister(instr, 22, 12);
   12396                                   unsigned length;
   12397                                   SpacingType spacing = kSingle;
   12398                                   switch ((instr >> 8) & 0xf) {
   12399                                     default:
   12400                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
   12401                                     case 0x7:
   12402                                       length = 1;
   12403                                       break;
   12404                                     case 0xa:
   12405                                       length = 2;
   12406                                       break;
   12407                                     case 0x6:
   12408                                       length = 3;
   12409                                       break;
   12410                                     case 0x2:
   12411                                       length = 4;
   12412                                       break;
   12413                                   }
   12414                                   unsigned last = first + length - 1;
   12415                                   TransferType transfer = kMultipleLanes;
   12416                                   unsigned rn = (instr >> 16) & 0xf;
   12417                                   // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
   12418                                   vst1(CurrentCond(),
   12419                                        dt,
   12420                                        NeonRegisterList(DRegister(first),
   12421                                                         DRegister(last),
   12422                                                         spacing,
   12423                                                         transfer),
   12424                                        AlignedMemOperand(Register(rn),
   12425                                                          align,
   12426                                                          Offset));
   12427                                   break;
   12428                                 }
   12429                                 default:
   12430                                   UnallocatedT32(instr);
   12431                                   break;
   12432                               }
   12433                               break;
   12434                             }
   12435                           }
   12436                           break;
   12437                         }
   12438                         default: {
   12439                           switch (instr & 0x00000f00) {
   12440                             case 0x00000000: {
   12441                               // 0xf9000000
   12442                               if (((instr & 0xd) == 0xd)) {
   12443                                 UnallocatedT32(instr);
   12444                                 return;
   12445                               }
   12446                               DataType dt =
   12447                                   Dt_size_7_Decode((instr >> 6) & 0x3);
   12448                               if (dt.Is(kDataTypeValueInvalid)) {
   12449                                 UnallocatedT32(instr);
   12450                                 return;
   12451                               }
   12452                               Alignment align =
   12453                                   Align_align_4_Decode((instr >> 4) & 0x3);
   12454                               if (dt.Is(kDataTypeValueInvalid) ||
   12455                                   align.Is(kBadAlignment)) {
   12456                                 UnallocatedT32(instr);
   12457                                 return;
   12458                               }
   12459                               unsigned first = ExtractDRegister(instr, 22, 12);
   12460                               unsigned length;
   12461                               SpacingType spacing;
   12462                               switch ((instr >> 8) & 0xf) {
   12463                                 default:
   12464                                   VIXL_UNREACHABLE_OR_FALLTHROUGH();
   12465                                 case 0x0:
   12466                                   length = 4;
   12467                                   spacing = kSingle;
   12468                                   break;
   12469                                 case 0x1:
   12470                                   length = 4;
   12471                                   spacing = kDouble;
   12472                                   break;
   12473                               }
   12474                               unsigned last =
   12475                                   first +
   12476                                   (length - 1) * (spacing == kSingle ? 1 : 2);
   12477                               TransferType transfer = kMultipleLanes;
   12478                               unsigned rn = (instr >> 16) & 0xf;
   12479                               unsigned rm = instr & 0xf;
   12480                               // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
   12481                               vst4(CurrentCond(),
   12482                                    dt,
   12483                                    NeonRegisterList(DRegister(first),
   12484                                                     DRegister(last),
   12485                                                     spacing,
   12486                                                     transfer),
   12487                                    AlignedMemOperand(Register(rn),
   12488                                                      align,
   12489                                                      Register(rm),
   12490                                                      PostIndex));
   12491                               break;
   12492                             }
   12493                             case 0x00000100: {
   12494                               // 0xf9000100
   12495                               if (((instr & 0xd) == 0xd)) {
   12496                                 UnallocatedT32(instr);
   12497                                 return;
   12498                               }
   12499                               DataType dt =
   12500                                   Dt_size_7_Decode((instr >> 6) & 0x3);
   12501                               if (dt.Is(kDataTypeValueInvalid)) {
   12502                                 UnallocatedT32(instr);
   12503                                 return;
   12504                               }
   12505                               Alignment align =
   12506                                   Align_align_4_Decode((instr >> 4) & 0x3);
   12507                               if (dt.Is(kDataTypeValueInvalid) ||
   12508                                   align.Is(kBadAlignment)) {
   12509                                 UnallocatedT32(instr);
   12510                                 return;
   12511                               }
   12512                               unsigned first = ExtractDRegister(instr, 22, 12);
   12513                               unsigned length;
   12514                               SpacingType spacing;
   12515                               switch ((instr >> 8) & 0xf) {
   12516                                 default:
   12517                                   VIXL_UNREACHABLE_OR_FALLTHROUGH();
   12518                                 case 0x0:
   12519                                   length = 4;
   12520                                   spacing = kSingle;
   12521                                   break;
   12522                                 case 0x1:
   12523                                   length = 4;
   12524                                   spacing = kDouble;
   12525                                   break;
   12526                               }
   12527                               unsigned last =
   12528                                   first +
   12529                                   (length - 1) * (spacing == kSingle ? 1 : 2);
   12530                               TransferType transfer = kMultipleLanes;
   12531                               unsigned rn = (instr >> 16) & 0xf;
   12532                               unsigned rm = instr & 0xf;
   12533                               // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
   12534                               vst4(CurrentCond(),
   12535                                    dt,
   12536                                    NeonRegisterList(DRegister(first),
   12537                                                     DRegister(last),
   12538                                                     spacing,
   12539                                                     transfer),
   12540                                    AlignedMemOperand(Register(rn),
   12541                                                      align,
   12542                                                      Register(rm),
   12543                                                      PostIndex));
   12544                               break;
   12545                             }
   12546                             case 0x00000200: {
   12547                               // 0xf9000200
   12548                               if (((instr & 0xd) == 0xd) ||
   12549                                   ((instr & 0xe20) == 0x620) ||
   12550                                   ((instr & 0xf30) == 0xa30)) {
   12551                                 UnallocatedT32(instr);
   12552                                 return;
   12553                               }
   12554                               DataType dt =
   12555                                   Dt_size_6_Decode((instr >> 6) & 0x3);
   12556                               if (dt.Is(kDataTypeValueInvalid)) {
   12557                                 UnallocatedT32(instr);
   12558                                 return;
   12559                               }
   12560                               Alignment align =
   12561                                   Align_align_5_Decode((instr >> 4) & 0x3);
   12562                               if (dt.Is(kDataTypeValueInvalid) ||
   12563                                   align.Is(kBadAlignment)) {
   12564                                 UnallocatedT32(instr);
   12565                                 return;
   12566                               }
   12567                               unsigned first = ExtractDRegister(instr, 22, 12);
   12568                               unsigned length;
   12569                               SpacingType spacing = kSingle;
   12570                               switch ((instr >> 8) & 0xf) {
   12571                                 default:
   12572                                   VIXL_UNREACHABLE_OR_FALLTHROUGH();
   12573                                 case 0x7:
   12574                                   length = 1;
   12575                                   break;
   12576                                 case 0xa:
   12577                                   length = 2;
   12578                                   break;
   12579                                 case 0x6:
   12580                                   length = 3;
   12581                                   break;
   12582                                 case 0x2:
   12583                                   length = 4;
   12584                                   break;
   12585                               }
   12586                               unsigned last = first + length - 1;
   12587                               TransferType transfer = kMultipleLanes;
   12588                               unsigned rn = (instr >> 16) & 0xf;
   12589                               unsigned rm = instr & 0xf;
   12590                               // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
   12591                               vst1(CurrentCond(),
   12592                                    dt,
   12593                                    NeonRegisterList(DRegister(first),
   12594                                                     DRegister(last),
   12595                                                     spacing,
   12596                                                     transfer),
   12597                                    AlignedMemOperand(Register(rn),
   12598                                                      align,
   12599                                                      Register(rm),
   12600                                                      PostIndex));
   12601                               break;
   12602                             }
   12603                             case 0x00000300: {
   12604                               // 0xf9000300
   12605                               if (((instr & 0xd) == 0xd) ||
   12606                                   ((instr & 0xe30) == 0x830)) {
   12607                                 UnallocatedT32(instr);
   12608                                 return;
   12609                               }
   12610                               DataType dt =
   12611                                   Dt_size_7_Decode((instr >> 6) & 0x3);
   12612                               if (dt.Is(kDataTypeValueInvalid)) {
   12613                                 UnallocatedT32(instr);
   12614                                 return;
   12615                               }
   12616                               Alignment align =
   12617                                   Align_align_2_Decode((instr >> 4) & 0x3);
   12618                               if (dt.Is(kDataTypeValueInvalid) ||
   12619                                   align.Is(kBadAlignment)) {
   12620                                 UnallocatedT32(instr);
   12621                                 return;
   12622                               }
   12623                               unsigned first = ExtractDRegister(instr, 22, 12);
   12624                               unsigned length;
   12625                               SpacingType spacing;
   12626                               switch ((instr >> 8) & 0xf) {
   12627                                 default:
   12628                                   VIXL_UNREACHABLE_OR_FALLTHROUGH();
   12629                                 case 0x8:
   12630                                   length = 2;
   12631                                   spacing = kSingle;
   12632                                   break;
   12633                                 case 0x9:
   12634                                   length = 2;
   12635                                   spacing = kDouble;
   12636                                   break;
   12637                                 case 0x3:
   12638                                   length = 4;
   12639                                   spacing = kSingle;
   12640                                   break;
   12641                               }
   12642                               unsigned last =
   12643                                   first +
   12644                                   (length - 1) * (spacing == kSingle ? 1 : 2);
   12645                               TransferType transfer = kMultipleLanes;
   12646                               unsigned rn = (instr >> 16) & 0xf;
   12647                               unsigned rm = instr & 0xf;
   12648                               // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
   12649                               vst2(CurrentCond(),
   12650                                    dt,
   12651                                    NeonRegisterList(DRegister(first),
   12652                                                     DRegister(last),
   12653                                                     spacing,
   12654                                                     transfer),
   12655                                    AlignedMemOperand(Register(rn),
   12656                                                      align,
   12657                                                      Register(rm),
   12658                                                      PostIndex));
   12659                               break;
   12660                             }
   12661                             case 0x00000400: {
   12662                               // 0xf9000400
   12663                               if (((instr & 0xd) == 0xd) ||
   12664                                   ((instr & 0x20) == 0x20)) {
   12665                                 UnallocatedT32(instr);
   12666                                 return;
   12667                               }
   12668                               DataType dt =
   12669                                   Dt_size_7_Decode((instr >> 6) & 0x3);
   12670                               if (dt.Is(kDataTypeValueInvalid)) {
   12671                                 UnallocatedT32(instr);
   12672                                 return;
   12673                               }
   12674                               Alignment align =
   12675                                   Align_align_3_Decode((instr >> 4) & 0x3);
   12676                               if (dt.Is(kDataTypeValueInvalid) ||
   12677                                   align.Is(kBadAlignment)) {
   12678                                 UnallocatedT32(instr);
   12679                                 return;
   12680                               }
   12681                               unsigned first = ExtractDRegister(instr, 22, 12);
   12682                               unsigned length;
   12683                               SpacingType spacing;
   12684                               switch ((instr >> 8) & 0xf) {
   12685                                 default:
   12686                                   VIXL_UNREACHABLE_OR_FALLTHROUGH();
   12687                                 case 0x4:
   12688                                   length = 3;
   12689                                   spacing = kSingle;
   12690                                   break;
   12691                                 case 0x5:
   12692                                   length = 3;
   12693                                   spacing = kDouble;
   12694                                   break;
   12695                               }
   12696                               unsigned last =
   12697                                   first +
   12698                                   (length - 1) * (spacing == kSingle ? 1 : 2);
   12699                               TransferType transfer = kMultipleLanes;
   12700                               unsigned rn = (instr >> 16) & 0xf;
   12701                               unsigned rm = instr & 0xf;
   12702                               // VST3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
   12703                               vst3(CurrentCond(),
   12704                                    dt,
   12705                                    NeonRegisterList(DRegister(first),
   12706                                                     DRegister(last),
   12707                                                     spacing,
   12708                                                     transfer),
   12709                                    AlignedMemOperand(Register(rn),
   12710                                                      align,
   12711                                                      Register(rm),
   12712                                                      PostIndex));
   12713                               break;
   12714                             }
   12715                             case 0x00000500: {
   12716                               // 0xf9000500
   12717                               if (((instr & 0xd) == 0xd) ||
   12718                                   ((instr & 0x20) == 0x20)) {
   12719                                 UnallocatedT32(instr);
   12720                                 return;
   12721                               }
   12722                               DataType dt =
   12723                                   Dt_size_7_Decode((instr >> 6) & 0x3);
   12724                               if (dt.Is(kDataTypeValueInvalid)) {
   12725                                 UnallocatedT32(instr);
   12726                                 return;
   12727                               }
   12728                               Alignment align =
   12729                                   Align_align_3_Decode((instr >> 4) & 0x3);
   12730                               if (dt.Is(kDataTypeValueInvalid) ||
   12731                                   align.Is(kBadAlignment)) {
   12732                                 UnallocatedT32(instr);
   12733                                 return;
   12734                               }
   12735                               unsigned first = ExtractDRegister(instr, 22, 12);
   12736                               unsigned length;
   12737                               SpacingType spacing;
   12738                               switch ((instr >> 8) & 0xf) {
   12739                                 default:
   12740                                   VIXL_UNREACHABLE_OR_FALLTHROUGH();
   12741                                 case 0x4:
   12742                                   length = 3;
   12743                                   spacing = kSingle;
   12744                                   break;
   12745                                 case 0x5:
   12746                                   length = 3;
   12747                                   spacing = kDouble;
   12748                                   break;
   12749                               }
   12750                               unsigned last =
   12751                                   first +
   12752                                   (length - 1) * (spacing == kSingle ? 1 : 2);
   12753                               TransferType transfer = kMultipleLanes;
   12754                               unsigned rn = (instr >> 16) & 0xf;
   12755                               unsigned rm = instr & 0xf;
   12756                               // VST3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
   12757                               vst3(CurrentCond(),
   12758                                    dt,
   12759                                    NeonRegisterList(DRegister(first),
   12760                                                     DRegister(last),
   12761                                                     spacing,
   12762                                                     transfer),
   12763                                    AlignedMemOperand(Register(rn),
   12764                                                      align,
   12765                                                      Register(rm),
   12766                                                      PostIndex));
   12767                               break;
   12768                             }
   12769                             case 0x00000600: {
   12770                               // 0xf9000600
   12771                               if (((instr & 0xd) == 0xd) ||
   12772                                   ((instr & 0xe20) == 0x620) ||
   12773                                   ((instr & 0xf30) == 0xa30)) {
   12774                                 UnallocatedT32(instr);
   12775                                 return;
   12776                               }
   12777                               DataType dt =
   12778                                   Dt_size_6_Decode((instr >> 6) & 0x3);
   12779                               if (dt.Is(kDataTypeValueInvalid)) {
   12780                                 UnallocatedT32(instr);
   12781                                 return;
   12782                               }
   12783                               Alignment align =
   12784                                   Align_align_5_Decode((instr >> 4) & 0x3);
   12785                               if (dt.Is(kDataTypeValueInvalid) ||
   12786                                   align.Is(kBadAlignment)) {
   12787                                 UnallocatedT32(instr);
   12788                                 return;
   12789                               }
   12790                               unsigned first = ExtractDRegister(instr, 22, 12);
   12791                               unsigned length;
   12792                               SpacingType spacing = kSingle;
   12793                               switch ((instr >> 8) & 0xf) {
   12794                                 default:
   12795                                   VIXL_UNREACHABLE_OR_FALLTHROUGH();
   12796                                 case 0x7:
   12797                                   length = 1;
   12798                                   break;
   12799                                 case 0xa:
   12800                                   length = 2;
   12801                                   break;
   12802                                 case 0x6:
   12803                                   length = 3;
   12804                                   break;
   12805                                 case 0x2:
   12806                                   length = 4;
   12807                                   break;
   12808                               }
   12809                               unsigned last = first + length - 1;
   12810                               TransferType transfer = kMultipleLanes;
   12811                               unsigned rn = (instr >> 16) & 0xf;
   12812                               unsigned rm = instr & 0xf;
   12813                               // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
   12814                               vst1(CurrentCond(),
   12815                                    dt,
   12816                                    NeonRegisterList(DRegister(first),
   12817                                                     DRegister(last),
   12818                                                     spacing,
   12819                                                     transfer),
   12820                                    AlignedMemOperand(Register(rn),
   12821                                                      align,
   12822                                                      Register(rm),
   12823                                                      PostIndex));
   12824                               break;
   12825                             }
   12826                             case 0x00000700: {
   12827                               // 0xf9000700
   12828                               if (((instr & 0xd) == 0xd) ||
   12829                                   ((instr & 0xe20) == 0x620) ||
   12830                                   ((instr & 0xf30) == 0xa30)) {
   12831                                 UnallocatedT32(instr);
   12832                                 return;
   12833                               }
   12834                               DataType dt =
   12835                                   Dt_size_6_Decode((instr >> 6) & 0x3);
   12836                               if (dt.Is(kDataTypeValueInvalid)) {
   12837                                 UnallocatedT32(instr);
   12838                                 return;
   12839                               }
   12840                               Alignment align =
   12841                                   Align_align_5_Decode((instr >> 4) & 0x3);
   12842                               if (dt.Is(kDataTypeValueInvalid) ||
   12843                                   align.Is(kBadAlignment)) {
   12844                                 UnallocatedT32(instr);
   12845                                 return;
   12846                               }
   12847                               unsigned first = ExtractDRegister(instr, 22, 12);
   12848                               unsigned length;
   12849                               SpacingType spacing = kSingle;
   12850                               switch ((instr >> 8) & 0xf) {
   12851                                 default:
   12852                                   VIXL_UNREACHABLE_OR_FALLTHROUGH();
   12853                                 case 0x7:
   12854                                   length = 1;
   12855                                   break;
   12856                                 case 0xa:
   12857                                   length = 2;
   12858                                   break;
   12859                                 case 0x6:
   12860                                   length = 3;
   12861                                   break;
   12862                                 case 0x2:
   12863                                   length = 4;
   12864                                   break;
   12865                               }
   12866                               unsigned last = first + length - 1;
   12867                               TransferType transfer = kMultipleLanes;
   12868                               unsigned rn = (instr >> 16) & 0xf;
   12869                               unsigned rm = instr & 0xf;
   12870                               // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
   12871                               vst1(CurrentCond(),
   12872                                    dt,
   12873                                    NeonRegisterList(DRegister(first),
   12874                                                     DRegister(last),
   12875                                                     spacing,
   12876                                                     transfer),
   12877                                    AlignedMemOperand(Register(rn),
   12878                                                      align,
   12879                                                      Register(rm),
   12880                                                      PostIndex));
   12881                               break;
   12882                             }
   12883                             case 0x00000800: {
   12884                               // 0xf9000800
   12885                               if (((instr & 0xd) == 0xd) ||
   12886                                   ((instr & 0xe30) == 0x830)) {
   12887                                 UnallocatedT32(instr);
   12888                                 return;
   12889                               }
   12890                               DataType dt =
   12891                                   Dt_size_7_Decode((instr >> 6) & 0x3);
   12892                               if (dt.Is(kDataTypeValueInvalid)) {
   12893                                 UnallocatedT32(instr);
   12894                                 return;
   12895                               }
   12896                               Alignment align =
   12897                                   Align_align_2_Decode((instr >> 4) & 0x3);
   12898                               if (dt.Is(kDataTypeValueInvalid) ||
   12899                                   align.Is(kBadAlignment)) {
   12900                                 UnallocatedT32(instr);
   12901                                 return;
   12902                               }
   12903                               unsigned first = ExtractDRegister(instr, 22, 12);
   12904                               unsigned length;
   12905                               SpacingType spacing;
   12906                               switch ((instr >> 8) & 0xf) {
   12907                                 default:
   12908                                   VIXL_UNREACHABLE_OR_FALLTHROUGH();
   12909                                 case 0x8:
   12910                                   length = 2;
   12911                                   spacing = kSingle;
   12912                                   break;
   12913                                 case 0x9:
   12914                                   length = 2;
   12915                                   spacing = kDouble;
   12916                                   break;
   12917                                 case 0x3:
   12918                                   length = 4;
   12919                                   spacing = kSingle;
   12920                                   break;
   12921                               }
   12922                               unsigned last =
   12923                                   first +
   12924                                   (length - 1) * (spacing == kSingle ? 1 : 2);
   12925                               TransferType transfer = kMultipleLanes;
   12926                               unsigned rn = (instr >> 16) & 0xf;
   12927                               unsigned rm = instr & 0xf;
   12928                               // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
   12929                               vst2(CurrentCond(),
   12930                                    dt,
   12931                                    NeonRegisterList(DRegister(first),
   12932                                                     DRegister(last),
   12933                                                     spacing,
   12934                                                     transfer),
   12935                                    AlignedMemOperand(Register(rn),
   12936                                                      align,
   12937                                                      Register(rm),
   12938                                                      PostIndex));
   12939                               break;
   12940                             }
   12941                             case 0x00000900: {
   12942                               // 0xf9000900
   12943                               if (((instr & 0xd) == 0xd) ||
   12944                                   ((instr & 0xe30) == 0x830)) {
   12945                                 UnallocatedT32(instr);
   12946                                 return;
   12947                               }
   12948                               DataType dt =
   12949                                   Dt_size_7_Decode((instr >> 6) & 0x3);
   12950                               if (dt.Is(kDataTypeValueInvalid)) {
   12951                                 UnallocatedT32(instr);
   12952                                 return;
   12953                               }
   12954                               Alignment align =
   12955                                   Align_align_2_Decode((instr >> 4) & 0x3);
   12956                               if (dt.Is(kDataTypeValueInvalid) ||
   12957                                   align.Is(kBadAlignment)) {
   12958                                 UnallocatedT32(instr);
   12959                                 return;
   12960                               }
   12961                               unsigned first = ExtractDRegister(instr, 22, 12);
   12962                               unsigned length;
   12963                               SpacingType spacing;
   12964                               switch ((instr >> 8) & 0xf) {
   12965                                 default:
   12966                                   VIXL_UNREACHABLE_OR_FALLTHROUGH();
   12967                                 case 0x8:
   12968                                   length = 2;
   12969                                   spacing = kSingle;
   12970                                   break;
   12971                                 case 0x9:
   12972                                   length = 2;
   12973                                   spacing = kDouble;
   12974                                   break;
   12975                                 case 0x3:
   12976                                   length = 4;
   12977                                   spacing = kSingle;
   12978                                   break;
   12979                               }
   12980                               unsigned last =
   12981                                   first +
   12982                                   (length - 1) * (spacing == kSingle ? 1 : 2);
   12983                               TransferType transfer = kMultipleLanes;
   12984                               unsigned rn = (instr >> 16) & 0xf;
   12985                               unsigned rm = instr & 0xf;
   12986                               // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
   12987                               vst2(CurrentCond(),
   12988                                    dt,
   12989                                    NeonRegisterList(DRegister(first),
   12990                                                     DRegister(last),
   12991                                                     spacing,
   12992                                                     transfer),
   12993                                    AlignedMemOperand(Register(rn),
   12994                                                      align,
   12995                                                      Register(rm),
   12996                                                      PostIndex));
   12997                               break;
   12998                             }
   12999                             case 0x00000a00: {
   13000                               // 0xf9000a00
   13001                               if (((instr & 0xd) == 0xd) ||
   13002                                   ((instr & 0xe20) == 0x620) ||
   13003                                   ((instr & 0xf30) == 0xa30)) {
   13004                                 UnallocatedT32(instr);
   13005                                 return;
   13006                               }
   13007                               DataType dt =
   13008                                   Dt_size_6_Decode((instr >> 6) & 0x3);
   13009                               if (dt.Is(kDataTypeValueInvalid)) {
   13010                                 UnallocatedT32(instr);
   13011                                 return;
   13012                               }
   13013                               Alignment align =
   13014                                   Align_align_5_Decode((instr >> 4) & 0x3);
   13015                               if (dt.Is(kDataTypeValueInvalid) ||
   13016                                   align.Is(kBadAlignment)) {
   13017                                 UnallocatedT32(instr);
   13018                                 return;
   13019                               }
   13020                               unsigned first = ExtractDRegister(instr, 22, 12);
   13021                               unsigned length;
   13022                               SpacingType spacing = kSingle;
   13023                               switch ((instr >> 8) & 0xf) {
   13024                                 default:
   13025                                   VIXL_UNREACHABLE_OR_FALLTHROUGH();
   13026                                 case 0x7:
   13027                                   length = 1;
   13028                                   break;
   13029                                 case 0xa:
   13030                                   length = 2;
   13031                                   break;
   13032                                 case 0x6:
   13033                                   length = 3;
   13034                                   break;
   13035                                 case 0x2:
   13036                                   length = 4;
   13037                                   break;
   13038                               }
   13039                               unsigned last = first + length - 1;
   13040                               TransferType transfer = kMultipleLanes;
   13041                               unsigned rn = (instr >> 16) & 0xf;
   13042                               unsigned rm = instr & 0xf;
   13043                               // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
   13044                               vst1(CurrentCond(),
   13045                                    dt,
   13046                                    NeonRegisterList(DRegister(first),
   13047                                                     DRegister(last),
   13048                                                     spacing,
   13049                                                     transfer),
   13050                                    AlignedMemOperand(Register(rn),
   13051                                                      align,
   13052                                                      Register(rm),
   13053                                                      PostIndex));
   13054                               break;
   13055                             }
   13056                             default:
   13057                               UnallocatedT32(instr);
   13058                               break;
   13059                           }
   13060                           break;
   13061                         }
   13062                       }
   13063                       break;
   13064                     }
   13065                     case 0x01200000: {
   13066                       // 0xf9200000
   13067                       switch (instr & 0x0000000d) {
   13068                         case 0x0000000d: {
   13069                           // 0xf920000d
   13070                           switch (instr & 0x00000002) {
   13071                             case 0x00000000: {
   13072                               // 0xf920000d
   13073                               switch (instr & 0x00000f00) {
   13074                                 case 0x00000000: {
   13075                                   // 0xf920000d
   13076                                   DataType dt =
   13077                                       Dt_size_7_Decode((instr >> 6) & 0x3);
   13078                                   if (dt.Is(kDataTypeValueInvalid)) {
   13079                                     UnallocatedT32(instr);
   13080                                     return;
   13081                                   }
   13082                                   Alignment align =
   13083                                       Align_align_4_Decode((instr >> 4) & 0x3);
   13084                                   if (dt.Is(kDataTypeValueInvalid) ||
   13085                                       align.Is(kBadAlignment)) {
   13086                                     UnallocatedT32(instr);
   13087                                     return;
   13088                                   }
   13089                                   unsigned first =
   13090                                       ExtractDRegister(instr, 22, 12);
   13091                                   unsigned length;
   13092                                   SpacingType spacing;
   13093                                   switch ((instr >> 8) & 0xf) {
   13094                                     default:
   13095                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
   13096                                     case 0x0:
   13097                                       length = 4;
   13098                                       spacing = kSingle;
   13099                                       break;
   13100                                     case 0x1:
   13101                                       length = 4;
   13102                                       spacing = kDouble;
   13103                                       break;
   13104                                   }
   13105                                   unsigned last =
   13106                                       first +
   13107                                       (length - 1) *
   13108                                           (spacing == kSingle ? 1 : 2);
   13109                                   TransferType transfer = kMultipleLanes;
   13110                                   unsigned rn = (instr >> 16) & 0xf;
   13111                                   // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
   13112                                   vld4(CurrentCond(),
   13113                                        dt,
   13114                                        NeonRegisterList(DRegister(first),
   13115                                                         DRegister(last),
   13116                                                         spacing,
   13117                                                         transfer),
   13118                                        AlignedMemOperand(Register(rn),
   13119                                                          align,
   13120                                                          PostIndex));
   13121                                   break;
   13122                                 }
   13123                                 case 0x00000100: {
   13124                                   // 0xf920010d
   13125                                   DataType dt =
   13126                                       Dt_size_7_Decode((instr >> 6) & 0x3);
   13127                                   if (dt.Is(kDataTypeValueInvalid)) {
   13128                                     UnallocatedT32(instr);
   13129                                     return;
   13130                                   }
   13131                                   Alignment align =
   13132                                       Align_align_4_Decode((instr >> 4) & 0x3);
   13133                                   if (dt.Is(kDataTypeValueInvalid) ||
   13134                                       align.Is(kBadAlignment)) {
   13135                                     UnallocatedT32(instr);
   13136                                     return;
   13137                                   }
   13138                                   unsigned first =
   13139                                       ExtractDRegister(instr, 22, 12);
   13140                                   unsigned length;
   13141                                   SpacingType spacing;
   13142                                   switch ((instr >> 8) & 0xf) {
   13143                                     default:
   13144                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
   13145                                     case 0x0:
   13146                                       length = 4;
   13147                                       spacing = kSingle;
   13148                                       break;
   13149                                     case 0x1:
   13150                                       length = 4;
   13151                                       spacing = kDouble;
   13152                                       break;
   13153                                   }
   13154                                   unsigned last =
   13155                                       first +
   13156                                       (length - 1) *
   13157                                           (spacing == kSingle ? 1 : 2);
   13158                                   TransferType transfer = kMultipleLanes;
   13159                                   unsigned rn = (instr >> 16) & 0xf;
   13160                                   // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
   13161                                   vld4(CurrentCond(),
   13162                                        dt,
   13163                                        NeonRegisterList(DRegister(first),
   13164                                                         DRegister(last),
   13165                                                         spacing,
   13166                                                         transfer),
   13167                                        AlignedMemOperand(Register(rn),
   13168                                                          align,
   13169                                                          PostIndex));
   13170                                   break;
   13171                                 }
   13172                                 case 0x00000200: {
   13173                                   // 0xf920020d
   13174                                   if (((instr & 0xe20) == 0x620) ||
   13175                                       ((instr & 0xf30) == 0xa30)) {
   13176                                     UnallocatedT32(instr);
   13177                                     return;
   13178                                   }
   13179                                   DataType dt =
   13180                                       Dt_size_6_Decode((instr >> 6) & 0x3);
   13181                                   if (dt.Is(kDataTypeValueInvalid)) {
   13182                                     UnallocatedT32(instr);
   13183                                     return;
   13184                                   }
   13185                                   Alignment align =
   13186                                       Align_align_1_Decode((instr >> 4) & 0x3);
   13187                                   if (dt.Is(kDataTypeValueInvalid) ||
   13188                                       align.Is(kBadAlignment)) {
   13189                                     UnallocatedT32(instr);
   13190                                     return;
   13191                                   }
   13192                                   unsigned first =
   13193                                       ExtractDRegister(instr, 22, 12);
   13194                                   unsigned length;
   13195                                   SpacingType spacing = kSingle;
   13196                                   switch ((instr >> 8) & 0xf) {
   13197                                     default:
   13198                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
   13199                                     case 0x7:
   13200                                       length = 1;
   13201                                       break;
   13202                                     case 0xa:
   13203                                       length = 2;
   13204                                       break;
   13205                                     case 0x6:
   13206                                       length = 3;
   13207                                       break;
   13208                                     case 0x2:
   13209                                       length = 4;
   13210                                       break;
   13211                                   }
   13212                                   unsigned last = first + length - 1;
   13213                                   TransferType transfer = kMultipleLanes;
   13214                                   unsigned rn = (instr >> 16) & 0xf;
   13215                                   // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
   13216                                   vld1(CurrentCond(),
   13217                                        dt,
   13218                                        NeonRegisterList(DRegister(first),
   13219                                                         DRegister(last),
   13220                                                         spacing,
   13221                                                         transfer),
   13222                                        AlignedMemOperand(Register(rn),
   13223                                                          align,
   13224                                                          PostIndex));
   13225                                   break;
   13226                                 }
   13227                                 case 0x00000300: {
   13228                                   // 0xf920030d
   13229                                   if (((instr & 0xe30) == 0x830)) {
   13230                                     UnallocatedT32(instr);
   13231                                     return;
   13232                                   }
   13233                                   DataType dt =
   13234                                       Dt_size_7_Decode((instr >> 6) & 0x3);
   13235                                   if (dt.Is(kDataTypeValueInvalid)) {
   13236                                     UnallocatedT32(instr);
   13237                                     return;
   13238                                   }
   13239                                   Alignment align =
   13240                                       Align_align_2_Decode((instr >> 4) & 0x3);
   13241                                   if (dt.Is(kDataTypeValueInvalid) ||
   13242                                       align.Is(kBadAlignment)) {
   13243                                     UnallocatedT32(instr);
   13244                                     return;
   13245                                   }
   13246                                   unsigned first =
   13247                                       ExtractDRegister(instr, 22, 12);
   13248                                   unsigned length;
   13249                                   SpacingType spacing;
   13250                                   switch ((instr >> 8) & 0xf) {
   13251                                     default:
   13252                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
   13253                                     case 0x8:
   13254                                       length = 2;
   13255                                       spacing = kSingle;
   13256                                       break;
   13257                                     case 0x9:
   13258                                       length = 2;
   13259                                       spacing = kDouble;
   13260                                       break;
   13261                                     case 0x3:
   13262                                       length = 4;
   13263                                       spacing = kSingle;
   13264                                       break;
   13265                                   }
   13266                                   unsigned last =
   13267                                       first +
   13268                                       (length - 1) *
   13269                                           (spacing == kSingle ? 1 : 2);
   13270                                   TransferType transfer = kMultipleLanes;
   13271                                   unsigned rn = (instr >> 16) & 0xf;
   13272                                   // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
   13273                                   vld2(CurrentCond(),
   13274                                        dt,
   13275                                        NeonRegisterList(DRegister(first),
   13276                                                         DRegister(last),
   13277                                                         spacing,
   13278                                                         transfer),
   13279                                        AlignedMemOperand(Register(rn),
   13280                                                          align,
   13281                                                          PostIndex));
   13282                                   break;
   13283                                 }
   13284                                 case 0x00000400: {
   13285                                   // 0xf920040d
   13286                                   DataType dt =
   13287                                       Dt_size_7_Decode((instr >> 6) & 0x3);
   13288                                   if (dt.Is(kDataTypeValueInvalid)) {
   13289                                     UnallocatedT32(instr);
   13290                                     return;
   13291                                   }
   13292                                   Alignment align =
   13293                                       Align_align_3_Decode((instr >> 4) & 0x3);
   13294                                   if (dt.Is(kDataTypeValueInvalid) ||
   13295                                       align.Is(kBadAlignment)) {
   13296                                     UnallocatedT32(instr);
   13297                                     return;
   13298                                   }
   13299                                   unsigned first =
   13300                                       ExtractDRegister(instr, 22, 12);
   13301                                   unsigned length;
   13302                                   SpacingType spacing;
   13303                                   switch ((instr >> 8) & 0xf) {
   13304                                     default:
   13305                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
   13306                                     case 0x4:
   13307                                       length = 3;
   13308                                       spacing = kSingle;
   13309                                       break;
   13310                                     case 0x5:
   13311                                       length = 3;
   13312                                       spacing = kDouble;
   13313                                       break;
   13314                                   }
   13315                                   unsigned last =
   13316                                       first +
   13317                                       (length - 1) *
   13318                                           (spacing == kSingle ? 1 : 2);
   13319                                   TransferType transfer = kMultipleLanes;
   13320                                   unsigned rn = (instr >> 16) & 0xf;
   13321                                   // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
   13322                                   vld3(CurrentCond(),
   13323                                        dt,
   13324                                        NeonRegisterList(DRegister(first),
   13325                                                         DRegister(last),
   13326                                                         spacing,
   13327                                                         transfer),
   13328                                        AlignedMemOperand(Register(rn),
   13329                                                          align,
   13330                                                          PostIndex));
   13331                                   break;
   13332                                 }
   13333                                 case 0x00000500: {
   13334                                   // 0xf920050d
   13335                                   DataType dt =
   13336                                       Dt_size_7_Decode((instr >> 6) & 0x3);
   13337                                   if (dt.Is(kDataTypeValueInvalid)) {
   13338                                     UnallocatedT32(instr);
   13339                                     return;
   13340                                   }
   13341                                   Alignment align =
   13342                                       Align_align_3_Decode((instr >> 4) & 0x3);
   13343                                   if (dt.Is(kDataTypeValueInvalid) ||
   13344                                       align.Is(kBadAlignment)) {
   13345                                     UnallocatedT32(instr);
   13346                                     return;
   13347                                   }
   13348                                   unsigned first =
   13349                                       ExtractDRegister(instr, 22, 12);
   13350                                   unsigned length;
   13351                                   SpacingType spacing;
   13352                                   switch ((instr >> 8) & 0xf) {
   13353                                     default:
   13354                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
   13355                                     case 0x4:
   13356                                       length = 3;
   13357                                       spacing = kSingle;
   13358                                       break;
   13359                                     case 0x5:
   13360                                       length = 3;
   13361                                       spacing = kDouble;
   13362                                       break;
   13363                                   }
   13364                                   unsigned last =
   13365                                       first +
   13366                                       (length - 1) *
   13367                                           (spacing == kSingle ? 1 : 2);
   13368                                   TransferType transfer = kMultipleLanes;
   13369                                   unsigned rn = (instr >> 16) & 0xf;
   13370                                   // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
   13371                                   vld3(CurrentCond(),
   13372                                        dt,
   13373                                        NeonRegisterList(DRegister(first),
   13374                                                         DRegister(last),
   13375                                                         spacing,
   13376                                                         transfer),
   13377                                        AlignedMemOperand(Register(rn),
   13378                                                          align,
   13379                                                          PostIndex));
   13380                                   break;
   13381                                 }
   13382                                 case 0x00000600: {
   13383                                   // 0xf920060d
   13384                                   if (((instr & 0xe20) == 0x620) ||
   13385                                       ((instr & 0xf30) == 0xa30)) {
   13386                                     UnallocatedT32(instr);
   13387                                     return;
   13388                                   }
   13389                                   DataType dt =
   13390                                       Dt_size_6_Decode((instr >> 6) & 0x3);
   13391                                   if (dt.Is(kDataTypeValueInvalid)) {
   13392                                     UnallocatedT32(instr);
   13393                                     return;
   13394                                   }
   13395                                   Alignment align =
   13396                                       Align_align_1_Decode((instr >> 4) & 0x3);
   13397                                   if (dt.Is(kDataTypeValueInvalid) ||
   13398                                       align.Is(kBadAlignment)) {
   13399                                     UnallocatedT32(instr);
   13400                                     return;
   13401                                   }
   13402                                   unsigned first =
   13403                                       ExtractDRegister(instr, 22, 12);
   13404                                   unsigned length;
   13405                                   SpacingType spacing = kSingle;
   13406                                   switch ((instr >> 8) & 0xf) {
   13407                                     default:
   13408                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
   13409                                     case 0x7:
   13410                                       length = 1;
   13411                                       break;
   13412                                     case 0xa:
   13413                                       length = 2;
   13414                                       break;
   13415                                     case 0x6:
   13416                                       length = 3;
   13417                                       break;
   13418                                     case 0x2:
   13419                                       length = 4;
   13420                                       break;
   13421                                   }
   13422                                   unsigned last = first + length - 1;
   13423                                   TransferType transfer = kMultipleLanes;
   13424                                   unsigned rn = (instr >> 16) & 0xf;
   13425                                   // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
   13426                                   vld1(CurrentCond(),
   13427                                        dt,
   13428                                        NeonRegisterList(DRegister(first),
   13429                                                         DRegister(last),
   13430                                                         spacing,
   13431                                                         transfer),
   13432                                        AlignedMemOperand(Register(rn),
   13433                                                          align,
   13434                                                          PostIndex));
   13435                                   break;
   13436                                 }
   13437                                 case 0x00000700: {
   13438                                   // 0xf920070d
   13439                                   if (((instr & 0xe20) == 0x620) ||
   13440                                       ((instr & 0xf30) == 0xa30)) {
   13441                                     UnallocatedT32(instr);
   13442                                     return;
   13443                                   }
   13444                                   DataType dt =
   13445                                       Dt_size_6_Decode((instr >> 6) & 0x3);
   13446                                   if (dt.Is(kDataTypeValueInvalid)) {
   13447                                     UnallocatedT32(instr);
   13448                                     return;
   13449                                   }
   13450                                   Alignment align =
   13451                                       Align_align_1_Decode((instr >> 4) & 0x3);
   13452                                   if (dt.Is(kDataTypeValueInvalid) ||
   13453                                       align.Is(kBadAlignment)) {
   13454                                     UnallocatedT32(instr);
   13455                                     return;
   13456                                   }
   13457                                   unsigned first =
   13458                                       ExtractDRegister(instr, 22, 12);
   13459                                   unsigned length;
   13460                                   SpacingType spacing = kSingle;
   13461                                   switch ((instr >> 8) & 0xf) {
   13462                                     default:
   13463                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
   13464                                     case 0x7:
   13465                                       length = 1;
   13466                                       break;
   13467                                     case 0xa:
   13468                                       length = 2;
   13469                                       break;
   13470                                     case 0x6:
   13471                                       length = 3;
   13472                                       break;
   13473                                     case 0x2:
   13474                                       length = 4;
   13475                                       break;
   13476                                   }
   13477                                   unsigned last = first + length - 1;
   13478                                   TransferType transfer = kMultipleLanes;
   13479                                   unsigned rn = (instr >> 16) & 0xf;
   13480                                   // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
   13481                                   vld1(CurrentCond(),
   13482                                        dt,
   13483                                        NeonRegisterList(DRegister(first),
   13484                                                         DRegister(last),
   13485                                                         spacing,
   13486                                                         transfer),
   13487                                        AlignedMemOperand(Register(rn),
   13488                                                          align,
   13489                                                          PostIndex));
   13490                                   break;
   13491                                 }
   13492                                 case 0x00000800: {
   13493                                   // 0xf920080d
   13494                                   if (((instr & 0xe30) == 0x830)) {
   13495                                     UnallocatedT32(instr);
   13496                                     return;
   13497                                   }
   13498                                   DataType dt =
   13499                                       Dt_size_7_Decode((instr >> 6) & 0x3);
   13500                                   if (dt.Is(kDataTypeValueInvalid)) {
   13501                                     UnallocatedT32(instr);
   13502                                     return;
   13503                                   }
   13504                                   Alignment align =
   13505                                       Align_align_2_Decode((instr >> 4) & 0x3);
   13506                                   if (dt.Is(kDataTypeValueInvalid) ||
   13507                                       align.Is(kBadAlignment)) {
   13508                                     UnallocatedT32(instr);
   13509                                     return;
   13510                                   }
   13511                                   unsigned first =
   13512                                       ExtractDRegister(instr, 22, 12);
   13513                                   unsigned length;
   13514                                   SpacingType spacing;
   13515                                   switch ((instr >> 8) & 0xf) {
   13516                                     default:
   13517                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
   13518                                     case 0x8:
   13519                                       length = 2;
   13520                                       spacing = kSingle;
   13521                                       break;
   13522                                     case 0x9:
   13523                                       length = 2;
   13524                                       spacing = kDouble;
   13525                                       break;
   13526                                     case 0x3:
   13527                                       length = 4;
   13528                                       spacing = kSingle;
   13529                                       break;
   13530                                   }
   13531                                   unsigned last =
   13532                                       first +
   13533                                       (length - 1) *
   13534                                           (spacing == kSingle ? 1 : 2);
   13535                                   TransferType transfer = kMultipleLanes;
   13536                                   unsigned rn = (instr >> 16) & 0xf;
   13537                                   // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
   13538                                   vld2(CurrentCond(),
   13539                                        dt,
   13540                                        NeonRegisterList(DRegister(first),
   13541                                                         DRegister(last),
   13542                                                         spacing,
   13543                                                         transfer),
   13544                                        AlignedMemOperand(Register(rn),
   13545                                                          align,
   13546                                                          PostIndex));
   13547                                   break;
   13548                                 }
   13549                                 case 0x00000900: {
   13550                                   // 0xf920090d
   13551                                   if (((instr & 0xe30) == 0x830)) {
   13552                                     UnallocatedT32(instr);
   13553                                     return;
   13554                                   }
   13555                                   DataType dt =
   13556                                       Dt_size_7_Decode((instr >> 6) & 0x3);
   13557                                   if (dt.Is(kDataTypeValueInvalid)) {
   13558                                     UnallocatedT32(instr);
   13559                                     return;
   13560                                   }
   13561                                   Alignment align =
   13562                                       Align_align_2_Decode((instr >> 4) & 0x3);
   13563                                   if (dt.Is(kDataTypeValueInvalid) ||
   13564                                       align.Is(kBadAlignment)) {
   13565                                     UnallocatedT32(instr);
   13566                                     return;
   13567                                   }
   13568                                   unsigned first =
   13569                                       ExtractDRegister(instr, 22, 12);
   13570                                   unsigned length;
   13571                                   SpacingType spacing;
   13572                                   switch ((instr >> 8) & 0xf) {
   13573                                     default:
   13574                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
   13575                                     case 0x8:
   13576                                       length = 2;
   13577                                       spacing = kSingle;
   13578                                       break;
   13579                                     case 0x9:
   13580                                       length = 2;
   13581                                       spacing = kDouble;
   13582                                       break;
   13583                                     case 0x3:
   13584                                       length = 4;
   13585                                       spacing = kSingle;
   13586                                       break;
   13587                                   }
   13588                                   unsigned last =
   13589                                       first +
   13590                                       (length - 1) *
   13591                                           (spacing == kSingle ? 1 : 2);
   13592                                   TransferType transfer = kMultipleLanes;
   13593                                   unsigned rn = (instr >> 16) & 0xf;
   13594                                   // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
   13595                                   vld2(CurrentCond(),
   13596                                        dt,
   13597                                        NeonRegisterList(DRegister(first),
   13598                                                         DRegister(last),
   13599                                                         spacing,
   13600                                                         transfer),
   13601                                        AlignedMemOperand(Register(rn),
   13602                                                          align,
   13603                                                          PostIndex));
   13604                                   break;
   13605                                 }
   13606                                 case 0x00000a00: {
   13607                                   // 0xf9200a0d
   13608                                   if (((instr & 0xe20) == 0x620) ||
   13609                                       ((instr & 0xf30) == 0xa30)) {
   13610                                     UnallocatedT32(instr);
   13611                                     return;
   13612                                   }
   13613                                   DataType dt =
   13614                                       Dt_size_6_Decode((instr >> 6) & 0x3);
   13615                                   if (dt.Is(kDataTypeValueInvalid)) {
   13616                                     UnallocatedT32(instr);
   13617                                     return;
   13618                                   }
   13619                                   Alignment align =
   13620                                       Align_align_1_Decode((instr >> 4) & 0x3);
   13621                                   if (dt.Is(kDataTypeValueInvalid) ||
   13622                                       align.Is(kBadAlignment)) {
   13623                                     UnallocatedT32(instr);
   13624                                     return;
   13625                                   }
   13626                                   unsigned first =
   13627                                       ExtractDRegister(instr, 22, 12);
   13628                                   unsigned length;
   13629                                   SpacingType spacing = kSingle;
   13630                                   switch ((instr >> 8) & 0xf) {
   13631                                     default:
   13632                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
   13633                                     case 0x7:
   13634                                       length = 1;
   13635                                       break;
   13636                                     case 0xa:
   13637                                       length = 2;
   13638                                       break;
   13639                                     case 0x6:
   13640                                       length = 3;
   13641                                       break;
   13642                                     case 0x2:
   13643                                       length = 4;
   13644                                       break;
   13645                                   }
   13646                                   unsigned last = first + length - 1;
   13647                                   TransferType transfer = kMultipleLanes;
   13648                                   unsigned rn = (instr >> 16) & 0xf;
   13649                                   // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
   13650                                   vld1(CurrentCond(),
   13651                                        dt,
   13652                                        NeonRegisterList(DRegister(first),
   13653                                                         DRegister(last),
   13654                                                         spacing,
   13655                                                         transfer),
   13656                                        AlignedMemOperand(Register(rn),
   13657                                                          align,
   13658                                                          PostIndex));
   13659                                   break;
   13660                                 }
   13661                                 default:
   13662                                   UnallocatedT32(instr);
   13663                                   break;
   13664                               }
   13665                               break;
   13666                             }
   13667                             case 0x00000002: {
   13668                               // 0xf920000f
   13669                               switch (instr & 0x00000f00) {
   13670                                 case 0x00000000: {
   13671                                   // 0xf920000d
   13672                                   DataType dt =
   13673                                       Dt_size_7_Decode((instr >> 6) & 0x3);
   13674                                   if (dt.Is(kDataTypeValueInvalid)) {
   13675                                     UnallocatedT32(instr);
   13676                                     return;
   13677                                   }
   13678                                   Alignment align =
   13679                                       Align_align_4_Decode((instr >> 4) & 0x3);
   13680                                   if (dt.Is(kDataTypeValueInvalid) ||
   13681                                       align.Is(kBadAlignment)) {
   13682                                     UnallocatedT32(instr);
   13683                                     return;
   13684                                   }
   13685                                   unsigned first =
   13686                                       ExtractDRegister(instr, 22, 12);
   13687                                   unsigned length;
   13688                                   SpacingType spacing;
   13689                                   switch ((instr >> 8) & 0xf) {
   13690                                     default:
   13691                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
   13692                                     case 0x0:
   13693                                       length = 4;
   13694                                       spacing = kSingle;
   13695                                       break;
   13696                                     case 0x1:
   13697                                       length = 4;
   13698                                       spacing = kDouble;
   13699                                       break;
   13700                                   }
   13701                                   unsigned last =
   13702                                       first +
   13703                                       (length - 1) *
   13704                                           (spacing == kSingle ? 1 : 2);
   13705                                   TransferType transfer = kMultipleLanes;
   13706                                   unsigned rn = (instr >> 16) & 0xf;
   13707                                   // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
   13708                                   vld4(CurrentCond(),
   13709                                        dt,
   13710                                        NeonRegisterList(DRegister(first),
   13711                                                         DRegister(last),
   13712                                                         spacing,
   13713                                                         transfer),
   13714                                        AlignedMemOperand(Register(rn),
   13715                                                          align,
   13716                                                          Offset));
   13717                                   break;
   13718                                 }
   13719                                 case 0x00000100: {
   13720                                   // 0xf920010d
   13721                                   DataType dt =
   13722                                       Dt_size_7_Decode((instr >> 6) & 0x3);
   13723                                   if (dt.Is(kDataTypeValueInvalid)) {
   13724                                     UnallocatedT32(instr);
   13725                                     return;
   13726                                   }
   13727                                   Alignment align =
   13728                                       Align_align_4_Decode((instr >> 4) & 0x3);
   13729                                   if (dt.Is(kDataTypeValueInvalid) ||
   13730                                       align.Is(kBadAlignment)) {
   13731                                     UnallocatedT32(instr);
   13732                                     return;
   13733                                   }
   13734                                   unsigned first =
   13735                                       ExtractDRegister(instr, 22, 12);
   13736                                   unsigned length;
   13737                                   SpacingType spacing;
   13738                                   switch ((instr >> 8) & 0xf) {
   13739                                     default:
   13740                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
   13741                                     case 0x0:
   13742                                       length = 4;
   13743                                       spacing = kSingle;
   13744                                       break;
   13745                                     case 0x1:
   13746                                       length = 4;
   13747                                       spacing = kDouble;
   13748                                       break;
   13749                                   }
   13750                                   unsigned last =
   13751                                       first +
   13752                                       (length - 1) *
   13753                                           (spacing == kSingle ? 1 : 2);
   13754                                   TransferType transfer = kMultipleLanes;
   13755                                   unsigned rn = (instr >> 16) & 0xf;
   13756                                   // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
   13757                                   vld4(CurrentCond(),
   13758                                        dt,
   13759                                        NeonRegisterList(DRegister(first),
   13760                                                         DRegister(last),
   13761                                                         spacing,
   13762                                                         transfer),
   13763                                        AlignedMemOperand(Register(rn),
   13764                                                          align,
   13765                                                          Offset));
   13766                                   break;
   13767                                 }
   13768                                 case 0x00000200: {
   13769                                   // 0xf920020d
   13770                                   if (((instr & 0xe20) == 0x620) ||
   13771                                       ((instr & 0xf30) == 0xa30)) {
   13772                                     UnallocatedT32(instr);
   13773                                     return;
   13774                                   }
   13775                                   DataType dt =
   13776                                       Dt_size_6_Decode((instr >> 6) & 0x3);
   13777                                   if (dt.Is(kDataTypeValueInvalid)) {
   13778                                     UnallocatedT32(instr);
   13779                                     return;
   13780                                   }
   13781                                   Alignment align =
   13782                                       Align_align_1_Decode((instr >> 4) & 0x3);
   13783                                   if (dt.Is(kDataTypeValueInvalid) ||
   13784                                       align.Is(kBadAlignment)) {
   13785                                     UnallocatedT32(instr);
   13786                                     return;
   13787                                   }
   13788                                   unsigned first =
   13789                                       ExtractDRegister(instr, 22, 12);
   13790                                   unsigned length;
   13791                                   SpacingType spacing = kSingle;
   13792                                   switch ((instr >> 8) & 0xf) {
   13793                                     default:
   13794                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
   13795                                     case 0x7:
   13796                                       length = 1;
   13797                                       break;
   13798                                     case 0xa:
   13799                                       length = 2;
   13800                                       break;
   13801                                     case 0x6:
   13802                                       length = 3;
   13803                                       break;
   13804                                     case 0x2:
   13805                                       length = 4;
   13806                                       break;
   13807                                   }
   13808                                   unsigned last = first + length - 1;
   13809                                   TransferType transfer = kMultipleLanes;
   13810                                   unsigned rn = (instr >> 16) & 0xf;
   13811                                   // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
   13812                                   vld1(CurrentCond(),
   13813                                        dt,
   13814                                        NeonRegisterList(DRegister(first),
   13815                                                         DRegister(last),
   13816                                                         spacing,
   13817                                                         transfer),
   13818                                        AlignedMemOperand(Register(rn),
   13819                                                          align,
   13820                                                          Offset));
   13821                                   break;
   13822                                 }
   13823                                 case 0x00000300: {
   13824                                   // 0xf920030d
   13825                                   if (((instr & 0xe30) == 0x830)) {
   13826                                     UnallocatedT32(instr);
   13827                                     return;
   13828                                   }
   13829                                   DataType dt =
   13830                                       Dt_size_7_Decode((instr >> 6) & 0x3);
   13831                                   if (dt.Is(kDataTypeValueInvalid)) {
   13832                                     UnallocatedT32(instr);
   13833                                     return;
   13834                                   }
   13835                                   Alignment align =
   13836                                       Align_align_2_Decode((instr >> 4) & 0x3);
   13837                                   if (dt.Is(kDataTypeValueInvalid) ||
   13838                                       align.Is(kBadAlignment)) {
   13839                                     UnallocatedT32(instr);
   13840                                     return;
   13841                                   }
   13842                                   unsigned first =
   13843                                       ExtractDRegister(instr, 22, 12);
   13844                                   unsigned length;
   13845                                   SpacingType spacing;
   13846                                   switch ((instr >> 8) & 0xf) {
   13847                                     default:
   13848                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
   13849                                     case 0x8:
   13850                                       length = 2;
   13851                                       spacing = kSingle;
   13852                                       break;
   13853                                     case 0x9:
   13854                                       length = 2;
   13855                                       spacing = kDouble;
   13856                                       break;
   13857                                     case 0x3:
   13858                                       length = 4;
   13859                                       spacing = kSingle;
   13860                                       break;
   13861                                   }
   13862                                   unsigned last =
   13863                                       first +
   13864                                       (length - 1) *
   13865                                           (spacing == kSingle ? 1 : 2);
   13866                                   TransferType transfer = kMultipleLanes;
   13867                                   unsigned rn = (instr >> 16) & 0xf;
   13868                                   // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
   13869                                   vld2(CurrentCond(),
   13870                                        dt,
   13871                                        NeonRegisterList(DRegister(first),
   13872                                                         DRegister(last),
   13873                                                         spacing,
   13874                                                         transfer),
   13875                                        AlignedMemOperand(Register(rn),
   13876                                                          align,
   13877                                                          Offset));
   13878                                   break;
   13879                                 }
   13880                                 case 0x00000400: {
   13881                                   // 0xf920040d
   13882                                   DataType dt =
   13883                                       Dt_size_7_Decode((instr >> 6) & 0x3);
   13884                                   if (dt.Is(kDataTypeValueInvalid)) {
   13885                                     UnallocatedT32(instr);
   13886                                     return;
   13887                                   }
   13888                                   Alignment align =
   13889                                       Align_align_3_Decode((instr >> 4) & 0x3);
   13890                                   if (dt.Is(kDataTypeValueInvalid) ||
   13891                                       align.Is(kBadAlignment)) {
   13892                                     UnallocatedT32(instr);
   13893                                     return;
   13894                                   }
   13895                                   unsigned first =
   13896                                       ExtractDRegister(instr, 22, 12);
   13897                                   unsigned length;
   13898                                   SpacingType spacing;
   13899                                   switch ((instr >> 8) & 0xf) {
   13900                                     default:
   13901                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
   13902                                     case 0x4:
   13903                                       length = 3;
   13904                                       spacing = kSingle;
   13905                                       break;
   13906                                     case 0x5:
   13907                                       length = 3;
   13908                                       spacing = kDouble;
   13909                                       break;
   13910                                   }
   13911                                   unsigned last =
   13912                                       first +
   13913                                       (length - 1) *
   13914                                           (spacing == kSingle ? 1 : 2);
   13915                                   TransferType transfer = kMultipleLanes;
   13916                                   unsigned rn = (instr >> 16) & 0xf;
   13917                                   // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
   13918                                   vld3(CurrentCond(),
   13919                                        dt,
   13920                                        NeonRegisterList(DRegister(first),
   13921                                                         DRegister(last),
   13922                                                         spacing,
   13923                                                         transfer),
   13924                                        AlignedMemOperand(Register(rn),
   13925                                                          align,
   13926                                                          Offset));
   13927                                   break;
   13928                                 }
   13929                                 case 0x00000500: {
   13930                                   // 0xf920050d
   13931                                   DataType dt =
   13932                                       Dt_size_7_Decode((instr >> 6) & 0x3);
   13933                                   if (dt.Is(kDataTypeValueInvalid)) {
   13934                                     UnallocatedT32(instr);
   13935                                     return;
   13936                                   }
   13937                                   Alignment align =
   13938                                       Align_align_3_Decode((instr >> 4) & 0x3);
   13939                                   if (dt.Is(kDataTypeValueInvalid) ||
   13940                                       align.Is(kBadAlignment)) {
   13941                                     UnallocatedT32(instr);
   13942                                     return;
   13943                                   }
   13944                                   unsigned first =
   13945                                       ExtractDRegister(instr, 22, 12);
   13946                                   unsigned length;
   13947                                   SpacingType spacing;
   13948                                   switch ((instr >> 8) & 0xf) {
   13949                                     default:
   13950                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
   13951                                     case 0x4:
   13952                                       length = 3;
   13953                                       spacing = kSingle;
   13954                                       break;
   13955                                     case 0x5:
   13956                                       length = 3;
   13957                                       spacing = kDouble;
   13958                                       break;
   13959                                   }
   13960                                   unsigned last =
   13961                                       first +
   13962                                       (length - 1) *
   13963                                           (spacing == kSingle ? 1 : 2);
   13964                                   TransferType transfer = kMultipleLanes;
   13965                                   unsigned rn = (instr >> 16) & 0xf;
   13966                                   // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
   13967                                   vld3(CurrentCond(),
   13968                                        dt,
   13969                                        NeonRegisterList(DRegister(first),
   13970                                                         DRegister(last),
   13971                                                         spacing,
   13972                                                         transfer),
   13973                                        AlignedMemOperand(Register(rn),
   13974                                                          align,
   13975                                                          Offset));
   13976                                   break;
   13977                                 }
   13978                                 case 0x00000600: {
   13979                                   // 0xf920060d
   13980                                   if (((instr & 0xe20) == 0x620) ||
   13981                                       ((instr & 0xf30) == 0xa30)) {
   13982                                     UnallocatedT32(instr);
   13983                                     return;
   13984                                   }
   13985                                   DataType dt =
   13986                                       Dt_size_6_Decode((instr >> 6) & 0x3);
   13987                                   if (dt.Is(kDataTypeValueInvalid)) {
   13988                                     UnallocatedT32(instr);
   13989                                     return;
   13990                                   }
   13991                                   Alignment align =
   13992                                       Align_align_1_Decode((instr >> 4) & 0x3);
   13993                                   if (dt.Is(kDataTypeValueInvalid) ||
   13994                                       align.Is(kBadAlignment)) {
   13995                                     UnallocatedT32(instr);
   13996                                     return;
   13997                                   }
   13998                                   unsigned first =
   13999                                       ExtractDRegister(instr, 22, 12);
   14000                                   unsigned length;
   14001                                   SpacingType spacing = kSingle;
   14002                                   switch ((instr >> 8) & 0xf) {
   14003                                     default:
   14004                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
   14005                                     case 0x7:
   14006                                       length = 1;
   14007                                       break;
   14008                                     case 0xa:
   14009                                       length = 2;
   14010                                       break;
   14011                                     case 0x6:
   14012                                       length = 3;
   14013                                       break;
   14014                                     case 0x2:
   14015                                       length = 4;
   14016                                       break;
   14017                                   }
   14018                                   unsigned last = first + length - 1;
   14019                                   TransferType transfer = kMultipleLanes;
   14020                                   unsigned rn = (instr >> 16) & 0xf;
   14021                                   // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
   14022                                   vld1(CurrentCond(),
   14023                                        dt,
   14024                                        NeonRegisterList(DRegister(first),
   14025                                                         DRegister(last),
   14026                                                         spacing,
   14027                                                         transfer),
   14028                                        AlignedMemOperand(Register(rn),
   14029                                                          align,
   14030                                                          Offset));
   14031                                   break;
   14032                                 }
   14033                                 case 0x00000700: {
   14034                                   // 0xf920070d
   14035                                   if (((instr & 0xe20) == 0x620) ||
   14036                                       ((instr & 0xf30) == 0xa30)) {
   14037                                     UnallocatedT32(instr);
   14038                                     return;
   14039                                   }
   14040                                   DataType dt =
   14041                                       Dt_size_6_Decode((instr >> 6) & 0x3);
   14042                                   if (dt.Is(kDataTypeValueInvalid)) {
   14043                                     UnallocatedT32(instr);
   14044                                     return;
   14045                                   }
   14046                                   Alignment align =
   14047                                       Align_align_1_Decode((instr >> 4) & 0x3);
   14048                                   if (dt.Is(kDataTypeValueInvalid) ||
   14049                                       align.Is(kBadAlignment)) {
   14050                                     UnallocatedT32(instr);
   14051                                     return;
   14052                                   }
   14053                                   unsigned first =
   14054                                       ExtractDRegister(instr, 22, 12);
   14055                                   unsigned length;
   14056                                   SpacingType spacing = kSingle;
   14057                                   switch ((instr >> 8) & 0xf) {
   14058                                     default:
   14059                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
   14060                                     case 0x7:
   14061                                       length = 1;
   14062                                       break;
   14063                                     case 0xa:
   14064                                       length = 2;
   14065                                       break;
   14066                                     case 0x6:
   14067                                       length = 3;
   14068                                       break;
   14069                                     case 0x2:
   14070                                       length = 4;
   14071                                       break;
   14072                                   }
   14073                                   unsigned last = first + length - 1;
   14074                                   TransferType transfer = kMultipleLanes;
   14075                                   unsigned rn = (instr >> 16) & 0xf;
   14076                                   // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
   14077                                   vld1(CurrentCond(),
   14078                                        dt,
   14079                                        NeonRegisterList(DRegister(first),
   14080                                                         DRegister(last),
   14081                                                         spacing,
   14082                                                         transfer),
   14083                                        AlignedMemOperand(Register(rn),
   14084                                                          align,
   14085                                                          Offset));
   14086                                   break;
   14087                                 }
   14088                                 case 0x00000800: {
   14089                                   // 0xf920080d
   14090                                   if (((instr & 0xe30) == 0x830)) {
   14091                                     UnallocatedT32(instr);
   14092                                     return;
   14093                                   }
   14094                                   DataType dt =
   14095                                       Dt_size_7_Decode((instr >> 6) & 0x3);
   14096                                   if (dt.Is(kDataTypeValueInvalid)) {
   14097                                     UnallocatedT32(instr);
   14098                                     return;
   14099                                   }
   14100                                   Alignment align =
   14101                                       Align_align_2_Decode((instr >> 4) & 0x3);
   14102                                   if (dt.Is(kDataTypeValueInvalid) ||
   14103                                       align.Is(kBadAlignment)) {
   14104                                     UnallocatedT32(instr);
   14105                                     return;
   14106                                   }
   14107                                   unsigned first =
   14108                                       ExtractDRegister(instr, 22, 12);
   14109                                   unsigned length;
   14110                                   SpacingType spacing;
   14111                                   switch ((instr >> 8) & 0xf) {
   14112                                     default:
   14113                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
   14114                                     case 0x8:
   14115                                       length = 2;
   14116                                       spacing = kSingle;
   14117                                       break;
   14118                                     case 0x9:
   14119                                       length = 2;
   14120                                       spacing = kDouble;
   14121                                       break;
   14122                                     case 0x3:
   14123                                       length = 4;
   14124                                       spacing = kSingle;
   14125                                       break;
   14126                                   }
   14127                                   unsigned last =
   14128                                       first +
   14129                                       (length - 1) *
   14130                                           (spacing == kSingle ? 1 : 2);
   14131                                   TransferType transfer = kMultipleLanes;
   14132                                   unsigned rn = (instr >> 16) & 0xf;
   14133                                   // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
   14134                                   vld2(CurrentCond(),
   14135                                        dt,
   14136                                        NeonRegisterList(DRegister(first),
   14137                                                         DRegister(last),
   14138                                                         spacing,
   14139                                                         transfer),
   14140                                        AlignedMemOperand(Register(rn),
   14141                                                          align,
   14142                                                          Offset));
   14143                                   break;
   14144                                 }
   14145                                 case 0x00000900: {
   14146                                   // 0xf920090d
   14147                                   if (((instr & 0xe30) == 0x830)) {
   14148                                     UnallocatedT32(instr);
   14149                                     return;
   14150                                   }
   14151                                   DataType dt =
   14152                                       Dt_size_7_Decode((instr >> 6) & 0x3);
   14153                                   if (dt.Is(kDataTypeValueInvalid)) {
   14154                                     UnallocatedT32(instr);
   14155                                     return;
   14156                                   }
   14157                                   Alignment align =
   14158                                       Align_align_2_Decode((instr >> 4) & 0x3);
   14159                                   if (dt.Is(kDataTypeValueInvalid) ||
   14160                                       align.Is(kBadAlignment)) {
   14161                                     UnallocatedT32(instr);
   14162                                     return;
   14163                                   }
   14164                                   unsigned first =
   14165                                       ExtractDRegister(instr, 22, 12);
   14166                                   unsigned length;
   14167                                   SpacingType spacing;
   14168                                   switch ((instr >> 8) & 0xf) {
   14169                                     default:
   14170                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
   14171                                     case 0x8:
   14172                                       length = 2;
   14173                                       spacing = kSingle;
   14174                                       break;
   14175                                     case 0x9:
   14176                                       length = 2;
   14177                                       spacing = kDouble;
   14178                                       break;
   14179                                     case 0x3:
   14180                                       length = 4;
   14181                                       spacing = kSingle;
   14182                                       break;
   14183                                   }
   14184                                   unsigned last =
   14185                                       first +
   14186                                       (length - 1) *
   14187                                           (spacing == kSingle ? 1 : 2);
   14188                                   TransferType transfer = kMultipleLanes;
   14189                                   unsigned rn = (instr >> 16) & 0xf;
   14190                                   // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
   14191                                   vld2(CurrentCond(),
   14192                                        dt,
   14193                                        NeonRegisterList(DRegister(first),
   14194                                                         DRegister(last),
   14195                                                         spacing,
   14196                                                         transfer),
   14197                                        AlignedMemOperand(Register(rn),
   14198                                                          align,
   14199                                                          Offset));
   14200                                   break;
   14201                                 }
   14202                                 case 0x00000a00: {
   14203                                   // 0xf9200a0d
   14204                                   if (((instr & 0xe20) == 0x620) ||
   14205                                       ((instr & 0xf30) == 0xa30)) {
   14206                                     UnallocatedT32(instr);
   14207                                     return;
   14208                                   }
   14209                                   DataType dt =
   14210                                       Dt_size_6_Decode((instr >> 6) & 0x3);
   14211                                   if (dt.Is(kDataTypeValueInvalid)) {
   14212                                     UnallocatedT32(instr);
   14213                                     return;
   14214                                   }
   14215                                   Alignment align =
   14216                                       Align_align_1_Decode((instr >> 4) & 0x3);
   14217                                   if (dt.Is(kDataTypeValueInvalid) ||
   14218                                       align.Is(kBadAlignment)) {
   14219                                     UnallocatedT32(instr);
   14220                                     return;
   14221                                   }
   14222                                   unsigned first =
   14223                                       ExtractDRegister(instr, 22, 12);
   14224                                   unsigned length;
   14225                                   SpacingType spacing = kSingle;
   14226                                   switch ((instr >> 8) & 0xf) {
   14227                                     default:
   14228                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
   14229                                     case 0x7:
   14230                                       length = 1;
   14231                                       break;
   14232                                     case 0xa:
   14233                                       length = 2;
   14234                                       break;
   14235                                     case 0x6:
   14236                                       length = 3;
   14237                                       break;
   14238                                     case 0x2:
   14239                                       length = 4;
   14240                                       break;
   14241                                   }
   14242                                   unsigned last = first + length - 1;
   14243                                   TransferType transfer = kMultipleLanes;
   14244                                   unsigned rn = (instr >> 16) & 0xf;
   14245                                   // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
   14246                                   vld1(CurrentCond(),
   14247                                        dt,
   14248                                        NeonRegisterList(DRegister(first),
   14249                                                         DRegister(last),
   14250                                                         spacing,
   14251                                                         transfer),
   14252                                        AlignedMemOperand(Register(rn),
   14253                                                          align,
   14254                                                          Offset));
   14255                                   break;
   14256                                 }
   14257                                 default:
   14258                                   UnallocatedT32(instr);
   14259                                   break;
   14260                               }
   14261                               break;
   14262                             }
   14263                           }
   14264                           break;
   14265                         }
   14266                         default: {
   14267                           switch (instr & 0x00000f00) {
   14268                             case 0x00000000: {
   14269                               // 0xf9200000
   14270                               if (((instr & 0xd) == 0xd)) {
   14271                                 UnallocatedT32(instr);
   14272                                 return;
   14273                               }
   14274                               DataType dt =
   14275                                   Dt_size_7_Decode((instr >> 6) & 0x3);
   14276                               if (dt.Is(kDataTypeValueInvalid)) {
   14277                                 UnallocatedT32(instr);
   14278                                 return;
   14279                               }
   14280                               Alignment align =
   14281                                   Align_align_4_Decode((instr >> 4) & 0x3);
   14282                               if (dt.Is(kDataTypeValueInvalid) ||
   14283                                   align.Is(kBadAlignment)) {
   14284                                 UnallocatedT32(instr);
   14285                                 return;
   14286                               }
   14287                               unsigned first = ExtractDRegister(instr, 22, 12);
   14288                               unsigned length;
   14289                               SpacingType spacing;
   14290                               switch ((instr >> 8) & 0xf) {
   14291                                 default:
   14292                                   VIXL_UNREACHABLE_OR_FALLTHROUGH();
   14293                                 case 0x0:
   14294                                   length = 4;
   14295                                   spacing = kSingle;
   14296                                   break;
   14297                                 case 0x1:
   14298                                   length = 4;
   14299                                   spacing = kDouble;
   14300                                   break;
   14301                               }
   14302                               unsigned last =
   14303                                   first +
   14304                                   (length - 1) * (spacing == kSingle ? 1 : 2);
   14305                               TransferType transfer = kMultipleLanes;
   14306                               unsigned rn = (instr >> 16) & 0xf;
   14307                               unsigned rm = instr & 0xf;
   14308                               // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
   14309                               vld4(CurrentCond(),
   14310                                    dt,
   14311                                    NeonRegisterList(DRegister(first),
   14312                                                     DRegister(last),
   14313                                                     spacing,
   14314                                                     transfer),
   14315                                    AlignedMemOperand(Register(rn),
   14316                                                      align,
   14317                                                      Register(rm),
   14318                                                      PostIndex));
   14319                               break;
   14320                             }
   14321                             case 0x00000100: {
   14322                               // 0xf9200100
   14323                               if (((instr & 0xd) == 0xd)) {
   14324                                 UnallocatedT32(instr);
   14325                                 return;
   14326                               }
   14327                               DataType dt =
   14328                                   Dt_size_7_Decode((instr >> 6) & 0x3);
   14329                               if (dt.Is(kDataTypeValueInvalid)) {
   14330                                 UnallocatedT32(instr);
   14331                                 return;
   14332                               }
   14333                               Alignment align =
   14334                                   Align_align_4_Decode((instr >> 4) & 0x3);
   14335                               if (dt.Is(kDataTypeValueInvalid) ||
   14336                                   align.Is(kBadAlignment)) {
   14337                                 UnallocatedT32(instr);
   14338                                 return;
   14339                               }
   14340                               unsigned first = ExtractDRegister(instr, 22, 12);
   14341                               unsigned length;
   14342                               SpacingType spacing;
   14343                               switch ((instr >> 8) & 0xf) {
   14344                                 default:
   14345                                   VIXL_UNREACHABLE_OR_FALLTHROUGH();
   14346                                 case 0x0:
   14347                                   length = 4;
   14348                                   spacing = kSingle;
   14349                                   break;
   14350                                 case 0x1:
   14351                                   length = 4;
   14352                                   spacing = kDouble;
   14353                                   break;
   14354                               }
   14355                               unsigned last =
   14356                                   first +
   14357                                   (length - 1) * (spacing == kSingle ? 1 : 2);
   14358                               TransferType transfer = kMultipleLanes;
   14359                               unsigned rn = (instr >> 16) & 0xf;
   14360                               unsigned rm = instr & 0xf;
   14361                               // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
   14362                               vld4(CurrentCond(),
   14363                                    dt,
   14364                                    NeonRegisterList(DRegister(first),
   14365                                                     DRegister(last),
   14366                                                     spacing,
   14367                                                     transfer),
   14368                                    AlignedMemOperand(Register(rn),
   14369                                                      align,
   14370                                                      Register(rm),
   14371                                                      PostIndex));
   14372                               break;
   14373                             }
   14374                             case 0x00000200: {
   14375                               // 0xf9200200
   14376                               if (((instr & 0xd) == 0xd) ||
   14377                                   ((instr & 0xe20) == 0x620) ||
   14378                                   ((instr & 0xf30) == 0xa30)) {
   14379                                 UnallocatedT32(instr);
   14380                                 return;
   14381                               }
   14382                               DataType dt =
   14383                                   Dt_size_6_Decode((instr >> 6) & 0x3);
   14384                               if (dt.Is(kDataTypeValueInvalid)) {
   14385                                 UnallocatedT32(instr);
   14386                                 return;
   14387                               }
   14388                               Alignment align =
   14389                                   Align_align_1_Decode((instr >> 4) & 0x3);
   14390                               if (dt.Is(kDataTypeValueInvalid) ||
   14391                                   align.Is(kBadAlignment)) {
   14392                                 UnallocatedT32(instr);
   14393                                 return;
   14394                               }
   14395                               unsigned first = ExtractDRegister(instr, 22, 12);
   14396                               unsigned length;
   14397                               SpacingType spacing = kSingle;
   14398                               switch ((instr >> 8) & 0xf) {
   14399                                 default:
   14400                                   VIXL_UNREACHABLE_OR_FALLTHROUGH();
   14401                                 case 0x7:
   14402                                   length = 1;
   14403                                   break;
   14404                                 case 0xa:
   14405                                   length = 2;
   14406                                   break;
   14407                                 case 0x6:
   14408                                   length = 3;
   14409                                   break;
   14410                                 case 0x2:
   14411                                   length = 4;
   14412                                   break;
   14413                               }
   14414                               unsigned last = first + length - 1;
   14415                               TransferType transfer = kMultipleLanes;
   14416                               unsigned rn = (instr >> 16) & 0xf;
   14417                               unsigned rm = instr & 0xf;
   14418                               // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
   14419                               vld1(CurrentCond(),
   14420                                    dt,
   14421                                    NeonRegisterList(DRegister(first),
   14422                                                     DRegister(last),
   14423                                                     spacing,
   14424                                                     transfer),
   14425                                    AlignedMemOperand(Register(rn),
   14426                                                      align,
   14427                                                      Register(rm),
   14428                                                      PostIndex));
   14429                               break;
   14430                             }
   14431                             case 0x00000300: {
   14432                               // 0xf9200300
   14433                               if (((instr & 0xd) == 0xd) ||
   14434                                   ((instr & 0xe30) == 0x830)) {
   14435                                 UnallocatedT32(instr);
   14436                                 return;
   14437                               }
   14438                               DataType dt =
   14439                                   Dt_size_7_Decode((instr >> 6) & 0x3);
   14440                               if (dt.Is(kDataTypeValueInvalid)) {
   14441                                 UnallocatedT32(instr);
   14442                                 return;
   14443                               }
   14444                               Alignment align =
   14445                                   Align_align_2_Decode((instr >> 4) & 0x3);
   14446                               if (dt.Is(kDataTypeValueInvalid) ||
   14447                                   align.Is(kBadAlignment)) {
   14448                                 UnallocatedT32(instr);
   14449                                 return;
   14450                               }
   14451                               unsigned first = ExtractDRegister(instr, 22, 12);
   14452                               unsigned length;
   14453                               SpacingType spacing;
   14454                               switch ((instr >> 8) & 0xf) {
   14455                                 default:
   14456                                   VIXL_UNREACHABLE_OR_FALLTHROUGH();
   14457                                 case 0x8:
   14458                                   length = 2;
   14459                                   spacing = kSingle;
   14460                                   break;
   14461                                 case 0x9:
   14462                                   length = 2;
   14463                                   spacing = kDouble;
   14464                                   break;
   14465                                 case 0x3:
   14466                                   length = 4;
   14467                                   spacing = kSingle;
   14468                                   break;
   14469                               }
   14470                               unsigned last =
   14471                                   first +
   14472                                   (length - 1) * (spacing == kSingle ? 1 : 2);
   14473                               TransferType transfer = kMultipleLanes;
   14474                               unsigned rn = (instr >> 16) & 0xf;
   14475                               unsigned rm = instr & 0xf;
   14476                               // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
   14477                               vld2(CurrentCond(),
   14478                                    dt,
   14479                                    NeonRegisterList(DRegister(first),
   14480                                                     DRegister(last),
   14481                                                     spacing,
   14482                                                     transfer),
   14483                                    AlignedMemOperand(Register(rn),
   14484                                                      align,
   14485                                                      Register(rm),
   14486                                                      PostIndex));
   14487                               break;
   14488                             }
   14489                             case 0x00000400: {
   14490                               // 0xf9200400
   14491                               if (((instr & 0xd) == 0xd)) {
   14492                                 UnallocatedT32(instr);
   14493                                 return;
   14494                               }
   14495                               DataType dt =
   14496                                   Dt_size_7_Decode((instr >> 6) & 0x3);
   14497                               if (dt.Is(kDataTypeValueInvalid)) {
   14498                                 UnallocatedT32(instr);
   14499                                 return;
   14500                               }
   14501                               Alignment align =
   14502                                   Align_align_3_Decode((instr >> 4) & 0x3);
   14503                               if (dt.Is(kDataTypeValueInvalid) ||
   14504                                   align.Is(kBadAlignment)) {
   14505                                 UnallocatedT32(instr);
   14506                                 return;
   14507                               }
   14508                               unsigned first = ExtractDRegister(instr, 22, 12);
   14509                               unsigned length;
   14510                               SpacingType spacing;
   14511                               switch ((instr >> 8) & 0xf) {
   14512                                 default:
   14513                                   VIXL_UNREACHABLE_OR_FALLTHROUGH();
   14514                                 case 0x4:
   14515                                   length = 3;
   14516                                   spacing = kSingle;
   14517                                   break;
   14518                                 case 0x5:
   14519                                   length = 3;
   14520                                   spacing = kDouble;
   14521                                   break;
   14522                               }
   14523                               unsigned last =
   14524                                   first +
   14525                                   (length - 1) * (spacing == kSingle ? 1 : 2);
   14526                               TransferType transfer = kMultipleLanes;
   14527                               unsigned rn = (instr >> 16) & 0xf;
   14528                               unsigned rm = instr & 0xf;
   14529                               // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
   14530                               vld3(CurrentCond(),
   14531                                    dt,
   14532                                    NeonRegisterList(DRegister(first),
   14533                                                     DRegister(last),
   14534                                                     spacing,
   14535                                                     transfer),
   14536                                    AlignedMemOperand(Register(rn),
   14537                                                      align,
   14538                                                      Register(rm),
   14539                                                      PostIndex));
   14540                               break;
   14541                             }
   14542                             case 0x00000500: {
   14543                               // 0xf9200500
   14544                               if (((instr & 0xd) == 0xd)) {
   14545                                 UnallocatedT32(instr);
   14546                                 return;
   14547                               }
   14548                               DataType dt =
   14549                                   Dt_size_7_Decode((instr >> 6) & 0x3);
   14550                               if (dt.Is(kDataTypeValueInvalid)) {
   14551                                 UnallocatedT32(instr);
   14552                                 return;
   14553                               }
   14554                               Alignment align =
   14555                                   Align_align_3_Decode((instr >> 4) & 0x3);
   14556                               if (dt.Is(kDataTypeValueInvalid) ||
   14557                                   align.Is(kBadAlignment)) {
   14558                                 UnallocatedT32(instr);
   14559                                 return;
   14560                               }
   14561                               unsigned first = ExtractDRegister(instr, 22, 12);
   14562                               unsigned length;
   14563                               SpacingType spacing;
   14564                               switch ((instr >> 8) & 0xf) {
   14565                                 default:
   14566                                   VIXL_UNREACHABLE_OR_FALLTHROUGH();
   14567                                 case 0x4:
   14568                                   length = 3;
   14569                                   spacing = kSingle;
   14570                                   break;
   14571                                 case 0x5:
   14572                                   length = 3;
   14573                                   spacing = kDouble;
   14574                                   break;
   14575                               }
   14576                               unsigned last =
   14577                                   first +
   14578                                   (length - 1) * (spacing == kSingle ? 1 : 2);
   14579                               TransferType transfer = kMultipleLanes;
   14580                               unsigned rn = (instr >> 16) & 0xf;
   14581                               unsigned rm = instr & 0xf;
   14582                               // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
   14583                               vld3(CurrentCond(),
   14584                                    dt,
   14585                                    NeonRegisterList(DRegister(first),
   14586                                                     DRegister(last),
   14587                                                     spacing,
   14588                                                     transfer),
   14589                                    AlignedMemOperand(Register(rn),
   14590                                                      align,
   14591                                                      Register(rm),
   14592                                                      PostIndex));
   14593                               break;
   14594                             }
   14595                             case 0x00000600: {
   14596                               // 0xf9200600
   14597                               if (((instr & 0xd) == 0xd) ||
   14598                                   ((instr & 0xe20) == 0x620) ||
   14599                                   ((instr & 0xf30) == 0xa30)) {
   14600                                 UnallocatedT32(instr);
   14601                                 return;
   14602                               }
   14603                               DataType dt =
   14604                                   Dt_size_6_Decode((instr >> 6) & 0x3);
   14605                               if (dt.Is(kDataTypeValueInvalid)) {
   14606                                 UnallocatedT32(instr);
   14607                                 return;
   14608                               }
   14609                               Alignment align =
   14610                                   Align_align_1_Decode((instr >> 4) & 0x3);
   14611                               if (dt.Is(kDataTypeValueInvalid) ||
   14612                                   align.Is(kBadAlignment)) {
   14613                                 UnallocatedT32(instr);
   14614                                 return;
   14615                               }
   14616                               unsigned first = ExtractDRegister(instr, 22, 12);
   14617                               unsigned length;
   14618                               SpacingType spacing = kSingle;
   14619                               switch ((instr >> 8) & 0xf) {
   14620                                 default:
   14621                                   VIXL_UNREACHABLE_OR_FALLTHROUGH();
   14622                                 case 0x7:
   14623                                   length = 1;
   14624                                   break;
   14625                                 case 0xa:
   14626                                   length = 2;
   14627                                   break;
   14628                                 case 0x6:
   14629                                   length = 3;
   14630                                   break;
   14631                                 case 0x2:
   14632                                   length = 4;
   14633                                   break;
   14634                               }
   14635                               unsigned last = first + length - 1;
   14636                               TransferType transfer = kMultipleLanes;
   14637                               unsigned rn = (instr >> 16) & 0xf;
   14638                               unsigned rm = instr & 0xf;
   14639                               // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
   14640                               vld1(CurrentCond(),
   14641                                    dt,
   14642                                    NeonRegisterList(DRegister(first),
   14643                                                     DRegister(last),
   14644                                                     spacing,
   14645                                                     transfer),
   14646                                    AlignedMemOperand(Register(rn),
   14647                                                      align,
   14648                                                      Register(rm),
   14649                                                      PostIndex));
   14650                               break;
   14651                             }
   14652                             case 0x00000700: {
   14653                               // 0xf9200700
   14654                               if (((instr & 0xd) == 0xd) ||
   14655                                   ((instr & 0xe20) == 0x620) ||
   14656                                   ((instr & 0xf30) == 0xa30)) {
   14657                                 UnallocatedT32(instr);
   14658                                 return;
   14659                               }
   14660                               DataType dt =
   14661                                   Dt_size_6_Decode((instr >> 6) & 0x3);
   14662                               if (dt.Is(kDataTypeValueInvalid)) {
   14663                                 UnallocatedT32(instr);
   14664                                 return;
   14665                               }
   14666                               Alignment align =
   14667                                   Align_align_1_Decode((instr >> 4) & 0x3);
   14668                               if (dt.Is(kDataTypeValueInvalid) ||
   14669                                   align.Is(kBadAlignment)) {
   14670                                 UnallocatedT32(instr);
   14671                                 return;
   14672                               }
   14673                               unsigned first = ExtractDRegister(instr, 22, 12);
   14674                               unsigned length;
   14675                               SpacingType spacing = kSingle;
   14676                               switch ((instr >> 8) & 0xf) {
   14677                                 default:
   14678                                   VIXL_UNREACHABLE_OR_FALLTHROUGH();
   14679                                 case 0x7:
   14680                                   length = 1;
   14681                                   break;
   14682                                 case 0xa:
   14683                                   length = 2;
   14684                                   break;
   14685                                 case 0x6:
   14686                                   length = 3;
   14687                                   break;
   14688                                 case 0x2:
   14689                                   length = 4;
   14690                                   break;
   14691                               }
   14692                               unsigned last = first + length - 1;
   14693                               TransferType transfer = kMultipleLanes;
   14694                               unsigned rn = (instr >> 16) & 0xf;
   14695                               unsigned rm = instr & 0xf;
   14696                               // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
   14697                               vld1(CurrentCond(),
   14698                                    dt,
   14699                                    NeonRegisterList(DRegister(first),
   14700                                                     DRegister(last),
   14701                                                     spacing,
   14702                                                     transfer),
   14703                                    AlignedMemOperand(Register(rn),
   14704                                                      align,
   14705                                                      Register(rm),
   14706                                                      PostIndex));
   14707                               break;
   14708                             }
   14709                             case 0x00000800: {
   14710                               // 0xf9200800
   14711                               if (((instr & 0xd) == 0xd) ||
   14712                                   ((instr & 0xe30) == 0x830)) {
   14713                                 UnallocatedT32(instr);
   14714                                 return;
   14715                               }
   14716                               DataType dt =
   14717                                   Dt_size_7_Decode((instr >> 6) & 0x3);
   14718                               if (dt.Is(kDataTypeValueInvalid)) {
   14719                                 UnallocatedT32(instr);
   14720                                 return;
   14721                               }
   14722                               Alignment align =
   14723                                   Align_align_2_Decode((instr >> 4) & 0x3);
   14724                               if (dt.Is(kDataTypeValueInvalid) ||
   14725                                   align.Is(kBadAlignment)) {
   14726                                 UnallocatedT32(instr);
   14727                                 return;
   14728                               }
   14729                               unsigned first = ExtractDRegister(instr, 22, 12);
   14730                               unsigned length;
   14731                               SpacingType spacing;
   14732                               switch ((instr >> 8) & 0xf) {
   14733                                 default:
   14734                                   VIXL_UNREACHABLE_OR_FALLTHROUGH();
   14735                                 case 0x8:
   14736                                   length = 2;
   14737                                   spacing = kSingle;
   14738                                   break;
   14739                                 case 0x9:
   14740                                   length = 2;
   14741                                   spacing = kDouble;
   14742                                   break;
   14743                                 case 0x3:
   14744                                   length = 4;
   14745                                   spacing = kSingle;
   14746                                   break;
   14747                               }
   14748                               unsigned last =
   14749                                   first +
   14750                                   (length - 1) * (spacing == kSingle ? 1 : 2);
   14751                               TransferType transfer = kMultipleLanes;
   14752                               unsigned rn = (instr >> 16) & 0xf;
   14753                               unsigned rm = instr & 0xf;
   14754                               // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
   14755                               vld2(CurrentCond(),
   14756                                    dt,
   14757                                    NeonRegisterList(DRegister(first),
   14758                                                     DRegister(last),
   14759                                                     spacing,
   14760                                                     transfer),
   14761                                    AlignedMemOperand(Register(rn),
   14762                                                      align,
   14763                                                      Register(rm),
   14764                                                      PostIndex));
   14765                               break;
   14766                             }
   14767                             case 0x00000900: {
   14768                               // 0xf9200900
   14769                               if (((instr & 0xd) == 0xd) ||
   14770                                   ((instr & 0xe30) == 0x830)) {
   14771                                 UnallocatedT32(instr);
   14772                                 return;
   14773                               }
   14774                               DataType dt =
   14775                                   Dt_size_7_Decode((instr >> 6) & 0x3);
   14776                               if (dt.Is(kDataTypeValueInvalid)) {
   14777                                 UnallocatedT32(instr);
   14778                                 return;
   14779                               }
   14780                               Alignment align =
   14781                                   Align_align_2_Decode((instr >> 4) & 0x3);
   14782                               if (dt.Is(kDataTypeValueInvalid) ||
   14783                                   align.Is(kBadAlignment)) {
   14784                                 UnallocatedT32(instr);
   14785                                 return;
   14786                               }
   14787                               unsigned first = ExtractDRegister(instr, 22, 12);
   14788                               unsigned length;
   14789                               SpacingType spacing;
   14790                               switch ((instr >> 8) & 0xf) {
   14791                                 default:
   14792                                   VIXL_UNREACHABLE_OR_FALLTHROUGH();
   14793                                 case 0x8:
   14794                                   length = 2;
   14795                                   spacing = kSingle;
   14796                                   break;
   14797                                 case 0x9:
   14798                                   length = 2;
   14799                                   spacing = kDouble;
   14800                                   break;
   14801                                 case 0x3:
   14802                                   length = 4;
   14803                                   spacing = kSingle;
   14804                                   break;
   14805                               }
   14806                               unsigned last =
   14807                                   first +
   14808                                   (length - 1) * (spacing == kSingle ? 1 : 2);
   14809                               TransferType transfer = kMultipleLanes;
   14810                               unsigned rn = (instr >> 16) & 0xf;
   14811                               unsigned rm = instr & 0xf;
   14812                               // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
   14813                               vld2(CurrentCond(),
   14814                                    dt,
   14815                                    NeonRegisterList(DRegister(first),
   14816                                                     DRegister(last),
   14817                                                     spacing,
   14818                                                     transfer),
   14819                                    AlignedMemOperand(Register(rn),
   14820                                                      align,
   14821                                                      Register(rm),
   14822                                                      PostIndex));
   14823                               break;
   14824                             }
   14825                             case 0x00000a00: {
   14826                               // 0xf9200a00
   14827                               if (((instr & 0xd) == 0xd) ||
   14828                                   ((instr & 0xe20) == 0x620) ||
   14829                                   ((instr & 0xf30) == 0xa30)) {
   14830                                 UnallocatedT32(instr);
   14831                                 return;
   14832                               }
   14833                               DataType dt =
   14834                                   Dt_size_6_Decode((instr >> 6) & 0x3);
   14835                               if (dt.Is(kDataTypeValueInvalid)) {
   14836                                 UnallocatedT32(instr);
   14837                                 return;
   14838                               }
   14839                               Alignment align =
   14840                                   Align_align_1_Decode((instr >> 4) & 0x3);
   14841                               if (dt.Is(kDataTypeValueInvalid) ||
   14842                                   align.Is(kBadAlignment)) {
   14843                                 UnallocatedT32(instr);
   14844                                 return;
   14845                               }
   14846                               unsigned first = ExtractDRegister(instr, 22, 12);
   14847                               unsigned length;
   14848                               SpacingType spacing = kSingle;
   14849                               switch ((instr >> 8) & 0xf) {
   14850                                 default:
   14851                                   VIXL_UNREACHABLE_OR_FALLTHROUGH();
   14852                                 case 0x7:
   14853                                   length = 1;
   14854                                   break;
   14855                                 case 0xa:
   14856                                   length = 2;
   14857                                   break;
   14858                                 case 0x6:
   14859                                   length = 3;
   14860                                   break;
   14861                                 case 0x2:
   14862                                   length = 4;
   14863                                   break;
   14864                               }
   14865                               unsigned last = first + length - 1;
   14866                               TransferType transfer = kMultipleLanes;
   14867                               unsigned rn = (instr >> 16) & 0xf;
   14868                               unsigned rm = instr & 0xf;
   14869                               // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
   14870                               vld1(CurrentCond(),
   14871                                    dt,
   14872                                    NeonRegisterList(DRegister(first),
   14873                                                     DRegister(last),
   14874                                                     spacing,
   14875                                                     transfer),
   14876                                    AlignedMemOperand(Register(rn),
   14877                                                      align,
   14878                                                      Register(rm),
   14879                                                      PostIndex));
   14880                               break;
   14881                             }
   14882                             default:
   14883                               UnallocatedT32(instr);
   14884                               break;
   14885                           }
   14886                           break;
   14887                         }
   14888                       }
   14889                       break;
   14890                     }
   14891                     case 0x01800000: {
   14892                       // 0xf9800000
   14893                       switch (instr & 0x00000300) {
   14894                         case 0x00000000: {
   14895                           // 0xf9800000
   14896                           switch (instr & 0x00000c00) {
   14897                             case 0x00000c00: {
   14898                               // 0xf9800c00
   14899                               UnallocatedT32(instr);
   14900                               break;
   14901                             }
   14902                             default: {
   14903                               switch (instr & 0x0000000d) {
   14904                                 case 0x0000000d: {
   14905                                   // 0xf980000d
   14906                                   switch (instr & 0x00000002) {
   14907                                     case 0x00000000: {
   14908                                       // 0xf980000d
   14909                                       if (((instr & 0xc00) == 0xc00)) {
   14910                                         UnallocatedT32(instr);
   14911                                         return;
   14912                                       }
   14913                                       DataType dt =
   14914                                           Dt_size_7_Decode((instr >> 10) & 0x3);
   14915                                       if (dt.Is(kDataTypeValueInvalid)) {
   14916                                         UnallocatedT32(instr);
   14917                                         return;
   14918                                       }
   14919                                       DecodeNeonAndAlign decode_neon =
   14920                                           Align_index_align_1_Decode((instr >>
   14921                                                                       4) &
   14922                                                                          0xf,
   14923                                                                      dt);
   14924                                       if (!decode_neon.IsValid()) {
   14925                                         UnallocatedT32(instr);
   14926                                         return;
   14927                                       }
   14928                                       Alignment align = decode_neon.GetAlign();
   14929                                       int lane = decode_neon.GetLane();
   14930                                       SpacingType spacing =
   14931                                           decode_neon.GetSpacing();
   14932                                       unsigned first =
   14933                                           ExtractDRegister(instr, 22, 12);
   14934                                       unsigned length = 1;
   14935                                       unsigned last = first + length - 1;
   14936                                       unsigned rn = (instr >> 16) & 0xf;
   14937                                       // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
   14938                                       vst1(CurrentCond(),
   14939                                            dt,
   14940                                            NeonRegisterList(DRegister(first),
   14941                                                             DRegister(last),
   14942                                                             spacing,
   14943                                                             lane),
   14944                                            AlignedMemOperand(Register(rn),
   14945                                                              align,
   14946                                                              PostIndex));
   14947                                       break;
   14948                                     }
   14949                                     case 0x00000002: {
   14950                                       // 0xf980000f
   14951                                       if (((instr & 0xc00) == 0xc00)) {
   14952                                         UnallocatedT32(instr);
   14953                                         return;
   14954                                       }
   14955                                       DataType dt =
   14956                                           Dt_size_7_Decode((instr >> 10) & 0x3);
   14957                                       if (dt.Is(kDataTypeValueInvalid)) {
   14958                                         UnallocatedT32(instr);
   14959                                         return;
   14960                                       }
   14961                                       DecodeNeonAndAlign decode_neon =
   14962                                           Align_index_align_1_Decode((instr >>
   14963                                                                       4) &
   14964                                                                          0xf,
   14965                                                                      dt);
   14966                                       if (!decode_neon.IsValid()) {
   14967                                         UnallocatedT32(instr);
   14968                                         return;
   14969                                       }
   14970                                       Alignment align = decode_neon.GetAlign();
   14971                                       int lane = decode_neon.GetLane();
   14972                                       SpacingType spacing =
   14973                                           decode_neon.GetSpacing();
   14974                                       unsigned first =
   14975                                           ExtractDRegister(instr, 22, 12);
   14976                                       unsigned length = 1;
   14977                                       unsigned last = first + length - 1;
   14978                                       unsigned rn = (instr >> 16) & 0xf;
   14979                                       // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
   14980                                       vst1(CurrentCond(),
   14981                                            dt,
   14982                                            NeonRegisterList(DRegister(first),
   14983                                                             DRegister(last),
   14984                                                             spacing,
   14985                                                             lane),
   14986                                            AlignedMemOperand(Register(rn),
   14987                                                              align,
   14988                                                              Offset));
   14989                                       break;
   14990                                     }
   14991                                   }
   14992                                   break;
   14993                                 }
   14994                                 default: {
   14995                                   if (((instr & 0xc00) == 0xc00) ||
   14996                                       ((instr & 0xd) == 0xd)) {
   14997                                     UnallocatedT32(instr);
   14998                                     return;
   14999                                   }
   15000                                   DataType dt =
   15001                                       Dt_size_7_Decode((instr >> 10) & 0x3);
   15002                                   if (dt.Is(kDataTypeValueInvalid)) {
   15003                                     UnallocatedT32(instr);
   15004                                     return;
   15005                                   }
   15006                                   DecodeNeonAndAlign decode_neon =
   15007                                       Align_index_align_1_Decode((instr >> 4) &
   15008                                                                      0xf,
   15009                                                                  dt);
   15010                                   if (!decode_neon.IsValid()) {
   15011                                     UnallocatedT32(instr);
   15012                                     return;
   15013                                   }
   15014                                   Alignment align = decode_neon.GetAlign();
   15015                                   int lane = decode_neon.GetLane();
   15016                                   SpacingType spacing =
   15017                                       decode_neon.GetSpacing();
   15018                                   unsigned first =
   15019                                       ExtractDRegister(instr, 22, 12);
   15020                                   unsigned length = 1;
   15021                                   unsigned last = first + length - 1;
   15022                                   unsigned rn = (instr >> 16) & 0xf;
   15023                                   unsigned rm = instr & 0xf;
   15024                                   // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
   15025                                   vst1(CurrentCond(),
   15026                                        dt,
   15027                                        NeonRegisterList(DRegister(first),
   15028                                                         DRegister(last),
   15029                                                         spacing,
   15030                                                         lane),
   15031                                        AlignedMemOperand(Register(rn),
   15032                                                          align,
   15033                                                          Register(rm),
   15034                                                          PostIndex));
   15035                                   break;
   15036                                 }
   15037                               }
   15038                               break;
   15039                             }
   15040                           }
   15041                           break;
   15042                         }
   15043                         case 0x00000100: {
   15044                           // 0xf9800100
   15045                           switch (instr & 0x00000c00) {
   15046                             case 0x00000c00: {
   15047                               // 0xf9800d00
   15048                               UnallocatedT32(instr);
   15049                               break;
   15050                             }
   15051                             default: {
   15052                               switch (instr & 0x0000000d) {
   15053                                 case 0x0000000d: {
   15054                                   // 0xf980010d
   15055                                   switch (instr & 0x00000002) {
   15056                                     case 0x00000000: {
   15057                                       // 0xf980010d
   15058                                       if (((instr & 0xc00) == 0xc00)) {
   15059                                         UnallocatedT32(instr);
   15060                                         return;
   15061                                       }
   15062                                       DataType dt =
   15063                                           Dt_size_7_Decode((instr >> 10) & 0x3);
   15064                                       if (dt.Is(kDataTypeValueInvalid)) {
   15065                                         UnallocatedT32(instr);
   15066                                         return;
   15067                                       }
   15068                                       DecodeNeonAndAlign decode_neon =
   15069                                           Align_index_align_2_Decode((instr >>
   15070                                                                       4) &
   15071                                                                          0xf,
   15072                                                                      dt);
   15073                                       if (!decode_neon.IsValid()) {
   15074                                         UnallocatedT32(instr);
   15075                                         return;
   15076                                       }
   15077                                       Alignment align = decode_neon.GetAlign();
   15078                                       int lane = decode_neon.GetLane();
   15079                                       SpacingType spacing =
   15080                                           decode_neon.GetSpacing();
   15081                                       unsigned first =
   15082                                           ExtractDRegister(instr, 22, 12);
   15083                                       unsigned length = 2;
   15084                                       unsigned last =
   15085                                           first +
   15086                                           (length - 1) *
   15087                                               (spacing == kSingle ? 1 : 2);
   15088                                       unsigned rn = (instr >> 16) & 0xf;
   15089                                       // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
   15090                                       vst2(CurrentCond(),
   15091                                            dt,
   15092                                            NeonRegisterList(DRegister(first),
   15093                                                             DRegister(last),
   15094                                                             spacing,
   15095                                                             lane),
   15096                                            AlignedMemOperand(Register(rn),
   15097                                                              align,
   15098                                                              PostIndex));
   15099                                       break;
   15100                                     }
   15101                                     case 0x00000002: {
   15102                                       // 0xf980010f
   15103                                       if (((instr & 0xc00) == 0xc00)) {
   15104                                         UnallocatedT32(instr);
   15105                                         return;
   15106                                       }
   15107                                       DataType dt =
   15108                                           Dt_size_7_Decode((instr >> 10) & 0x3);
   15109                                       if (dt.Is(kDataTypeValueInvalid)) {
   15110                                         UnallocatedT32(instr);
   15111                                         return;
   15112                                       }
   15113                                       DecodeNeonAndAlign decode_neon =
   15114                                           Align_index_align_2_Decode((instr >>
   15115                                                                       4) &
   15116                                                                          0xf,
   15117                                                                      dt);
   15118                                       if (!decode_neon.IsValid()) {
   15119                                         UnallocatedT32(instr);
   15120                                         return;
   15121                                       }
   15122                                       Alignment align = decode_neon.GetAlign();
   15123                                       int lane = decode_neon.GetLane();
   15124                                       SpacingType spacing =
   15125                                           decode_neon.GetSpacing();
   15126                                       unsigned first =
   15127                                           ExtractDRegister(instr, 22, 12);
   15128                                       unsigned length = 2;
   15129                                       unsigned last =
   15130                                           first +
   15131                                           (length - 1) *
   15132                                               (spacing == kSingle ? 1 : 2);
   15133                                       unsigned rn = (instr >> 16) & 0xf;
   15134                                       // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
   15135                                       vst2(CurrentCond(),
   15136                                            dt,
   15137                                            NeonRegisterList(DRegister(first),
   15138                                                             DRegister(last),
   15139                                                             spacing,
   15140                                                             lane),
   15141                                            AlignedMemOperand(Register(rn),
   15142                                                              align,
   15143                                                              Offset));
   15144                                       break;
   15145                                     }
   15146                                   }
   15147                                   break;
   15148                                 }
   15149                                 default: {
   15150                                   if (((instr & 0xc00) == 0xc00) ||
   15151                                       ((instr & 0xd) == 0xd)) {
   15152                                     UnallocatedT32(instr);
   15153                                     return;
   15154                                   }
   15155                                   DataType dt =
   15156                                       Dt_size_7_Decode((instr >> 10) & 0x3);
   15157                                   if (dt.Is(kDataTypeValueInvalid)) {
   15158                                     UnallocatedT32(instr);
   15159                                     return;
   15160                                   }
   15161                                   DecodeNeonAndAlign decode_neon =
   15162                                       Align_index_align_2_Decode((instr >> 4) &
   15163                                                                      0xf,
   15164                                                                  dt);
   15165                                   if (!decode_neon.IsValid()) {
   15166                                     UnallocatedT32(instr);
   15167                                     return;
   15168                                   }
   15169                                   Alignment align = decode_neon.GetAlign();
   15170                                   int lane = decode_neon.GetLane();
   15171                                   SpacingType spacing =
   15172                                       decode_neon.GetSpacing();
   15173                                   unsigned first =
   15174                                       ExtractDRegister(instr, 22, 12);
   15175                                   unsigned length = 2;
   15176                                   unsigned last =
   15177                                       first +
   15178                                       (length - 1) *
   15179                                           (spacing == kSingle ? 1 : 2);
   15180                                   unsigned rn = (instr >> 16) & 0xf;
   15181                                   unsigned rm = instr & 0xf;
   15182                                   // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
   15183                                   vst2(CurrentCond(),
   15184                                        dt,
   15185                                        NeonRegisterList(DRegister(first),
   15186                                                         DRegister(last),
   15187                                                         spacing,
   15188                                                         lane),
   15189                                        AlignedMemOperand(Register(rn),
   15190                                                          align,
   15191                                                          Register(rm),
   15192                                                          PostIndex));
   15193                                   break;
   15194                                 }
   15195                               }
   15196                               break;
   15197                             }
   15198                           }
   15199                           break;
   15200                         }
   15201                         case 0x00000200: {
   15202                           // 0xf9800200
   15203                           switch (instr & 0x00000c30) {
   15204                             case 0x00000010: {
   15205                               // 0xf9800210
   15206                               UnallocatedT32(instr);
   15207                               break;
   15208                             }
   15209                             case 0x00000030: {
   15210                               // 0xf9800230
   15211                               UnallocatedT32(instr);
   15212                               break;
   15213                             }
   15214                             case 0x00000410: {
   15215                               // 0xf9800610
   15216                               UnallocatedT32(instr);
   15217                               break;
   15218                             }
   15219                             case 0x00000430: {
   15220                               // 0xf9800630
   15221                               UnallocatedT32(instr);
   15222                               break;
   15223                             }
   15224                             case 0x00000810: {
   15225                               // 0xf9800a10
   15226                               UnallocatedT32(instr);
   15227                               break;
   15228                             }
   15229                             case 0x00000820: {
   15230                               // 0xf9800a20
   15231                               UnallocatedT32(instr);
   15232                               break;
   15233                             }
   15234                             case 0x00000830: {
   15235                               // 0xf9800a30
   15236                               UnallocatedT32(instr);
   15237                               break;
   15238                             }
   15239                             case 0x00000c00: {
   15240                               // 0xf9800e00
   15241                               UnallocatedT32(instr);
   15242                               break;
   15243                             }
   15244                             case 0x00000c10: {
   15245                               // 0xf9800e10
   15246                               UnallocatedT32(instr);
   15247                               break;
   15248                             }
   15249                             case 0x00000c20: {
   15250                               // 0xf9800e20
   15251                               UnallocatedT32(instr);
   15252                               break;
   15253                             }
   15254                             case 0x00000c30: {
   15255                               // 0xf9800e30
   15256                               UnallocatedT32(instr);
   15257                               break;
   15258                             }
   15259                             default: {
   15260                               switch (instr & 0x0000000d) {
   15261                                 case 0x0000000d: {
   15262                                   // 0xf980020d
   15263                                   switch (instr & 0x00000002) {
   15264                                     case 0x00000000: {
   15265                                       // 0xf980020d
   15266                                       if (((instr & 0xc00) == 0xc00) ||
   15267                                           ((instr & 0x810) == 0x10) ||
   15268                                           ((instr & 0xc30) == 0x810) ||
   15269                                           ((instr & 0xc30) == 0x820) ||
   15270                                           ((instr & 0xc30) == 0x830)) {
   15271                                         UnallocatedT32(instr);
   15272                                         return;
   15273                                       }
   15274                                       DataType dt =
   15275                                           Dt_size_7_Decode((instr >> 10) & 0x3);
   15276                                       if (dt.Is(kDataTypeValueInvalid)) {
   15277                                         UnallocatedT32(instr);
   15278                                         return;
   15279                                       }
   15280                                       DecodeNeon decode_neon =
   15281                                           Index_1_Decode((instr >> 4) & 0xf,
   15282                                                          dt);
   15283                                       if (!decode_neon.IsValid()) {
   15284                                         UnallocatedT32(instr);
   15285                                         return;
   15286                                       }
   15287                                       int lane = decode_neon.GetLane();
   15288                                       SpacingType spacing =
   15289                                           decode_neon.GetSpacing();
   15290                                       unsigned first =
   15291                                           ExtractDRegister(instr, 22, 12);
   15292                                       unsigned length = 3;
   15293                                       unsigned last =
   15294                                           first +
   15295                                           (length - 1) *
   15296                                               (spacing == kSingle ? 1 : 2);
   15297                                       unsigned rn = (instr >> 16) & 0xf;
   15298                                       // VST3{<c>}{<q>}.<dt> <list>, [<Rn>]! ; T1 NOLINT(whitespace/line_length)
   15299                                       vst3(CurrentCond(),
   15300                                            dt,
   15301                                            NeonRegisterList(DRegister(first),
   15302                                                             DRegister(last),
   15303                                                             spacing,
   15304                                                             lane),
   15305                                            MemOperand(Register(rn), PreIndex));
   15306                                       break;
   15307                                     }
   15308                                     case 0x00000002: {
   15309                                       // 0xf980020f
   15310                                       if (((instr & 0xc00) == 0xc00) ||
   15311                                           ((instr & 0x810) == 0x10) ||
   15312                                           ((instr & 0xc30) == 0x810) ||
   15313                                           ((instr & 0xc30) == 0x820) ||
   15314                                           ((instr & 0xc30) == 0x830)) {
   15315                                         UnallocatedT32(instr);
   15316                                         return;
   15317                                       }
   15318                                       DataType dt =
   15319                                           Dt_size_7_Decode((instr >> 10) & 0x3);
   15320                                       if (dt.Is(kDataTypeValueInvalid)) {
   15321                                         UnallocatedT32(instr);
   15322                                         return;
   15323                                       }
   15324                                       DecodeNeon decode_neon =
   15325                                           Index_1_Decode((instr >> 4) & 0xf,
   15326                                                          dt);
   15327                                       if (!decode_neon.IsValid()) {
   15328                                         UnallocatedT32(instr);
   15329                                         return;
   15330                                       }
   15331                                       int lane = decode_neon.GetLane();
   15332                                       SpacingType spacing =
   15333                                           decode_neon.GetSpacing();
   15334                                       unsigned first =
   15335                                           ExtractDRegister(instr, 22, 12);
   15336                                       unsigned length = 3;
   15337                                       unsigned last =
   15338                                           first +
   15339                                           (length - 1) *
   15340                                               (spacing == kSingle ? 1 : 2);
   15341                                       unsigned rn = (instr >> 16) & 0xf;
   15342                                       // VST3{<c>}{<q>}.<dt> <list>, [<Rn>] ; T1
   15343                                       vst3(CurrentCond(),
   15344                                            dt,
   15345                                            NeonRegisterList(DRegister(first),
   15346                                                             DRegister(last),
   15347                                                             spacing,
   15348                                                             lane),
   15349                                            MemOperand(Register(rn), Offset));
   15350                                       break;
   15351                                     }
   15352                                   }
   15353                                   break;
   15354                                 }
   15355                                 default: {
   15356                                   if (((instr & 0xc00) == 0xc00) ||
   15357                                       ((instr & 0xd) == 0xd) ||
   15358                                       ((instr & 0x810) == 0x10) ||
   15359                                       ((instr & 0xc30) == 0x810) ||
   15360                                       ((instr & 0xc30) == 0x820) ||
   15361                                       ((instr & 0xc30) == 0x830)) {
   15362                                     UnallocatedT32(instr);
   15363                                     return;
   15364                                   }
   15365                                   DataType dt =
   15366                                       Dt_size_7_Decode((instr >> 10) & 0x3);
   15367                                   if (dt.Is(kDataTypeValueInvalid)) {
   15368                                     UnallocatedT32(instr);
   15369                                     return;
   15370                                   }
   15371                                   DecodeNeon decode_neon =
   15372                                       Index_1_Decode((instr >> 4) & 0xf, dt);
   15373                                   if (!decode_neon.IsValid()) {
   15374                                     UnallocatedT32(instr);
   15375                                     return;
   15376                                   }
   15377                                   int lane = decode_neon.GetLane();
   15378                                   SpacingType spacing =
   15379                                       decode_neon.GetSpacing();
   15380                                   unsigned first =
   15381                                       ExtractDRegister(instr, 22, 12);
   15382                                   unsigned length = 3;
   15383                                   unsigned last =
   15384                                       first +
   15385                                       (length - 1) *
   15386                                           (spacing == kSingle ? 1 : 2);
   15387                                   unsigned rn = (instr >> 16) & 0xf;
   15388                                   Sign sign(plus);
   15389                                   unsigned rm = instr & 0xf;
   15390                                   // VST3{<c>}{<q>}.<dt> <list>, [<Rn>], #<Rm> ; T1 NOLINT(whitespace/line_length)
   15391                                   vst3(CurrentCond(),
   15392                                        dt,
   15393                                        NeonRegisterList(DRegister(first),
   15394                                                         DRegister(last),
   15395                                                         spacing,
   15396                                                         lane),
   15397                                        MemOperand(Register(rn),
   15398                                                   sign,
   15399                                                   Register(rm),
   15400                                                   PostIndex));
   15401                                   break;
   15402                                 }
   15403                               }
   15404                               break;
   15405                             }
   15406                           }
   15407                           break;
   15408                         }
   15409                         case 0x00000300: {
   15410                           // 0xf9800300
   15411                           switch (instr & 0x00000c00) {
   15412                             case 0x00000c00: {
   15413                               // 0xf9800f00
   15414                               UnallocatedT32(instr);
   15415                               break;
   15416                             }
   15417                             default: {
   15418                               switch (instr & 0x0000000d) {
   15419                                 case 0x0000000d: {
   15420                                   // 0xf980030d
   15421                                   switch (instr & 0x00000002) {
   15422                                     case 0x00000000: {
   15423                                       // 0xf980030d
   15424                                       if (((instr & 0xc00) == 0xc00)) {
   15425                                         UnallocatedT32(instr);
   15426                                         return;
   15427                                       }
   15428                                       DataType dt =
   15429                                           Dt_size_7_Decode((instr >> 10) & 0x3);
   15430                                       if (dt.Is(kDataTypeValueInvalid)) {
   15431                                         UnallocatedT32(instr);
   15432                                         return;
   15433                                       }
   15434                                       DecodeNeonAndAlign decode_neon =
   15435                                           Align_index_align_3_Decode((instr >>
   15436                                                                       4) &
   15437                                                                          0xf,
   15438                                                                      dt);
   15439                                       if (!decode_neon.IsValid()) {
   15440                                         UnallocatedT32(instr);
   15441                                         return;
   15442                                       }
   15443                                       Alignment align = decode_neon.GetAlign();
   15444                                       int lane = decode_neon.GetLane();
   15445                                       SpacingType spacing =
   15446                                           decode_neon.GetSpacing();
   15447                                       unsigned first =
   15448                                           ExtractDRegister(instr, 22, 12);
   15449                                       unsigned length = 4;
   15450                                       unsigned last =
   15451                                           first +
   15452                                           (length - 1) *
   15453                                               (spacing == kSingle ? 1 : 2);
   15454                                       unsigned rn = (instr >> 16) & 0xf;
   15455                                       // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
   15456                                       vst4(CurrentCond(),
   15457                                            dt,
   15458                                            NeonRegisterList(DRegister(first),
   15459                                                             DRegister(last),
   15460                                                             spacing,
   15461                                                             lane),
   15462                                            AlignedMemOperand(Register(rn),
   15463                                                              align,
   15464                                                              PostIndex));
   15465                                       break;
   15466                                     }
   15467                                     case 0x00000002: {
   15468                                       // 0xf980030f
   15469                                       if (((instr & 0xc00) == 0xc00)) {
   15470                                         UnallocatedT32(instr);
   15471                                         return;
   15472                                       }
   15473                                       DataType dt =
   15474                                           Dt_size_7_Decode((instr >> 10) & 0x3);
   15475                                       if (dt.Is(kDataTypeValueInvalid)) {
   15476                                         UnallocatedT32(instr);
   15477                                         return;
   15478                                       }
   15479                                       DecodeNeonAndAlign decode_neon =
   15480                                           Align_index_align_3_Decode((instr >>
   15481                                                                       4) &
   15482                                                                          0xf,
   15483                                                                      dt);
   15484                                       if (!decode_neon.IsValid()) {
   15485                                         UnallocatedT32(instr);
   15486                                         return;
   15487                                       }
   15488                                       Alignment align = decode_neon.GetAlign();
   15489                                       int lane = decode_neon.GetLane();
   15490                                       SpacingType spacing =
   15491                                           decode_neon.GetSpacing();
   15492                                       unsigned first =
   15493                                           ExtractDRegister(instr, 22, 12);
   15494                                       unsigned length = 4;
   15495                                       unsigned last =
   15496                                           first +
   15497                                           (length - 1) *
   15498                                               (spacing == kSingle ? 1 : 2);
   15499                                       unsigned rn = (instr >> 16) & 0xf;
   15500                                       // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
   15501                                       vst4(CurrentCond(),
   15502                                            dt,
   15503                                            NeonRegisterList(DRegister(first),
   15504                                                             DRegister(last),
   15505                                                             spacing,
   15506                                                             lane),
   15507                                            AlignedMemOperand(Register(rn),
   15508                                                              align,
   15509                                                              Offset));
   15510                                       break;
   15511                                     }
   15512                                   }
   15513                                   break;
   15514                                 }
   15515                                 default: {
   15516                                   if (((instr & 0xc00) == 0xc00) ||
   15517                                       ((instr & 0xd) == 0xd)) {
   15518                                     UnallocatedT32(instr);
   15519                                     return;
   15520                                   }
   15521                                   DataType dt =
   15522                                       Dt_size_7_Decode((instr >> 10) & 0x3);
   15523                                   if (dt.Is(kDataTypeValueInvalid)) {
   15524                                     UnallocatedT32(instr);
   15525                                     return;
   15526                                   }
   15527                                   DecodeNeonAndAlign decode_neon =
   15528                                       Align_index_align_3_Decode((instr >> 4) &
   15529                                                                      0xf,
   15530                                                                  dt);
   15531                                   if (!decode_neon.IsValid()) {
   15532                                     UnallocatedT32(instr);
   15533                                     return;
   15534                                   }
   15535                                   Alignment align = decode_neon.GetAlign();
   15536                                   int lane = decode_neon.GetLane();
   15537                                   SpacingType spacing =
   15538                                       decode_neon.GetSpacing();
   15539                                   unsigned first =
   15540                                       ExtractDRegister(instr, 22, 12);
   15541                                   unsigned length = 4;
   15542                                   unsigned last =
   15543                                       first +
   15544                                       (length - 1) *
   15545                                           (spacing == kSingle ? 1 : 2);
   15546                                   unsigned rn = (instr >> 16) & 0xf;
   15547                                   unsigned rm = instr & 0xf;
   15548                                   // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
   15549                                   vst4(CurrentCond(),
   15550                                        dt,
   15551                                        NeonRegisterList(DRegister(first),
   15552                                                         DRegister(last),
   15553                                                         spacing,
   15554                                                         lane),
   15555                                        AlignedMemOperand(Register(rn),
   15556                                                          align,
   15557                                                          Register(rm),
   15558                                                          PostIndex));
   15559                                   break;
   15560                                 }
   15561                               }
   15562                               break;
   15563                             }
   15564                           }
   15565                           break;
   15566                         }
   15567                       }
   15568                       break;
   15569                     }
   15570                     case 0x01a00000: {
   15571                       // 0xf9a00000
   15572                       switch (instr & 0x00000300) {
   15573                         case 0x00000000: {
   15574                           // 0xf9a00000
   15575                           switch (instr & 0x00000c00) {
   15576                             case 0x00000c00: {
   15577                               // 0xf9a00c00
   15578                               switch (instr & 0x0000000d) {
   15579                                 case 0x0000000d: {
   15580                                   // 0xf9a00c0d
   15581                                   switch (instr & 0x00000002) {
   15582                                     case 0x00000000: {
   15583                                       // 0xf9a00c0d
   15584                                       DataType dt =
   15585                                           Dt_size_7_Decode((instr >> 6) & 0x3);
   15586                                       if (dt.Is(kDataTypeValueInvalid)) {
   15587                                         UnallocatedT32(instr);
   15588                                         return;
   15589                                       }
   15590                                       Alignment align =
   15591                                           Align_a_1_Decode((instr >> 4) & 0x1,
   15592                                                            dt);
   15593                                       if (dt.Is(kDataTypeValueInvalid) ||
   15594                                           align.Is(kBadAlignment)) {
   15595                                         UnallocatedT32(instr);
   15596                                         return;
   15597                                       }
   15598                                       unsigned first =
   15599                                           ExtractDRegister(instr, 22, 12);
   15600                                       unsigned length;
   15601                                       SpacingType spacing = kSingle;
   15602                                       switch ((instr >> 5) & 0x1) {
   15603                                         default:
   15604                                           VIXL_UNREACHABLE_OR_FALLTHROUGH();
   15605                                         case 0x0:
   15606                                           length = 1;
   15607                                           break;
   15608                                         case 0x1:
   15609                                           length = 2;
   15610                                           break;
   15611                                       }
   15612                                       unsigned last = first + length - 1;
   15613                                       TransferType transfer = kAllLanes;
   15614                                       unsigned rn = (instr >> 16) & 0xf;
   15615                                       // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
   15616                                       vld1(CurrentCond(),
   15617                                            dt,
   15618                                            NeonRegisterList(DRegister(first),
   15619                                                             DRegister(last),
   15620                                                             spacing,
   15621                                                             transfer),
   15622                                            AlignedMemOperand(Register(rn),
   15623                                                              align,
   15624                                                              PostIndex));
   15625                                       break;
   15626                                     }
   15627                                     case 0x00000002: {
   15628                                       // 0xf9a00c0f
   15629                                       DataType dt =
   15630                                           Dt_size_7_Decode((instr >> 6) & 0x3);
   15631                                       if (dt.Is(kDataTypeValueInvalid)) {
   15632                                         UnallocatedT32(instr);
   15633                                         return;
   15634                                       }
   15635                                       Alignment align =
   15636                                           Align_a_1_Decode((instr >> 4) & 0x1,
   15637                                                            dt);
   15638                                       if (dt.Is(kDataTypeValueInvalid) ||
   15639                                           align.Is(kBadAlignment)) {
   15640                                         UnallocatedT32(instr);
   15641                                         return;
   15642                                       }
   15643                                       unsigned first =
   15644                                           ExtractDRegister(instr, 22, 12);
   15645                                       unsigned length;
   15646                                       SpacingType spacing = kSingle;
   15647                                       switch ((instr >> 5) & 0x1) {
   15648                                         default:
   15649                                           VIXL_UNREACHABLE_OR_FALLTHROUGH();
   15650                                         case 0x0:
   15651                                           length = 1;
   15652                                           break;
   15653                                         case 0x1:
   15654                                           length = 2;
   15655                                           break;
   15656                                       }
   15657                                       unsigned last = first + length - 1;
   15658                                       TransferType transfer = kAllLanes;
   15659                                       unsigned rn = (instr >> 16) & 0xf;
   15660                                       // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
   15661                                       vld1(CurrentCond(),
   15662                                            dt,
   15663                                            NeonRegisterList(DRegister(first),
   15664                                                             DRegister(last),
   15665                                                             spacing,
   15666                                                             transfer),
   15667                                            AlignedMemOperand(Register(rn),
   15668                                                              align,
   15669                                                              Offset));
   15670                                       break;
   15671                                     }
   15672                                   }
   15673                                   break;
   15674                                 }
   15675                                 default: {
   15676                                   if (((instr & 0xd) == 0xd)) {
   15677                                     UnallocatedT32(instr);
   15678                                     return;
   15679                                   }
   15680                                   DataType dt =
   15681                                       Dt_size_7_Decode((instr >> 6) & 0x3);
   15682                                   if (dt.Is(kDataTypeValueInvalid)) {
   15683                                     UnallocatedT32(instr);
   15684                                     return;
   15685                                   }
   15686                                   Alignment align =
   15687                                       Align_a_1_Decode((instr >> 4) & 0x1, dt);
   15688                                   if (dt.Is(kDataTypeValueInvalid) ||
   15689                                       align.Is(kBadAlignment)) {
   15690                                     UnallocatedT32(instr);
   15691                                     return;
   15692                                   }
   15693                                   unsigned first =
   15694                                       ExtractDRegister(instr, 22, 12);
   15695                                   unsigned length;
   15696                                   SpacingType spacing = kSingle;
   15697                                   switch ((instr >> 5) & 0x1) {
   15698                                     default:
   15699                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
   15700                                     case 0x0:
   15701                                       length = 1;
   15702                                       break;
   15703                                     case 0x1:
   15704                                       length = 2;
   15705                                       break;
   15706                                   }
   15707                                   unsigned last = first + length - 1;
   15708                                   TransferType transfer = kAllLanes;
   15709                                   unsigned rn = (instr >> 16) & 0xf;
   15710                                   unsigned rm = instr & 0xf;
   15711                                   // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
   15712                                   vld1(CurrentCond(),
   15713                                        dt,
   15714                                        NeonRegisterList(DRegister(first),
   15715                                                         DRegister(last),
   15716                                                         spacing,
   15717                                                         transfer),
   15718                                        AlignedMemOperand(Register(rn),
   15719                                                          align,
   15720                                                          Register(rm),
   15721                                                          PostIndex));
   15722                                   break;
   15723                                 }
   15724                               }
   15725                               break;
   15726                             }
   15727                             default: {
   15728                               switch (instr & 0x0000000d) {
   15729                                 case 0x0000000d: {
   15730                                   // 0xf9a0000d
   15731                                   switch (instr & 0x00000002) {
   15732                                     case 0x00000000: {
   15733                                       // 0xf9a0000d
   15734                                       if (((instr & 0xc00) == 0xc00)) {
   15735                                         UnallocatedT32(instr);
   15736                                         return;
   15737                                       }
   15738                                       DataType dt =
   15739                                           Dt_size_7_Decode((instr >> 10) & 0x3);
   15740                                       if (dt.Is(kDataTypeValueInvalid)) {
   15741                                         UnallocatedT32(instr);
   15742                                         return;
   15743                                       }
   15744                                       DecodeNeonAndAlign decode_neon =
   15745                                           Align_index_align_1_Decode((instr >>
   15746                                                                       4) &
   15747                                                                          0xf,
   15748                                                                      dt);
   15749                                       if (!decode_neon.IsValid()) {
   15750                                         UnallocatedT32(instr);
   15751                                         return;
   15752                                       }
   15753                                       Alignment align = decode_neon.GetAlign();
   15754                                       int lane = decode_neon.GetLane();
   15755                                       SpacingType spacing =
   15756                                           decode_neon.GetSpacing();
   15757                                       unsigned first =
   15758                                           ExtractDRegister(instr, 22, 12);
   15759                                       unsigned length = 1;
   15760                                       unsigned last = first + length - 1;
   15761                                       unsigned rn = (instr >> 16) & 0xf;
   15762                                       // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
   15763                                       vld1(CurrentCond(),
   15764                                            dt,
   15765                                            NeonRegisterList(DRegister(first),
   15766                                                             DRegister(last),
   15767                                                             spacing,
   15768                                                             lane),
   15769                                            AlignedMemOperand(Register(rn),
   15770                                                              align,
   15771                                                              PostIndex));
   15772                                       break;
   15773                                     }
   15774                                     case 0x00000002: {
   15775                                       // 0xf9a0000f
   15776                                       if (((instr & 0xc00) == 0xc00)) {
   15777                                         UnallocatedT32(instr);
   15778                                         return;
   15779                                       }
   15780                                       DataType dt =
   15781                                           Dt_size_7_Decode((instr >> 10) & 0x3);
   15782                                       if (dt.Is(kDataTypeValueInvalid)) {
   15783                                         UnallocatedT32(instr);
   15784                                         return;
   15785                                       }
   15786                                       DecodeNeonAndAlign decode_neon =
   15787                                           Align_index_align_1_Decode((instr >>
   15788                                                                       4) &
   15789                                                                          0xf,
   15790                                                                      dt);
   15791                                       if (!decode_neon.IsValid()) {
   15792                                         UnallocatedT32(instr);
   15793                                         return;
   15794                                       }
   15795                                       Alignment align = decode_neon.GetAlign();
   15796                                       int lane = decode_neon.GetLane();
   15797                                       SpacingType spacing =
   15798                                           decode_neon.GetSpacing();
   15799                                       unsigned first =
   15800                                           ExtractDRegister(instr, 22, 12);
   15801                                       unsigned length = 1;
   15802                                       unsigned last = first + length - 1;
   15803                                       unsigned rn = (instr >> 16) & 0xf;
   15804                                       // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
   15805                                       vld1(CurrentCond(),
   15806                                            dt,
   15807                                            NeonRegisterList(DRegister(first),
   15808                                                             DRegister(last),
   15809                                                             spacing,
   15810                                                             lane),
   15811                                            AlignedMemOperand(Register(rn),
   15812                                                              align,
   15813                                                              Offset));
   15814                                       break;
   15815                                     }
   15816                                   }
   15817                                   break;
   15818                                 }
   15819                                 default: {
   15820                                   if (((instr & 0xc00) == 0xc00) ||
   15821                                       ((instr & 0xd) == 0xd)) {
   15822                                     UnallocatedT32(instr);
   15823                                     return;
   15824                                   }
   15825                                   DataType dt =
   15826                                       Dt_size_7_Decode((instr >> 10) & 0x3);
   15827                                   if (dt.Is(kDataTypeValueInvalid)) {
   15828                                     UnallocatedT32(instr);
   15829                                     return;
   15830                                   }
   15831                                   DecodeNeonAndAlign decode_neon =
   15832                                       Align_index_align_1_Decode((instr >> 4) &
   15833                                                                      0xf,
   15834                                                                  dt);
   15835                                   if (!decode_neon.IsValid()) {
   15836                                     UnallocatedT32(instr);
   15837                                     return;
   15838                                   }
   15839                                   Alignment align = decode_neon.GetAlign();
   15840                                   int lane = decode_neon.GetLane();
   15841                                   SpacingType spacing =
   15842                                       decode_neon.GetSpacing();
   15843                                   unsigned first =
   15844                                       ExtractDRegister(instr, 22, 12);
   15845                                   unsigned length = 1;
   15846                                   unsigned last = first + length - 1;
   15847                                   unsigned rn = (instr >> 16) & 0xf;
   15848                                   unsigned rm = instr & 0xf;
   15849                                   // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
   15850                                   vld1(CurrentCond(),
   15851                                        dt,
   15852                                        NeonRegisterList(DRegister(first),
   15853                                                         DRegister(last),
   15854                                                         spacing,
   15855                                                         lane),
   15856                                        AlignedMemOperand(Register(rn),
   15857                                                          align,
   15858                                                          Register(rm),
   15859                                                          PostIndex));
   15860                                   break;
   15861                                 }
   15862                               }
   15863                               break;
   15864                             }
   15865                           }
   15866                           break;
   15867                         }
   15868                         case 0x00000100: {
   15869                           // 0xf9a00100
   15870                           switch (instr & 0x00000c00) {
   15871                             case 0x00000c00: {
   15872                               // 0xf9a00d00
   15873                               switch (instr & 0x0000000d) {
   15874                                 case 0x0000000d: {
   15875                                   // 0xf9a00d0d
   15876                                   switch (instr & 0x00000002) {
   15877                                     case 0x00000000: {
   15878                                       // 0xf9a00d0d
   15879                                       DataType dt =
   15880                                           Dt_size_7_Decode((instr >> 6) & 0x3);
   15881                                       if (dt.Is(kDataTypeValueInvalid)) {
   15882                                         UnallocatedT32(instr);
   15883                                         return;
   15884                                       }
   15885                                       Alignment align =
   15886                                           Align_a_2_Decode((instr >> 4) & 0x1,
   15887                                                            dt);
   15888                                       if (dt.Is(kDataTypeValueInvalid) ||
   15889                                           align.Is(kBadAlignment)) {
   15890                                         UnallocatedT32(instr);
   15891                                         return;
   15892                                       }
   15893                                       unsigned first =
   15894                                           ExtractDRegister(instr, 22, 12);
   15895                                       unsigned length;
   15896                                       SpacingType spacing;
   15897                                       switch ((instr >> 5) & 0x1) {
   15898                                         default:
   15899                                           VIXL_UNREACHABLE_OR_FALLTHROUGH();
   15900                                         case 0x0:
   15901                                           length = 2;
   15902                                           spacing = kSingle;
   15903                                           break;
   15904                                         case 0x1:
   15905                                           length = 2;
   15906                                           spacing = kDouble;
   15907                                           break;
   15908                                       }
   15909                                       unsigned last =
   15910                                           first +
   15911                                           (length - 1) *
   15912                                               (spacing == kSingle ? 1 : 2);
   15913                                       TransferType transfer = kAllLanes;
   15914                                       unsigned rn = (instr >> 16) & 0xf;
   15915                                       // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
   15916                                       vld2(CurrentCond(),
   15917                                            dt,
   15918                                            NeonRegisterList(DRegister(first),
   15919                                                             DRegister(last),
   15920                                                             spacing,
   15921                                                             transfer),
   15922                                            AlignedMemOperand(Register(rn),
   15923                                                              align,
   15924                                                              PostIndex));
   15925                                       break;
   15926                                     }
   15927                                     case 0x00000002: {
   15928                                       // 0xf9a00d0f
   15929                                       DataType dt =
   15930                                           Dt_size_7_Decode((instr >> 6) & 0x3);
   15931                                       if (dt.Is(kDataTypeValueInvalid)) {
   15932                                         UnallocatedT32(instr);
   15933                                         return;
   15934                                       }
   15935                                       Alignment align =
   15936                                           Align_a_2_Decode((instr >> 4) & 0x1,
   15937                                                            dt);
   15938                                       if (dt.Is(kDataTypeValueInvalid) ||
   15939                                           align.Is(kBadAlignment)) {
   15940                                         UnallocatedT32(instr);
   15941                                         return;
   15942                                       }
   15943                                       unsigned first =
   15944                                           ExtractDRegister(instr, 22, 12);
   15945                                       unsigned length;
   15946                                       SpacingType spacing;
   15947                                       switch ((instr >> 5) & 0x1) {
   15948                                         default:
   15949                                           VIXL_UNREACHABLE_OR_FALLTHROUGH();
   15950                                         case 0x0:
   15951                                           length = 2;
   15952                                           spacing = kSingle;
   15953                                           break;
   15954                                         case 0x1:
   15955                                           length = 2;
   15956                                           spacing = kDouble;
   15957                                           break;
   15958                                       }
   15959                                       unsigned last =
   15960                                           first +
   15961                                           (length - 1) *
   15962                                               (spacing == kSingle ? 1 : 2);
   15963                                       TransferType transfer = kAllLanes;
   15964                                       unsigned rn = (instr >> 16) & 0xf;
   15965                                       // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
   15966                                       vld2(CurrentCond(),
   15967                                            dt,
   15968                                            NeonRegisterList(DRegister(first),
   15969                                                             DRegister(last),
   15970                                                             spacing,
   15971                                                             transfer),
   15972                                            AlignedMemOperand(Register(rn),
   15973                                                              align,
   15974                                                              Offset));
   15975                                       break;
   15976                                     }
   15977                                   }
   15978                                   break;
   15979                                 }
   15980                                 default: {
   15981                                   if (((instr & 0xd) == 0xd)) {
   15982                                     UnallocatedT32(instr);
   15983                                     return;
   15984                                   }
   15985                                   DataType dt =
   15986                                       Dt_size_7_Decode((instr >> 6) & 0x3);
   15987                                   if (dt.Is(kDataTypeValueInvalid)) {
   15988                                     UnallocatedT32(instr);
   15989                                     return;
   15990                                   }
   15991                                   Alignment align =
   15992                                       Align_a_2_Decode((instr >> 4) & 0x1, dt);
   15993                                   if (dt.Is(kDataTypeValueInvalid) ||
   15994                                       align.Is(kBadAlignment)) {
   15995                                     UnallocatedT32(instr);
   15996                                     return;
   15997                                   }
   15998                                   unsigned first =
   15999                                       ExtractDRegister(instr, 22, 12);
   16000                                   unsigned length;
   16001                                   SpacingType spacing;
   16002                                   switch ((instr >> 5) & 0x1) {
   16003                                     default:
   16004                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
   16005                                     case 0x0:
   16006                                       length = 2;
   16007                                       spacing = kSingle;
   16008                                       break;
   16009                                     case 0x1:
   16010                                       length = 2;
   16011                                       spacing = kDouble;
   16012                                       break;
   16013                                   }
   16014                                   unsigned last =
   16015                                       first +
   16016                                       (length - 1) *
   16017                                           (spacing == kSingle ? 1 : 2);
   16018                                   TransferType transfer = kAllLanes;
   16019                                   unsigned rn = (instr >> 16) & 0xf;
   16020                                   unsigned rm = instr & 0xf;
   16021                                   // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
   16022                                   vld2(CurrentCond(),
   16023                                        dt,
   16024                                        NeonRegisterList(DRegister(first),
   16025                                                         DRegister(last),
   16026                                                         spacing,
   16027                                                         transfer),
   16028                                        AlignedMemOperand(Register(rn),
   16029                                                          align,
   16030                                                          Register(rm),
   16031                                                          PostIndex));
   16032                                   break;
   16033                                 }
   16034                               }
   16035                               break;
   16036                             }
   16037                             default: {
   16038                               switch (instr & 0x0000000d) {
   16039                                 case 0x0000000d: {
   16040                                   // 0xf9a0010d
   16041                                   switch (instr & 0x00000002) {
   16042                                     case 0x00000000: {
   16043                                       // 0xf9a0010d
   16044                                       if (((instr & 0xc00) == 0xc00)) {
   16045                                         UnallocatedT32(instr);
   16046                                         return;
   16047                                       }
   16048                                       DataType dt =
   16049                                           Dt_size_7_Decode((instr >> 10) & 0x3);
   16050                                       if (dt.Is(kDataTypeValueInvalid)) {
   16051                                         UnallocatedT32(instr);
   16052                                         return;
   16053                                       }
   16054                                       DecodeNeonAndAlign decode_neon =
   16055                                           Align_index_align_2_Decode((instr >>
   16056                                                                       4) &
   16057                                                                          0xf,
   16058                                                                      dt);
   16059                                       if (!decode_neon.IsValid()) {
   16060                                         UnallocatedT32(instr);
   16061                                         return;
   16062                                       }
   16063                                       Alignment align = decode_neon.GetAlign();
   16064                                       int lane = decode_neon.GetLane();
   16065                                       SpacingType spacing =
   16066                                           decode_neon.GetSpacing();
   16067                                       unsigned first =
   16068                                           ExtractDRegister(instr, 22, 12);
   16069                                       unsigned length = 2;
   16070                                       unsigned last =
   16071                                           first +
   16072                                           (length - 1) *
   16073                                               (spacing == kSingle ? 1 : 2);
   16074                                       unsigned rn = (instr >> 16) & 0xf;
   16075                                       // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
   16076                                       vld2(CurrentCond(),
   16077                                            dt,
   16078                                            NeonRegisterList(DRegister(first),
   16079                                                             DRegister(last),
   16080                                                             spacing,
   16081                                                             lane),
   16082                                            AlignedMemOperand(Register(rn),
   16083                                                              align,
   16084                                                              PostIndex));
   16085                                       break;
   16086                                     }
   16087                                     case 0x00000002: {
   16088                                       // 0xf9a0010f
   16089                                       if (((instr & 0xc00) == 0xc00)) {
   16090                                         UnallocatedT32(instr);
   16091                                         return;
   16092                                       }
   16093                                       DataType dt =
   16094                                           Dt_size_7_Decode((instr >> 10) & 0x3);
   16095                                       if (dt.Is(kDataTypeValueInvalid)) {
   16096                                         UnallocatedT32(instr);
   16097                                         return;
   16098                                       }
   16099                                       DecodeNeonAndAlign decode_neon =
   16100                                           Align_index_align_2_Decode((instr >>
   16101                                                                       4) &
   16102                                                                          0xf,
   16103                                                                      dt);
   16104                                       if (!decode_neon.IsValid()) {
   16105                                         UnallocatedT32(instr);
   16106                                         return;
   16107                                       }
   16108                                       Alignment align = decode_neon.GetAlign();
   16109                                       int lane = decode_neon.GetLane();
   16110                                       SpacingType spacing =
   16111                                           decode_neon.GetSpacing();
   16112                                       unsigned first =
   16113                                           ExtractDRegister(instr, 22, 12);
   16114                                       unsigned length = 2;
   16115                                       unsigned last =
   16116                                           first +
   16117                                           (length - 1) *
   16118                                               (spacing == kSingle ? 1 : 2);
   16119                                       unsigned rn = (instr >> 16) & 0xf;
   16120                                       // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
   16121                                       vld2(CurrentCond(),
   16122                                            dt,
   16123                                            NeonRegisterList(DRegister(first),
   16124                                                             DRegister(last),
   16125                                                             spacing,
   16126                                                             lane),
   16127                                            AlignedMemOperand(Register(rn),
   16128                                                              align,
   16129                                                              Offset));
   16130                                       break;
   16131                                     }
   16132                                   }
   16133                                   break;
   16134                                 }
   16135                                 default: {
   16136                                   if (((instr & 0xc00) == 0xc00) ||
   16137                                       ((instr & 0xd) == 0xd)) {
   16138                                     UnallocatedT32(instr);
   16139                                     return;
   16140                                   }
   16141                                   DataType dt =
   16142                                       Dt_size_7_Decode((instr >> 10) & 0x3);
   16143                                   if (dt.Is(kDataTypeValueInvalid)) {
   16144                                     UnallocatedT32(instr);
   16145                                     return;
   16146                                   }
   16147                                   DecodeNeonAndAlign decode_neon =
   16148                                       Align_index_align_2_Decode((instr >> 4) &
   16149                                                                      0xf,
   16150                                                                  dt);
   16151                                   if (!decode_neon.IsValid()) {
   16152                                     UnallocatedT32(instr);
   16153                                     return;
   16154                                   }
   16155                                   Alignment align = decode_neon.GetAlign();
   16156                                   int lane = decode_neon.GetLane();
   16157                                   SpacingType spacing =
   16158                                       decode_neon.GetSpacing();
   16159                                   unsigned first =
   16160                                       ExtractDRegister(instr, 22, 12);
   16161                                   unsigned length = 2;
   16162                                   unsigned last =
   16163                                       first +
   16164                                       (length - 1) *
   16165                                           (spacing == kSingle ? 1 : 2);
   16166                                   unsigned rn = (instr >> 16) & 0xf;
   16167                                   unsigned rm = instr & 0xf;
   16168                                   // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
   16169                                   vld2(CurrentCond(),
   16170                                        dt,
   16171                                        NeonRegisterList(DRegister(first),
   16172                                                         DRegister(last),
   16173                                                         spacing,
   16174                                                         lane),
   16175                                        AlignedMemOperand(Register(rn),
   16176                                                          align,
   16177                                                          Register(rm),
   16178                                                          PostIndex));
   16179                                   break;
   16180                                 }
   16181                               }
   16182                               break;
   16183                             }
   16184                           }
   16185                           break;
   16186                         }
   16187                         case 0x00000200: {
   16188                           // 0xf9a00200
   16189                           switch (instr & 0x00000c00) {
   16190                             case 0x00000c00: {
   16191                               // 0xf9a00e00
   16192                               switch (instr & 0x00000010) {
   16193                                 case 0x00000000: {
   16194                                   // 0xf9a00e00
   16195                                   switch (instr & 0x0000000d) {
   16196                                     case 0x0000000d: {
   16197                                       // 0xf9a00e0d
   16198                                       switch (instr & 0x00000002) {
   16199                                         case 0x00000000: {
   16200                                           // 0xf9a00e0d
   16201                                           DataType dt = Dt_size_7_Decode(
   16202                                               (instr >> 6) & 0x3);
   16203                                           if (dt.Is(kDataTypeValueInvalid)) {
   16204                                             UnallocatedT32(instr);
   16205                                             return;
   16206                                           }
   16207                                           unsigned first =
   16208                                               ExtractDRegister(instr, 22, 12);
   16209                                           unsigned length;
   16210                                           SpacingType spacing;
   16211                                           switch ((instr >> 5) & 0x1) {
   16212                                             default:
   16213                                               VIXL_UNREACHABLE_OR_FALLTHROUGH();
   16214                                             case 0x0:
   16215                                               length = 3;
   16216                                               spacing = kSingle;
   16217                                               break;
   16218                                             case 0x1:
   16219                                               length = 3;
   16220                                               spacing = kDouble;
   16221                                               break;
   16222                                           }
   16223                                           unsigned last =
   16224                                               first +
   16225                                               (length - 1) *
   16226                                                   (spacing == kSingle ? 1 : 2);
   16227                                           TransferType transfer = kAllLanes;
   16228                                           unsigned rn = (instr >> 16) & 0xf;
   16229                                           // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>]! ; T1 NOLINT(whitespace/line_length)
   16230                                           vld3(CurrentCond(),
   16231                                                dt,
   16232                                                NeonRegisterList(DRegister(
   16233                                                                     first),
   16234                                                                 DRegister(last),
   16235                                                                 spacing,
   16236                                                                 transfer),
   16237                                                MemOperand(Register(rn),
   16238                                                           PreIndex));
   16239                                           break;
   16240                                         }
   16241                                         case 0x00000002: {
   16242                                           // 0xf9a00e0f
   16243                                           DataType dt = Dt_size_7_Decode(
   16244                                               (instr >> 6) & 0x3);
   16245                                           if (dt.Is(kDataTypeValueInvalid)) {
   16246                                             UnallocatedT32(instr);
   16247                                             return;
   16248                                           }
   16249                                           unsigned first =
   16250                                               ExtractDRegister(instr, 22, 12);
   16251                                           unsigned length;
   16252                                           SpacingType spacing;
   16253                                           switch ((instr >> 5) & 0x1) {
   16254                                             default:
   16255                                               VIXL_UNREACHABLE_OR_FALLTHROUGH();
   16256                                             case 0x0:
   16257                                               length = 3;
   16258                                               spacing = kSingle;
   16259                                               break;
   16260                                             case 0x1:
   16261                                               length = 3;
   16262                                               spacing = kDouble;
   16263                                               break;
   16264                                           }
   16265                                           unsigned last =
   16266                                               first +
   16267                                               (length - 1) *
   16268                                                   (spacing == kSingle ? 1 : 2);
   16269                                           TransferType transfer = kAllLanes;
   16270                                           unsigned rn = (instr >> 16) & 0xf;
   16271                                           // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>] ; T1 NOLINT(whitespace/line_length)
   16272                                           vld3(CurrentCond(),
   16273                                                dt,
   16274                                                NeonRegisterList(DRegister(
   16275                                                                     first),
   16276                                                                 DRegister(last),
   16277                                                                 spacing,
   16278                                                                 transfer),
   16279                                                MemOperand(Register(rn),
   16280                                                           Offset));
   16281                                           break;
   16282                                         }
   16283                                       }
   16284                                       break;
   16285                                     }
   16286                                     default: {
   16287                                       if (((instr & 0xd) == 0xd)) {
   16288                                         UnallocatedT32(instr);
   16289                                         return;
   16290                                       }
   16291                                       DataType dt =
   16292                                           Dt_size_7_Decode((instr >> 6) & 0x3);
   16293                                       if (dt.Is(kDataTypeValueInvalid)) {
   16294                                         UnallocatedT32(instr);
   16295                                         return;
   16296                                       }
   16297                                       unsigned first =
   16298                                           ExtractDRegister(instr, 22, 12);
   16299                                       unsigned length;
   16300                                       SpacingType spacing;
   16301                                       switch ((instr >> 5) & 0x1) {
   16302                                         default:
   16303                                           VIXL_UNREACHABLE_OR_FALLTHROUGH();
   16304                                         case 0x0:
   16305                                           length = 3;
   16306                                           spacing = kSingle;
   16307                                           break;
   16308                                         case 0x1:
   16309                                           length = 3;
   16310                                           spacing = kDouble;
   16311                                           break;
   16312                                       }
   16313                                       unsigned last =
   16314                                           first +
   16315                                           (length - 1) *
   16316                                               (spacing == kSingle ? 1 : 2);
   16317                                       TransferType transfer = kAllLanes;
   16318                                       unsigned rn = (instr >> 16) & 0xf;
   16319                                       Sign sign(plus);
   16320                                       unsigned rm = instr & 0xf;
   16321                                       // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>], #<Rm> ; T1 NOLINT(whitespace/line_length)
   16322                                       vld3(CurrentCond(),
   16323                                            dt,
   16324                                            NeonRegisterList(DRegister(first),
   16325                                                             DRegister(last),
   16326                                                             spacing,
   16327                                                             transfer),
   16328                                            MemOperand(Register(rn),
   16329                                                       sign,
   16330                                                       Register(rm),
   16331                                                       PostIndex));
   16332                                       break;
   16333                                     }
   16334                                   }
   16335                                   break;
   16336                                 }
   16337                                 default:
   16338                                   UnallocatedT32(instr);
   16339                                   break;
   16340                               }
   16341                               break;
   16342                             }
   16343                             default: {
   16344                               switch (instr & 0x0000000d) {
   16345                                 case 0x0000000d: {
   16346                                   // 0xf9a0020d
   16347                                   switch (instr & 0x00000002) {
   16348                                     case 0x00000000: {
   16349                                       // 0xf9a0020d
   16350                                       if (((instr & 0xc00) == 0xc00)) {
   16351                                         UnallocatedT32(instr);
   16352                                         return;
   16353                                       }
   16354                                       DataType dt =
   16355                                           Dt_size_7_Decode((instr >> 10) & 0x3);
   16356                                       if (dt.Is(kDataTypeValueInvalid)) {
   16357                                         UnallocatedT32(instr);
   16358                                         return;
   16359                                       }
   16360                                       DecodeNeon decode_neon =
   16361                                           Index_1_Decode((instr >> 4) & 0xf,
   16362                                                          dt);
   16363                                       if (!decode_neon.IsValid()) {
   16364                                         UnallocatedT32(instr);
   16365                                         return;
   16366                                       }
   16367                                       int lane = decode_neon.GetLane();
   16368                                       SpacingType spacing =
   16369                                           decode_neon.GetSpacing();
   16370                                       unsigned first =
   16371                                           ExtractDRegister(instr, 22, 12);
   16372                                       unsigned length = 3;
   16373                                       unsigned last =
   16374                                           first +
   16375                                           (length - 1) *
   16376                                               (spacing == kSingle ? 1 : 2);
   16377                                       unsigned rn = (instr >> 16) & 0xf;
   16378                                       // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>]! ; T1 NOLINT(whitespace/line_length)
   16379                                       vld3(CurrentCond(),
   16380                                            dt,
   16381                                            NeonRegisterList(DRegister(first),
   16382                                                             DRegister(last),
   16383                                                             spacing,
   16384                                                             lane),
   16385                                            MemOperand(Register(rn), PreIndex));
   16386                                       break;
   16387                                     }
   16388                                     case 0x00000002: {
   16389                                       // 0xf9a0020f
   16390                                       if (((instr & 0xc00) == 0xc00)) {
   16391                                         UnallocatedT32(instr);
   16392                                         return;
   16393                                       }
   16394                                       DataType dt =
   16395                                           Dt_size_7_Decode((instr >> 10) & 0x3);
   16396                                       if (dt.Is(kDataTypeValueInvalid)) {
   16397                                         UnallocatedT32(instr);
   16398                                         return;
   16399                                       }
   16400                                       DecodeNeon decode_neon =
   16401                                           Index_1_Decode((instr >> 4) & 0xf,
   16402                                                          dt);
   16403                                       if (!decode_neon.IsValid()) {
   16404                                         UnallocatedT32(instr);
   16405                                         return;
   16406                                       }
   16407                                       int lane = decode_neon.GetLane();
   16408                                       SpacingType spacing =
   16409                                           decode_neon.GetSpacing();
   16410                                       unsigned first =
   16411                                           ExtractDRegister(instr, 22, 12);
   16412                                       unsigned length = 3;
   16413                                       unsigned last =
   16414                                           first +
   16415                                           (length - 1) *
   16416                                               (spacing == kSingle ? 1 : 2);
   16417                                       unsigned rn = (instr >> 16) & 0xf;
   16418                                       // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>] ; T1
   16419                                       vld3(CurrentCond(),
   16420                                            dt,
   16421                                            NeonRegisterList(DRegister(first),
   16422                                                             DRegister(last),
   16423                                                             spacing,
   16424                                                             lane),
   16425                                            MemOperand(Register(rn), Offset));
   16426                                       break;
   16427                                     }
   16428                                   }
   16429                                   break;
   16430                                 }
   16431                                 default: {
   16432                                   if (((instr & 0xc00) == 0xc00) ||
   16433                                       ((instr & 0xd) == 0xd)) {
   16434                                     UnallocatedT32(instr);
   16435                                     return;
   16436                                   }
   16437                                   DataType dt =
   16438                                       Dt_size_7_Decode((instr >> 10) & 0x3);
   16439                                   if (dt.Is(kDataTypeValueInvalid)) {
   16440                                     UnallocatedT32(instr);
   16441                                     return;
   16442                                   }
   16443                                   DecodeNeon decode_neon =
   16444                                       Index_1_Decode((instr >> 4) & 0xf, dt);
   16445                                   if (!decode_neon.IsValid()) {
   16446                                     UnallocatedT32(instr);
   16447                                     return;
   16448                                   }
   16449                                   int lane = decode_neon.GetLane();
   16450                                   SpacingType spacing =
   16451                                       decode_neon.GetSpacing();
   16452                                   unsigned first =
   16453                                       ExtractDRegister(instr, 22, 12);
   16454                                   unsigned length = 3;
   16455                                   unsigned last =
   16456                                       first +
   16457                                       (length - 1) *
   16458                                           (spacing == kSingle ? 1 : 2);
   16459                                   unsigned rn = (instr >> 16) & 0xf;
   16460                                   Sign sign(plus);
   16461                                   unsigned rm = instr & 0xf;
   16462                                   // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>], #<Rm> ; T1 NOLINT(whitespace/line_length)
   16463                                   vld3(CurrentCond(),
   16464                                        dt,
   16465                                        NeonRegisterList(DRegister(first),
   16466                                                         DRegister(last),
   16467                                                         spacing,
   16468                                                         lane),
   16469                                        MemOperand(Register(rn),
   16470                                                   sign,
   16471                                                   Register(rm),
   16472                                                   PostIndex));
   16473                                   break;
   16474                                 }
   16475                               }
   16476                               break;
   16477                             }
   16478                           }
   16479                           break;
   16480                         }
   16481                         case 0x00000300: {
   16482                           // 0xf9a00300
   16483                           switch (instr & 0x00000c00) {
   16484                             case 0x00000c00: {
   16485                               // 0xf9a00f00
   16486                               switch (instr & 0x0000000d) {
   16487                                 case 0x0000000d: {
   16488                                   // 0xf9a00f0d
   16489                                   switch (instr & 0x00000002) {
   16490                                     case 0x00000000: {
   16491                                       // 0xf9a00f0d
   16492                                       DataType dt =
   16493                                           Dt_size_8_Decode((instr >> 6) & 0x3);
   16494                                       if (dt.Is(kDataTypeValueInvalid)) {
   16495                                         UnallocatedT32(instr);
   16496                                         return;
   16497                                       }
   16498                                       Alignment align =
   16499                                           Align_a_3_Decode((instr >> 4) & 0x1,
   16500                                                            dt,
   16501                                                            (instr >> 6) & 0x3);
   16502                                       if (dt.Is(kDataTypeValueInvalid) ||
   16503                                           align.Is(kBadAlignment)) {
   16504                                         UnallocatedT32(instr);
   16505                                         return;
   16506                                       }
   16507                                       unsigned first =
   16508                                           ExtractDRegister(instr, 22, 12);
   16509                                       unsigned length;
   16510                                       SpacingType spacing;
   16511                                       switch ((instr >> 5) & 0x1) {
   16512                                         default:
   16513                                           VIXL_UNREACHABLE_OR_FALLTHROUGH();
   16514                                         case 0x0:
   16515                                           length = 4;
   16516                                           spacing = kSingle;
   16517                                           break;
   16518                                         case 0x1:
   16519                                           length = 4;
   16520                                           spacing = kDouble;
   16521                                           break;
   16522                                       }
   16523                                       unsigned last =
   16524                                           first +
   16525                                           (length - 1) *
   16526                                               (spacing == kSingle ? 1 : 2);
   16527                                       TransferType transfer = kAllLanes;
   16528                                       unsigned rn = (instr >> 16) & 0xf;
   16529                                       // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
   16530                                       vld4(CurrentCond(),
   16531                                            dt,
   16532                                            NeonRegisterList(DRegister(first),
   16533                                                             DRegister(last),
   16534                                                             spacing,
   16535                                                             transfer),
   16536                                            AlignedMemOperand(Register(rn),
   16537                                                              align,
   16538                                                              PostIndex));
   16539                                       break;
   16540                                     }
   16541                                     case 0x00000002: {
   16542                                       // 0xf9a00f0f
   16543                                       DataType dt =
   16544                                           Dt_size_8_Decode((instr >> 6) & 0x3);
   16545                                       if (dt.Is(kDataTypeValueInvalid)) {
   16546                                         UnallocatedT32(instr);
   16547                                         return;
   16548                                       }
   16549                                       Alignment align =
   16550                                           Align_a_3_Decode((instr >> 4) & 0x1,
   16551                                                            dt,
   16552                                                            (instr >> 6) & 0x3);
   16553                                       if (dt.Is(kDataTypeValueInvalid) ||
   16554                                           align.Is(kBadAlignment)) {
   16555                                         UnallocatedT32(instr);
   16556                                         return;
   16557                                       }
   16558                                       unsigned first =
   16559                                           ExtractDRegister(instr, 22, 12);
   16560                                       unsigned length;
   16561                                       SpacingType spacing;
   16562                                       switch ((instr >> 5) & 0x1) {
   16563                                         default:
   16564                                           VIXL_UNREACHABLE_OR_FALLTHROUGH();
   16565                                         case 0x0:
   16566                                           length = 4;
   16567                                           spacing = kSingle;
   16568                                           break;
   16569                                         case 0x1:
   16570                                           length = 4;
   16571                                           spacing = kDouble;
   16572                                           break;
   16573                                       }
   16574                                       unsigned last =
   16575                                           first +
   16576                                           (length - 1) *
   16577                                               (spacing == kSingle ? 1 : 2);
   16578                                       TransferType transfer = kAllLanes;
   16579                                       unsigned rn = (instr >> 16) & 0xf;
   16580                                       // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
   16581                                       vld4(CurrentCond(),
   16582                                            dt,
   16583                                            NeonRegisterList(DRegister(first),
   16584                                                             DRegister(last),
   16585                                                             spacing,
   16586                                                             transfer),
   16587                                            AlignedMemOperand(Register(rn),
   16588                                                              align,
   16589                                                              Offset));
   16590                                       break;
   16591                                     }
   16592                                   }
   16593                                   break;
   16594                                 }
   16595                                 default: {
   16596                                   if (((instr & 0xd) == 0xd)) {
   16597                                     UnallocatedT32(instr);
   16598                                     return;
   16599                                   }
   16600                                   DataType dt =
   16601                                       Dt_size_8_Decode((instr >> 6) & 0x3);
   16602                                   if (dt.Is(kDataTypeValueInvalid)) {
   16603                                     UnallocatedT32(instr);
   16604                                     return;
   16605                                   }
   16606                                   Alignment align =
   16607                                       Align_a_3_Decode((instr >> 4) & 0x1,
   16608                                                        dt,
   16609                                                        (instr >> 6) & 0x3);
   16610                                   if (dt.Is(kDataTypeValueInvalid) ||
   16611                                       align.Is(kBadAlignment)) {
   16612                                     UnallocatedT32(instr);
   16613                                     return;
   16614                                   }
   16615                                   unsigned first =
   16616                                       ExtractDRegister(instr, 22, 12);
   16617                                   unsigned length;
   16618                                   SpacingType spacing;
   16619                                   switch ((instr >> 5) & 0x1) {
   16620                                     default:
   16621                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
   16622                                     case 0x0:
   16623                                       length = 4;
   16624                                       spacing = kSingle;
   16625                                       break;
   16626                                     case 0x1:
   16627                                       length = 4;
   16628                                       spacing = kDouble;
   16629                                       break;
   16630                                   }
   16631                                   unsigned last =
   16632                                       first +
   16633                                       (length - 1) *
   16634                                           (spacing == kSingle ? 1 : 2);
   16635                                   TransferType transfer = kAllLanes;
   16636                                   unsigned rn = (instr >> 16) & 0xf;
   16637                                   unsigned rm = instr & 0xf;
   16638                                   // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
   16639                                   vld4(CurrentCond(),
   16640                                        dt,
   16641                                        NeonRegisterList(DRegister(first),
   16642                                                         DRegister(last),
   16643                                                         spacing,
   16644                                                         transfer),
   16645                                        AlignedMemOperand(Register(rn),
   16646                                                          align,
   16647                                                          Register(rm),
   16648                                                          PostIndex));
   16649                                   break;
   16650                                 }
   16651                               }
   16652                               break;
   16653                             }
   16654                             default: {
   16655                               switch (instr & 0x0000000d) {
   16656                                 case 0x0000000d: {
   16657                                   // 0xf9a0030d
   16658                                   switch (instr & 0x00000002) {
   16659                                     case 0x00000000: {
   16660                                       // 0xf9a0030d
   16661                                       if (((instr & 0xc00) == 0xc00)) {
   16662                                         UnallocatedT32(instr);
   16663                                         return;
   16664                                       }
   16665                                       DataType dt =
   16666                                           Dt_size_7_Decode((instr >> 10) & 0x3);
   16667                                       if (dt.Is(kDataTypeValueInvalid)) {
   16668                                         UnallocatedT32(instr);
   16669                                         return;
   16670                                       }
   16671                                       DecodeNeonAndAlign decode_neon =
   16672                                           Align_index_align_3_Decode((instr >>
   16673                                                                       4) &
   16674                                                                          0xf,
   16675                                                                      dt);
   16676                                       if (!decode_neon.IsValid()) {
   16677                                         UnallocatedT32(instr);
   16678                                         return;
   16679                                       }
   16680                                       Alignment align = decode_neon.GetAlign();
   16681                                       int lane = decode_neon.GetLane();
   16682                                       SpacingType spacing =
   16683                                           decode_neon.GetSpacing();
   16684                                       unsigned first =
   16685                                           ExtractDRegister(instr, 22, 12);
   16686                                       unsigned length = 4;
   16687                                       unsigned last =
   16688                                           first +
   16689                                           (length - 1) *
   16690                                               (spacing == kSingle ? 1 : 2);
   16691                                       unsigned rn = (instr >> 16) & 0xf;
   16692                                       // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
   16693                                       vld4(CurrentCond(),
   16694                                            dt,
   16695                                            NeonRegisterList(DRegister(first),
   16696                                                             DRegister(last),
   16697                                                             spacing,
   16698                                                             lane),
   16699                                            AlignedMemOperand(Register(rn),
   16700                                                              align,
   16701                                                              PostIndex));
   16702                                       break;
   16703                                     }
   16704                                     case 0x00000002: {
   16705                                       // 0xf9a0030f
   16706                                       if (((instr & 0xc00) == 0xc00)) {
   16707                                         UnallocatedT32(instr);
   16708                                         return;
   16709                                       }
   16710                                       DataType dt =
   16711                                           Dt_size_7_Decode((instr >> 10) & 0x3);
   16712                                       if (dt.Is(kDataTypeValueInvalid)) {
   16713                                         UnallocatedT32(instr);
   16714                                         return;
   16715                                       }
   16716                                       DecodeNeonAndAlign decode_neon =
   16717                                           Align_index_align_3_Decode((instr >>
   16718                                                                       4) &
   16719                                                                          0xf,
   16720                                                                      dt);
   16721                                       if (!decode_neon.IsValid()) {
   16722                                         UnallocatedT32(instr);
   16723                                         return;
   16724                                       }
   16725                                       Alignment align = decode_neon.GetAlign();
   16726                                       int lane = decode_neon.GetLane();
   16727                                       SpacingType spacing =
   16728                                           decode_neon.GetSpacing();
   16729                                       unsigned first =
   16730                                           ExtractDRegister(instr, 22, 12);
   16731                                       unsigned length = 4;
   16732                                       unsigned last =
   16733                                           first +
   16734                                           (length - 1) *
   16735                                               (spacing == kSingle ? 1 : 2);
   16736                                       unsigned rn = (instr >> 16) & 0xf;
   16737                                       // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
   16738                                       vld4(CurrentCond(),
   16739                                            dt,
   16740                                            NeonRegisterList(DRegister(first),
   16741                                                             DRegister(last),
   16742                                                             spacing,
   16743                                                             lane),
   16744                                            AlignedMemOperand(Register(rn),
   16745                                                              align,
   16746                                                              Offset));
   16747                                       break;
   16748                                     }
   16749                                   }
   16750                                   break;
   16751                                 }
   16752                                 default: {
   16753                                   if (((instr & 0xc00) == 0xc00) ||
   16754                                       ((instr & 0xd) == 0xd)) {
   16755                                     UnallocatedT32(instr);
   16756                                     return;
   16757                                   }
   16758                                   DataType dt =
   16759                                       Dt_size_7_Decode((instr >> 10) & 0x3);
   16760                                   if (dt.Is(kDataTypeValueInvalid)) {
   16761                                     UnallocatedT32(instr);
   16762                                     return;
   16763                                   }
   16764                                   DecodeNeonAndAlign decode_neon =
   16765                                       Align_index_align_3_Decode((instr >> 4) &
   16766                                                                      0xf,
   16767                                                                  dt);
   16768                                   if (!decode_neon.IsValid()) {
   16769                                     UnallocatedT32(instr);
   16770                                     return;
   16771                                   }
   16772                                   Alignment align = decode_neon.GetAlign();
   16773                                   int lane = decode_neon.GetLane();
   16774                                   SpacingType spacing =
   16775                                       decode_neon.GetSpacing();
   16776                                   unsigned first =
   16777                                       ExtractDRegister(instr, 22, 12);
   16778                                   unsigned length = 4;
   16779                                   unsigned last =
   16780                                       first +
   16781                                       (length - 1) *
   16782                                           (spacing == kSingle ? 1 : 2);
   16783                                   unsigned rn = (instr >> 16) & 0xf;
   16784                                   unsigned rm = instr & 0xf;
   16785                                   // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
   16786                                   vld4(CurrentCond(),
   16787                                        dt,
   16788                                        NeonRegisterList(DRegister(first),
   16789                                                         DRegister(last),
   16790                                                         spacing,
   16791                                                         lane),
   16792                                        AlignedMemOperand(Register(rn),
   16793                                                          align,
   16794                                                          Register(rm),
   16795                                                          PostIndex));
   16796                                   break;
   16797                                 }
   16798                               }
   16799                               break;
   16800                             }
   16801                           }
   16802                           break;
   16803                         }
   16804                       }
   16805                       break;
   16806                     }
   16807                   }
   16808                   break;
   16809                 }
   16810                 case 0x10100000: {
   16811                   // 0xf8100000
   16812                   switch (instr & 0x01400000) {
   16813                     case 0x00000000: {
   16814                       // 0xf8100000
   16815                       switch (instr & 0x000f0000) {
   16816                         case 0x000f0000: {
   16817                           // 0xf81f0000
   16818                           switch (instr & 0x0000f000) {
   16819                             case 0x0000f000: {
   16820                               // 0xf81ff000
   16821                               uint32_t U = (instr >> 23) & 0x1;
   16822                               int32_t imm = instr & 0xfff;
   16823                               if (U == 0) imm = -imm;
   16824                               bool minus_zero = (imm == 0) && (U == 0);
   16825                               Label label(imm, kT32PcDelta, minus_zero);
   16826                               // PLD{<c>}{<q>} <label> ; T1
   16827                               pld(CurrentCond(), &label);
   16828                               if (((instr & 0xff7ff000) != 0xf81ff000)) {
   16829                                 UnpredictableT32(instr);
   16830                               }
   16831                               break;
   16832                             }
   16833                             default: {
   16834                               switch (instr & 0x00200000) {
   16835                                 case 0x00000000: {
   16836                                   // 0xf81f0000
   16837                                   if (((instr & 0xf000) == 0xf000)) {
   16838                                     UnallocatedT32(instr);
   16839                                     return;
   16840                                   }
   16841                                   unsigned rt = (instr >> 12) & 0xf;
   16842                                   uint32_t U = (instr >> 23) & 0x1;
   16843                                   int32_t imm = instr & 0xfff;
   16844                                   if (U == 0) imm = -imm;
   16845                                   bool minus_zero = (imm == 0) && (U == 0);
   16846                                   Label label(imm, kT32PcDelta, minus_zero);
   16847                                   // LDRB{<c>}{<q>} <Rt>, <label> ; T1
   16848                                   ldrb(CurrentCond(), Register(rt), &label);
   16849                                   break;
   16850                                 }
   16851                                 case 0x00200000: {
   16852                                   // 0xf83f0000
   16853                                   if (((instr & 0xf000) == 0xf000)) {
   16854                                     UnallocatedT32(instr);
   16855                                     return;
   16856                                   }
   16857                                   unsigned rt = (instr >> 12) & 0xf;
   16858                                   uint32_t U = (instr >> 23) & 0x1;
   16859                                   int32_t imm = instr & 0xfff;
   16860                                   if (U == 0) imm = -imm;
   16861                                   bool minus_zero = (imm == 0) && (U == 0);
   16862                                   Label label(imm, kT32PcDelta, minus_zero);
   16863                                   // LDRH{<c>}{<q>} <Rt>, <label> ; T1
   16864                                   ldrh(CurrentCond(), Register(rt), &label);
   16865                                   break;
   16866                                 }
   16867                               }
   16868                               break;
   16869                             }
   16870                           }
   16871                           break;
   16872                         }
   16873                         default: {
   16874                           switch (instr & 0x00a00000) {
   16875                             case 0x00000000: {
   16876                               // 0xf8100000
   16877                               switch (instr & 0x00000d00) {
   16878                                 case 0x00000000: {
   16879                                   // 0xf8100000
   16880                                   switch (instr & 0x000002c0) {
   16881                                     case 0x00000000: {
   16882                                       // 0xf8100000
   16883                                       switch (instr & 0x0000f000) {
   16884                                         case 0x0000f000: {
   16885                                           // 0xf810f000
   16886                                           if (((instr & 0xf0000) == 0xf0000)) {
   16887                                             UnallocatedT32(instr);
   16888                                             return;
   16889                                           }
   16890                                           unsigned rn = (instr >> 16) & 0xf;
   16891                                           Sign sign(plus);
   16892                                           unsigned rm = instr & 0xf;
   16893                                           Shift shift = LSL;
   16894                                           uint32_t amount = (instr >> 4) & 0x3;
   16895                                           AddrMode addrmode = Offset;
   16896                                           // PLD{<c>}{<q>} [<Rn>, {+}<Rm>{, LSL #<amount>}] ; T1 NOLINT(whitespace/line_length)
   16897                                           pld(CurrentCond(),
   16898                                               MemOperand(Register(rn),
   16899                                                          sign,
   16900                                                          Register(rm),
   16901                                                          shift,
   16902                                                          amount,
   16903                                                          addrmode));
   16904                                           break;
   16905                                         }
   16906                                         default: {
   16907                                           if (((instr & 0xf0000) == 0xf0000) ||
   16908                                               ((instr & 0xf000) == 0xf000)) {
   16909                                             UnallocatedT32(instr);
   16910                                             return;
   16911                                           }
   16912                                           unsigned rt = (instr >> 12) & 0xf;
   16913                                           unsigned rn = (instr >> 16) & 0xf;
   16914                                           Sign sign(plus);
   16915                                           unsigned rm = instr & 0xf;
   16916                                           Shift shift = LSL;
   16917                                           uint32_t amount = (instr >> 4) & 0x3;
   16918                                           AddrMode addrmode = Offset;
   16919                                           if ((rt < kNumberOfT32LowRegisters) &&
   16920                                               (rn < kNumberOfT32LowRegisters) &&
   16921                                               (rm < kNumberOfT32LowRegisters) &&
   16922                                               shift.IsLSL() && (amount == 0) &&
   16923                                               sign.IsPlus()) {
   16924                                             // LDRB{<c>}.W <Rt>, [<Rn>, #{+}<Rm>] ; T2 NOLINT(whitespace/line_length)
   16925                                             ldrb(CurrentCond(),
   16926                                                  Wide,
   16927                                                  Register(rt),
   16928                                                  MemOperand(Register(rn),
   16929                                                             sign,
   16930                                                             Register(rm),
   16931                                                             addrmode));
   16932                                           } else {
   16933                                             // LDRB{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>{, LSL #<imm>}] ; T2 NOLINT(whitespace/line_length)
   16934                                             ldrb(CurrentCond(),
   16935                                                  Best,
   16936                                                  Register(rt),
   16937                                                  MemOperand(Register(rn),
   16938                                                             sign,
   16939                                                             Register(rm),
   16940                                                             shift,
   16941                                                             amount,
   16942                                                             addrmode));
   16943                                           }
   16944                                           break;
   16945                                         }
   16946                                       }
   16947                                       break;
   16948                                     }
   16949                                     default:
   16950                                       UnallocatedT32(instr);
   16951                                       break;
   16952                                   }
   16953                                   break;
   16954                                 }
   16955                                 case 0x00000900: {
   16956                                   // 0xf8100900
   16957                                   if (((instr & 0xf0000) == 0xf0000)) {
   16958                                     UnallocatedT32(instr);
   16959                                     return;
   16960                                   }
   16961                                   unsigned rt = (instr >> 12) & 0xf;
   16962                                   unsigned rn = (instr >> 16) & 0xf;
   16963                                   Sign sign((((instr >> 9) & 0x1) == 0) ? minus
   16964                                                                         : plus);
   16965                                   int32_t offset = instr & 0xff;
   16966                                   // LDRB{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_2> ; T3 NOLINT(whitespace/line_length)
   16967                                   ldrb(CurrentCond(),
   16968                                        Best,
   16969                                        Register(rt),
   16970                                        MemOperand(Register(rn),
   16971                                                   sign,
   16972                                                   offset,
   16973                                                   PostIndex));
   16974                                   break;
   16975                                 }
   16976                                 case 0x00000c00: {
   16977                                   // 0xf8100c00
   16978                                   switch (instr & 0x00000200) {
   16979                                     case 0x00000000: {
   16980                                       // 0xf8100c00
   16981                                       switch (instr & 0x0000f000) {
   16982                                         case 0x0000f000: {
   16983                                           // 0xf810fc00
   16984                                           if (((instr & 0xf0000) == 0xf0000)) {
   16985                                             UnallocatedT32(instr);
   16986                                             return;
   16987                                           }
   16988                                           unsigned rn = (instr >> 16) & 0xf;
   16989                                           int32_t offset = instr & 0xff;
   16990                                           // PLD{<c>}{<q>} [<Rn>{, #-<imm_1>}] ; T2 NOLINT(whitespace/line_length)
   16991                                           pld(CurrentCond(),
   16992                                               MemOperand(Register(rn),
   16993                                                          minus,
   16994                                                          offset,
   16995                                                          Offset));
   16996                                           break;
   16997                                         }
   16998                                         default: {
   16999                                           if (((instr & 0xf0000) == 0xf0000) ||
   17000                                               ((instr & 0xf000) == 0xf000)) {
   17001                                             UnallocatedT32(instr);
   17002                                             return;
   17003                                           }
   17004                                           unsigned rt = (instr >> 12) & 0xf;
   17005                                           unsigned rn = (instr >> 16) & 0xf;
   17006                                           int32_t offset = instr & 0xff;
   17007                                           // LDRB{<c>}{<q>} <Rt>, [<Rn>{, #-<imm_2>}] ; T3 NOLINT(whitespace/line_length)
   17008                                           ldrb(CurrentCond(),
   17009                                                Best,
   17010                                                Register(rt),
   17011                                                MemOperand(Register(rn),
   17012                                                           minus,
   17013                                                           offset,
   17014                                                           Offset));
   17015                                           break;
   17016                                         }
   17017                                       }
   17018                                       break;
   17019                                     }
   17020                                     case 0x00000200: {
   17021                                       // 0xf8100e00
   17022                                       if (((instr & 0xf0000) == 0xf0000)) {
   17023                                         UnallocatedT32(instr);
   17024                                         return;
   17025                                       }
   17026                                       UnimplementedT32_32("LDRBT", instr);
   17027                                       break;
   17028                                     }
   17029                                   }
   17030                                   break;
   17031                                 }
   17032                                 case 0x00000d00: {
   17033                                   // 0xf8100d00
   17034                                   if (((instr & 0xf0000) == 0xf0000)) {
   17035                                     UnallocatedT32(instr);
   17036                                     return;
   17037                                   }
   17038                                   unsigned rt = (instr >> 12) & 0xf;
   17039                                   unsigned rn = (instr >> 16) & 0xf;
   17040                                   Sign sign((((instr >> 9) & 0x1) == 0) ? minus
   17041                                                                         : plus);
   17042                                   int32_t offset = instr & 0xff;
   17043                                   // LDRB{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_2>}]! ; T3 NOLINT(whitespace/line_length)
   17044                                   ldrb(CurrentCond(),
   17045                                        Best,
   17046                                        Register(rt),
   17047                                        MemOperand(Register(rn),
   17048                                                   sign,
   17049                                                   offset,
   17050                                                   PreIndex));
   17051                                   break;
   17052                                 }
   17053                                 default:
   17054                                   UnallocatedT32(instr);
   17055                                   break;
   17056                               }
   17057                               break;
   17058                             }
   17059                             case 0x00200000: {
   17060                               // 0xf8300000
   17061                               switch (instr & 0x00000d00) {
   17062                                 case 0x00000000: {
   17063                                   // 0xf8300000
   17064                                   switch (instr & 0x000002c0) {
   17065                                     case 0x00000000: {
   17066                                       // 0xf8300000
   17067                                       switch (instr & 0x0000f000) {
   17068                                         case 0x0000f000: {
   17069                                           // 0xf830f000
   17070                                           if (((instr & 0xf0000) == 0xf0000)) {
   17071                                             UnallocatedT32(instr);
   17072                                             return;
   17073                                           }
   17074                                           unsigned rn = (instr >> 16) & 0xf;
   17075                                           Sign sign(plus);
   17076                                           unsigned rm = instr & 0xf;
   17077                                           Shift shift = LSL;
   17078                                           uint32_t amount = (instr >> 4) & 0x3;
   17079                                           AddrMode addrmode = Offset;
   17080                                           // PLDW{<c>}{<q>} [<Rn>, {+}<Rm>{, LSL #<amount>}] ; T1 NOLINT(whitespace/line_length)
   17081                                           pldw(CurrentCond(),
   17082                                                MemOperand(Register(rn),
   17083                                                           sign,
   17084                                                           Register(rm),
   17085                                                           shift,
   17086                                                           amount,
   17087                                                           addrmode));
   17088                                           break;
   17089                                         }
   17090                                         default: {
   17091                                           if (((instr & 0xf0000) == 0xf0000) ||
   17092                                               ((instr & 0xf000) == 0xf000)) {
   17093                                             UnallocatedT32(instr);
   17094                                             return;
   17095                                           }
   17096                                           unsigned rt = (instr >> 12) & 0xf;
   17097                                           unsigned rn = (instr >> 16) & 0xf;
   17098                                           Sign sign(plus);
   17099                                           unsigned rm = instr & 0xf;
   17100                                           Shift shift = LSL;
   17101                                           uint32_t amount = (instr >> 4) & 0x3;
   17102                                           AddrMode addrmode = Offset;
   17103                                           if ((rt < kNumberOfT32LowRegisters) &&
   17104                                               (rn < kNumberOfT32LowRegisters) &&
   17105                                               (rm < kNumberOfT32LowRegisters) &&
   17106                                               shift.IsLSL() && (amount == 0) &&
   17107                                               sign.IsPlus()) {
   17108                                             // LDRH{<c>}.W <Rt>, [<Rn>, #{+}<Rm>] ; T2 NOLINT(whitespace/line_length)
   17109                                             ldrh(CurrentCond(),
   17110                                                  Wide,
   17111                                                  Register(rt),
   17112                                                  MemOperand(Register(rn),
   17113                                                             sign,
   17114                                                             Register(rm),
   17115                                                             addrmode));
   17116                                           } else {
   17117                                             // LDRH{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>{, LSL #<imm>}] ; T2 NOLINT(whitespace/line_length)
   17118                                             ldrh(CurrentCond(),
   17119                                                  Best,
   17120                                                  Register(rt),
   17121                                                  MemOperand(Register(rn),
   17122                                                             sign,
   17123                                                             Register(rm),
   17124                                                             shift,
   17125                                                             amount,
   17126                                                             addrmode));
   17127                                           }
   17128                                           break;
   17129                                         }
   17130                                       }
   17131                                       break;
   17132                                     }
   17133                                     default:
   17134                                       UnallocatedT32(instr);
   17135                                       break;
   17136                                   }
   17137                                   break;
   17138                                 }
   17139                                 case 0x00000900: {
   17140                                   // 0xf8300900
   17141                                   if (((instr & 0xf0000) == 0xf0000)) {
   17142                                     UnallocatedT32(instr);
   17143                                     return;
   17144                                   }
   17145                                   unsigned rt = (instr >> 12) & 0xf;
   17146                                   unsigned rn = (instr >> 16) & 0xf;
   17147                                   Sign sign((((instr >> 9) & 0x1) == 0) ? minus
   17148                                                                         : plus);
   17149                                   int32_t offset = instr & 0xff;
   17150                                   // LDRH{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_2> ; T3 NOLINT(whitespace/line_length)
   17151                                   ldrh(CurrentCond(),
   17152                                        Best,
   17153                                        Register(rt),
   17154                                        MemOperand(Register(rn),
   17155                                                   sign,
   17156                                                   offset,
   17157                                                   PostIndex));
   17158                                   break;
   17159                                 }
   17160                                 case 0x00000c00: {
   17161                                   // 0xf8300c00
   17162                                   switch (instr & 0x00000200) {
   17163                                     case 0x00000000: {
   17164                                       // 0xf8300c00
   17165                                       switch (instr & 0x0000f000) {
   17166                                         case 0x0000f000: {
   17167                                           // 0xf830fc00
   17168                                           if (((instr & 0xf0000) == 0xf0000)) {
   17169                                             UnallocatedT32(instr);
   17170                                             return;
   17171                                           }
   17172                                           unsigned rn = (instr >> 16) & 0xf;
   17173                                           int32_t offset = instr & 0xff;
   17174                                           // PLDW{<c>}{<q>} [<Rn>{, #-<imm_1>}] ; T2 NOLINT(whitespace/line_length)
   17175                                           pldw(CurrentCond(),
   17176                                                MemOperand(Register(rn),
   17177                                                           minus,
   17178                                                           offset,
   17179                                                           Offset));
   17180                                           break;
   17181                                         }
   17182                                         default: {
   17183                                           if (((instr & 0xf0000) == 0xf0000) ||
   17184                                               ((instr & 0xf000) == 0xf000)) {
   17185                                             UnallocatedT32(instr);
   17186                                             return;
   17187                                           }
   17188                                           unsigned rt = (instr >> 12) & 0xf;
   17189                                           unsigned rn = (instr >> 16) & 0xf;
   17190                                           int32_t offset = instr & 0xff;
   17191                                           // LDRH{<c>}{<q>} <Rt>, [<Rn>{, #-<imm_2>}] ; T3 NOLINT(whitespace/line_length)
   17192                                           ldrh(CurrentCond(),
   17193                                                Best,
   17194                                                Register(rt),
   17195                                                MemOperand(Register(rn),
   17196                                                           minus,
   17197                                                           offset,
   17198                                                           Offset));
   17199                                           break;
   17200                                         }
   17201                                       }
   17202                                       break;
   17203                                     }
   17204                                     case 0x00000200: {
   17205                                       // 0xf8300e00
   17206                                       if (((instr & 0xf0000) == 0xf0000)) {
   17207                                         UnallocatedT32(instr);
   17208                                         return;
   17209                                       }
   17210                                       UnimplementedT32_32("LDRHT", instr);
   17211                                       break;
   17212                                     }
   17213                                   }
   17214                                   break;
   17215                                 }
   17216                                 case 0x00000d00: {
   17217                                   // 0xf8300d00
   17218                                   if (((instr & 0xf0000) == 0xf0000)) {
   17219                                     UnallocatedT32(instr);
   17220                                     return;
   17221                                   }
   17222                                   unsigned rt = (instr >> 12) & 0xf;
   17223                                   unsigned rn = (instr >> 16) & 0xf;
   17224                                   Sign sign((((instr >> 9) & 0x1) == 0) ? minus
   17225                                                                         : plus);
   17226                                   int32_t offset = instr & 0xff;
   17227                                   // LDRH{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_2>}]! ; T3 NOLINT(whitespace/line_length)
   17228                                   ldrh(CurrentCond(),
   17229                                        Best,
   17230                                        Register(rt),
   17231                                        MemOperand(Register(rn),
   17232                                                   sign,
   17233                                                   offset,
   17234                                                   PreIndex));
   17235                                   break;
   17236                                 }
   17237                                 default:
   17238                                   UnallocatedT32(instr);
   17239                                   break;
   17240                               }
   17241                               break;
   17242                             }
   17243                             case 0x00800000: {
   17244                               // 0xf8900000
   17245                               switch (instr & 0x0000f000) {
   17246                                 case 0x0000f000: {
   17247                                   // 0xf890f000
   17248                                   if (((instr & 0xf0000) == 0xf0000)) {
   17249                                     UnallocatedT32(instr);
   17250                                     return;
   17251                                   }
   17252                                   unsigned rn = (instr >> 16) & 0xf;
   17253                                   int32_t offset = instr & 0xfff;
   17254                                   // PLD{<c>}{<q>} [<Rn>{, #{+}<imm>}] ; T1
   17255                                   pld(CurrentCond(),
   17256                                       MemOperand(Register(rn),
   17257                                                  plus,
   17258                                                  offset,
   17259                                                  Offset));
   17260                                   break;
   17261                                 }
   17262                                 default: {
   17263                                   if (((instr & 0xf0000) == 0xf0000) ||
   17264                                       ((instr & 0xf000) == 0xf000)) {
   17265                                     UnallocatedT32(instr);
   17266                                     return;
   17267                                   }
   17268                                   unsigned rt = (instr >> 12) & 0xf;
   17269                                   unsigned rn = (instr >> 16) & 0xf;
   17270                                   int32_t offset = instr & 0xfff;
   17271                                   if ((rt < kNumberOfT32LowRegisters) &&
   17272                                       (rn < kNumberOfT32LowRegisters) &&
   17273                                       ((offset >= 0) && (offset <= 31))) {
   17274                                     // LDRB{<c>}.W <Rt>, [<Rn>{, #{+}<imm_1>}] ; T2 NOLINT(whitespace/line_length)
   17275                                     ldrb(CurrentCond(),
   17276                                          Wide,
   17277                                          Register(rt),
   17278                                          MemOperand(Register(rn),
   17279                                                     plus,
   17280                                                     offset,
   17281                                                     Offset));
   17282                                   } else {
   17283                                     // LDRB{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm_1>}] ; T2 NOLINT(whitespace/line_length)
   17284                                     ldrb(CurrentCond(),
   17285                                          Best,
   17286                                          Register(rt),
   17287                                          MemOperand(Register(rn),
   17288                                                     plus,
   17289                                                     offset,
   17290                                                     Offset));
   17291                                   }
   17292                                   break;
   17293                                 }
   17294                               }
   17295                               break;
   17296                             }
   17297                             case 0x00a00000: {
   17298                               // 0xf8b00000
   17299                               switch (instr & 0x0000f000) {
   17300                                 case 0x0000f000: {
   17301                                   // 0xf8b0f000
   17302                                   if (((instr & 0xf0000) == 0xf0000)) {
   17303                                     UnallocatedT32(instr);
   17304                                     return;
   17305                                   }
   17306                                   unsigned rn = (instr >> 16) & 0xf;
   17307                                   int32_t offset = instr & 0xfff;
   17308                                   // PLDW{<c>}{<q>} [<Rn>{, #{+}<imm>}] ; T1
   17309                                   pldw(CurrentCond(),
   17310                                        MemOperand(Register(rn),
   17311                                                   plus,
   17312                                                   offset,
   17313                                                   Offset));
   17314                                   break;
   17315                                 }
   17316                                 default: {
   17317                                   if (((instr & 0xf0000) == 0xf0000) ||
   17318                                       ((instr & 0xf000) == 0xf000)) {
   17319                                     UnallocatedT32(instr);
   17320                                     return;
   17321                                   }
   17322                                   unsigned rt = (instr >> 12) & 0xf;
   17323                                   unsigned rn = (instr >> 16) & 0xf;
   17324                                   int32_t offset = instr & 0xfff;
   17325                                   if ((rt < kNumberOfT32LowRegisters) &&
   17326                                       (rn < kNumberOfT32LowRegisters) &&
   17327                                       ((offset >= 0) && (offset <= 62) &&
   17328                                        ((offset & 1) == 0))) {
   17329                                     // LDRH{<c>}.W <Rt>, [<Rn>{, #{+}<imm_1>}] ; T2 NOLINT(whitespace/line_length)
   17330                                     ldrh(CurrentCond(),
   17331                                          Wide,
   17332                                          Register(rt),
   17333                                          MemOperand(Register(rn),
   17334                                                     plus,
   17335                                                     offset,
   17336                                                     Offset));
   17337                                   } else {
   17338                                     // LDRH{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm_1>}] ; T2 NOLINT(whitespace/line_length)
   17339                                     ldrh(CurrentCond(),
   17340                                          Best,
   17341                                          Register(rt),
   17342                                          MemOperand(Register(rn),
   17343                                                     plus,
   17344                                                     offset,
   17345                                                     Offset));
   17346                                   }
   17347                                   break;
   17348                                 }
   17349                               }
   17350                               break;
   17351                             }
   17352                           }
   17353                           break;
   17354                         }
   17355                       }
   17356                       break;
   17357                     }
   17358                     case 0x00400000: {
   17359                       // 0xf8500000
   17360                       switch (instr & 0x00200000) {
   17361                         case 0x00000000: {
   17362                           // 0xf8500000
   17363                           switch (instr & 0x000f0000) {
   17364                             case 0x000f0000: {
   17365                               // 0xf85f0000
   17366                               unsigned rt = (instr >> 12) & 0xf;
   17367                               uint32_t U = (instr >> 23) & 0x1;
   17368                               int32_t imm = instr & 0xfff;
   17369                               if (U == 0) imm = -imm;
   17370                               bool minus_zero = (imm == 0) && (U == 0);
   17371                               Label label(imm, kT32PcDelta, minus_zero);
   17372                               if ((imm >= -4095) && (imm <= 4095) &&
   17373                                   ((rt < kNumberOfT32LowRegisters) &&
   17374                                    (imm >= 0) && (imm <= 1020) &&
   17375                                    ((imm & 3) == 0))) {
   17376                                 // LDR{<c>}.W <Rt>, <label> ; T2
   17377                                 ldr(CurrentCond(), Wide, Register(rt), &label);
   17378                               } else {
   17379                                 // LDR{<c>}{<q>} <Rt>, <label> ; T2
   17380                                 ldr(CurrentCond(), Best, Register(rt), &label);
   17381                               }
   17382                               break;
   17383                             }
   17384                             default: {
   17385                               switch (instr & 0x00800000) {
   17386                                 case 0x00000000: {
   17387                                   // 0xf8500000
   17388                                   switch (instr & 0x00000d00) {
   17389                                     case 0x00000000: {
   17390                                       // 0xf8500000
   17391                                       if ((instr & 0x000002c0) == 0x00000000) {
   17392                                         if (((instr & 0xf0000) == 0xf0000)) {
   17393                                           UnallocatedT32(instr);
   17394                                           return;
   17395                                         }
   17396                                         unsigned rt = (instr >> 12) & 0xf;
   17397                                         unsigned rn = (instr >> 16) & 0xf;
   17398                                         Sign sign(plus);
   17399                                         unsigned rm = instr & 0xf;
   17400                                         Shift shift = LSL;
   17401                                         uint32_t amount = (instr >> 4) & 0x3;
   17402                                         AddrMode addrmode = Offset;
   17403                                         if ((rt < kNumberOfT32LowRegisters) &&
   17404                                             (rn < kNumberOfT32LowRegisters) &&
   17405                                             (rm < kNumberOfT32LowRegisters) &&
   17406                                             shift.IsLSL() && (amount == 0) &&
   17407                                             sign.IsPlus()) {
   17408                                           // LDR{<c>}.W <Rt>, [<Rn>, #{+}<Rm>] ; T2 NOLINT(whitespace/line_length)
   17409                                           ldr(CurrentCond(),
   17410                                               Wide,
   17411                                               Register(rt),
   17412                                               MemOperand(Register(rn),
   17413                                                          sign,
   17414                                                          Register(rm),
   17415                                                          addrmode));
   17416                                         } else {
   17417                                           // LDR{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>{, LSL #<imm>}] ; T2 NOLINT(whitespace/line_length)
   17418                                           ldr(CurrentCond(),
   17419                                               Best,
   17420                                               Register(rt),
   17421                                               MemOperand(Register(rn),
   17422                                                          sign,
   17423                                                          Register(rm),
   17424                                                          shift,
   17425                                                          amount,
   17426                                                          addrmode));
   17427                                         }
   17428                                       } else {
   17429                                         UnallocatedT32(instr);
   17430                                       }
   17431                                       break;
   17432                                     }
   17433                                     case 0x00000900: {
   17434                                       // 0xf8500900
   17435                                       if (((instr & 0xf0000) == 0xf0000)) {
   17436                                         UnallocatedT32(instr);
   17437                                         return;
   17438                                       }
   17439                                       if (((Uint32((instr >> 16)) &
   17440                                             Uint32(0xf)) == Uint32(0xd)) &&
   17441                                           ((Uint32((instr >> 9)) &
   17442                                             Uint32(0x1)) == Uint32(0x1)) &&
   17443                                           ((Uint32(instr) & Uint32(0xff)) ==
   17444                                            Uint32(0x4))) {
   17445                                         unsigned rt = (instr >> 12) & 0xf;
   17446                                         if ((rt <= 7) || (rt == kPCRegNum)) {
   17447                                           // POP{<c>}.W <single_register_list> ; T4 NOLINT(whitespace/line_length)
   17448                                           pop(CurrentCond(),
   17449                                               Wide,
   17450                                               Register(rt));
   17451                                         } else {
   17452                                           // POP{<c>}{<q>} <single_register_list> ; T4 NOLINT(whitespace/line_length)
   17453                                           pop(CurrentCond(),
   17454                                               Best,
   17455                                               Register(rt));
   17456                                         }
   17457                                         return;
   17458                                       }
   17459                                       unsigned rt = (instr >> 12) & 0xf;
   17460                                       unsigned rn = (instr >> 16) & 0xf;
   17461                                       Sign sign((((instr >> 9) & 0x1) == 0)
   17462                                                     ? minus
   17463                                                     : plus);
   17464                                       int32_t offset = instr & 0xff;
   17465                                       // LDR{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_2> ; T4 NOLINT(whitespace/line_length)
   17466                                       ldr(CurrentCond(),
   17467                                           Best,
   17468                                           Register(rt),
   17469                                           MemOperand(Register(rn),
   17470                                                      sign,
   17471                                                      offset,
   17472                                                      PostIndex));
   17473                                       break;
   17474                                     }
   17475                                     case 0x00000c00: {
   17476                                       // 0xf8500c00
   17477                                       switch (instr & 0x00000200) {
   17478                                         case 0x00000000: {
   17479                                           // 0xf8500c00
   17480                                           if (((instr & 0xf0000) == 0xf0000)) {
   17481                                             UnallocatedT32(instr);
   17482                                             return;
   17483                                           }
   17484                                           unsigned rt = (instr >> 12) & 0xf;
   17485                                           unsigned rn = (instr >> 16) & 0xf;
   17486                                           int32_t offset = instr & 0xff;
   17487                                           // LDR{<c>}{<q>} <Rt>, [<Rn>{, #-<imm_2>}] ; T4 NOLINT(whitespace/line_length)
   17488                                           ldr(CurrentCond(),
   17489                                               Best,
   17490                                               Register(rt),
   17491                                               MemOperand(Register(rn),
   17492                                                          minus,
   17493                                                          offset,
   17494                                                          Offset));
   17495                                           break;
   17496                                         }
   17497                                         case 0x00000200: {
   17498                                           // 0xf8500e00
   17499                                           if (((instr & 0xf0000) == 0xf0000)) {
   17500                                             UnallocatedT32(instr);
   17501                                             return;
   17502                                           }
   17503                                           UnimplementedT32_32("LDRT", instr);
   17504                                           break;
   17505                                         }
   17506                                       }
   17507                                       break;
   17508                                     }
   17509                                     case 0x00000d00: {
   17510                                       // 0xf8500d00
   17511                                       if (((instr & 0xf0000) == 0xf0000)) {
   17512                                         UnallocatedT32(instr);
   17513                                         return;
   17514                                       }
   17515                                       unsigned rt = (instr >> 12) & 0xf;
   17516                                       unsigned rn = (instr >> 16) & 0xf;
   17517                                       Sign sign((((instr >> 9) & 0x1) == 0)
   17518                                                     ? minus
   17519                                                     : plus);
   17520                                       int32_t offset = instr & 0xff;
   17521                                       // LDR{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_2>}]! ; T4 NOLINT(whitespace/line_length)
   17522                                       ldr(CurrentCond(),
   17523                                           Best,
   17524                                           Register(rt),
   17525                                           MemOperand(Register(rn),
   17526                                                      sign,
   17527                                                      offset,
   17528                                                      PreIndex));
   17529                                       break;
   17530                                     }
   17531                                     default:
   17532                                       UnallocatedT32(instr);
   17533                                       break;
   17534                                   }
   17535                                   break;
   17536                                 }
   17537                                 case 0x00800000: {
   17538                                   // 0xf8d00000
   17539                                   if (((instr & 0xf0000) == 0xf0000)) {
   17540                                     UnallocatedT32(instr);
   17541                                     return;
   17542                                   }
   17543                                   unsigned rt = (instr >> 12) & 0xf;
   17544                                   unsigned rn = (instr >> 16) & 0xf;
   17545                                   int32_t offset = instr & 0xfff;
   17546                                   if (((rt < kNumberOfT32LowRegisters) &&
   17547                                        (rn < kNumberOfT32LowRegisters) &&
   17548                                        ((offset >= 0) && (offset <= 124) &&
   17549                                         ((offset & 3) == 0))) ||
   17550                                       ((rt < kNumberOfT32LowRegisters) &&
   17551                                        (rn == sp.GetCode()) &&
   17552                                        ((offset >= 0) && (offset <= 1020) &&
   17553                                         ((offset & 3) == 0)))) {
   17554                                     // LDR{<c>}.W <Rt>, [<Rn>{, #{+}<imm_1>}] ; T3 NOLINT(whitespace/line_length)
   17555                                     ldr(CurrentCond(),
   17556                                         Wide,
   17557                                         Register(rt),
   17558                                         MemOperand(Register(rn),
   17559                                                    plus,
   17560                                                    offset,
   17561                                                    Offset));
   17562                                   } else {
   17563                                     // LDR{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm_1>}] ; T3 NOLINT(whitespace/line_length)
   17564                                     ldr(CurrentCond(),
   17565                                         Best,
   17566                                         Register(rt),
   17567                                         MemOperand(Register(rn),
   17568                                                    plus,
   17569                                                    offset,
   17570                                                    Offset));
   17571                                   }
   17572                                   break;
   17573                                 }
   17574                               }
   17575                               break;
   17576                             }
   17577                           }
   17578                           break;
   17579                         }
   17580                         default:
   17581                           UnallocatedT32(instr);
   17582                           break;
   17583                       }
   17584                       break;
   17585                     }
   17586                     case 0x01000000: {
   17587                       // 0xf9100000
   17588                       switch (instr & 0x00200000) {
   17589                         case 0x00000000: {
   17590                           // 0xf9100000
   17591                           switch (instr & 0x000f0000) {
   17592                             case 0x000f0000: {
   17593                               // 0xf91f0000
   17594                               switch (instr & 0x0000f000) {
   17595                                 case 0x0000f000: {
   17596                                   // 0xf91ff000
   17597                                   uint32_t U = (instr >> 23) & 0x1;
   17598                                   int32_t imm = instr & 0xfff;
   17599                                   if (U == 0) imm = -imm;
   17600                                   bool minus_zero = (imm == 0) && (U == 0);
   17601                                   Label label(imm, kT32PcDelta, minus_zero);
   17602                                   // PLI{<c>}{<q>} <label> ; T3
   17603                                   pli(CurrentCond(), &label);
   17604                                   break;
   17605                                 }
   17606                                 default: {
   17607                                   if (((instr & 0xf000) == 0xf000)) {
   17608                                     UnallocatedT32(instr);
   17609                                     return;
   17610                                   }
   17611                                   unsigned rt = (instr >> 12) & 0xf;
   17612                                   uint32_t U = (instr >> 23) & 0x1;
   17613                                   int32_t imm = instr & 0xfff;
   17614                                   if (U == 0) imm = -imm;
   17615                                   bool minus_zero = (imm == 0) && (U == 0);
   17616                                   Label label(imm, kT32PcDelta, minus_zero);
   17617                                   // LDRSB{<c>}{<q>} <Rt>, <label> ; T1
   17618                                   ldrsb(CurrentCond(), Register(rt), &label);
   17619                                   break;
   17620                                 }
   17621                               }
   17622                               break;
   17623                             }
   17624                             default: {
   17625                               switch (instr & 0x00800000) {
   17626                                 case 0x00000000: {
   17627                                   // 0xf9100000
   17628                                   switch (instr & 0x00000d00) {
   17629                                     case 0x00000000: {
   17630                                       // 0xf9100000
   17631                                       switch (instr & 0x000002c0) {
   17632                                         case 0x00000000: {
   17633                                           // 0xf9100000
   17634                                           switch (instr & 0x0000f000) {
   17635                                             case 0x0000f000: {
   17636                                               // 0xf910f000
   17637                                               if (((instr & 0xf0000) ==
   17638                                                    0xf0000)) {
   17639                                                 UnallocatedT32(instr);
   17640                                                 return;
   17641                                               }
   17642                                               unsigned rn = (instr >> 16) & 0xf;
   17643                                               Sign sign(plus);
   17644                                               unsigned rm = instr & 0xf;
   17645                                               Shift shift = LSL;
   17646                                               uint32_t amount =
   17647                                                   (instr >> 4) & 0x3;
   17648                                               AddrMode addrmode = Offset;
   17649                                               // PLI{<c>}{<q>} [<Rn>, {+}<Rm>{, LSL #<amount>}] ; T1 NOLINT(whitespace/line_length)
   17650                                               pli(CurrentCond(),
   17651                                                   MemOperand(Register(rn),
   17652                                                              sign,
   17653                                                              Register(rm),
   17654                                                              shift,
   17655                                                              amount,
   17656                                                              addrmode));
   17657                                               break;
   17658                                             }
   17659                                             default: {
   17660                                               if (((instr & 0xf0000) ==
   17661                                                    0xf0000) ||
   17662                                                   ((instr & 0xf000) ==
   17663                                                    0xf000)) {
   17664                                                 UnallocatedT32(instr);
   17665                                                 return;
   17666                                               }
   17667                                               unsigned rt = (instr >> 12) & 0xf;
   17668                                               unsigned rn = (instr >> 16) & 0xf;
   17669                                               Sign sign(plus);
   17670                                               unsigned rm = instr & 0xf;
   17671                                               Shift shift = LSL;
   17672                                               uint32_t amount =
   17673                                                   (instr >> 4) & 0x3;
   17674                                               AddrMode addrmode = Offset;
   17675                                               if ((rt <
   17676                                                    kNumberOfT32LowRegisters) &&
   17677                                                   (rn <
   17678                                                    kNumberOfT32LowRegisters) &&
   17679                                                   (rm <
   17680                                                    kNumberOfT32LowRegisters) &&
   17681                                                   shift.IsLSL() &&
   17682                                                   (amount == 0) &&
   17683                                                   sign.IsPlus()) {
   17684                                                 // LDRSB{<c>}.W <Rt>, [<Rn>, #{+}<Rm>] ; T2 NOLINT(whitespace/line_length)
   17685                                                 ldrsb(CurrentCond(),
   17686                                                       Wide,
   17687                                                       Register(rt),
   17688                                                       MemOperand(Register(rn),
   17689                                                                  sign,
   17690                                                                  Register(rm),
   17691                                                                  addrmode));
   17692                                               } else {
   17693                                                 // LDRSB{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>{, LSL #<imm>}] ; T2 NOLINT(whitespace/line_length)
   17694                                                 ldrsb(CurrentCond(),
   17695                                                       Best,
   17696                                                       Register(rt),
   17697                                                       MemOperand(Register(rn),
   17698                                                                  sign,
   17699                                                                  Register(rm),
   17700                                                                  shift,
   17701                                                                  amount,
   17702                                                                  addrmode));
   17703                                               }
   17704                                               break;
   17705                                             }
   17706                                           }
   17707                                           break;
   17708                                         }
   17709                                         default:
   17710                                           UnallocatedT32(instr);
   17711                                           break;
   17712                                       }
   17713                                       break;
   17714                                     }
   17715                                     case 0x00000900: {
   17716                                       // 0xf9100900
   17717                                       if (((instr & 0xf0000) == 0xf0000)) {
   17718                                         UnallocatedT32(instr);
   17719                                         return;
   17720                                       }
   17721                                       unsigned rt = (instr >> 12) & 0xf;
   17722                                       unsigned rn = (instr >> 16) & 0xf;
   17723                                       Sign sign((((instr >> 9) & 0x1) == 0)
   17724                                                     ? minus
   17725                                                     : plus);
   17726                                       int32_t offset = instr & 0xff;
   17727                                       // LDRSB{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_1> ; T2 NOLINT(whitespace/line_length)
   17728                                       ldrsb(CurrentCond(),
   17729                                             Best,
   17730                                             Register(rt),
   17731                                             MemOperand(Register(rn),
   17732                                                        sign,
   17733                                                        offset,
   17734                                                        PostIndex));
   17735                                       break;
   17736                                     }
   17737                                     case 0x00000c00: {
   17738                                       // 0xf9100c00
   17739                                       switch (instr & 0x00000200) {
   17740                                         case 0x00000000: {
   17741                                           // 0xf9100c00
   17742                                           switch (instr & 0x0000f000) {
   17743                                             case 0x0000f000: {
   17744                                               // 0xf910fc00
   17745                                               if (((instr & 0xf0000) ==
   17746                                                    0xf0000)) {
   17747                                                 UnallocatedT32(instr);
   17748                                                 return;
   17749                                               }
   17750                                               unsigned rn = (instr >> 16) & 0xf;
   17751                                               int32_t offset = instr & 0xff;
   17752                                               // PLI{<c>}{<q>} [<Rn>{, #-<imm_1>}] ; T2 NOLINT(whitespace/line_length)
   17753                                               pli(CurrentCond(),
   17754                                                   MemOperand(Register(rn),
   17755                                                              minus,
   17756                                                              offset,
   17757                                                              Offset));
   17758                                               break;
   17759                                             }
   17760                                             default: {
   17761                                               if (((instr & 0xf0000) ==
   17762                                                    0xf0000) ||
   17763                                                   ((instr & 0xf000) ==
   17764                                                    0xf000)) {
   17765                                                 UnallocatedT32(instr);
   17766                                                 return;
   17767                                               }
   17768                                               unsigned rt = (instr >> 12) & 0xf;
   17769                                               unsigned rn = (instr >> 16) & 0xf;
   17770                                               int32_t offset = instr & 0xff;
   17771                                               // LDRSB{<c>}{<q>} <Rt>, [<Rn>{, #-<imm_1>}] ; T2 NOLINT(whitespace/line_length)
   17772                                               ldrsb(CurrentCond(),
   17773                                                     Best,
   17774                                                     Register(rt),
   17775                                                     MemOperand(Register(rn),
   17776                                                                minus,
   17777                                                                offset,
   17778                                                                Offset));
   17779                                               break;
   17780                                             }
   17781                                           }
   17782                                           break;
   17783                                         }
   17784                                         case 0x00000200: {
   17785                                           // 0xf9100e00
   17786                                           if (((instr & 0xf0000) == 0xf0000)) {
   17787                                             UnallocatedT32(instr);
   17788                                             return;
   17789                                           }
   17790                                           UnimplementedT32_32("LDRSBT", instr);
   17791                                           break;
   17792                                         }
   17793                                       }
   17794                                       break;
   17795                                     }
   17796                                     case 0x00000d00: {
   17797                                       // 0xf9100d00
   17798                                       if (((instr & 0xf0000) == 0xf0000)) {
   17799                                         UnallocatedT32(instr);
   17800                                         return;
   17801                                       }
   17802                                       unsigned rt = (instr >> 12) & 0xf;
   17803                                       unsigned rn = (instr >> 16) & 0xf;
   17804                                       Sign sign((((instr >> 9) & 0x1) == 0)
   17805                                                     ? minus
   17806                                                     : plus);
   17807                                       int32_t offset = instr & 0xff;
   17808                                       // LDRSB{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_1>}]! ; T2 NOLINT(whitespace/line_length)
   17809                                       ldrsb(CurrentCond(),
   17810                                             Best,
   17811                                             Register(rt),
   17812                                             MemOperand(Register(rn),
   17813                                                        sign,
   17814                                                        offset,
   17815                                                        PreIndex));
   17816                                       break;
   17817                                     }
   17818                                     default:
   17819                                       UnallocatedT32(instr);
   17820                                       break;
   17821                                   }
   17822                                   break;
   17823                                 }
   17824                                 case 0x00800000: {
   17825                                   // 0xf9900000
   17826                                   switch (instr & 0x0000f000) {
   17827                                     case 0x0000f000: {
   17828                                       // 0xf990f000
   17829                                       if (((instr & 0xf0000) == 0xf0000)) {
   17830                                         UnallocatedT32(instr);
   17831                                         return;
   17832                                       }
   17833                                       unsigned rn = (instr >> 16) & 0xf;
   17834                                       int32_t offset = instr & 0xfff;
   17835                                       // PLI{<c>}{<q>} [<Rn>{, #{+}<imm>}] ; T1
   17836                                       pli(CurrentCond(),
   17837                                           MemOperand(Register(rn),
   17838                                                      plus,
   17839                                                      offset,
   17840                                                      Offset));
   17841                                       break;
   17842                                     }
   17843                                     default: {
   17844                                       if (((instr & 0xf0000) == 0xf0000) ||
   17845                                           ((instr & 0xf000) == 0xf000)) {
   17846                                         UnallocatedT32(instr);
   17847                                         return;
   17848                                       }
   17849                                       unsigned rt = (instr >> 12) & 0xf;
   17850                                       unsigned rn = (instr >> 16) & 0xf;
   17851                                       int32_t offset = instr & 0xfff;
   17852                                       // LDRSB{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm>}] ; T1 NOLINT(whitespace/line_length)
   17853                                       ldrsb(CurrentCond(),
   17854                                             Best,
   17855                                             Register(rt),
   17856                                             MemOperand(Register(rn),
   17857                                                        plus,
   17858                                                        offset,
   17859                                                        Offset));
   17860                                       break;
   17861                                     }
   17862                                   }
   17863                                   break;
   17864                                 }
   17865                               }
   17866                               break;
   17867                             }
   17868                           }
   17869                           break;
   17870                         }
   17871                         case 0x00200000: {
   17872                           // 0xf9300000
   17873                           switch (instr & 0x000f0000) {
   17874                             case 0x000f0000: {
   17875                               // 0xf93f0000
   17876                               if (((instr & 0xf000) == 0xf000)) {
   17877                                 UnallocatedT32(instr);
   17878                                 return;
   17879                               }
   17880                               unsigned rt = (instr >> 12) & 0xf;
   17881                               uint32_t U = (instr >> 23) & 0x1;
   17882                               int32_t imm = instr & 0xfff;
   17883                               if (U == 0) imm = -imm;
   17884                               bool minus_zero = (imm == 0) && (U == 0);
   17885                               Label label(imm, kT32PcDelta, minus_zero);
   17886                               // LDRSH{<c>}{<q>} <Rt>, <label> ; T1
   17887                               ldrsh(CurrentCond(), Register(rt), &label);
   17888                               break;
   17889                             }
   17890                             default: {
   17891                               switch (instr & 0x00800000) {
   17892                                 case 0x00000000: {
   17893                                   // 0xf9300000
   17894                                   switch (instr & 0x00000d00) {
   17895                                     case 0x00000000: {
   17896                                       // 0xf9300000
   17897                                       if ((instr & 0x000002c0) == 0x00000000) {
   17898                                         if (((instr & 0xf0000) == 0xf0000) ||
   17899                                             ((instr & 0xf000) == 0xf000)) {
   17900                                           UnallocatedT32(instr);
   17901                                           return;
   17902                                         }
   17903                                         unsigned rt = (instr >> 12) & 0xf;
   17904                                         unsigned rn = (instr >> 16) & 0xf;
   17905                                         Sign sign(plus);
   17906                                         unsigned rm = instr & 0xf;
   17907                                         Shift shift = LSL;
   17908                                         uint32_t amount = (instr >> 4) & 0x3;
   17909                                         AddrMode addrmode = Offset;
   17910                                         if ((rt < kNumberOfT32LowRegisters) &&
   17911                                             (rn < kNumberOfT32LowRegisters) &&
   17912                                             (rm < kNumberOfT32LowRegisters) &&
   17913                                             shift.IsLSL() && (amount == 0) &&
   17914                                             sign.IsPlus()) {
   17915                                           // LDRSH{<c>}.W <Rt>, [<Rn>, #{+}<Rm>] ; T2 NOLINT(whitespace/line_length)
   17916                                           ldrsh(CurrentCond(),
   17917                                                 Wide,
   17918                                                 Register(rt),
   17919                                                 MemOperand(Register(rn),
   17920                                                            sign,
   17921                                                            Register(rm),
   17922                                                            addrmode));
   17923                                         } else {
   17924                                           // LDRSH{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>{, LSL #<imm>}] ; T2 NOLINT(whitespace/line_length)
   17925                                           ldrsh(CurrentCond(),
   17926                                                 Best,
   17927                                                 Register(rt),
   17928                                                 MemOperand(Register(rn),
   17929                                                            sign,
   17930                                                            Register(rm),
   17931                                                            shift,
   17932                                                            amount,
   17933                                                            addrmode));
   17934                                         }
   17935                                       } else {
   17936                                         UnallocatedT32(instr);
   17937                                       }
   17938                                       break;
   17939                                     }
   17940                                     case 0x00000900: {
   17941                                       // 0xf9300900
   17942                                       if (((instr & 0xf0000) == 0xf0000)) {
   17943                                         UnallocatedT32(instr);
   17944                                         return;
   17945                                       }
   17946                                       unsigned rt = (instr >> 12) & 0xf;
   17947                                       unsigned rn = (instr >> 16) & 0xf;
   17948                                       Sign sign((((instr >> 9) & 0x1) == 0)
   17949                                                     ? minus
   17950                                                     : plus);
   17951                                       int32_t offset = instr & 0xff;
   17952                                       // LDRSH{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_1> ; T2 NOLINT(whitespace/line_length)
   17953                                       ldrsh(CurrentCond(),
   17954                                             Best,
   17955                                             Register(rt),
   17956                                             MemOperand(Register(rn),
   17957                                                        sign,
   17958                                                        offset,
   17959                                                        PostIndex));
   17960                                       break;
   17961                                     }
   17962                                     case 0x00000c00: {
   17963                                       // 0xf9300c00
   17964                                       switch (instr & 0x00000200) {
   17965                                         case 0x00000000: {
   17966                                           // 0xf9300c00
   17967                                           if (((instr & 0xf0000) == 0xf0000) ||
   17968                                               ((instr & 0xf000) == 0xf000)) {
   17969                                             UnallocatedT32(instr);
   17970                                             return;
   17971                                           }
   17972                                           unsigned rt = (instr >> 12) & 0xf;
   17973                                           unsigned rn = (instr >> 16) & 0xf;
   17974                                           int32_t offset = instr & 0xff;
   17975                                           // LDRSH{<c>}{<q>} <Rt>, [<Rn>{, #-<imm_1>}] ; T2 NOLINT(whitespace/line_length)
   17976                                           ldrsh(CurrentCond(),
   17977                                                 Best,
   17978                                                 Register(rt),
   17979                                                 MemOperand(Register(rn),
   17980                                                            minus,
   17981                                                            offset,
   17982                                                            Offset));
   17983                                           break;
   17984                                         }
   17985                                         case 0x00000200: {
   17986                                           // 0xf9300e00
   17987                                           if (((instr & 0xf0000) == 0xf0000)) {
   17988                                             UnallocatedT32(instr);
   17989                                             return;
   17990                                           }
   17991                                           UnimplementedT32_32("LDRSHT", instr);
   17992                                           break;
   17993                                         }
   17994                                       }
   17995                                       break;
   17996                                     }
   17997                                     case 0x00000d00: {
   17998                                       // 0xf9300d00
   17999                                       if (((instr & 0xf0000) == 0xf0000)) {
   18000                                         UnallocatedT32(instr);
   18001                                         return;
   18002                                       }
   18003                                       unsigned rt = (instr >> 12) & 0xf;
   18004                                       unsigned rn = (instr >> 16) & 0xf;
   18005                                       Sign sign((((instr >> 9) & 0x1) == 0)
   18006                                                     ? minus
   18007                                                     : plus);
   18008                                       int32_t offset = instr & 0xff;
   18009                                       // LDRSH{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_1>}]! ; T2 NOLINT(whitespace/line_length)
   18010                                       ldrsh(CurrentCond(),
   18011                                             Best,
   18012                                             Register(rt),
   18013                                             MemOperand(Register(rn),
   18014                                                        sign,
   18015                                                        offset,
   18016                                                        PreIndex));
   18017                                       break;
   18018                                     }
   18019                                     default:
   18020                                       UnallocatedT32(instr);
   18021                                       break;
   18022                                   }
   18023                                   break;
   18024                                 }
   18025                                 case 0x00800000: {
   18026                                   // 0xf9b00000
   18027                                   if (((instr & 0xf0000) == 0xf0000) ||
   18028                                       ((instr & 0xf000) == 0xf000)) {
   18029                                     UnallocatedT32(instr);
   18030                                     return;
   18031                                   }
   18032                                   unsigned rt = (instr >> 12) & 0xf;
   18033                                   unsigned rn = (instr >> 16) & 0xf;
   18034                                   int32_t offset = instr & 0xfff;
   18035                                   // LDRSH{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm>}] ; T1 NOLINT(whitespace/line_length)
   18036                                   ldrsh(CurrentCond(),
   18037                                         Best,
   18038                                         Register(rt),
   18039                                         MemOperand(Register(rn),
   18040                                                    plus,
   18041                                                    offset,
   18042                                                    Offset));
   18043                                   break;
   18044                                 }
   18045                               }
   18046                               break;
   18047                             }
   18048                           }
   18049                           break;
   18050                         }
   18051                       }
   18052                       break;
   18053                     }
   18054                     default:
   18055                       UnallocatedT32(instr);
   18056                       break;
   18057                   }
   18058                   break;
   18059                 }
   18060               }
   18061               break;
   18062             }
   18063             case 0x02000000: {
   18064               // 0xea000000
   18065               switch (instr & 0x11900000) {
   18066                 case 0x00000000: {
   18067                   // 0xea000000
   18068                   switch (instr & 0x00600000) {
   18069                     case 0x00000000: {
   18070                       // 0xea000000
   18071                       switch (instr & 0x000070f0) {
   18072                         case 0x00000030: {
   18073                           // 0xea000030
   18074                           unsigned rd = (instr >> 8) & 0xf;
   18075                           unsigned rn = (instr >> 16) & 0xf;
   18076                           unsigned rm = instr & 0xf;
   18077                           // AND{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2
   18078                           and_(CurrentCond(),
   18079                                Best,
   18080                                Register(rd),
   18081                                Register(rn),
   18082                                Operand(Register(rm), RRX));
   18083                           if (((instr & 0xfff0f0f0) != 0xea000030)) {
   18084                             UnpredictableT32(instr);
   18085                           }
   18086                           break;
   18087                         }
   18088                         default: {
   18089                           if (((instr & 0x70f0) == 0x30)) {
   18090                             UnallocatedT32(instr);
   18091                             return;
   18092                           }
   18093                           unsigned rd = (instr >> 8) & 0xf;
   18094                           unsigned rn = (instr >> 16) & 0xf;
   18095                           unsigned rm = instr & 0xf;
   18096                           ImmediateShiftOperand
   18097                               shift_operand((instr >> 4) & 0x3,
   18098                                             ((instr >> 6) & 0x3) |
   18099                                                 ((instr >> 10) & 0x1c));
   18100                           if (InITBlock() &&
   18101                               (instr & 0x00100000) == 0x00000000 &&
   18102                               shift_operand.GetShift().IsLSL() &&
   18103                               (shift_operand.GetAmount() == 0) &&
   18104                               ((rd == rn) && (rd < kNumberOfT32LowRegisters) &&
   18105                                (rm < kNumberOfT32LowRegisters))) {
   18106                             // AND<c>.W {<Rd>}, <Rn>, <Rm> ; T2
   18107                             and_(CurrentCond(),
   18108                                  Wide,
   18109                                  Register(rd),
   18110                                  Register(rn),
   18111                                  Register(rm));
   18112                             if (((instr & 0xfff08000) != 0xea000000)) {
   18113                               UnpredictableT32(instr);
   18114                             }
   18115                           } else {
   18116                             VIXL_ASSERT((instr & 0x00100000) == 0x00000000);
   18117                             // AND{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
   18118                             and_(CurrentCond(),
   18119                                  Best,
   18120                                  Register(rd),
   18121                                  Register(rn),
   18122                                  Operand(Register(rm),
   18123                                          shift_operand.GetType(),
   18124                                          shift_operand.GetAmount()));
   18125                             if (((instr & 0xfff08000) != 0xea000000)) {
   18126                               UnpredictableT32(instr);
   18127                             }
   18128                           }
   18129                           break;
   18130                         }
   18131                       }
   18132                       break;
   18133                     }
   18134                     case 0x00200000: {
   18135                       // 0xea200000
   18136                       switch (instr & 0x000070f0) {
   18137                         case 0x00000030: {
   18138                           // 0xea200030
   18139                           unsigned rd = (instr >> 8) & 0xf;
   18140                           unsigned rn = (instr >> 16) & 0xf;
   18141                           unsigned rm = instr & 0xf;
   18142                           // BIC{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2
   18143                           bic(CurrentCond(),
   18144                               Best,
   18145                               Register(rd),
   18146                               Register(rn),
   18147                               Operand(Register(rm), RRX));
   18148                           if (((instr & 0xfff0f0f0) != 0xea200030)) {
   18149                             UnpredictableT32(instr);
   18150                           }
   18151                           break;
   18152                         }
   18153                         default: {
   18154                           if (((instr & 0x70f0) == 0x30)) {
   18155                             UnallocatedT32(instr);
   18156                             return;
   18157                           }
   18158                           unsigned rd = (instr >> 8) & 0xf;
   18159                           unsigned rn = (instr >> 16) & 0xf;
   18160                           unsigned rm = instr & 0xf;
   18161                           ImmediateShiftOperand
   18162                               shift_operand((instr >> 4) & 0x3,
   18163                                             ((instr >> 6) & 0x3) |
   18164                                                 ((instr >> 10) & 0x1c));
   18165                           if (InITBlock() &&
   18166                               (instr & 0x00100000) == 0x00000000 &&
   18167                               shift_operand.GetShift().IsLSL() &&
   18168                               (shift_operand.GetAmount() == 0) &&
   18169                               ((rd == rn) && (rd < kNumberOfT32LowRegisters) &&
   18170                                (rm < kNumberOfT32LowRegisters))) {
   18171                             // BIC<c>.W {<Rd>}, <Rn>, <Rm> ; T2
   18172                             bic(CurrentCond(),
   18173                                 Wide,
   18174                                 Register(rd),
   18175                                 Register(rn),
   18176                                 Register(rm));
   18177                             if (((instr & 0xfff08000) != 0xea200000)) {
   18178                               UnpredictableT32(instr);
   18179                             }
   18180                           } else {
   18181                             VIXL_ASSERT((instr & 0x00100000) == 0x00000000);
   18182                             // BIC{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
   18183                             bic(CurrentCond(),
   18184                                 Best,
   18185                                 Register(rd),
   18186                                 Register(rn),
   18187                                 Operand(Register(rm),
   18188                                         shift_operand.GetType(),
   18189                                         shift_operand.GetAmount()));
   18190                             if (((instr & 0xfff08000) != 0xea200000)) {
   18191                               UnpredictableT32(instr);
   18192                             }
   18193                           }
   18194                           break;
   18195                         }
   18196                       }
   18197                       break;
   18198                     }
   18199                     case 0x00400000: {
   18200                       // 0xea400000
   18201                       switch (instr & 0x000f0000) {
   18202                         case 0x000f0000: {
   18203                           // 0xea4f0000
   18204                           switch (instr & 0x000070f0) {
   18205                             case 0x00000030: {
   18206                               // 0xea4f0030
   18207                               unsigned rd = (instr >> 8) & 0xf;
   18208                               unsigned rm = instr & 0xf;
   18209                               // RRX{<c>}{<q>} {<Rd>}, <Rm> ; T3
   18210                               rrx(CurrentCond(), Register(rd), Register(rm));
   18211                               if (((instr & 0xfffff0f0) != 0xea4f0030)) {
   18212                                 UnpredictableT32(instr);
   18213                               }
   18214                               break;
   18215                             }
   18216                             default: {
   18217                               if (((instr & 0x70f0) == 0x30)) {
   18218                                 UnallocatedT32(instr);
   18219                                 return;
   18220                               }
   18221                               if (((Uint32((instr >> 4)) & Uint32(0x3)) ==
   18222                                    Uint32(0x2))) {
   18223                                 unsigned rd = (instr >> 8) & 0xf;
   18224                                 unsigned rm = instr & 0xf;
   18225                                 uint32_t amount = ((instr >> 6) & 0x3) |
   18226                                                   ((instr >> 10) & 0x1c);
   18227                                 if (amount == 0) amount = 32;
   18228                                 if (InITBlock() &&
   18229                                     ((rd < kNumberOfT32LowRegisters) &&
   18230                                      (rm < kNumberOfT32LowRegisters) &&
   18231                                      ((amount >= 1) && (amount <= 32)))) {
   18232                                   // ASR<c>.W {<Rd>}, <Rm>, #<imm> ; T3
   18233                                   asr(CurrentCond(),
   18234                                       Wide,
   18235                                       Register(rd),
   18236                                       Register(rm),
   18237                                       amount);
   18238                                   if (((instr & 0xffff8030) != 0xea4f0020)) {
   18239                                     UnpredictableT32(instr);
   18240                                   }
   18241                                 } else {
   18242                                   // ASR{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; T3
   18243                                   asr(CurrentCond(),
   18244                                       Best,
   18245                                       Register(rd),
   18246                                       Register(rm),
   18247                                       amount);
   18248                                   if (((instr & 0xffff8030) != 0xea4f0020)) {
   18249                                     UnpredictableT32(instr);
   18250                                   }
   18251                                 }
   18252                                 return;
   18253                               }
   18254                               if (((Uint32((instr >> 4)) & Uint32(0x3)) ==
   18255                                    Uint32(0x0)) &&
   18256                                   ((instr & 0x000070c0) != 0x00000000)) {
   18257                                 unsigned rd = (instr >> 8) & 0xf;
   18258                                 unsigned rm = instr & 0xf;
   18259                                 uint32_t amount = ((instr >> 6) & 0x3) |
   18260                                                   ((instr >> 10) & 0x1c);
   18261                                 if (InITBlock() &&
   18262                                     ((rd < kNumberOfT32LowRegisters) &&
   18263                                      (rm < kNumberOfT32LowRegisters) &&
   18264                                      ((amount >= 1) && (amount <= 31)))) {
   18265                                   // LSL<c>.W {<Rd>}, <Rm>, #<imm> ; T3
   18266                                   lsl(CurrentCond(),
   18267                                       Wide,
   18268                                       Register(rd),
   18269                                       Register(rm),
   18270                                       amount);
   18271                                   if (((instr & 0xffff8030) != 0xea4f0000)) {
   18272                                     UnpredictableT32(instr);
   18273                                   }
   18274                                 } else {
   18275                                   // LSL{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; T3
   18276                                   lsl(CurrentCond(),
   18277                                       Best,
   18278                                       Register(rd),
   18279                                       Register(rm),
   18280                                       amount);
   18281                                   if (((instr & 0xffff8030) != 0xea4f0000)) {
   18282                                     UnpredictableT32(instr);
   18283                                   }
   18284                                 }
   18285                                 return;
   18286                               }
   18287                               if (((Uint32((instr >> 4)) & Uint32(0x3)) ==
   18288                                    Uint32(0x1))) {
   18289                                 unsigned rd = (instr >> 8) & 0xf;
   18290                                 unsigned rm = instr & 0xf;
   18291                                 uint32_t amount = ((instr >> 6) & 0x3) |
   18292                                                   ((instr >> 10) & 0x1c);
   18293                                 if (amount == 0) amount = 32;
   18294                                 if (InITBlock() &&
   18295                                     ((rd < kNumberOfT32LowRegisters) &&
   18296                                      (rm < kNumberOfT32LowRegisters) &&
   18297                                      ((amount >= 1) && (amount <= 32)))) {
   18298                                   // LSR<c>.W {<Rd>}, <Rm>, #<imm> ; T3
   18299                                   lsr(CurrentCond(),
   18300                                       Wide,
   18301                                       Register(rd),
   18302                                       Register(rm),
   18303                                       amount);
   18304                                   if (((instr & 0xffff8030) != 0xea4f0010)) {
   18305                                     UnpredictableT32(instr);
   18306                                   }
   18307                                 } else {
   18308                                   // LSR{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; T3
   18309                                   lsr(CurrentCond(),
   18310                                       Best,
   18311                                       Register(rd),
   18312                                       Register(rm),
   18313                                       amount);
   18314                                   if (((instr & 0xffff8030) != 0xea4f0010)) {
   18315                                     UnpredictableT32(instr);
   18316                                   }
   18317                                 }
   18318                                 return;
   18319                               }
   18320                               if (((Uint32((instr >> 4)) & Uint32(0x3)) ==
   18321                                    Uint32(0x3)) &&
   18322                                   ((instr & 0x000070c0) != 0x00000000)) {
   18323                                 unsigned rd = (instr >> 8) & 0xf;
   18324                                 unsigned rm = instr & 0xf;
   18325                                 uint32_t amount = ((instr >> 6) & 0x3) |
   18326                                                   ((instr >> 10) & 0x1c);
   18327                                 // ROR{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; T3
   18328                                 ror(CurrentCond(),
   18329                                     Best,
   18330                                     Register(rd),
   18331                                     Register(rm),
   18332                                     amount);
   18333                                 if (((instr & 0xffff8030) != 0xea4f0030)) {
   18334                                   UnpredictableT32(instr);
   18335                                 }
   18336                                 return;
   18337                               }
   18338                               unsigned rd = (instr >> 8) & 0xf;
   18339                               unsigned rm = instr & 0xf;
   18340                               ImmediateShiftOperand
   18341                                   shift_operand((instr >> 4) & 0x3,
   18342                                                 ((instr >> 6) & 0x3) |
   18343                                                     ((instr >> 10) & 0x1c));
   18344                               if ((instr & 0x00100000) == 0x00000000 &&
   18345                                   (shift_operand.GetShift().IsLSL() &&
   18346                                    (shift_operand.GetAmount() == 0))) {
   18347                                 // MOV<c>.W <Rd>, <Rm> {, <shift> #<amount> } ; T3 NOLINT(whitespace/line_length)
   18348                                 mov(CurrentCond(),
   18349                                     Wide,
   18350                                     Register(rd),
   18351                                     Operand(Register(rm),
   18352                                             shift_operand.GetType(),
   18353                                             shift_operand.GetAmount()));
   18354                                 if (((instr & 0xffff8000) != 0xea4f0000)) {
   18355                                   UnpredictableT32(instr);
   18356                                 }
   18357                               } else if (InITBlock() &&
   18358                                          (instr & 0x00100000) == 0x00000000 &&
   18359                                          ((rd < kNumberOfT32LowRegisters) &&
   18360                                           (rm < kNumberOfT32LowRegisters))) {
   18361                                 // MOV<c>.W <Rd>, <Rm> {, <shift> #<amount> } ; T3 NOLINT(whitespace/line_length)
   18362                                 mov(CurrentCond(),
   18363                                     Wide,
   18364                                     Register(rd),
   18365                                     Operand(Register(rm),
   18366                                             shift_operand.GetType(),
   18367                                             shift_operand.GetAmount()));
   18368                                 if (((instr & 0xffff8000) != 0xea4f0000)) {
   18369                                   UnpredictableT32(instr);
   18370                                 }
   18371                               } else {
   18372                                 VIXL_ASSERT((instr & 0x00100000) == 0x00000000);
   18373                                 // MOV{<c>}{<q>} <Rd>, <Rm> {, <shift> #<amount> } ; T3 NOLINT(whitespace/line_length)
   18374                                 mov(CurrentCond(),
   18375                                     Best,
   18376                                     Register(rd),
   18377                                     Operand(Register(rm),
   18378                                             shift_operand.GetType(),
   18379                                             shift_operand.GetAmount()));
   18380                                 if (((instr & 0xffff8000) != 0xea4f0000)) {
   18381                                   UnpredictableT32(instr);
   18382                                 }
   18383                               }
   18384                               break;
   18385                             }
   18386                           }
   18387                           break;
   18388                         }
   18389                         default: {
   18390                           switch (instr & 0x000070f0) {
   18391                             case 0x00000030: {
   18392                               // 0xea400030
   18393                               if (((instr & 0xf0000) == 0xf0000)) {
   18394                                 UnallocatedT32(instr);
   18395                                 return;
   18396                               }
   18397                               unsigned rd = (instr >> 8) & 0xf;
   18398                               unsigned rn = (instr >> 16) & 0xf;
   18399                               unsigned rm = instr & 0xf;
   18400                               // ORR{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2
   18401                               orr(CurrentCond(),
   18402                                   Best,
   18403                                   Register(rd),
   18404                                   Register(rn),
   18405                                   Operand(Register(rm), RRX));
   18406                               if (((instr & 0xfff0f0f0) != 0xea400030)) {
   18407                                 UnpredictableT32(instr);
   18408                               }
   18409                               break;
   18410                             }
   18411                             default: {
   18412                               if (((instr & 0xf0000) == 0xf0000) ||
   18413                                   ((instr & 0x70f0) == 0x30)) {
   18414                                 UnallocatedT32(instr);
   18415                                 return;
   18416                               }
   18417                               unsigned rd = (instr >> 8) & 0xf;
   18418                               unsigned rn = (instr >> 16) & 0xf;
   18419                               unsigned rm = instr & 0xf;
   18420                               ImmediateShiftOperand
   18421                                   shift_operand((instr >> 4) & 0x3,
   18422                                                 ((instr >> 6) & 0x3) |
   18423                                                     ((instr >> 10) & 0x1c));
   18424                               if (InITBlock() &&
   18425                                   (instr & 0x00100000) == 0x00000000 &&
   18426                                   shift_operand.GetShift().IsLSL() &&
   18427                                   (shift_operand.GetAmount() == 0) &&
   18428                                   ((rd == rn) &&
   18429                                    (rd < kNumberOfT32LowRegisters) &&
   18430                                    (rm < kNumberOfT32LowRegisters))) {
   18431                                 // ORR<c>.W {<Rd>}, <Rn>, <Rm> ; T2
   18432                                 orr(CurrentCond(),
   18433                                     Wide,
   18434                                     Register(rd),
   18435                                     Register(rn),
   18436                                     Register(rm));
   18437                                 if (((instr & 0xfff08000) != 0xea400000)) {
   18438                                   UnpredictableT32(instr);
   18439                                 }
   18440                               } else {
   18441                                 VIXL_ASSERT((instr & 0x00100000) == 0x00000000);
   18442                                 // ORR{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
   18443                                 orr(CurrentCond(),
   18444                                     Best,
   18445                                     Register(rd),
   18446                                     Register(rn),
   18447                                     Operand(Register(rm),
   18448                                             shift_operand.GetType(),
   18449                                             shift_operand.GetAmount()));
   18450                                 if (((instr & 0xfff08000) != 0xea400000)) {
   18451                                   UnpredictableT32(instr);
   18452                                 }
   18453                               }
   18454                               break;
   18455                             }
   18456                           }
   18457                           break;
   18458                         }
   18459                       }
   18460                       break;
   18461                     }
   18462                     case 0x00600000: {
   18463                       // 0xea600000
   18464                       switch (instr & 0x000f0000) {
   18465                         case 0x000f0000: {
   18466                           // 0xea6f0000
   18467                           switch (instr & 0x000070f0) {
   18468                             case 0x00000030: {
   18469                               // 0xea6f0030
   18470                               unsigned rd = (instr >> 8) & 0xf;
   18471                               unsigned rm = instr & 0xf;
   18472                               // MVN{<c>}{<q>} <Rd>, <Rm>, RRX ; T2
   18473                               mvn(CurrentCond(),
   18474                                   Best,
   18475                                   Register(rd),
   18476                                   Operand(Register(rm), RRX));
   18477                               if (((instr & 0xfffff0f0) != 0xea6f0030)) {
   18478                                 UnpredictableT32(instr);
   18479                               }
   18480                               break;
   18481                             }
   18482                             default: {
   18483                               if (((instr & 0x70f0) == 0x30)) {
   18484                                 UnallocatedT32(instr);
   18485                                 return;
   18486                               }
   18487                               unsigned rd = (instr >> 8) & 0xf;
   18488                               unsigned rm = instr & 0xf;
   18489                               ImmediateShiftOperand
   18490                                   shift_operand((instr >> 4) & 0x3,
   18491                                                 ((instr >> 6) & 0x3) |
   18492                                                     ((instr >> 10) & 0x1c));
   18493                               if (InITBlock() &&
   18494                                   (instr & 0x00100000) == 0x00000000 &&
   18495                                   shift_operand.GetShift().IsLSL() &&
   18496                                   (shift_operand.GetAmount() == 0) &&
   18497                                   ((rd < kNumberOfT32LowRegisters) &&
   18498                                    (rm < kNumberOfT32LowRegisters))) {
   18499                                 // MVN<c>.W <Rd>, <Rm> ; T2
   18500                                 mvn(CurrentCond(),
   18501                                     Wide,
   18502                                     Register(rd),
   18503                                     Register(rm));
   18504                                 if (((instr & 0xffff8000) != 0xea6f0000)) {
   18505                                   UnpredictableT32(instr);
   18506                                 }
   18507                               } else {
   18508                                 VIXL_ASSERT((instr & 0x00100000) == 0x00000000);
   18509                                 // MVN{<c>}{<q>} <Rd>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
   18510                                 mvn(CurrentCond(),
   18511                                     Best,
   18512                                     Register(rd),
   18513                                     Operand(Register(rm),
   18514                                             shift_operand.GetType(),
   18515                                             shift_operand.GetAmount()));
   18516                                 if (((instr & 0xffff8000) != 0xea6f0000)) {
   18517                                   UnpredictableT32(instr);
   18518                                 }
   18519                               }
   18520                               break;
   18521                             }
   18522                           }
   18523                           break;
   18524                         }
   18525                         default: {
   18526                           switch (instr & 0x000070f0) {
   18527                             case 0x00000030: {
   18528                               // 0xea600030
   18529                               if (((instr & 0xf0000) == 0xf0000)) {
   18530                                 UnallocatedT32(instr);
   18531                                 return;
   18532                               }
   18533                               unsigned rd = (instr >> 8) & 0xf;
   18534                               unsigned rn = (instr >> 16) & 0xf;
   18535                               unsigned rm = instr & 0xf;
   18536                               // ORN{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T1
   18537                               orn(CurrentCond(),
   18538                                   Register(rd),
   18539                                   Register(rn),
   18540                                   Operand(Register(rm), RRX));
   18541                               if (((instr & 0xfff0f0f0) != 0xea600030)) {
   18542                                 UnpredictableT32(instr);
   18543                               }
   18544                               break;
   18545                             }
   18546                             default: {
   18547                               if (((instr & 0xf0000) == 0xf0000) ||
   18548                                   ((instr & 0x70f0) == 0x30)) {
   18549                                 UnallocatedT32(instr);
   18550                                 return;
   18551                               }
   18552                               unsigned rd = (instr >> 8) & 0xf;
   18553                               unsigned rn = (instr >> 16) & 0xf;
   18554                               unsigned rm = instr & 0xf;
   18555                               ImmediateShiftOperand
   18556                                   shift_operand((instr >> 4) & 0x3,
   18557                                                 ((instr >> 6) & 0x3) |
   18558                                                     ((instr >> 10) & 0x1c));
   18559                               // ORN{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T1 NOLINT(whitespace/line_length)
   18560                               orn(CurrentCond(),
   18561                                   Register(rd),
   18562                                   Register(rn),
   18563                                   Operand(Register(rm),
   18564                                           shift_operand.GetType(),
   18565                                           shift_operand.GetAmount()));
   18566                               if (((instr & 0xfff08000) != 0xea600000)) {
   18567                                 UnpredictableT32(instr);
   18568                               }
   18569                               break;
   18570                             }
   18571                           }
   18572                           break;
   18573                         }
   18574                       }
   18575                       break;
   18576                     }
   18577                   }
   18578                   break;
   18579                 }
   18580                 case 0x00100000: {
   18581                   // 0xea100000
   18582                   switch (instr & 0x00600000) {
   18583                     case 0x00000000: {
   18584                       // 0xea100000
   18585                       switch (instr & 0x00000f00) {
   18586                         case 0x00000f00: {
   18587                           // 0xea100f00
   18588                           switch (instr & 0x000070f0) {
   18589                             case 0x00000030: {
   18590                               // 0xea100f30
   18591                               unsigned rn = (instr >> 16) & 0xf;
   18592                               unsigned rm = instr & 0xf;
   18593                               // TST{<c>}{<q>} <Rn>, <Rm>, RRX ; T2
   18594                               tst(CurrentCond(),
   18595                                   Best,
   18596                                   Register(rn),
   18597                                   Operand(Register(rm), RRX));
   18598                               if (((instr & 0xfff0fff0) != 0xea100f30)) {
   18599                                 UnpredictableT32(instr);
   18600                               }
   18601                               break;
   18602                             }
   18603                             default: {
   18604                               if (((instr & 0x70f0) == 0x30)) {
   18605                                 UnallocatedT32(instr);
   18606                                 return;
   18607                               }
   18608                               unsigned rn = (instr >> 16) & 0xf;
   18609                               unsigned rm = instr & 0xf;
   18610                               ImmediateShiftOperand
   18611                                   shift_operand((instr >> 4) & 0x3,
   18612                                                 ((instr >> 6) & 0x3) |
   18613                                                     ((instr >> 10) & 0x1c));
   18614                               if (shift_operand.GetShift().IsLSL() &&
   18615                                   (shift_operand.GetAmount() == 0) &&
   18616                                   ((rn < kNumberOfT32LowRegisters) &&
   18617                                    (rm < kNumberOfT32LowRegisters))) {
   18618                                 // TST{<c>}.W <Rn>, <Rm> ; T2
   18619                                 tst(CurrentCond(),
   18620                                     Wide,
   18621                                     Register(rn),
   18622                                     Register(rm));
   18623                                 if (((instr & 0xfff08f00) != 0xea100f00)) {
   18624                                   UnpredictableT32(instr);
   18625                                 }
   18626                               } else {
   18627                                 // TST{<c>}{<q>} <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
   18628                                 tst(CurrentCond(),
   18629                                     Best,
   18630                                     Register(rn),
   18631                                     Operand(Register(rm),
   18632                                             shift_operand.GetType(),
   18633                                             shift_operand.GetAmount()));
   18634                                 if (((instr & 0xfff08f00) != 0xea100f00)) {
   18635                                   UnpredictableT32(instr);
   18636                                 }
   18637                               }
   18638                               break;
   18639                             }
   18640                           }
   18641                           break;
   18642                         }
   18643                         default: {
   18644                           switch (instr & 0x000070f0) {
   18645                             case 0x00000030: {
   18646                               // 0xea100030
   18647                               if (((instr & 0xf00) == 0xf00)) {
   18648                                 UnallocatedT32(instr);
   18649                                 return;
   18650                               }
   18651                               unsigned rd = (instr >> 8) & 0xf;
   18652                               unsigned rn = (instr >> 16) & 0xf;
   18653                               unsigned rm = instr & 0xf;
   18654                               // ANDS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2
   18655                               ands(CurrentCond(),
   18656                                    Best,
   18657                                    Register(rd),
   18658                                    Register(rn),
   18659                                    Operand(Register(rm), RRX));
   18660                               if (((instr & 0xfff0f0f0) != 0xea100030)) {
   18661                                 UnpredictableT32(instr);
   18662                               }
   18663                               break;
   18664                             }
   18665                             default: {
   18666                               if (((instr & 0x70f0) == 0x30) ||
   18667                                   ((instr & 0xf00) == 0xf00)) {
   18668                                 UnallocatedT32(instr);
   18669                                 return;
   18670                               }
   18671                               unsigned rd = (instr >> 8) & 0xf;
   18672                               unsigned rn = (instr >> 16) & 0xf;
   18673                               unsigned rm = instr & 0xf;
   18674                               ImmediateShiftOperand
   18675                                   shift_operand((instr >> 4) & 0x3,
   18676                                                 ((instr >> 6) & 0x3) |
   18677                                                     ((instr >> 10) & 0x1c));
   18678                               if (OutsideITBlock() &&
   18679                                   (instr & 0x00100000) == 0x00100000 &&
   18680                                   shift_operand.GetShift().IsLSL() &&
   18681                                   (shift_operand.GetAmount() == 0) &&
   18682                                   ((rd == rn) &&
   18683                                    (rd < kNumberOfT32LowRegisters) &&
   18684                                    (rm < kNumberOfT32LowRegisters))) {
   18685                                 // ANDS.W {<Rd>}, <Rn>, <Rm> ; T2
   18686                                 ands(Condition::None(),
   18687                                      Wide,
   18688                                      Register(rd),
   18689                                      Register(rn),
   18690                                      Register(rm));
   18691                                 if (((instr & 0xfff08000) != 0xea100000)) {
   18692                                   UnpredictableT32(instr);
   18693                                 }
   18694                               } else {
   18695                                 VIXL_ASSERT((instr & 0x00100000) == 0x00100000);
   18696                                 // ANDS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
   18697                                 ands(CurrentCond(),
   18698                                      Best,
   18699                                      Register(rd),
   18700                                      Register(rn),
   18701                                      Operand(Register(rm),
   18702                                              shift_operand.GetType(),
   18703                                              shift_operand.GetAmount()));
   18704                                 if (((instr & 0xfff08000) != 0xea100000)) {
   18705                                   UnpredictableT32(instr);
   18706                                 }
   18707                               }
   18708                               break;
   18709                             }
   18710                           }
   18711                           break;
   18712                         }
   18713                       }
   18714                       break;
   18715                     }
   18716                     case 0x00200000: {
   18717                       // 0xea300000
   18718                       switch (instr & 0x000070f0) {
   18719                         case 0x00000030: {
   18720                           // 0xea300030
   18721                           unsigned rd = (instr >> 8) & 0xf;
   18722                           unsigned rn = (instr >> 16) & 0xf;
   18723                           unsigned rm = instr & 0xf;
   18724                           // BICS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2
   18725                           bics(CurrentCond(),
   18726                                Best,
   18727                                Register(rd),
   18728                                Register(rn),
   18729                                Operand(Register(rm), RRX));
   18730                           if (((instr & 0xfff0f0f0) != 0xea300030)) {
   18731                             UnpredictableT32(instr);
   18732                           }
   18733                           break;
   18734                         }
   18735                         default: {
   18736                           if (((instr & 0x70f0) == 0x30)) {
   18737                             UnallocatedT32(instr);
   18738                             return;
   18739                           }
   18740                           unsigned rd = (instr >> 8) & 0xf;
   18741                           unsigned rn = (instr >> 16) & 0xf;
   18742                           unsigned rm = instr & 0xf;
   18743                           ImmediateShiftOperand
   18744                               shift_operand((instr >> 4) & 0x3,
   18745                                             ((instr >> 6) & 0x3) |
   18746                                                 ((instr >> 10) & 0x1c));
   18747                           if (OutsideITBlock() &&
   18748                               (instr & 0x00100000) == 0x00100000 &&
   18749                               shift_operand.GetShift().IsLSL() &&
   18750                               (shift_operand.GetAmount() == 0) &&
   18751                               ((rd == rn) && (rd < kNumberOfT32LowRegisters) &&
   18752                                (rm < kNumberOfT32LowRegisters))) {
   18753                             // BICS.W {<Rd>}, <Rn>, <Rm> ; T2
   18754                             bics(Condition::None(),
   18755                                  Wide,
   18756                                  Register(rd),
   18757                                  Register(rn),
   18758                                  Register(rm));
   18759                             if (((instr & 0xfff08000) != 0xea300000)) {
   18760                               UnpredictableT32(instr);
   18761                             }
   18762                           } else {
   18763                             VIXL_ASSERT((instr & 0x00100000) == 0x00100000);
   18764                             // BICS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
   18765                             bics(CurrentCond(),
   18766                                  Best,
   18767                                  Register(rd),
   18768                                  Register(rn),
   18769                                  Operand(Register(rm),
   18770                                          shift_operand.GetType(),
   18771                                          shift_operand.GetAmount()));
   18772                             if (((instr & 0xfff08000) != 0xea300000)) {
   18773                               UnpredictableT32(instr);
   18774                             }
   18775                           }
   18776                           break;
   18777                         }
   18778                       }
   18779                       break;
   18780                     }
   18781                     case 0x00400000: {
   18782                       // 0xea500000
   18783                       switch (instr & 0x000f0000) {
   18784                         case 0x000f0000: {
   18785                           // 0xea5f0000
   18786                           switch (instr & 0x000070f0) {
   18787                             case 0x00000030: {
   18788                               // 0xea5f0030
   18789                               unsigned rd = (instr >> 8) & 0xf;
   18790                               unsigned rm = instr & 0xf;
   18791                               // RRXS{<c>}{<q>} {<Rd>}, <Rm> ; T3
   18792                               rrxs(CurrentCond(), Register(rd), Register(rm));
   18793                               if (((instr & 0xfffff0f0) != 0xea5f0030)) {
   18794                                 UnpredictableT32(instr);
   18795                               }
   18796                               break;
   18797                             }
   18798                             default: {
   18799                               if (((instr & 0x70f0) == 0x30)) {
   18800                                 UnallocatedT32(instr);
   18801                                 return;
   18802                               }
   18803                               if (((Uint32((instr >> 4)) & Uint32(0x3)) ==
   18804                                    Uint32(0x2))) {
   18805                                 unsigned rd = (instr >> 8) & 0xf;
   18806                                 unsigned rm = instr & 0xf;
   18807                                 uint32_t amount = ((instr >> 6) & 0x3) |
   18808                                                   ((instr >> 10) & 0x1c);
   18809                                 if (amount == 0) amount = 32;
   18810                                 if (OutsideITBlock() &&
   18811                                     ((rd < kNumberOfT32LowRegisters) &&
   18812                                      (rm < kNumberOfT32LowRegisters) &&
   18813                                      ((amount >= 1) && (amount <= 32)))) {
   18814                                   // ASRS.W {<Rd>}, <Rm>, #<imm> ; T3
   18815                                   asrs(Condition::None(),
   18816                                        Wide,
   18817                                        Register(rd),
   18818                                        Register(rm),
   18819                                        amount);
   18820                                   if (((instr & 0xffff8030) != 0xea5f0020)) {
   18821                                     UnpredictableT32(instr);
   18822                                   }
   18823                                 } else {
   18824                                   // ASRS{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; T3
   18825                                   asrs(CurrentCond(),
   18826                                        Best,
   18827                                        Register(rd),
   18828                                        Register(rm),
   18829                                        amount);
   18830                                   if (((instr & 0xffff8030) != 0xea5f0020)) {
   18831                                     UnpredictableT32(instr);
   18832                                   }
   18833                                 }
   18834                                 return;
   18835                               }
   18836                               if (((Uint32((instr >> 4)) & Uint32(0x3)) ==
   18837                                    Uint32(0x0)) &&
   18838                                   ((instr & 0x000070c0) != 0x00000000)) {
   18839                                 unsigned rd = (instr >> 8) & 0xf;
   18840                                 unsigned rm = instr & 0xf;
   18841                                 uint32_t amount = ((instr >> 6) & 0x3) |
   18842                                                   ((instr >> 10) & 0x1c);
   18843                                 if (OutsideITBlock() &&
   18844                                     ((rd < kNumberOfT32LowRegisters) &&
   18845                                      (rm < kNumberOfT32LowRegisters) &&
   18846                                      ((amount >= 1) && (amount <= 31)))) {
   18847                                   // LSLS.W {<Rd>}, <Rm>, #<imm> ; T3
   18848                                   lsls(Condition::None(),
   18849                                        Wide,
   18850                                        Register(rd),
   18851                                        Register(rm),
   18852                                        amount);
   18853                                   if (((instr & 0xffff8030) != 0xea5f0000)) {
   18854                                     UnpredictableT32(instr);
   18855                                   }
   18856                                 } else {
   18857                                   // LSLS{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; T3
   18858                                   lsls(CurrentCond(),
   18859                                        Best,
   18860                                        Register(rd),
   18861                                        Register(rm),
   18862                                        amount);
   18863                                   if (((instr & 0xffff8030) != 0xea5f0000)) {
   18864                                     UnpredictableT32(instr);
   18865                                   }
   18866                                 }
   18867                                 return;
   18868                               }
   18869                               if (((Uint32((instr >> 4)) & Uint32(0x3)) ==
   18870                                    Uint32(0x1))) {
   18871                                 unsigned rd = (instr >> 8) & 0xf;
   18872                                 unsigned rm = instr & 0xf;
   18873                                 uint32_t amount = ((instr >> 6) & 0x3) |
   18874                                                   ((instr >> 10) & 0x1c);
   18875                                 if (amount == 0) amount = 32;
   18876                                 if (OutsideITBlock() &&
   18877                                     ((rd < kNumberOfT32LowRegisters) &&
   18878                                      (rm < kNumberOfT32LowRegisters) &&
   18879                                      ((amount >= 1) && (amount <= 32)))) {
   18880                                   // LSRS.W {<Rd>}, <Rm>, #<imm> ; T3
   18881                                   lsrs(Condition::None(),
   18882                                        Wide,
   18883                                        Register(rd),
   18884                                        Register(rm),
   18885                                        amount);
   18886                                   if (((instr & 0xffff8030) != 0xea5f0010)) {
   18887                                     UnpredictableT32(instr);
   18888                                   }
   18889                                 } else {
   18890                                   // LSRS{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; T3
   18891                                   lsrs(CurrentCond(),
   18892                                        Best,
   18893                                        Register(rd),
   18894                                        Register(rm),
   18895                                        amount);
   18896                                   if (((instr & 0xffff8030) != 0xea5f0010)) {
   18897                                     UnpredictableT32(instr);
   18898                                   }
   18899                                 }
   18900                                 return;
   18901                               }
   18902                               if (((Uint32((instr >> 4)) & Uint32(0x3)) ==
   18903                                    Uint32(0x3)) &&
   18904                                   ((instr & 0x000070c0) != 0x00000000)) {
   18905                                 unsigned rd = (instr >> 8) & 0xf;
   18906                                 unsigned rm = instr & 0xf;
   18907                                 uint32_t amount = ((instr >> 6) & 0x3) |
   18908                                                   ((instr >> 10) & 0x1c);
   18909                                 // RORS{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; T3
   18910                                 rors(CurrentCond(),
   18911                                      Best,
   18912                                      Register(rd),
   18913                                      Register(rm),
   18914                                      amount);
   18915                                 if (((instr & 0xffff8030) != 0xea5f0030)) {
   18916                                   UnpredictableT32(instr);
   18917                                 }
   18918                                 return;
   18919                               }
   18920                               unsigned rd = (instr >> 8) & 0xf;
   18921                               unsigned rm = instr & 0xf;
   18922                               ImmediateShiftOperand
   18923                                   shift_operand((instr >> 4) & 0x3,
   18924                                                 ((instr >> 6) & 0x3) |
   18925                                                     ((instr >> 10) & 0x1c));
   18926                               if (OutsideITBlock() &&
   18927                                   (instr & 0x00100000) == 0x00100000 &&
   18928                                   ((rd < kNumberOfT32LowRegisters) &&
   18929                                    (rm < kNumberOfT32LowRegisters))) {
   18930                                 // MOVS.W <Rd>, <Rm> {, <shift> #<amount> } ; T3
   18931                                 movs(Condition::None(),
   18932                                      Wide,
   18933                                      Register(rd),
   18934                                      Operand(Register(rm),
   18935                                              shift_operand.GetType(),
   18936                                              shift_operand.GetAmount()));
   18937                                 if (((instr & 0xffff8000) != 0xea5f0000)) {
   18938                                   UnpredictableT32(instr);
   18939                                 }
   18940                               } else {
   18941                                 VIXL_ASSERT((instr & 0x00100000) == 0x00100000);
   18942                                 // MOVS{<c>}{<q>} <Rd>, <Rm> {, <shift> #<amount> } ; T3 NOLINT(whitespace/line_length)
   18943                                 movs(CurrentCond(),
   18944                                      Best,
   18945                                      Register(rd),
   18946                                      Operand(Register(rm),
   18947                                              shift_operand.GetType(),
   18948                                              shift_operand.GetAmount()));
   18949                                 if (((instr & 0xffff8000) != 0xea5f0000)) {
   18950                                   UnpredictableT32(instr);
   18951                                 }
   18952                               }
   18953                               break;
   18954                             }
   18955                           }
   18956                           break;
   18957                         }
   18958                         default: {
   18959                           switch (instr & 0x000070f0) {
   18960                             case 0x00000030: {
   18961                               // 0xea500030
   18962                               if (((instr & 0xf0000) == 0xf0000)) {
   18963                                 UnallocatedT32(instr);
   18964                                 return;
   18965                               }
   18966                               unsigned rd = (instr >> 8) & 0xf;
   18967                               unsigned rn = (instr >> 16) & 0xf;
   18968                               unsigned rm = instr & 0xf;
   18969                               // ORRS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2
   18970                               orrs(CurrentCond(),
   18971                                    Best,
   18972                                    Register(rd),
   18973                                    Register(rn),
   18974                                    Operand(Register(rm), RRX));
   18975                               if (((instr & 0xfff0f0f0) != 0xea500030)) {
   18976                                 UnpredictableT32(instr);
   18977                               }
   18978                               break;
   18979                             }
   18980                             default: {
   18981                               if (((instr & 0xf0000) == 0xf0000) ||
   18982                                   ((instr & 0x70f0) == 0x30)) {
   18983                                 UnallocatedT32(instr);
   18984                                 return;
   18985                               }
   18986                               unsigned rd = (instr >> 8) & 0xf;
   18987                               unsigned rn = (instr >> 16) & 0xf;
   18988                               unsigned rm = instr & 0xf;
   18989                               ImmediateShiftOperand
   18990                                   shift_operand((instr >> 4) & 0x3,
   18991                                                 ((instr >> 6) & 0x3) |
   18992                                                     ((instr >> 10) & 0x1c));
   18993                               if (OutsideITBlock() &&
   18994                                   (instr & 0x00100000) == 0x00100000 &&
   18995                                   shift_operand.GetShift().IsLSL() &&
   18996                                   (shift_operand.GetAmount() == 0) &&
   18997                                   ((rd == rn) &&
   18998                                    (rd < kNumberOfT32LowRegisters) &&
   18999                                    (rm < kNumberOfT32LowRegisters))) {
   19000                                 // ORRS.W {<Rd>}, <Rn>, <Rm> ; T2
   19001                                 orrs(Condition::None(),
   19002                                      Wide,
   19003                                      Register(rd),
   19004                                      Register(rn),
   19005                                      Register(rm));
   19006                                 if (((instr & 0xfff08000) != 0xea500000)) {
   19007                                   UnpredictableT32(instr);
   19008                                 }
   19009                               } else {
   19010                                 VIXL_ASSERT((instr & 0x00100000) == 0x00100000);
   19011                                 // ORRS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
   19012                                 orrs(CurrentCond(),
   19013                                      Best,
   19014                                      Register(rd),
   19015                                      Register(rn),
   19016                                      Operand(Register(rm),
   19017                                              shift_operand.GetType(),
   19018                                              shift_operand.GetAmount()));
   19019                                 if (((instr & 0xfff08000) != 0xea500000)) {
   19020                                   UnpredictableT32(instr);
   19021                                 }
   19022                               }
   19023                               break;
   19024                             }
   19025                           }
   19026                           break;
   19027                         }
   19028                       }
   19029                       break;
   19030                     }
   19031                     case 0x00600000: {
   19032                       // 0xea700000
   19033                       switch (instr & 0x000f0000) {
   19034                         case 0x000f0000: {
   19035                           // 0xea7f0000
   19036                           switch (instr & 0x000070f0) {
   19037                             case 0x00000030: {
   19038                               // 0xea7f0030
   19039                               unsigned rd = (instr >> 8) & 0xf;
   19040                               unsigned rm = instr & 0xf;
   19041                               // MVNS{<c>}{<q>} <Rd>, <Rm>, RRX ; T2
   19042                               mvns(CurrentCond(),
   19043                                    Best,
   19044                                    Register(rd),
   19045                                    Operand(Register(rm), RRX));
   19046                               if (((instr & 0xfffff0f0) != 0xea7f0030)) {
   19047                                 UnpredictableT32(instr);
   19048                               }
   19049                               break;
   19050                             }
   19051                             default: {
   19052                               if (((instr & 0x70f0) == 0x30)) {
   19053                                 UnallocatedT32(instr);
   19054                                 return;
   19055                               }
   19056                               unsigned rd = (instr >> 8) & 0xf;
   19057                               unsigned rm = instr & 0xf;
   19058                               ImmediateShiftOperand
   19059                                   shift_operand((instr >> 4) & 0x3,
   19060                                                 ((instr >> 6) & 0x3) |
   19061                                                     ((instr >> 10) & 0x1c));
   19062                               if (OutsideITBlock() &&
   19063                                   (instr & 0x00100000) == 0x00100000 &&
   19064                                   shift_operand.GetShift().IsLSL() &&
   19065                                   (shift_operand.GetAmount() == 0) &&
   19066                                   ((rd < kNumberOfT32LowRegisters) &&
   19067                                    (rm < kNumberOfT32LowRegisters))) {
   19068                                 // MVNS.W <Rd>, <Rm> ; T2
   19069                                 mvns(Condition::None(),
   19070                                      Wide,
   19071                                      Register(rd),
   19072                                      Register(rm));
   19073                                 if (((instr & 0xffff8000) != 0xea7f0000)) {
   19074                                   UnpredictableT32(instr);
   19075                                 }
   19076                               } else {
   19077                                 VIXL_ASSERT((instr & 0x00100000) == 0x00100000);
   19078                                 // MVNS{<c>}{<q>} <Rd>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
   19079                                 mvns(CurrentCond(),
   19080                                      Best,
   19081                                      Register(rd),
   19082                                      Operand(Register(rm),
   19083                                              shift_operand.GetType(),
   19084                                              shift_operand.GetAmount()));
   19085                                 if (((instr & 0xffff8000) != 0xea7f0000)) {
   19086                                   UnpredictableT32(instr);
   19087                                 }
   19088                               }
   19089                               break;
   19090                             }
   19091                           }
   19092                           break;
   19093                         }
   19094                         default: {
   19095                           switch (instr & 0x000070f0) {
   19096                             case 0x00000030: {
   19097                               // 0xea700030
   19098                               if (((instr & 0xf0000) == 0xf0000)) {
   19099                                 UnallocatedT32(instr);
   19100                                 return;
   19101                               }
   19102                               unsigned rd = (instr >> 8) & 0xf;
   19103                               unsigned rn = (instr >> 16) & 0xf;
   19104                               unsigned rm = instr & 0xf;
   19105                               // ORNS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T1
   19106                               orns(CurrentCond(),
   19107                                    Register(rd),
   19108                                    Register(rn),
   19109                                    Operand(Register(rm), RRX));
   19110                               if (((instr & 0xfff0f0f0) != 0xea700030)) {
   19111                                 UnpredictableT32(instr);
   19112                               }
   19113                               break;
   19114                             }
   19115                             default: {
   19116                               if (((instr & 0xf0000) == 0xf0000) ||
   19117                                   ((instr & 0x70f0) == 0x30)) {
   19118                                 UnallocatedT32(instr);
   19119                                 return;
   19120                               }
   19121                               unsigned rd = (instr >> 8) & 0xf;
   19122                               unsigned rn = (instr >> 16) & 0xf;
   19123                               unsigned rm = instr & 0xf;
   19124                               ImmediateShiftOperand
   19125                                   shift_operand((instr >> 4) & 0x3,
   19126                                                 ((instr >> 6) & 0x3) |
   19127                                                     ((instr >> 10) & 0x1c));
   19128                               // ORNS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T1 NOLINT(whitespace/line_length)
   19129                               orns(CurrentCond(),
   19130                                    Register(rd),
   19131                                    Register(rn),
   19132                                    Operand(Register(rm),
   19133                                            shift_operand.GetType(),
   19134                                            shift_operand.GetAmount()));
   19135                               if (((instr & 0xfff08000) != 0xea700000)) {
   19136                                 UnpredictableT32(instr);
   19137                               }
   19138                               break;
   19139                             }
   19140                           }
   19141                           break;
   19142                         }
   19143                       }
   19144                       break;
   19145                     }
   19146                   }
   19147                   break;
   19148                 }
   19149                 case 0x00800000: {
   19150                   // 0xea800000
   19151                   switch (instr & 0x00600000) {
   19152                     case 0x00000000: {
   19153                       // 0xea800000
   19154                       switch (instr & 0x000070f0) {
   19155                         case 0x00000030: {
   19156                           // 0xea800030
   19157                           unsigned rd = (instr >> 8) & 0xf;
   19158                           unsigned rn = (instr >> 16) & 0xf;
   19159                           unsigned rm = instr & 0xf;
   19160                           // EOR{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2
   19161                           eor(CurrentCond(),
   19162                               Best,
   19163                               Register(rd),
   19164                               Register(rn),
   19165                               Operand(Register(rm), RRX));
   19166                           if (((instr & 0xfff0f0f0) != 0xea800030)) {
   19167                             UnpredictableT32(instr);
   19168                           }
   19169                           break;
   19170                         }
   19171                         default: {
   19172                           if (((instr & 0x70f0) == 0x30)) {
   19173                             UnallocatedT32(instr);
   19174                             return;
   19175                           }
   19176                           unsigned rd = (instr >> 8) & 0xf;
   19177                           unsigned rn = (instr >> 16) & 0xf;
   19178                           unsigned rm = instr & 0xf;
   19179                           ImmediateShiftOperand
   19180                               shift_operand((instr >> 4) & 0x3,
   19181                                             ((instr >> 6) & 0x3) |
   19182                                                 ((instr >> 10) & 0x1c));
   19183                           if (InITBlock() &&
   19184                               (instr & 0x00100000) == 0x00000000 &&
   19185                               shift_operand.GetShift().IsLSL() &&
   19186                               (shift_operand.GetAmount() == 0) &&
   19187                               ((rd == rn) && (rd < kNumberOfT32LowRegisters) &&
   19188                                (rm < kNumberOfT32LowRegisters))) {
   19189                             // EOR<c>.W {<Rd>}, <Rn>, <Rm> ; T2
   19190                             eor(CurrentCond(),
   19191                                 Wide,
   19192                                 Register(rd),
   19193                                 Register(rn),
   19194                                 Register(rm));
   19195                             if (((instr & 0xfff08000) != 0xea800000)) {
   19196                               UnpredictableT32(instr);
   19197                             }
   19198                           } else {
   19199                             VIXL_ASSERT((instr & 0x00100000) == 0x00000000);
   19200                             // EOR{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
   19201                             eor(CurrentCond(),
   19202                                 Best,
   19203                                 Register(rd),
   19204                                 Register(rn),
   19205                                 Operand(Register(rm),
   19206                                         shift_operand.GetType(),
   19207                                         shift_operand.GetAmount()));
   19208                             if (((instr & 0xfff08000) != 0xea800000)) {
   19209                               UnpredictableT32(instr);
   19210                             }
   19211                           }
   19212                           break;
   19213                         }
   19214                       }
   19215                       break;
   19216                     }
   19217                     case 0x00400000: {
   19218                       // 0xeac00000
   19219                       switch (instr & 0x00000030) {
   19220                         case 0x00000000: {
   19221                           // 0xeac00000
   19222                           unsigned rd = (instr >> 8) & 0xf;
   19223                           unsigned rn = (instr >> 16) & 0xf;
   19224                           unsigned rm = instr & 0xf;
   19225                           uint32_t amount =
   19226                               ((instr >> 6) & 0x3) | ((instr >> 10) & 0x1c);
   19227                           // PKHBT{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, LSL #<imm> } ; T1 NOLINT(whitespace/line_length)
   19228                           pkhbt(CurrentCond(),
   19229                                 Register(rd),
   19230                                 Register(rn),
   19231                                 Operand(Register(rm), LSL, amount));
   19232                           if (((instr & 0xfff08030) != 0xeac00000)) {
   19233                             UnpredictableT32(instr);
   19234                           }
   19235                           break;
   19236                         }
   19237                         case 0x00000020: {
   19238                           // 0xeac00020
   19239                           unsigned rd = (instr >> 8) & 0xf;
   19240                           unsigned rn = (instr >> 16) & 0xf;
   19241                           unsigned rm = instr & 0xf;
   19242                           uint32_t amount =
   19243                               ((instr >> 6) & 0x3) | ((instr >> 10) & 0x1c);
   19244                           if (amount == 0) amount = 32;
   19245                           // PKHTB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ASR #<imm> } ; T1 NOLINT(whitespace/line_length)
   19246                           pkhtb(CurrentCond(),
   19247                                 Register(rd),
   19248                                 Register(rn),
   19249                                 Operand(Register(rm), ASR, amount));
   19250                           if (((instr & 0xfff08030) != 0xeac00020)) {
   19251                             UnpredictableT32(instr);
   19252                           }
   19253                           break;
   19254                         }
   19255                         default:
   19256                           UnallocatedT32(instr);
   19257                           break;
   19258                       }
   19259                       break;
   19260                     }
   19261                     default:
   19262                       UnallocatedT32(instr);
   19263                       break;
   19264                   }
   19265                   break;
   19266                 }
   19267                 case 0x00900000: {
   19268                   // 0xea900000
   19269                   switch (instr & 0x00600000) {
   19270                     case 0x00000000: {
   19271                       // 0xea900000
   19272                       switch (instr & 0x00000f00) {
   19273                         case 0x00000f00: {
   19274                           // 0xea900f00
   19275                           switch (instr & 0x000070f0) {
   19276                             case 0x00000030: {
   19277                               // 0xea900f30
   19278                               unsigned rn = (instr >> 16) & 0xf;
   19279                               unsigned rm = instr & 0xf;
   19280                               // TEQ{<c>}{<q>} <Rn>, <Rm>, RRX ; T1
   19281                               teq(CurrentCond(),
   19282                                   Register(rn),
   19283                                   Operand(Register(rm), RRX));
   19284                               if (((instr & 0xfff0fff0) != 0xea900f30)) {
   19285                                 UnpredictableT32(instr);
   19286                               }
   19287                               break;
   19288                             }
   19289                             default: {
   19290                               if (((instr & 0x70f0) == 0x30)) {
   19291                                 UnallocatedT32(instr);
   19292                                 return;
   19293                               }
   19294                               unsigned rn = (instr >> 16) & 0xf;
   19295                               unsigned rm = instr & 0xf;
   19296                               ImmediateShiftOperand
   19297                                   shift_operand((instr >> 4) & 0x3,
   19298                                                 ((instr >> 6) & 0x3) |
   19299                                                     ((instr >> 10) & 0x1c));
   19300                               // TEQ{<c>}{<q>} <Rn>, <Rm> {, <shift> #<amount> } ; T1 NOLINT(whitespace/line_length)
   19301                               teq(CurrentCond(),
   19302                                   Register(rn),
   19303                                   Operand(Register(rm),
   19304                                           shift_operand.GetType(),
   19305                                           shift_operand.GetAmount()));
   19306                               if (((instr & 0xfff08f00) != 0xea900f00)) {
   19307                                 UnpredictableT32(instr);
   19308                               }
   19309                               break;
   19310                             }
   19311                           }
   19312                           break;
   19313                         }
   19314                         default: {
   19315                           switch (instr & 0x000070f0) {
   19316                             case 0x00000030: {
   19317                               // 0xea900030
   19318                               if (((instr & 0xf00) == 0xf00)) {
   19319                                 UnallocatedT32(instr);
   19320                                 return;
   19321                               }
   19322                               unsigned rd = (instr >> 8) & 0xf;
   19323                               unsigned rn = (instr >> 16) & 0xf;
   19324                               unsigned rm = instr & 0xf;
   19325                               // EORS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2
   19326                               eors(CurrentCond(),
   19327                                    Best,
   19328                                    Register(rd),
   19329                                    Register(rn),
   19330                                    Operand(Register(rm), RRX));
   19331                               if (((instr & 0xfff0f0f0) != 0xea900030)) {
   19332                                 UnpredictableT32(instr);
   19333                               }
   19334                               break;
   19335                             }
   19336                             default: {
   19337                               if (((instr & 0x70f0) == 0x30) ||
   19338                                   ((instr & 0xf00) == 0xf00)) {
   19339                                 UnallocatedT32(instr);
   19340                                 return;
   19341                               }
   19342                               unsigned rd = (instr >> 8) & 0xf;
   19343                               unsigned rn = (instr >> 16) & 0xf;
   19344                               unsigned rm = instr & 0xf;
   19345                               ImmediateShiftOperand
   19346                                   shift_operand((instr >> 4) & 0x3,
   19347                                                 ((instr >> 6) & 0x3) |
   19348                                                     ((instr >> 10) & 0x1c));
   19349                               if (OutsideITBlock() &&
   19350                                   (instr & 0x00100000) == 0x00100000 &&
   19351                                   shift_operand.GetShift().IsLSL() &&
   19352                                   (shift_operand.GetAmount() == 0) &&
   19353                                   ((rd == rn) &&
   19354                                    (rd < kNumberOfT32LowRegisters) &&
   19355                                    (rm < kNumberOfT32LowRegisters))) {
   19356                                 // EORS.W {<Rd>}, <Rn>, <Rm> ; T2
   19357                                 eors(Condition::None(),
   19358                                      Wide,
   19359                                      Register(rd),
   19360                                      Register(rn),
   19361                                      Register(rm));
   19362                                 if (((instr & 0xfff08000) != 0xea900000)) {
   19363                                   UnpredictableT32(instr);
   19364                                 }
   19365                               } else {
   19366                                 VIXL_ASSERT((instr & 0x00100000) == 0x00100000);
   19367                                 // EORS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
   19368                                 eors(CurrentCond(),
   19369                                      Best,
   19370                                      Register(rd),
   19371                                      Register(rn),
   19372                                      Operand(Register(rm),
   19373                                              shift_operand.GetType(),
   19374                                              shift_operand.GetAmount()));
   19375                                 if (((instr & 0xfff08000) != 0xea900000)) {
   19376                                   UnpredictableT32(instr);
   19377                                 }
   19378                               }
   19379                               break;
   19380                             }
   19381                           }
   19382                           break;
   19383                         }
   19384                       }
   19385                       break;
   19386                     }
   19387                     default:
   19388                       UnallocatedT32(instr);
   19389                       break;
   19390                   }
   19391                   break;
   19392                 }
   19393                 case 0x01000000: {
   19394                   // 0xeb000000
   19395                   switch (instr & 0x00600000) {
   19396                     case 0x00000000: {
   19397                       // 0xeb000000
   19398                       switch (instr & 0x000f0000) {
   19399                         case 0x000d0000: {
   19400                           // 0xeb0d0000
   19401                           switch (instr & 0x000070f0) {
   19402                             case 0x00000030: {
   19403                               // 0xeb0d0030
   19404                               unsigned rd = (instr >> 8) & 0xf;
   19405                               unsigned rm = instr & 0xf;
   19406                               // ADD{<c>}{<q>} {<Rd>}, SP, <Rm>, RRX ; T3
   19407                               add(CurrentCond(),
   19408                                   Best,
   19409                                   Register(rd),
   19410                                   sp,
   19411                                   Operand(Register(rm), RRX));
   19412                               if (((instr & 0xfffff0f0) != 0xeb0d0030)) {
   19413                                 UnpredictableT32(instr);
   19414                               }
   19415                               break;
   19416                             }
   19417                             default: {
   19418                               if (((instr & 0x70f0) == 0x30)) {
   19419                                 UnallocatedT32(instr);
   19420                                 return;
   19421                               }
   19422                               unsigned rd = (instr >> 8) & 0xf;
   19423                               unsigned rm = instr & 0xf;
   19424                               ImmediateShiftOperand
   19425                                   shift_operand((instr >> 4) & 0x3,
   19426                                                 ((instr >> 6) & 0x3) |
   19427                                                     ((instr >> 10) & 0x1c));
   19428                               if ((instr & 0x00100000) == 0x00000000 &&
   19429                                   shift_operand.GetShift().IsLSL() &&
   19430                                   (shift_operand.GetAmount() == 0) &&
   19431                                   (((rd == rm)) || ((rd == sp.GetCode())))) {
   19432                                 // ADD{<c>}.W {<Rd>}, SP, <Rm> ; T3
   19433                                 add(CurrentCond(),
   19434                                     Wide,
   19435                                     Register(rd),
   19436                                     sp,
   19437                                     Register(rm));
   19438                                 if (((instr & 0xffff8000) != 0xeb0d0000)) {
   19439                                   UnpredictableT32(instr);
   19440                                 }
   19441                               } else {
   19442                                 VIXL_ASSERT((instr & 0x00100000) == 0x00000000);
   19443                                 // ADD{<c>}{<q>} {<Rd>}, SP, <Rm> {, <shift> #<amount> } ; T3 NOLINT(whitespace/line_length)
   19444                                 add(CurrentCond(),
   19445                                     Best,
   19446                                     Register(rd),
   19447                                     sp,
   19448                                     Operand(Register(rm),
   19449                                             shift_operand.GetType(),
   19450                                             shift_operand.GetAmount()));
   19451                                 if (((instr & 0xffff8000) != 0xeb0d0000)) {
   19452                                   UnpredictableT32(instr);
   19453                                 }
   19454                               }
   19455                               break;
   19456                             }
   19457                           }
   19458                           break;
   19459                         }
   19460                         default: {
   19461                           switch (instr & 0x000070f0) {
   19462                             case 0x00000030: {
   19463                               // 0xeb000030
   19464                               if (((instr & 0xf0000) == 0xd0000)) {
   19465                                 UnallocatedT32(instr);
   19466                                 return;
   19467                               }
   19468                               unsigned rd = (instr >> 8) & 0xf;
   19469                               unsigned rn = (instr >> 16) & 0xf;
   19470                               unsigned rm = instr & 0xf;
   19471                               // ADD{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T3
   19472                               add(CurrentCond(),
   19473                                   Best,
   19474                                   Register(rd),
   19475                                   Register(rn),
   19476                                   Operand(Register(rm), RRX));
   19477                               if (((instr & 0xfff0f0f0) != 0xeb000030)) {
   19478                                 UnpredictableT32(instr);
   19479                               }
   19480                               break;
   19481                             }
   19482                             default: {
   19483                               if (((instr & 0xf0000) == 0xd0000) ||
   19484                                   ((instr & 0x70f0) == 0x30)) {
   19485                                 UnallocatedT32(instr);
   19486                                 return;
   19487                               }
   19488                               unsigned rd = (instr >> 8) & 0xf;
   19489                               unsigned rn = (instr >> 16) & 0xf;
   19490                               unsigned rm = instr & 0xf;
   19491                               ImmediateShiftOperand
   19492                                   shift_operand((instr >> 4) & 0x3,
   19493                                                 ((instr >> 6) & 0x3) |
   19494                                                     ((instr >> 10) & 0x1c));
   19495                               if (InITBlock() &&
   19496                                   (instr & 0x00100000) == 0x00000000 &&
   19497                                   shift_operand.GetShift().IsLSL() &&
   19498                                   (shift_operand.GetAmount() == 0) &&
   19499                                   ((rd < kNumberOfT32LowRegisters) &&
   19500                                    (rn < kNumberOfT32LowRegisters) &&
   19501                                    (rm < kNumberOfT32LowRegisters))) {
   19502                                 // ADD<c>.W {<Rd>}, <Rn>, <Rm> ; T3
   19503                                 add(CurrentCond(),
   19504                                     Wide,
   19505                                     Register(rd),
   19506                                     Register(rn),
   19507                                     Register(rm));
   19508                                 if (((instr & 0xfff08000) != 0xeb000000)) {
   19509                                   UnpredictableT32(instr);
   19510                                 }
   19511                               } else if ((instr & 0x00100000) == 0x00000000 &&
   19512                                          shift_operand.GetShift().IsLSL() &&
   19513                                          (shift_operand.GetAmount() == 0) &&
   19514                                          ((rd == rn))) {
   19515                                 // ADD<c>.W {<Rd>}, <Rn>, <Rm> ; T3
   19516                                 add(CurrentCond(),
   19517                                     Wide,
   19518                                     Register(rd),
   19519                                     Register(rn),
   19520                                     Register(rm));
   19521                                 if (((instr & 0xfff08000) != 0xeb000000)) {
   19522                                   UnpredictableT32(instr);
   19523                                 }
   19524                               } else {
   19525                                 VIXL_ASSERT((instr & 0x00100000) == 0x00000000);
   19526                                 // ADD{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T3 NOLINT(whitespace/line_length)
   19527                                 add(CurrentCond(),
   19528                                     Best,
   19529                                     Register(rd),
   19530                                     Register(rn),
   19531                                     Operand(Register(rm),
   19532                                             shift_operand.GetType(),
   19533                                             shift_operand.GetAmount()));
   19534                                 if (((instr & 0xfff08000) != 0xeb000000)) {
   19535                                   UnpredictableT32(instr);
   19536                                 }
   19537                               }
   19538                               break;
   19539                             }
   19540                           }
   19541                           break;
   19542                         }
   19543                       }
   19544                       break;
   19545                     }
   19546                     case 0x00400000: {
   19547                       // 0xeb400000
   19548                       switch (instr & 0x000070f0) {
   19549                         case 0x00000030: {
   19550                           // 0xeb400030
   19551                           unsigned rd = (instr >> 8) & 0xf;
   19552                           unsigned rn = (instr >> 16) & 0xf;
   19553                           unsigned rm = instr & 0xf;
   19554                           // ADC{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2
   19555                           adc(CurrentCond(),
   19556                               Best,
   19557                               Register(rd),
   19558                               Register(rn),
   19559                               Operand(Register(rm), RRX));
   19560                           if (((instr & 0xfff0f0f0) != 0xeb400030)) {
   19561                             UnpredictableT32(instr);
   19562                           }
   19563                           break;
   19564                         }
   19565                         default: {
   19566                           if (((instr & 0x70f0) == 0x30)) {
   19567                             UnallocatedT32(instr);
   19568                             return;
   19569                           }
   19570                           unsigned rd = (instr >> 8) & 0xf;
   19571                           unsigned rn = (instr >> 16) & 0xf;
   19572                           unsigned rm = instr & 0xf;
   19573                           ImmediateShiftOperand
   19574                               shift_operand((instr >> 4) & 0x3,
   19575                                             ((instr >> 6) & 0x3) |
   19576                                                 ((instr >> 10) & 0x1c));
   19577                           if (InITBlock() &&
   19578                               (instr & 0x00100000) == 0x00000000 &&
   19579                               shift_operand.GetShift().IsLSL() &&
   19580                               (shift_operand.GetAmount() == 0) &&
   19581                               ((rd == rn) && (rd < kNumberOfT32LowRegisters) &&
   19582                                (rm < kNumberOfT32LowRegisters))) {
   19583                             // ADC<c>.W {<Rd>}, <Rn>, <Rm> ; T2
   19584                             adc(CurrentCond(),
   19585                                 Wide,
   19586                                 Register(rd),
   19587                                 Register(rn),
   19588                                 Register(rm));
   19589                             if (((instr & 0xfff08000) != 0xeb400000)) {
   19590                               UnpredictableT32(instr);
   19591                             }
   19592                           } else {
   19593                             VIXL_ASSERT((instr & 0x00100000) == 0x00000000);
   19594                             // ADC{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
   19595                             adc(CurrentCond(),
   19596                                 Best,
   19597                                 Register(rd),
   19598                                 Register(rn),
   19599                                 Operand(Register(rm),
   19600                                         shift_operand.GetType(),
   19601                                         shift_operand.GetAmount()));
   19602                             if (((instr & 0xfff08000) != 0xeb400000)) {
   19603                               UnpredictableT32(instr);
   19604                             }
   19605                           }
   19606                           break;
   19607                         }
   19608                       }
   19609                       break;
   19610                     }
   19611                     case 0x00600000: {
   19612                       // 0xeb600000
   19613                       switch (instr & 0x000070f0) {
   19614                         case 0x00000030: {
   19615                           // 0xeb600030
   19616                           unsigned rd = (instr >> 8) & 0xf;
   19617                           unsigned rn = (instr >> 16) & 0xf;
   19618                           unsigned rm = instr & 0xf;
   19619                           // SBC{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2
   19620                           sbc(CurrentCond(),
   19621                               Best,
   19622                               Register(rd),
   19623                               Register(rn),
   19624                               Operand(Register(rm), RRX));
   19625                           if (((instr & 0xfff0f0f0) != 0xeb600030)) {
   19626                             UnpredictableT32(instr);
   19627                           }
   19628                           break;
   19629                         }
   19630                         default: {
   19631                           if (((instr & 0x70f0) == 0x30)) {
   19632                             UnallocatedT32(instr);
   19633                             return;
   19634                           }
   19635                           unsigned rd = (instr >> 8) & 0xf;
   19636                           unsigned rn = (instr >> 16) & 0xf;
   19637                           unsigned rm = instr & 0xf;
   19638                           ImmediateShiftOperand
   19639                               shift_operand((instr >> 4) & 0x3,
   19640                                             ((instr >> 6) & 0x3) |
   19641                                                 ((instr >> 10) & 0x1c));
   19642                           if (InITBlock() &&
   19643                               (instr & 0x00100000) == 0x00000000 &&
   19644                               shift_operand.GetShift().IsLSL() &&
   19645                               (shift_operand.GetAmount() == 0) &&
   19646                               ((rd == rn) && (rd < kNumberOfT32LowRegisters) &&
   19647                                (rm < kNumberOfT32LowRegisters))) {
   19648                             // SBC<c>.W {<Rd>}, <Rn>, <Rm> ; T2
   19649                             sbc(CurrentCond(),
   19650                                 Wide,
   19651                                 Register(rd),
   19652                                 Register(rn),
   19653                                 Register(rm));
   19654                             if (((instr & 0xfff08000) != 0xeb600000)) {
   19655                               UnpredictableT32(instr);
   19656                             }
   19657                           } else {
   19658                             VIXL_ASSERT((instr & 0x00100000) == 0x00000000);
   19659                             // SBC{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
   19660                             sbc(CurrentCond(),
   19661                                 Best,
   19662                                 Register(rd),
   19663                                 Register(rn),
   19664                                 Operand(Register(rm),
   19665                                         shift_operand.GetType(),
   19666                                         shift_operand.GetAmount()));
   19667                             if (((instr & 0xfff08000) != 0xeb600000)) {
   19668                               UnpredictableT32(instr);
   19669                             }
   19670                           }
   19671                           break;
   19672                         }
   19673                       }
   19674                       break;
   19675                     }
   19676                     default:
   19677                       UnallocatedT32(instr);
   19678                       break;
   19679                   }
   19680                   break;
   19681                 }
   19682                 case 0x01100000: {
   19683                   // 0xeb100000
   19684                   switch (instr & 0x00600000) {
   19685                     case 0x00000000: {
   19686                       // 0xeb100000
   19687                       switch (instr & 0x00000f00) {
   19688                         case 0x00000f00: {
   19689                           // 0xeb100f00
   19690                           switch (instr & 0x000070f0) {
   19691                             case 0x00000030: {
   19692                               // 0xeb100f30
   19693                               unsigned rn = (instr >> 16) & 0xf;
   19694                               unsigned rm = instr & 0xf;
   19695                               // CMN{<c>}{<q>} <Rn>, <Rm>, RRX ; T2
   19696                               cmn(CurrentCond(),
   19697                                   Best,
   19698                                   Register(rn),
   19699                                   Operand(Register(rm), RRX));
   19700                               if (((instr & 0xfff0fff0) != 0xeb100f30)) {
   19701                                 UnpredictableT32(instr);
   19702                               }
   19703                               break;
   19704                             }
   19705                             default: {
   19706                               if (((instr & 0x70f0) == 0x30)) {
   19707                                 UnallocatedT32(instr);
   19708                                 return;
   19709                               }
   19710                               unsigned rn = (instr >> 16) & 0xf;
   19711                               unsigned rm = instr & 0xf;
   19712                               ImmediateShiftOperand
   19713                                   shift_operand((instr >> 4) & 0x3,
   19714                                                 ((instr >> 6) & 0x3) |
   19715                                                     ((instr >> 10) & 0x1c));
   19716                               if (shift_operand.GetShift().IsLSL() &&
   19717                                   (shift_operand.GetAmount() == 0) &&
   19718                                   ((rn < kNumberOfT32LowRegisters) &&
   19719                                    (rm < kNumberOfT32LowRegisters))) {
   19720                                 // CMN{<c>}.W <Rn>, <Rm> ; T2
   19721                                 cmn(CurrentCond(),
   19722                                     Wide,
   19723                                     Register(rn),
   19724                                     Register(rm));
   19725                                 if (((instr & 0xfff08f00) != 0xeb100f00)) {
   19726                                   UnpredictableT32(instr);
   19727                                 }
   19728                               } else {
   19729                                 // CMN{<c>}{<q>} <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
   19730                                 cmn(CurrentCond(),
   19731                                     Best,
   19732                                     Register(rn),
   19733                                     Operand(Register(rm),
   19734                                             shift_operand.GetType(),
   19735                                             shift_operand.GetAmount()));
   19736                                 if (((instr & 0xfff08f00) != 0xeb100f00)) {
   19737                                   UnpredictableT32(instr);
   19738                                 }
   19739                               }
   19740                               break;
   19741                             }
   19742                           }
   19743                           break;
   19744                         }
   19745                         default: {
   19746                           switch (instr & 0x000f0000) {
   19747                             case 0x000d0000: {
   19748                               // 0xeb1d0000
   19749                               switch (instr & 0x000070f0) {
   19750                                 case 0x00000030: {
   19751                                   // 0xeb1d0030
   19752                                   if (((instr & 0xf00) == 0xf00)) {
   19753                                     UnallocatedT32(instr);
   19754                                     return;
   19755                                   }
   19756                                   unsigned rd = (instr >> 8) & 0xf;
   19757                                   unsigned rm = instr & 0xf;
   19758                                   // ADDS{<c>}{<q>} {<Rd>}, SP, <Rm>, RRX ; T3
   19759                                   adds(CurrentCond(),
   19760                                        Best,
   19761                                        Register(rd),
   19762                                        sp,
   19763                                        Operand(Register(rm), RRX));
   19764                                   if (((instr & 0xfffff0f0) != 0xeb1d0030)) {
   19765                                     UnpredictableT32(instr);
   19766                                   }
   19767                                   break;
   19768                                 }
   19769                                 default: {
   19770                                   if (((instr & 0x70f0) == 0x30) ||
   19771                                       ((instr & 0xf00) == 0xf00)) {
   19772                                     UnallocatedT32(instr);
   19773                                     return;
   19774                                   }
   19775                                   unsigned rd = (instr >> 8) & 0xf;
   19776                                   unsigned rm = instr & 0xf;
   19777                                   ImmediateShiftOperand
   19778                                       shift_operand((instr >> 4) & 0x3,
   19779                                                     ((instr >> 6) & 0x3) |
   19780                                                         ((instr >> 10) & 0x1c));
   19781                                   // ADDS{<c>}{<q>} {<Rd>}, SP, <Rm> {, <shift> #<amount> } ; T3 NOLINT(whitespace/line_length)
   19782                                   adds(CurrentCond(),
   19783                                        Best,
   19784                                        Register(rd),
   19785                                        sp,
   19786                                        Operand(Register(rm),
   19787                                                shift_operand.GetType(),
   19788                                                shift_operand.GetAmount()));
   19789                                   if (((instr & 0xffff8000) != 0xeb1d0000)) {
   19790                                     UnpredictableT32(instr);
   19791                                   }
   19792                                   break;
   19793                                 }
   19794                               }
   19795                               break;
   19796                             }
   19797                             default: {
   19798                               switch (instr & 0x000070f0) {
   19799                                 case 0x00000030: {
   19800                                   // 0xeb100030
   19801                                   if (((instr & 0xf0000) == 0xd0000) ||
   19802                                       ((instr & 0xf00) == 0xf00)) {
   19803                                     UnallocatedT32(instr);
   19804                                     return;
   19805                                   }
   19806                                   unsigned rd = (instr >> 8) & 0xf;
   19807                                   unsigned rn = (instr >> 16) & 0xf;
   19808                                   unsigned rm = instr & 0xf;
   19809                                   // ADDS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T3
   19810                                   adds(CurrentCond(),
   19811                                        Best,
   19812                                        Register(rd),
   19813                                        Register(rn),
   19814                                        Operand(Register(rm), RRX));
   19815                                   if (((instr & 0xfff0f0f0) != 0xeb100030)) {
   19816                                     UnpredictableT32(instr);
   19817                                   }
   19818                                   break;
   19819                                 }
   19820                                 default: {
   19821                                   if (((instr & 0xf0000) == 0xd0000) ||
   19822                                       ((instr & 0x70f0) == 0x30) ||
   19823                                       ((instr & 0xf00) == 0xf00)) {
   19824                                     UnallocatedT32(instr);
   19825                                     return;
   19826                                   }
   19827                                   unsigned rd = (instr >> 8) & 0xf;
   19828                                   unsigned rn = (instr >> 16) & 0xf;
   19829                                   unsigned rm = instr & 0xf;
   19830                                   ImmediateShiftOperand
   19831                                       shift_operand((instr >> 4) & 0x3,
   19832                                                     ((instr >> 6) & 0x3) |
   19833                                                         ((instr >> 10) & 0x1c));
   19834                                   if (OutsideITBlock() &&
   19835                                       (instr & 0x00100000) == 0x00100000 &&
   19836                                       shift_operand.GetShift().IsLSL() &&
   19837                                       (shift_operand.GetAmount() == 0) &&
   19838                                       ((rd < kNumberOfT32LowRegisters) &&
   19839                                        (rn < kNumberOfT32LowRegisters) &&
   19840                                        (rm < kNumberOfT32LowRegisters))) {
   19841                                     // ADDS.W {<Rd>}, <Rn>, <Rm> ; T3
   19842                                     adds(Condition::None(),
   19843                                          Wide,
   19844                                          Register(rd),
   19845                                          Register(rn),
   19846                                          Register(rm));
   19847                                     if (((instr & 0xfff08000) != 0xeb100000)) {
   19848                                       UnpredictableT32(instr);
   19849                                     }
   19850                                   } else {
   19851                                     VIXL_ASSERT((instr & 0x00100000) ==
   19852                                                 0x00100000);
   19853                                     // ADDS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T3 NOLINT(whitespace/line_length)
   19854                                     adds(CurrentCond(),
   19855                                          Best,
   19856                                          Register(rd),
   19857                                          Register(rn),
   19858                                          Operand(Register(rm),
   19859                                                  shift_operand.GetType(),
   19860                                                  shift_operand.GetAmount()));
   19861                                     if (((instr & 0xfff08000) != 0xeb100000)) {
   19862                                       UnpredictableT32(instr);
   19863                                     }
   19864                                   }
   19865                                   break;
   19866                                 }
   19867                               }
   19868                               break;
   19869                             }
   19870                           }
   19871                           break;
   19872                         }
   19873                       }
   19874                       break;
   19875                     }
   19876                     case 0x00400000: {
   19877                       // 0xeb500000
   19878                       switch (instr & 0x000070f0) {
   19879                         case 0x00000030: {
   19880                           // 0xeb500030
   19881                           unsigned rd = (instr >> 8) & 0xf;
   19882                           unsigned rn = (instr >> 16) & 0xf;
   19883                           unsigned rm = instr & 0xf;
   19884                           // ADCS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2
   19885                           adcs(CurrentCond(),
   19886                                Best,
   19887                                Register(rd),
   19888                                Register(rn),
   19889                                Operand(Register(rm), RRX));
   19890                           if (((instr & 0xfff0f0f0) != 0xeb500030)) {
   19891                             UnpredictableT32(instr);
   19892                           }
   19893                           break;
   19894                         }
   19895                         default: {
   19896                           if (((instr & 0x70f0) == 0x30)) {
   19897                             UnallocatedT32(instr);
   19898                             return;
   19899                           }
   19900                           unsigned rd = (instr >> 8) & 0xf;
   19901                           unsigned rn = (instr >> 16) & 0xf;
   19902                           unsigned rm = instr & 0xf;
   19903                           ImmediateShiftOperand
   19904                               shift_operand((instr >> 4) & 0x3,
   19905                                             ((instr >> 6) & 0x3) |
   19906                                                 ((instr >> 10) & 0x1c));
   19907                           if (OutsideITBlock() &&
   19908                               (instr & 0x00100000) == 0x00100000 &&
   19909                               shift_operand.GetShift().IsLSL() &&
   19910                               (shift_operand.GetAmount() == 0) &&
   19911                               ((rd == rn) && (rd < kNumberOfT32LowRegisters) &&
   19912                                (rm < kNumberOfT32LowRegisters))) {
   19913                             // ADCS.W {<Rd>}, <Rn>, <Rm> ; T2
   19914                             adcs(Condition::None(),
   19915                                  Wide,
   19916                                  Register(rd),
   19917                                  Register(rn),
   19918                                  Register(rm));
   19919                             if (((instr & 0xfff08000) != 0xeb500000)) {
   19920                               UnpredictableT32(instr);
   19921                             }
   19922                           } else {
   19923                             VIXL_ASSERT((instr & 0x00100000) == 0x00100000);
   19924                             // ADCS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
   19925                             adcs(CurrentCond(),
   19926                                  Best,
   19927                                  Register(rd),
   19928                                  Register(rn),
   19929                                  Operand(Register(rm),
   19930                                          shift_operand.GetType(),
   19931                                          shift_operand.GetAmount()));
   19932                             if (((instr & 0xfff08000) != 0xeb500000)) {
   19933                               UnpredictableT32(instr);
   19934                             }
   19935                           }
   19936                           break;
   19937                         }
   19938                       }
   19939                       break;
   19940                     }
   19941                     case 0x00600000: {
   19942                       // 0xeb700000
   19943                       switch (instr & 0x000070f0) {
   19944                         case 0x00000030: {
   19945                           // 0xeb700030
   19946                           unsigned rd = (instr >> 8) & 0xf;
   19947                           unsigned rn = (instr >> 16) & 0xf;
   19948                           unsigned rm = instr & 0xf;
   19949                           // SBCS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2
   19950                           sbcs(CurrentCond(),
   19951                                Best,
   19952                                Register(rd),
   19953                                Register(rn),
   19954                                Operand(Register(rm), RRX));
   19955                           if (((instr & 0xfff0f0f0) != 0xeb700030)) {
   19956                             UnpredictableT32(instr);
   19957                           }
   19958                           break;
   19959                         }
   19960                         default: {
   19961                           if (((instr & 0x70f0) == 0x30)) {
   19962                             UnallocatedT32(instr);
   19963                             return;
   19964                           }
   19965                           unsigned rd = (instr >> 8) & 0xf;
   19966                           unsigned rn = (instr >> 16) & 0xf;
   19967                           unsigned rm = instr & 0xf;
   19968                           ImmediateShiftOperand
   19969                               shift_operand((instr >> 4) & 0x3,
   19970                                             ((instr >> 6) & 0x3) |
   19971                                                 ((instr >> 10) & 0x1c));
   19972                           if (OutsideITBlock() &&
   19973                               (instr & 0x00100000) == 0x00100000 &&
   19974                               shift_operand.GetShift().IsLSL() &&
   19975                               (shift_operand.GetAmount() == 0) &&
   19976                               ((rd == rn) && (rd < kNumberOfT32LowRegisters) &&
   19977                                (rm < kNumberOfT32LowRegisters))) {
   19978                             // SBCS.W {<Rd>}, <Rn>, <Rm> ; T2
   19979                             sbcs(Condition::None(),
   19980                                  Wide,
   19981                                  Register(rd),
   19982                                  Register(rn),
   19983                                  Register(rm));
   19984                             if (((instr & 0xfff08000) != 0xeb700000)) {
   19985                               UnpredictableT32(instr);
   19986                             }
   19987                           } else {
   19988                             VIXL_ASSERT((instr & 0x00100000) == 0x00100000);
   19989                             // SBCS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
   19990                             sbcs(CurrentCond(),
   19991                                  Best,
   19992                                  Register(rd),
   19993                                  Register(rn),
   19994                                  Operand(Register(rm),
   19995                                          shift_operand.GetType(),
   19996                                          shift_operand.GetAmount()));
   19997                             if (((instr & 0xfff08000) != 0xeb700000)) {
   19998                               UnpredictableT32(instr);
   19999                             }
   20000                           }
   20001                           break;
   20002                         }
   20003                       }
   20004                       break;
   20005                     }
   20006                     default:
   20007                       UnallocatedT32(instr);
   20008                       break;
   20009                   }
   20010                   break;
   20011                 }
   20012                 case 0x01800000: {
   20013                   // 0xeb800000
   20014                   switch (instr & 0x00600000) {
   20015                     case 0x00200000: {
   20016                       // 0xeba00000
   20017                       switch (instr & 0x000f0000) {
   20018                         case 0x000d0000: {
   20019                           // 0xebad0000
   20020                           switch (instr & 0x000070f0) {
   20021                             case 0x00000030: {
   20022                               // 0xebad0030
   20023                               unsigned rd = (instr >> 8) & 0xf;
   20024                               unsigned rm = instr & 0xf;
   20025                               // SUB{<c>}{<q>} {<Rd>}, SP, <Rm>, RRX ; T1
   20026                               sub(CurrentCond(),
   20027                                   Best,
   20028                                   Register(rd),
   20029                                   sp,
   20030                                   Operand(Register(rm), RRX));
   20031                               if (((instr & 0xfffff0f0) != 0xebad0030)) {
   20032                                 UnpredictableT32(instr);
   20033                               }
   20034                               break;
   20035                             }
   20036                             default: {
   20037                               if (((instr & 0x70f0) == 0x30)) {
   20038                                 UnallocatedT32(instr);
   20039                                 return;
   20040                               }
   20041                               unsigned rd = (instr >> 8) & 0xf;
   20042                               unsigned rm = instr & 0xf;
   20043                               ImmediateShiftOperand
   20044                                   shift_operand((instr >> 4) & 0x3,
   20045                                                 ((instr >> 6) & 0x3) |
   20046                                                     ((instr >> 10) & 0x1c));
   20047                               if ((instr & 0x00100000) == 0x00000000 &&
   20048                                   shift_operand.GetShift().IsLSL() &&
   20049                                   (shift_operand.GetAmount() == 0)) {
   20050                                 // SUB{<c>} {<Rd>}, SP, <Rm> ; T1
   20051                                 sub(CurrentCond(),
   20052                                     Best,
   20053                                     Register(rd),
   20054                                     sp,
   20055                                     Register(rm));
   20056                                 if (((instr & 0xffff8000) != 0xebad0000)) {
   20057                                   UnpredictableT32(instr);
   20058                                 }
   20059                               } else {
   20060                                 VIXL_ASSERT((instr & 0x00100000) == 0x00000000);
   20061                                 // SUB{<c>}{<q>} {<Rd>}, SP, <Rm> {, <shift> #<amount> } ; T1 NOLINT(whitespace/line_length)
   20062                                 sub(CurrentCond(),
   20063                                     Best,
   20064                                     Register(rd),
   20065                                     sp,
   20066                                     Operand(Register(rm),
   20067                                             shift_operand.GetType(),
   20068                                             shift_operand.GetAmount()));
   20069                                 if (((instr & 0xffff8000) != 0xebad0000)) {
   20070                                   UnpredictableT32(instr);
   20071                                 }
   20072                               }
   20073                               break;
   20074                             }
   20075                           }
   20076                           break;
   20077                         }
   20078                         default: {
   20079                           switch (instr & 0x000070f0) {
   20080                             case 0x00000030: {
   20081                               // 0xeba00030
   20082                               if (((instr & 0xf0000) == 0xd0000)) {
   20083                                 UnallocatedT32(instr);
   20084                                 return;
   20085                               }
   20086                               unsigned rd = (instr >> 8) & 0xf;
   20087                               unsigned rn = (instr >> 16) & 0xf;
   20088                               unsigned rm = instr & 0xf;
   20089                               // SUB{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2
   20090                               sub(CurrentCond(),
   20091                                   Best,
   20092                                   Register(rd),
   20093                                   Register(rn),
   20094                                   Operand(Register(rm), RRX));
   20095                               if (((instr & 0xfff0f0f0) != 0xeba00030)) {
   20096                                 UnpredictableT32(instr);
   20097                               }
   20098                               break;
   20099                             }
   20100                             default: {
   20101                               if (((instr & 0xf0000) == 0xd0000) ||
   20102                                   ((instr & 0x70f0) == 0x30)) {
   20103                                 UnallocatedT32(instr);
   20104                                 return;
   20105                               }
   20106                               unsigned rd = (instr >> 8) & 0xf;
   20107                               unsigned rn = (instr >> 16) & 0xf;
   20108                               unsigned rm = instr & 0xf;
   20109                               ImmediateShiftOperand
   20110                                   shift_operand((instr >> 4) & 0x3,
   20111                                                 ((instr >> 6) & 0x3) |
   20112                                                     ((instr >> 10) & 0x1c));
   20113                               if (InITBlock() &&
   20114                                   (instr & 0x00100000) == 0x00000000 &&
   20115                                   shift_operand.GetShift().IsLSL() &&
   20116                                   (shift_operand.GetAmount() == 0) &&
   20117                                   ((rd < kNumberOfT32LowRegisters) &&
   20118                                    (rn < kNumberOfT32LowRegisters) &&
   20119                                    (rm < kNumberOfT32LowRegisters))) {
   20120                                 // SUB<c>.W {<Rd>}, <Rn>, <Rm> ; T2
   20121                                 sub(CurrentCond(),
   20122                                     Wide,
   20123                                     Register(rd),
   20124                                     Register(rn),
   20125                                     Register(rm));
   20126                                 if (((instr & 0xfff08000) != 0xeba00000)) {
   20127                                   UnpredictableT32(instr);
   20128                                 }
   20129                               } else {
   20130                                 VIXL_ASSERT((instr & 0x00100000) == 0x00000000);
   20131                                 // SUB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
   20132                                 sub(CurrentCond(),
   20133                                     Best,
   20134                                     Register(rd),
   20135                                     Register(rn),
   20136                                     Operand(Register(rm),
   20137                                             shift_operand.GetType(),
   20138                                             shift_operand.GetAmount()));
   20139                                 if (((instr & 0xfff08000) != 0xeba00000)) {
   20140                                   UnpredictableT32(instr);
   20141                                 }
   20142                               }
   20143                               break;
   20144                             }
   20145                           }
   20146                           break;
   20147                         }
   20148                       }
   20149                       break;
   20150                     }
   20151                     case 0x00400000: {
   20152                       // 0xebc00000
   20153                       switch (instr & 0x000070f0) {
   20154                         case 0x00000030: {
   20155                           // 0xebc00030
   20156                           unsigned rd = (instr >> 8) & 0xf;
   20157                           unsigned rn = (instr >> 16) & 0xf;
   20158                           unsigned rm = instr & 0xf;
   20159                           // RSB{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T1
   20160                           rsb(CurrentCond(),
   20161                               Best,
   20162                               Register(rd),
   20163                               Register(rn),
   20164                               Operand(Register(rm), RRX));
   20165                           if (((instr & 0xfff0f0f0) != 0xebc00030)) {
   20166                             UnpredictableT32(instr);
   20167                           }
   20168                           break;
   20169                         }
   20170                         default: {
   20171                           if (((instr & 0x70f0) == 0x30)) {
   20172                             UnallocatedT32(instr);
   20173                             return;
   20174                           }
   20175                           unsigned rd = (instr >> 8) & 0xf;
   20176                           unsigned rn = (instr >> 16) & 0xf;
   20177                           unsigned rm = instr & 0xf;
   20178                           ImmediateShiftOperand
   20179                               shift_operand((instr >> 4) & 0x3,
   20180                                             ((instr >> 6) & 0x3) |
   20181                                                 ((instr >> 10) & 0x1c));
   20182                           // RSB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T1 NOLINT(whitespace/line_length)
   20183                           rsb(CurrentCond(),
   20184                               Best,
   20185                               Register(rd),
   20186                               Register(rn),
   20187                               Operand(Register(rm),
   20188                                       shift_operand.GetType(),
   20189                                       shift_operand.GetAmount()));
   20190                           if (((instr & 0xfff08000) != 0xebc00000)) {
   20191                             UnpredictableT32(instr);
   20192                           }
   20193                           break;
   20194                         }
   20195                       }
   20196                       break;
   20197                     }
   20198                     default:
   20199                       UnallocatedT32(instr);
   20200                       break;
   20201                   }
   20202                   break;
   20203                 }
   20204                 case 0x01900000: {
   20205                   // 0xeb900000
   20206                   switch (instr & 0x00600000) {
   20207                     case 0x00200000: {
   20208                       // 0xebb00000
   20209                       switch (instr & 0x00000f00) {
   20210                         case 0x00000f00: {
   20211                           // 0xebb00f00
   20212                           switch (instr & 0x000070f0) {
   20213                             case 0x00000030: {
   20214                               // 0xebb00f30
   20215                               unsigned rn = (instr >> 16) & 0xf;
   20216                               unsigned rm = instr & 0xf;
   20217                               // CMP{<c>}{<q>} <Rn>, <Rm>, RRX ; T3
   20218                               cmp(CurrentCond(),
   20219                                   Best,
   20220                                   Register(rn),
   20221                                   Operand(Register(rm), RRX));
   20222                               if (((instr & 0xfff0fff0) != 0xebb00f30)) {
   20223                                 UnpredictableT32(instr);
   20224                               }
   20225                               break;
   20226                             }
   20227                             default: {
   20228                               if (((instr & 0x70f0) == 0x30)) {
   20229                                 UnallocatedT32(instr);
   20230                                 return;
   20231                               }
   20232                               unsigned rn = (instr >> 16) & 0xf;
   20233                               unsigned rm = instr & 0xf;
   20234                               ImmediateShiftOperand
   20235                                   shift_operand((instr >> 4) & 0x3,
   20236                                                 ((instr >> 6) & 0x3) |
   20237                                                     ((instr >> 10) & 0x1c));
   20238                               if (shift_operand.GetShift().IsLSL() &&
   20239                                   (shift_operand.GetAmount() == 0)) {
   20240                                 // CMP{<c>}.W <Rn>, <Rm> ; T3
   20241                                 cmp(CurrentCond(),
   20242                                     Wide,
   20243                                     Register(rn),
   20244                                     Register(rm));
   20245                                 if (((instr & 0xfff08f00) != 0xebb00f00)) {
   20246                                   UnpredictableT32(instr);
   20247                                 }
   20248                               } else {
   20249                                 // CMP{<c>}{<q>} <Rn>, <Rm>, <shift> #<amount> ; T3 NOLINT(whitespace/line_length)
   20250                                 cmp(CurrentCond(),
   20251                                     Best,
   20252                                     Register(rn),
   20253                                     Operand(Register(rm),
   20254                                             shift_operand.GetType(),
   20255                                             shift_operand.GetAmount()));
   20256                                 if (((instr & 0xfff08f00) != 0xebb00f00)) {
   20257                                   UnpredictableT32(instr);
   20258                                 }
   20259                               }
   20260                               break;
   20261                             }
   20262                           }
   20263                           break;
   20264                         }
   20265                         default: {
   20266                           switch (instr & 0x000f0000) {
   20267                             case 0x000d0000: {
   20268                               // 0xebbd0000
   20269                               switch (instr & 0x000070f0) {
   20270                                 case 0x00000030: {
   20271                                   // 0xebbd0030
   20272                                   if (((instr & 0xf00) == 0xf00)) {
   20273                                     UnallocatedT32(instr);
   20274                                     return;
   20275                                   }
   20276                                   unsigned rd = (instr >> 8) & 0xf;
   20277                                   unsigned rm = instr & 0xf;
   20278                                   // SUBS{<c>}{<q>} {<Rd>}, SP, <Rm>, RRX ; T1
   20279                                   subs(CurrentCond(),
   20280                                        Best,
   20281                                        Register(rd),
   20282                                        sp,
   20283                                        Operand(Register(rm), RRX));
   20284                                   if (((instr & 0xfffff0f0) != 0xebbd0030)) {
   20285                                     UnpredictableT32(instr);
   20286                                   }
   20287                                   break;
   20288                                 }
   20289                                 default: {
   20290                                   if (((instr & 0x70f0) == 0x30) ||
   20291                                       ((instr & 0xf00) == 0xf00)) {
   20292                                     UnallocatedT32(instr);
   20293                                     return;
   20294                                   }
   20295                                   unsigned rd = (instr >> 8) & 0xf;
   20296                                   unsigned rm = instr & 0xf;
   20297                                   ImmediateShiftOperand
   20298                                       shift_operand((instr >> 4) & 0x3,
   20299                                                     ((instr >> 6) & 0x3) |
   20300                                                         ((instr >> 10) & 0x1c));
   20301                                   // SUBS{<c>}{<q>} {<Rd>}, SP, <Rm> {, <shift> #<amount> } ; T1 NOLINT(whitespace/line_length)
   20302                                   subs(CurrentCond(),
   20303                                        Best,
   20304                                        Register(rd),
   20305                                        sp,
   20306                                        Operand(Register(rm),
   20307                                                shift_operand.GetType(),
   20308                                                shift_operand.GetAmount()));
   20309                                   if (((instr & 0xffff8000) != 0xebbd0000)) {
   20310                                     UnpredictableT32(instr);
   20311                                   }
   20312                                   break;
   20313                                 }
   20314                               }
   20315                               break;
   20316                             }
   20317                             default: {
   20318                               switch (instr & 0x000070f0) {
   20319                                 case 0x00000030: {
   20320                                   // 0xebb00030
   20321                                   if (((instr & 0xf0000) == 0xd0000) ||
   20322                                       ((instr & 0xf00) == 0xf00)) {
   20323                                     UnallocatedT32(instr);
   20324                                     return;
   20325                                   }
   20326                                   unsigned rd = (instr >> 8) & 0xf;
   20327                                   unsigned rn = (instr >> 16) & 0xf;
   20328                                   unsigned rm = instr & 0xf;
   20329                                   // SUBS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2
   20330                                   subs(CurrentCond(),
   20331                                        Best,
   20332                                        Register(rd),
   20333                                        Register(rn),
   20334                                        Operand(Register(rm), RRX));
   20335                                   if (((instr & 0xfff0f0f0) != 0xebb00030)) {
   20336                                     UnpredictableT32(instr);
   20337                                   }
   20338                                   break;
   20339                                 }
   20340                                 default: {
   20341                                   if (((instr & 0xf0000) == 0xd0000) ||
   20342                                       ((instr & 0x70f0) == 0x30) ||
   20343                                       ((instr & 0xf00) == 0xf00)) {
   20344                                     UnallocatedT32(instr);
   20345                                     return;
   20346                                   }
   20347                                   unsigned rd = (instr >> 8) & 0xf;
   20348                                   unsigned rn = (instr >> 16) & 0xf;
   20349                                   unsigned rm = instr & 0xf;
   20350                                   ImmediateShiftOperand
   20351                                       shift_operand((instr >> 4) & 0x3,
   20352                                                     ((instr >> 6) & 0x3) |
   20353                                                         ((instr >> 10) & 0x1c));
   20354                                   if (OutsideITBlock() &&
   20355                                       (instr & 0x00100000) == 0x00100000 &&
   20356                                       shift_operand.GetShift().IsLSL() &&
   20357                                       (shift_operand.GetAmount() == 0) &&
   20358                                       ((rd < kNumberOfT32LowRegisters) &&
   20359                                        (rn < kNumberOfT32LowRegisters) &&
   20360                                        (rm < kNumberOfT32LowRegisters))) {
   20361                                     // SUBS.W {<Rd>}, <Rn>, <Rm> ; T2
   20362                                     subs(Condition::None(),
   20363                                          Wide,
   20364                                          Register(rd),
   20365                                          Register(rn),
   20366                                          Register(rm));
   20367                                     if (((instr & 0xfff08000) != 0xebb00000)) {
   20368                                       UnpredictableT32(instr);
   20369                                     }
   20370                                   } else {
   20371                                     VIXL_ASSERT((instr & 0x00100000) ==
   20372                                                 0x00100000);
   20373                                     // SUBS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
   20374                                     subs(CurrentCond(),
   20375                                          Best,
   20376                                          Register(rd),
   20377                                          Register(rn),
   20378                                          Operand(Register(rm),
   20379                                                  shift_operand.GetType(),
   20380                                                  shift_operand.GetAmount()));
   20381                                     if (((instr & 0xfff08000) != 0xebb00000)) {
   20382                                       UnpredictableT32(instr);
   20383                                     }
   20384                                   }
   20385                                   break;
   20386                                 }
   20387                               }
   20388                               break;
   20389                             }
   20390                           }
   20391                           break;
   20392                         }
   20393                       }
   20394                       break;
   20395                     }
   20396                     case 0x00400000: {
   20397                       // 0xebd00000
   20398                       switch (instr & 0x000070f0) {
   20399                         case 0x00000030: {
   20400                           // 0xebd00030
   20401                           unsigned rd = (instr >> 8) & 0xf;
   20402                           unsigned rn = (instr >> 16) & 0xf;
   20403                           unsigned rm = instr & 0xf;
   20404                           // RSBS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T1
   20405                           rsbs(CurrentCond(),
   20406                                Best,
   20407                                Register(rd),
   20408                                Register(rn),
   20409                                Operand(Register(rm), RRX));
   20410                           if (((instr & 0xfff0f0f0) != 0xebd00030)) {
   20411                             UnpredictableT32(instr);
   20412                           }
   20413                           break;
   20414                         }
   20415                         default: {
   20416                           if (((instr & 0x70f0) == 0x30)) {
   20417                             UnallocatedT32(instr);
   20418                             return;
   20419                           }
   20420                           unsigned rd = (instr >> 8) & 0xf;
   20421                           unsigned rn = (instr >> 16) & 0xf;
   20422                           unsigned rm = instr & 0xf;
   20423                           ImmediateShiftOperand
   20424                               shift_operand((instr >> 4) & 0x3,
   20425                                             ((instr >> 6) & 0x3) |
   20426                                                 ((instr >> 10) & 0x1c));
   20427                           // RSBS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T1 NOLINT(whitespace/line_length)
   20428                           rsbs(CurrentCond(),
   20429                                Best,
   20430                                Register(rd),
   20431                                Register(rn),
   20432                                Operand(Register(rm),
   20433                                        shift_operand.GetType(),
   20434                                        shift_operand.GetAmount()));
   20435                           if (((instr & 0xfff08000) != 0xebd00000)) {
   20436                             UnpredictableT32(instr);
   20437                           }
   20438                           break;
   20439                         }
   20440                       }
   20441                       break;
   20442                     }
   20443                     default:
   20444                       UnallocatedT32(instr);
   20445                       break;
   20446                   }
   20447                   break;
   20448                 }
   20449                 case 0x10000000: {
   20450                   // 0xfa000000
   20451                   switch (instr & 0x0000f080) {
   20452                     case 0x0000f000: {
   20453                       // 0xfa00f000
   20454                       if ((instr & 0x00000070) == 0x00000000) {
   20455                         if (((Uint32((instr >> 21)) & Uint32(0x3)) ==
   20456                              Uint32(0x2))) {
   20457                           unsigned rd = (instr >> 8) & 0xf;
   20458                           unsigned rm = (instr >> 16) & 0xf;
   20459                           unsigned rs = instr & 0xf;
   20460                           if (InITBlock() &&
   20461                               ((rd == rm) && (rd < kNumberOfT32LowRegisters) &&
   20462                                (rs < kNumberOfT32LowRegisters))) {
   20463                             // ASR<c>.W {<Rd>}, <Rm>, <Rs> ; T2
   20464                             asr(CurrentCond(),
   20465                                 Wide,
   20466                                 Register(rd),
   20467                                 Register(rm),
   20468                                 Register(rs));
   20469                           } else {
   20470                             // ASR{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; T2
   20471                             asr(CurrentCond(),
   20472                                 Best,
   20473                                 Register(rd),
   20474                                 Register(rm),
   20475                                 Register(rs));
   20476                           }
   20477                           return;
   20478                         }
   20479                         if (((Uint32((instr >> 21)) & Uint32(0x3)) ==
   20480                              Uint32(0x0))) {
   20481                           unsigned rd = (instr >> 8) & 0xf;
   20482                           unsigned rm = (instr >> 16) & 0xf;
   20483                           unsigned rs = instr & 0xf;
   20484                           if (InITBlock() &&
   20485                               ((rd == rm) && (rd < kNumberOfT32LowRegisters) &&
   20486                                (rs < kNumberOfT32LowRegisters))) {
   20487                             // LSL<c>.W {<Rd>}, <Rm>, <Rs> ; T2
   20488                             lsl(CurrentCond(),
   20489                                 Wide,
   20490                                 Register(rd),
   20491                                 Register(rm),
   20492                                 Register(rs));
   20493                           } else {
   20494                             // LSL{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; T2
   20495                             lsl(CurrentCond(),
   20496                                 Best,
   20497                                 Register(rd),
   20498                                 Register(rm),
   20499                                 Register(rs));
   20500                           }
   20501                           return;
   20502                         }
   20503                         if (((Uint32((instr >> 21)) & Uint32(0x3)) ==
   20504                              Uint32(0x1))) {
   20505                           unsigned rd = (instr >> 8) & 0xf;
   20506                           unsigned rm = (instr >> 16) & 0xf;
   20507                           unsigned rs = instr & 0xf;
   20508                           if (InITBlock() &&
   20509                               ((rd == rm) && (rd < kNumberOfT32LowRegisters) &&
   20510                                (rs < kNumberOfT32LowRegisters))) {
   20511                             // LSR<c>.W {<Rd>}, <Rm>, <Rs> ; T2
   20512                             lsr(CurrentCond(),
   20513                                 Wide,
   20514                                 Register(rd),
   20515                                 Register(rm),
   20516                                 Register(rs));
   20517                           } else {
   20518                             // LSR{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; T2
   20519                             lsr(CurrentCond(),
   20520                                 Best,
   20521                                 Register(rd),
   20522                                 Register(rm),
   20523                                 Register(rs));
   20524                           }
   20525                           return;
   20526                         }
   20527                         if (((Uint32((instr >> 21)) & Uint32(0x3)) ==
   20528                              Uint32(0x3))) {
   20529                           unsigned rd = (instr >> 8) & 0xf;
   20530                           unsigned rm = (instr >> 16) & 0xf;
   20531                           unsigned rs = instr & 0xf;
   20532                           if (InITBlock() &&
   20533                               ((rd == rm) && (rd < kNumberOfT32LowRegisters) &&
   20534                                (rs < kNumberOfT32LowRegisters))) {
   20535                             // ROR<c>.W {<Rd>}, <Rm>, <Rs> ; T2
   20536                             ror(CurrentCond(),
   20537                                 Wide,
   20538                                 Register(rd),
   20539                                 Register(rm),
   20540                                 Register(rs));
   20541                           } else {
   20542                             // ROR{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; T2
   20543                             ror(CurrentCond(),
   20544                                 Best,
   20545                                 Register(rd),
   20546                                 Register(rm),
   20547                                 Register(rs));
   20548                           }
   20549                           return;
   20550                         }
   20551                         unsigned rd = (instr >> 8) & 0xf;
   20552                         unsigned rm = (instr >> 16) & 0xf;
   20553                         Shift shift((instr >> 21) & 0x3);
   20554                         unsigned rs = instr & 0xf;
   20555                         if (InITBlock() && (instr & 0x00100000) == 0x00000000 &&
   20556                             ((rd < kNumberOfT32LowRegisters) &&
   20557                              (rm < kNumberOfT32LowRegisters) &&
   20558                              (rs < kNumberOfT32LowRegisters))) {
   20559                           // MOV<c>.W <Rd>, <Rm>, <shift> <Rs> ; T2
   20560                           mov(CurrentCond(),
   20561                               Wide,
   20562                               Register(rd),
   20563                               Operand(Register(rm),
   20564                                       shift.GetType(),
   20565                                       Register(rs)));
   20566                         } else {
   20567                           VIXL_ASSERT((instr & 0x00100000) == 0x00000000);
   20568                           // MOV{<c>}{<q>} <Rd>, <Rm>, <shift> <Rs> ; T2
   20569                           mov(CurrentCond(),
   20570                               Best,
   20571                               Register(rd),
   20572                               Operand(Register(rm),
   20573                                       shift.GetType(),
   20574                                       Register(rs)));
   20575                         }
   20576                       } else {
   20577                         UnallocatedT32(instr);
   20578                       }
   20579                       break;
   20580                     }
   20581                     case 0x0000f080: {
   20582                       // 0xfa00f080
   20583                       switch (instr & 0x00600000) {
   20584                         case 0x00000000: {
   20585                           // 0xfa00f080
   20586                           switch (instr & 0x000f0000) {
   20587                             case 0x000f0000: {
   20588                               // 0xfa0ff080
   20589                               unsigned rd = (instr >> 8) & 0xf;
   20590                               unsigned rm = instr & 0xf;
   20591                               uint32_t amount = ((instr >> 4) & 0x3) * 8;
   20592                               if ((amount == 0) &&
   20593                                   ((rd < kNumberOfT32LowRegisters) &&
   20594                                    (rm < kNumberOfT32LowRegisters))) {
   20595                                 // SXTH{<c>}.W {<Rd>}, <Rm> ; T2
   20596                                 sxth(CurrentCond(),
   20597                                      Wide,
   20598                                      Register(rd),
   20599                                      Register(rm));
   20600                                 if (((instr & 0xfffff0c0) != 0xfa0ff080)) {
   20601                                   UnpredictableT32(instr);
   20602                                 }
   20603                               } else {
   20604                                 // SXTH{<c>}{<q>} {<Rd>}, <Rm> {, ROR #<amount> } ; T2 NOLINT(whitespace/line_length)
   20605                                 sxth(CurrentCond(),
   20606                                      Best,
   20607                                      Register(rd),
   20608                                      Operand(Register(rm), ROR, amount));
   20609                                 if (((instr & 0xfffff0c0) != 0xfa0ff080)) {
   20610                                   UnpredictableT32(instr);
   20611                                 }
   20612                               }
   20613                               break;
   20614                             }
   20615                             default: {
   20616                               if (((instr & 0xf0000) == 0xf0000)) {
   20617                                 UnallocatedT32(instr);
   20618                                 return;
   20619                               }
   20620                               unsigned rd = (instr >> 8) & 0xf;
   20621                               unsigned rn = (instr >> 16) & 0xf;
   20622                               unsigned rm = instr & 0xf;
   20623                               uint32_t amount = ((instr >> 4) & 0x3) * 8;
   20624                               // SXTAH{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ROR #<amount> } ; T1 NOLINT(whitespace/line_length)
   20625                               sxtah(CurrentCond(),
   20626                                     Register(rd),
   20627                                     Register(rn),
   20628                                     Operand(Register(rm), ROR, amount));
   20629                               if (((instr & 0xfff0f0c0) != 0xfa00f080)) {
   20630                                 UnpredictableT32(instr);
   20631                               }
   20632                               break;
   20633                             }
   20634                           }
   20635                           break;
   20636                         }
   20637                         case 0x00200000: {
   20638                           // 0xfa20f080
   20639                           switch (instr & 0x000f0000) {
   20640                             case 0x000f0000: {
   20641                               // 0xfa2ff080
   20642                               unsigned rd = (instr >> 8) & 0xf;
   20643                               unsigned rm = instr & 0xf;
   20644                               uint32_t amount = ((instr >> 4) & 0x3) * 8;
   20645                               // SXTB16{<c>}{<q>} {<Rd>}, <Rm> {, ROR #<amount> } ; T1 NOLINT(whitespace/line_length)
   20646                               sxtb16(CurrentCond(),
   20647                                      Register(rd),
   20648                                      Operand(Register(rm), ROR, amount));
   20649                               if (((instr & 0xfffff0c0) != 0xfa2ff080)) {
   20650                                 UnpredictableT32(instr);
   20651                               }
   20652                               break;
   20653                             }
   20654                             default: {
   20655                               if (((instr & 0xf0000) == 0xf0000)) {
   20656                                 UnallocatedT32(instr);
   20657                                 return;
   20658                               }
   20659                               unsigned rd = (instr >> 8) & 0xf;
   20660                               unsigned rn = (instr >> 16) & 0xf;
   20661                               unsigned rm = instr & 0xf;
   20662                               uint32_t amount = ((instr >> 4) & 0x3) * 8;
   20663                               // SXTAB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ROR #<amount> } ; T1 NOLINT(whitespace/line_length)
   20664                               sxtab16(CurrentCond(),
   20665                                       Register(rd),
   20666                                       Register(rn),
   20667                                       Operand(Register(rm), ROR, amount));
   20668                               if (((instr & 0xfff0f0c0) != 0xfa20f080)) {
   20669                                 UnpredictableT32(instr);
   20670                               }
   20671                               break;
   20672                             }
   20673                           }
   20674                           break;
   20675                         }
   20676                         case 0x00400000: {
   20677                           // 0xfa40f080
   20678                           switch (instr & 0x000f0000) {
   20679                             case 0x000f0000: {
   20680                               // 0xfa4ff080
   20681                               unsigned rd = (instr >> 8) & 0xf;
   20682                               unsigned rm = instr & 0xf;
   20683                               uint32_t amount = ((instr >> 4) & 0x3) * 8;
   20684                               if ((amount == 0) &&
   20685                                   ((rd < kNumberOfT32LowRegisters) &&
   20686                                    (rm < kNumberOfT32LowRegisters))) {
   20687                                 // SXTB{<c>}.W {<Rd>}, <Rm> ; T2
   20688                                 sxtb(CurrentCond(),
   20689                                      Wide,
   20690                                      Register(rd),
   20691                                      Register(rm));
   20692                                 if (((instr & 0xfffff0c0) != 0xfa4ff080)) {
   20693                                   UnpredictableT32(instr);
   20694                                 }
   20695                               } else {
   20696                                 // SXTB{<c>}{<q>} {<Rd>}, <Rm> {, ROR #<amount> } ; T2 NOLINT(whitespace/line_length)
   20697                                 sxtb(CurrentCond(),
   20698                                      Best,
   20699                                      Register(rd),
   20700                                      Operand(Register(rm), ROR, amount));
   20701                                 if (((instr & 0xfffff0c0) != 0xfa4ff080)) {
   20702                                   UnpredictableT32(instr);
   20703                                 }
   20704                               }
   20705                               break;
   20706                             }
   20707                             default: {
   20708                               if (((instr & 0xf0000) == 0xf0000)) {
   20709                                 UnallocatedT32(instr);
   20710                                 return;
   20711                               }
   20712                               unsigned rd = (instr >> 8) & 0xf;
   20713                               unsigned rn = (instr >> 16) & 0xf;
   20714                               unsigned rm = instr & 0xf;
   20715                               uint32_t amount = ((instr >> 4) & 0x3) * 8;
   20716                               // SXTAB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ROR #<amount> } ; T1 NOLINT(whitespace/line_length)
   20717                               sxtab(CurrentCond(),
   20718                                     Register(rd),
   20719                                     Register(rn),
   20720                                     Operand(Register(rm), ROR, amount));
   20721                               if (((instr & 0xfff0f0c0) != 0xfa40f080)) {
   20722                                 UnpredictableT32(instr);
   20723                               }
   20724                               break;
   20725                             }
   20726                           }
   20727                           break;
   20728                         }
   20729                         default:
   20730                           UnallocatedT32(instr);
   20731                           break;
   20732                       }
   20733                       break;
   20734                     }
   20735                     default:
   20736                       UnallocatedT32(instr);
   20737                       break;
   20738                   }
   20739                   break;
   20740                 }
   20741                 case 0x10100000: {
   20742                   // 0xfa100000
   20743                   switch (instr & 0x0000f080) {
   20744                     case 0x0000f000: {
   20745                       // 0xfa10f000
   20746                       if ((instr & 0x00000070) == 0x00000000) {
   20747                         if (((Uint32((instr >> 21)) & Uint32(0x3)) ==
   20748                              Uint32(0x2))) {
   20749                           unsigned rd = (instr >> 8) & 0xf;
   20750                           unsigned rm = (instr >> 16) & 0xf;
   20751                           unsigned rs = instr & 0xf;
   20752                           if (OutsideITBlock() &&
   20753                               ((rd == rm) && (rd < kNumberOfT32LowRegisters) &&
   20754                                (rs < kNumberOfT32LowRegisters))) {
   20755                             // ASRS.W {<Rd>}, <Rm>, <Rs> ; T2
   20756                             asrs(Condition::None(),
   20757                                  Wide,
   20758                                  Register(rd),
   20759                                  Register(rm),
   20760                                  Register(rs));
   20761                           } else {
   20762                             // ASRS{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; T2
   20763                             asrs(CurrentCond(),
   20764                                  Best,
   20765                                  Register(rd),
   20766                                  Register(rm),
   20767                                  Register(rs));
   20768                           }
   20769                           return;
   20770                         }
   20771                         if (((Uint32((instr >> 21)) & Uint32(0x3)) ==
   20772                              Uint32(0x0))) {
   20773                           unsigned rd = (instr >> 8) & 0xf;
   20774                           unsigned rm = (instr >> 16) & 0xf;
   20775                           unsigned rs = instr & 0xf;
   20776                           if (OutsideITBlock() &&
   20777                               ((rd == rm) && (rd < kNumberOfT32LowRegisters) &&
   20778                                (rs < kNumberOfT32LowRegisters))) {
   20779                             // LSLS.W {<Rd>}, <Rm>, <Rs> ; T2
   20780                             lsls(Condition::None(),
   20781                                  Wide,
   20782                                  Register(rd),
   20783                                  Register(rm),
   20784                                  Register(rs));
   20785                           } else {
   20786                             // LSLS{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; T2
   20787                             lsls(CurrentCond(),
   20788                                  Best,
   20789                                  Register(rd),
   20790                                  Register(rm),
   20791                                  Register(rs));
   20792                           }
   20793                           return;
   20794                         }
   20795                         if (((Uint32((instr >> 21)) & Uint32(0x3)) ==
   20796                              Uint32(0x1))) {
   20797                           unsigned rd = (instr >> 8) & 0xf;
   20798                           unsigned rm = (instr >> 16) & 0xf;
   20799                           unsigned rs = instr & 0xf;
   20800                           if (OutsideITBlock() &&
   20801                               ((rd == rm) && (rd < kNumberOfT32LowRegisters) &&
   20802                                (rs < kNumberOfT32LowRegisters))) {
   20803                             // LSRS.W {<Rd>}, <Rm>, <Rs> ; T2
   20804                             lsrs(Condition::None(),
   20805                                  Wide,
   20806                                  Register(rd),
   20807                                  Register(rm),
   20808                                  Register(rs));
   20809                           } else {
   20810                             // LSRS{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; T2
   20811                             lsrs(CurrentCond(),
   20812                                  Best,
   20813                                  Register(rd),
   20814                                  Register(rm),
   20815                                  Register(rs));
   20816                           }
   20817                           return;
   20818                         }
   20819                         if (((Uint32((instr >> 21)) & Uint32(0x3)) ==
   20820                              Uint32(0x3))) {
   20821                           unsigned rd = (instr >> 8) & 0xf;
   20822                           unsigned rm = (instr >> 16) & 0xf;
   20823                           unsigned rs = instr & 0xf;
   20824                           if (OutsideITBlock() &&
   20825                               ((rd == rm) && (rd < kNumberOfT32LowRegisters) &&
   20826                                (rs < kNumberOfT32LowRegisters))) {
   20827                             // RORS.W {<Rd>}, <Rm>, <Rs> ; T2
   20828                             rors(Condition::None(),
   20829                                  Wide,
   20830                                  Register(rd),
   20831                                  Register(rm),
   20832                                  Register(rs));
   20833                           } else {
   20834                             // RORS{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; T2
   20835                             rors(CurrentCond(),
   20836                                  Best,
   20837                                  Register(rd),
   20838                                  Register(rm),
   20839                                  Register(rs));
   20840                           }
   20841                           return;
   20842                         }
   20843                         unsigned rd = (instr >> 8) & 0xf;
   20844                         unsigned rm = (instr >> 16) & 0xf;
   20845                         Shift shift((instr >> 21) & 0x3);
   20846                         unsigned rs = instr & 0xf;
   20847                         if (OutsideITBlock() &&
   20848                             (instr & 0x00100000) == 0x00100000 &&
   20849                             ((rd < kNumberOfT32LowRegisters) &&
   20850                              (rm < kNumberOfT32LowRegisters) &&
   20851                              (rs < kNumberOfT32LowRegisters))) {
   20852                           // MOVS.W <Rd>, <Rm>, <shift> <Rs> ; T2
   20853                           movs(Condition::None(),
   20854                                Wide,
   20855                                Register(rd),
   20856                                Operand(Register(rm),
   20857                                        shift.GetType(),
   20858                                        Register(rs)));
   20859                         } else {
   20860                           VIXL_ASSERT((instr & 0x00100000) == 0x00100000);
   20861                           // MOVS{<c>}{<q>} <Rd>, <Rm>, <shift> <Rs> ; T2
   20862                           movs(CurrentCond(),
   20863                                Best,
   20864                                Register(rd),
   20865                                Operand(Register(rm),
   20866                                        shift.GetType(),
   20867                                        Register(rs)));
   20868                         }
   20869                       } else {
   20870                         UnallocatedT32(instr);
   20871                       }
   20872                       break;
   20873                     }
   20874                     case 0x0000f080: {
   20875                       // 0xfa10f080
   20876                       switch (instr & 0x00600000) {
   20877                         case 0x00000000: {
   20878                           // 0xfa10f080
   20879                           switch (instr & 0x000f0000) {
   20880                             case 0x000f0000: {
   20881                               // 0xfa1ff080
   20882                               unsigned rd = (instr >> 8) & 0xf;
   20883                               unsigned rm = instr & 0xf;
   20884                               uint32_t amount = ((instr >> 4) & 0x3) * 8;
   20885                               if ((amount == 0) &&
   20886                                   ((rd < kNumberOfT32LowRegisters) &&
   20887                                    (rm < kNumberOfT32LowRegisters))) {
   20888                                 // UXTH{<c>}.W {<Rd>}, <Rm> ; T2
   20889                                 uxth(CurrentCond(),
   20890                                      Wide,
   20891                                      Register(rd),
   20892                                      Register(rm));
   20893                                 if (((instr & 0xfffff0c0) != 0xfa1ff080)) {
   20894                                   UnpredictableT32(instr);
   20895                                 }
   20896                               } else {
   20897                                 // UXTH{<c>}{<q>} {<Rd>}, <Rm> {, ROR #<amount> } ; T2 NOLINT(whitespace/line_length)
   20898                                 uxth(CurrentCond(),
   20899                                      Best,
   20900                                      Register(rd),
   20901                                      Operand(Register(rm), ROR, amount));
   20902                                 if (((instr & 0xfffff0c0) != 0xfa1ff080)) {
   20903                                   UnpredictableT32(instr);
   20904                                 }
   20905                               }
   20906                               break;
   20907                             }
   20908                             default: {
   20909                               if (((instr & 0xf0000) == 0xf0000)) {
   20910                                 UnallocatedT32(instr);
   20911                                 return;
   20912                               }
   20913                               unsigned rd = (instr >> 8) & 0xf;
   20914                               unsigned rn = (instr >> 16) & 0xf;
   20915                               unsigned rm = instr & 0xf;
   20916                               uint32_t amount = ((instr >> 4) & 0x3) * 8;
   20917                               // UXTAH{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ROR #<amount> } ; T1 NOLINT(whitespace/line_length)
   20918                               uxtah(CurrentCond(),
   20919                                     Register(rd),
   20920                                     Register(rn),
   20921                                     Operand(Register(rm), ROR, amount));
   20922                               if (((instr & 0xfff0f0c0) != 0xfa10f080)) {
   20923                                 UnpredictableT32(instr);
   20924                               }
   20925                               break;
   20926                             }
   20927                           }
   20928                           break;
   20929                         }
   20930                         case 0x00200000: {
   20931                           // 0xfa30f080
   20932                           switch (instr & 0x000f0000) {
   20933                             case 0x000f0000: {
   20934                               // 0xfa3ff080
   20935                               unsigned rd = (instr >> 8) & 0xf;
   20936                               unsigned rm = instr & 0xf;
   20937                               uint32_t amount = ((instr >> 4) & 0x3) * 8;
   20938                               // UXTB16{<c>}{<q>} {<Rd>}, <Rm> {, ROR #<amount> } ; T1 NOLINT(whitespace/line_length)
   20939                               uxtb16(CurrentCond(),
   20940                                      Register(rd),
   20941                                      Operand(Register(rm), ROR, amount));
   20942                               if (((instr & 0xfffff0c0) != 0xfa3ff080)) {
   20943                                 UnpredictableT32(instr);
   20944                               }
   20945                               break;
   20946                             }
   20947                             default: {
   20948                               if (((instr & 0xf0000) == 0xf0000)) {
   20949                                 UnallocatedT32(instr);
   20950                                 return;
   20951                               }
   20952                               unsigned rd = (instr >> 8) & 0xf;
   20953                               unsigned rn = (instr >> 16) & 0xf;
   20954                               unsigned rm = instr & 0xf;
   20955                               uint32_t amount = ((instr >> 4) & 0x3) * 8;
   20956                               // UXTAB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ROR #<amount> } ; T1 NOLINT(whitespace/line_length)
   20957                               uxtab16(CurrentCond(),
   20958                                       Register(rd),
   20959                                       Register(rn),
   20960                                       Operand(Register(rm), ROR, amount));
   20961                               if (((instr & 0xfff0f0c0) != 0xfa30f080)) {
   20962                                 UnpredictableT32(instr);
   20963                               }
   20964                               break;
   20965                             }
   20966                           }
   20967                           break;
   20968                         }
   20969                         case 0x00400000: {
   20970                           // 0xfa50f080
   20971                           switch (instr & 0x000f0000) {
   20972                             case 0x000f0000: {
   20973                               // 0xfa5ff080
   20974                               unsigned rd = (instr >> 8) & 0xf;
   20975                               unsigned rm = instr & 0xf;
   20976                               uint32_t amount = ((instr >> 4) & 0x3) * 8;
   20977                               if ((amount == 0) &&
   20978                                   ((rd < kNumberOfT32LowRegisters) &&
   20979                                    (rm < kNumberOfT32LowRegisters))) {
   20980                                 // UXTB{<c>}.W {<Rd>}, <Rm> ; T2
   20981                                 uxtb(CurrentCond(),
   20982                                      Wide,
   20983                                      Register(rd),
   20984                                      Register(rm));
   20985                                 if (((instr & 0xfffff0c0) != 0xfa5ff080)) {
   20986                                   UnpredictableT32(instr);
   20987                                 }
   20988                               } else {
   20989                                 // UXTB{<c>}{<q>} {<Rd>}, <Rm> {, ROR #<amount> } ; T2 NOLINT(whitespace/line_length)
   20990                                 uxtb(CurrentCond(),
   20991                                      Best,
   20992                                      Register(rd),
   20993                                      Operand(Register(rm), ROR, amount));
   20994                                 if (((instr & 0xfffff0c0) != 0xfa5ff080)) {
   20995                                   UnpredictableT32(instr);
   20996                                 }
   20997                               }
   20998                               break;
   20999                             }
   21000                             default: {
   21001                               if (((instr & 0xf0000) == 0xf0000)) {
   21002                                 UnallocatedT32(instr);
   21003                                 return;
   21004                               }
   21005                               unsigned rd = (instr >> 8) & 0xf;
   21006                               unsigned rn = (instr >> 16) & 0xf;
   21007                               unsigned rm = instr & 0xf;
   21008                               uint32_t amount = ((instr >> 4) & 0x3) * 8;
   21009                               // UXTAB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ROR #<amount> } ; T1 NOLINT(whitespace/line_length)
   21010                               uxtab(CurrentCond(),
   21011                                     Register(rd),
   21012                                     Register(rn),
   21013                                     Operand(Register(rm), ROR, amount));
   21014                               if (((instr & 0xfff0f0c0) != 0xfa50f080)) {
   21015                                 UnpredictableT32(instr);
   21016                               }
   21017                               break;
   21018                             }
   21019                           }
   21020                           break;
   21021                         }
   21022                         default:
   21023                           UnallocatedT32(instr);
   21024                           break;
   21025                       }
   21026                       break;
   21027                     }
   21028                     default:
   21029                       UnallocatedT32(instr);
   21030                       break;
   21031                   }
   21032                   break;
   21033                 }
   21034                 case 0x10800000: {
   21035                   // 0xfa800000
   21036                   switch (instr & 0x0060f0f0) {
   21037                     case 0x0000f000: {
   21038                       // 0xfa80f000
   21039                       unsigned rd = (instr >> 8) & 0xf;
   21040                       unsigned rn = (instr >> 16) & 0xf;
   21041                       unsigned rm = instr & 0xf;
   21042                       // SADD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
   21043                       sadd8(CurrentCond(),
   21044                             Register(rd),
   21045                             Register(rn),
   21046                             Register(rm));
   21047                       break;
   21048                     }
   21049                     case 0x0000f010: {
   21050                       // 0xfa80f010
   21051                       unsigned rd = (instr >> 8) & 0xf;
   21052                       unsigned rn = (instr >> 16) & 0xf;
   21053                       unsigned rm = instr & 0xf;
   21054                       // QADD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
   21055                       qadd8(CurrentCond(),
   21056                             Register(rd),
   21057                             Register(rn),
   21058                             Register(rm));
   21059                       break;
   21060                     }
   21061                     case 0x0000f020: {
   21062                       // 0xfa80f020
   21063                       unsigned rd = (instr >> 8) & 0xf;
   21064                       unsigned rn = (instr >> 16) & 0xf;
   21065                       unsigned rm = instr & 0xf;
   21066                       // SHADD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
   21067                       shadd8(CurrentCond(),
   21068                              Register(rd),
   21069                              Register(rn),
   21070                              Register(rm));
   21071                       break;
   21072                     }
   21073                     case 0x0000f040: {
   21074                       // 0xfa80f040
   21075                       unsigned rd = (instr >> 8) & 0xf;
   21076                       unsigned rn = (instr >> 16) & 0xf;
   21077                       unsigned rm = instr & 0xf;
   21078                       // UADD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
   21079                       uadd8(CurrentCond(),
   21080                             Register(rd),
   21081                             Register(rn),
   21082                             Register(rm));
   21083                       break;
   21084                     }
   21085                     case 0x0000f050: {
   21086                       // 0xfa80f050
   21087                       unsigned rd = (instr >> 8) & 0xf;
   21088                       unsigned rn = (instr >> 16) & 0xf;
   21089                       unsigned rm = instr & 0xf;
   21090                       // UQADD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
   21091                       uqadd8(CurrentCond(),
   21092                              Register(rd),
   21093                              Register(rn),
   21094                              Register(rm));
   21095                       break;
   21096                     }
   21097                     case 0x0000f060: {
   21098                       // 0xfa80f060
   21099                       unsigned rd = (instr >> 8) & 0xf;
   21100                       unsigned rn = (instr >> 16) & 0xf;
   21101                       unsigned rm = instr & 0xf;
   21102                       // UHADD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
   21103                       uhadd8(CurrentCond(),
   21104                              Register(rd),
   21105                              Register(rn),
   21106                              Register(rm));
   21107                       break;
   21108                     }
   21109                     case 0x0000f080: {
   21110                       // 0xfa80f080
   21111                       unsigned rd = (instr >> 8) & 0xf;
   21112                       unsigned rm = instr & 0xf;
   21113                       unsigned rn = (instr >> 16) & 0xf;
   21114                       // QADD{<c>}{<q>} {<Rd>}, <Rm>, <Rn> ; T1
   21115                       qadd(CurrentCond(),
   21116                            Register(rd),
   21117                            Register(rm),
   21118                            Register(rn));
   21119                       break;
   21120                     }
   21121                     case 0x0000f090: {
   21122                       // 0xfa80f090
   21123                       unsigned rd = (instr >> 8) & 0xf;
   21124                       unsigned rm = instr & 0xf;
   21125                       unsigned rn = (instr >> 16) & 0xf;
   21126                       // QDADD{<c>}{<q>} {<Rd>}, <Rm>, <Rn> ; T1
   21127                       qdadd(CurrentCond(),
   21128                             Register(rd),
   21129                             Register(rm),
   21130                             Register(rn));
   21131                       break;
   21132                     }
   21133                     case 0x0000f0a0: {
   21134                       // 0xfa80f0a0
   21135                       unsigned rd = (instr >> 8) & 0xf;
   21136                       unsigned rm = instr & 0xf;
   21137                       unsigned rn = (instr >> 16) & 0xf;
   21138                       // QSUB{<c>}{<q>} {<Rd>}, <Rm>, <Rn> ; T1
   21139                       qsub(CurrentCond(),
   21140                            Register(rd),
   21141                            Register(rm),
   21142                            Register(rn));
   21143                       break;
   21144                     }
   21145                     case 0x0000f0b0: {
   21146                       // 0xfa80f0b0
   21147                       unsigned rd = (instr >> 8) & 0xf;
   21148                       unsigned rm = instr & 0xf;
   21149                       unsigned rn = (instr >> 16) & 0xf;
   21150                       // QDSUB{<c>}{<q>} {<Rd>}, <Rm>, <Rn> ; T1
   21151                       qdsub(CurrentCond(),
   21152                             Register(rd),
   21153                             Register(rm),
   21154                             Register(rn));
   21155                       break;
   21156                     }
   21157                     case 0x0020f000: {
   21158                       // 0xfaa0f000
   21159                       unsigned rd = (instr >> 8) & 0xf;
   21160                       unsigned rn = (instr >> 16) & 0xf;
   21161                       unsigned rm = instr & 0xf;
   21162                       // SASX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
   21163                       sasx(CurrentCond(),
   21164                            Register(rd),
   21165                            Register(rn),
   21166                            Register(rm));
   21167                       break;
   21168                     }
   21169                     case 0x0020f010: {
   21170                       // 0xfaa0f010
   21171                       unsigned rd = (instr >> 8) & 0xf;
   21172                       unsigned rn = (instr >> 16) & 0xf;
   21173                       unsigned rm = instr & 0xf;
   21174                       // QASX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
   21175                       qasx(CurrentCond(),
   21176                            Register(rd),
   21177                            Register(rn),
   21178                            Register(rm));
   21179                       break;
   21180                     }
   21181                     case 0x0020f020: {
   21182                       // 0xfaa0f020
   21183                       unsigned rd = (instr >> 8) & 0xf;
   21184                       unsigned rn = (instr >> 16) & 0xf;
   21185                       unsigned rm = instr & 0xf;
   21186                       // SHASX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
   21187                       shasx(CurrentCond(),
   21188                             Register(rd),
   21189                             Register(rn),
   21190                             Register(rm));
   21191                       break;
   21192                     }
   21193                     case 0x0020f040: {
   21194                       // 0xfaa0f040
   21195                       unsigned rd = (instr >> 8) & 0xf;
   21196                       unsigned rn = (instr >> 16) & 0xf;
   21197                       unsigned rm = instr & 0xf;
   21198                       // UASX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
   21199                       uasx(CurrentCond(),
   21200                            Register(rd),
   21201                            Register(rn),
   21202                            Register(rm));
   21203                       break;
   21204                     }
   21205                     case 0x0020f050: {
   21206                       // 0xfaa0f050
   21207                       unsigned rd = (instr >> 8) & 0xf;
   21208                       unsigned rn = (instr >> 16) & 0xf;
   21209                       unsigned rm = instr & 0xf;
   21210                       // UQASX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
   21211                       uqasx(CurrentCond(),
   21212                             Register(rd),
   21213                             Register(rn),
   21214                             Register(rm));
   21215                       break;
   21216                     }
   21217                     case 0x0020f060: {
   21218                       // 0xfaa0f060
   21219                       unsigned rd = (instr >> 8) & 0xf;
   21220                       unsigned rn = (instr >> 16) & 0xf;
   21221                       unsigned rm = instr & 0xf;
   21222                       // UHASX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
   21223                       uhasx(CurrentCond(),
   21224                             Register(rd),
   21225                             Register(rn),
   21226                             Register(rm));
   21227                       break;
   21228                     }
   21229                     case 0x0020f080: {
   21230                       // 0xfaa0f080
   21231                       unsigned rd = (instr >> 8) & 0xf;
   21232                       unsigned rn = (instr >> 16) & 0xf;
   21233                       unsigned rm = instr & 0xf;
   21234                       // SEL{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
   21235                       sel(CurrentCond(),
   21236                           Register(rd),
   21237                           Register(rn),
   21238                           Register(rm));
   21239                       break;
   21240                     }
   21241                     case 0x0040f000: {
   21242                       // 0xfac0f000
   21243                       unsigned rd = (instr >> 8) & 0xf;
   21244                       unsigned rn = (instr >> 16) & 0xf;
   21245                       unsigned rm = instr & 0xf;
   21246                       // SSUB8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
   21247                       ssub8(CurrentCond(),
   21248                             Register(rd),
   21249                             Register(rn),
   21250                             Register(rm));
   21251                       break;
   21252                     }
   21253                     case 0x0040f010: {
   21254                       // 0xfac0f010
   21255                       unsigned rd = (instr >> 8) & 0xf;
   21256                       unsigned rn = (instr >> 16) & 0xf;
   21257                       unsigned rm = instr & 0xf;
   21258                       // QSUB8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
   21259                       qsub8(CurrentCond(),
   21260                             Register(rd),
   21261                             Register(rn),
   21262                             Register(rm));
   21263                       break;
   21264                     }
   21265                     case 0x0040f020: {
   21266                       // 0xfac0f020
   21267                       unsigned rd = (instr >> 8) & 0xf;
   21268                       unsigned rn = (instr >> 16) & 0xf;
   21269                       unsigned rm = instr & 0xf;
   21270                       // SHSUB8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
   21271                       shsub8(CurrentCond(),
   21272                              Register(rd),
   21273                              Register(rn),
   21274                              Register(rm));
   21275                       break;
   21276                     }
   21277                     case 0x0040f040: {
   21278                       // 0xfac0f040
   21279                       unsigned rd = (instr >> 8) & 0xf;
   21280                       unsigned rn = (instr >> 16) & 0xf;
   21281                       unsigned rm = instr & 0xf;
   21282                       // USUB8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
   21283                       usub8(CurrentCond(),
   21284                             Register(rd),
   21285                             Register(rn),
   21286                             Register(rm));
   21287                       break;
   21288                     }
   21289                     case 0x0040f050: {
   21290                       // 0xfac0f050
   21291                       unsigned rd = (instr >> 8) & 0xf;
   21292                       unsigned rn = (instr >> 16) & 0xf;
   21293                       unsigned rm = instr & 0xf;
   21294                       // UQSUB8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
   21295                       uqsub8(CurrentCond(),
   21296                              Register(rd),
   21297                              Register(rn),
   21298                              Register(rm));
   21299                       break;
   21300                     }
   21301                     case 0x0040f060: {
   21302                       // 0xfac0f060
   21303                       unsigned rd = (instr >> 8) & 0xf;
   21304                       unsigned rn = (instr >> 16) & 0xf;
   21305                       unsigned rm = instr & 0xf;
   21306                       // UHSUB8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
   21307                       uhsub8(CurrentCond(),
   21308                              Register(rd),
   21309                              Register(rn),
   21310                              Register(rm));
   21311                       break;
   21312                     }
   21313                     case 0x0040f080: {
   21314                       // 0xfac0f080
   21315                       unsigned rd = (instr >> 8) & 0xf;
   21316                       unsigned rn = (instr >> 16) & 0xf;
   21317                       unsigned rm = instr & 0xf;
   21318                       // CRC32B{<q>} <Rd>, <Rn>, <Rm> ; T1
   21319                       crc32b(Condition::None(),
   21320                              Register(rd),
   21321                              Register(rn),
   21322                              Register(rm));
   21323                       break;
   21324                     }
   21325                     case 0x0040f090: {
   21326                       // 0xfac0f090
   21327                       unsigned rd = (instr >> 8) & 0xf;
   21328                       unsigned rn = (instr >> 16) & 0xf;
   21329                       unsigned rm = instr & 0xf;
   21330                       // CRC32H{<q>} <Rd>, <Rn>, <Rm> ; T1
   21331                       crc32h(Condition::None(),
   21332                              Register(rd),
   21333                              Register(rn),
   21334                              Register(rm));
   21335                       break;
   21336                     }
   21337                     case 0x0040f0a0: {
   21338                       // 0xfac0f0a0
   21339                       unsigned rd = (instr >> 8) & 0xf;
   21340                       unsigned rn = (instr >> 16) & 0xf;
   21341                       unsigned rm = instr & 0xf;
   21342                       // CRC32W{<q>} <Rd>, <Rn>, <Rm> ; T1
   21343                       crc32w(Condition::None(),
   21344                              Register(rd),
   21345                              Register(rn),
   21346                              Register(rm));
   21347                       break;
   21348                     }
   21349                     case 0x0060f000: {
   21350                       // 0xfae0f000
   21351                       unsigned rd = (instr >> 8) & 0xf;
   21352                       unsigned rn = (instr >> 16) & 0xf;
   21353                       unsigned rm = instr & 0xf;
   21354                       // SSAX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
   21355                       ssax(CurrentCond(),
   21356                            Register(rd),
   21357                            Register(rn),
   21358                            Register(rm));
   21359                       break;
   21360                     }
   21361                     case 0x0060f010: {
   21362                       // 0xfae0f010
   21363                       unsigned rd = (instr >> 8) & 0xf;
   21364                       unsigned rn = (instr >> 16) & 0xf;
   21365                       unsigned rm = instr & 0xf;
   21366                       // QSAX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
   21367                       qsax(CurrentCond(),
   21368                            Register(rd),
   21369                            Register(rn),
   21370                            Register(rm));
   21371                       break;
   21372                     }
   21373                     case 0x0060f020: {
   21374                       // 0xfae0f020
   21375                       unsigned rd = (instr >> 8) & 0xf;
   21376                       unsigned rn = (instr >> 16) & 0xf;
   21377                       unsigned rm = instr & 0xf;
   21378                       // SHSAX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
   21379                       shsax(CurrentCond(),
   21380                             Register(rd),
   21381                             Register(rn),
   21382                             Register(rm));
   21383                       break;
   21384                     }
   21385                     case 0x0060f040: {
   21386                       // 0xfae0f040
   21387                       unsigned rd = (instr >> 8) & 0xf;
   21388                       unsigned rn = (instr >> 16) & 0xf;
   21389                       unsigned rm = instr & 0xf;
   21390                       // USAX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
   21391                       usax(CurrentCond(),
   21392                            Register(rd),
   21393                            Register(rn),
   21394                            Register(rm));
   21395                       break;
   21396                     }
   21397                     case 0x0060f050: {
   21398                       // 0xfae0f050
   21399                       unsigned rd = (instr >> 8) & 0xf;
   21400                       unsigned rn = (instr >> 16) & 0xf;
   21401                       unsigned rm = instr & 0xf;
   21402                       // UQSAX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
   21403                       uqsax(CurrentCond(),
   21404                             Register(rd),
   21405                             Register(rn),
   21406                             Register(rm));
   21407                       break;
   21408                     }
   21409                     case 0x0060f060: {
   21410                       // 0xfae0f060
   21411                       unsigned rd = (instr >> 8) & 0xf;
   21412                       unsigned rn = (instr >> 16) & 0xf;
   21413                       unsigned rm = instr & 0xf;
   21414                       // UHSAX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
   21415                       uhsax(CurrentCond(),
   21416                             Register(rd),
   21417                             Register(rn),
   21418                             Register(rm));
   21419                       break;
   21420                     }
   21421                     default:
   21422                       UnallocatedT32(instr);
   21423                       break;
   21424                   }
   21425                   break;
   21426                 }
   21427                 case 0x10900000: {
   21428                   // 0xfa900000
   21429                   switch (instr & 0x0060f0f0) {
   21430                     case 0x0000f000: {
   21431                       // 0xfa90f000
   21432                       unsigned rd = (instr >> 8) & 0xf;
   21433                       unsigned rn = (instr >> 16) & 0xf;
   21434                       unsigned rm = instr & 0xf;
   21435                       // SADD16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
   21436                       sadd16(CurrentCond(),
   21437                              Register(rd),
   21438                              Register(rn),
   21439                              Register(rm));
   21440                       break;
   21441                     }
   21442                     case 0x0000f010: {
   21443                       // 0xfa90f010
   21444                       unsigned rd = (instr >> 8) & 0xf;
   21445                       unsigned rn = (instr >> 16) & 0xf;
   21446                       unsigned rm = instr & 0xf;
   21447                       // QADD16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
   21448                       qadd16(CurrentCond(),
   21449                              Register(rd),
   21450                              Register(rn),
   21451                              Register(rm));
   21452                       break;
   21453                     }
   21454                     case 0x0000f020: {
   21455                       // 0xfa90f020
   21456                       unsigned rd = (instr >> 8) & 0xf;
   21457                       unsigned rn = (instr >> 16) & 0xf;
   21458                       unsigned rm = instr & 0xf;
   21459                       // SHADD16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
   21460                       shadd16(CurrentCond(),
   21461                               Register(rd),
   21462                               Register(rn),
   21463                               Register(rm));
   21464                       break;
   21465                     }
   21466                     case 0x0000f040: {
   21467                       // 0xfa90f040
   21468                       unsigned rd = (instr >> 8) & 0xf;
   21469                       unsigned rn = (instr >> 16) & 0xf;
   21470                       unsigned rm = instr & 0xf;
   21471                       // UADD16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
   21472                       uadd16(CurrentCond(),
   21473                              Register(rd),
   21474                              Register(rn),
   21475                              Register(rm));
   21476                       break;
   21477                     }
   21478                     case 0x0000f050: {
   21479                       // 0xfa90f050
   21480                       unsigned rd = (instr >> 8) & 0xf;
   21481                       unsigned rn = (instr >> 16) & 0xf;
   21482                       unsigned rm = instr & 0xf;
   21483                       // UQADD16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
   21484                       uqadd16(CurrentCond(),
   21485                               Register(rd),
   21486                               Register(rn),
   21487                               Register(rm));
   21488                       break;
   21489                     }
   21490                     case 0x0000f060: {
   21491                       // 0xfa90f060
   21492                       unsigned rd = (instr >> 8) & 0xf;
   21493                       unsigned rn = (instr >> 16) & 0xf;
   21494                       unsigned rm = instr & 0xf;
   21495                       // UHADD16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
   21496                       uhadd16(CurrentCond(),
   21497                               Register(rd),
   21498                               Register(rn),
   21499                               Register(rm));
   21500                       break;
   21501                     }
   21502                     case 0x0000f080: {
   21503                       // 0xfa90f080
   21504                       if (((instr >> 16) & 0xf) == (instr & 0xf)) {
   21505                         unsigned rd = (instr >> 8) & 0xf;
   21506                         unsigned rm = instr & 0xf;
   21507                         if ((rd < kNumberOfT32LowRegisters) &&
   21508                             (rm < kNumberOfT32LowRegisters)) {
   21509                           // REV{<c>}.W <Rd>, <Rm> ; T2
   21510                           rev(CurrentCond(), Wide, Register(rd), Register(rm));
   21511                         } else {
   21512                           // REV{<c>}{<q>} <Rd>, <Rm> ; T2
   21513                           rev(CurrentCond(), Best, Register(rd), Register(rm));
   21514                         }
   21515                       } else {
   21516                         UnallocatedT32(instr);
   21517                       }
   21518                       break;
   21519                     }
   21520                     case 0x0000f090: {
   21521                       // 0xfa90f090
   21522                       if (((instr >> 16) & 0xf) == (instr & 0xf)) {
   21523                         unsigned rd = (instr >> 8) & 0xf;
   21524                         unsigned rm = instr & 0xf;
   21525                         if ((rd < kNumberOfT32LowRegisters) &&
   21526                             (rm < kNumberOfT32LowRegisters)) {
   21527                           // REV16{<c>}.W <Rd>, <Rm> ; T2
   21528                           rev16(CurrentCond(),
   21529                                 Wide,
   21530                                 Register(rd),
   21531                                 Register(rm));
   21532                         } else {
   21533                           // REV16{<c>}{<q>} <Rd>, <Rm> ; T2
   21534                           rev16(CurrentCond(),
   21535                                 Best,
   21536                                 Register(rd),
   21537                                 Register(rm));
   21538                         }
   21539                       } else {
   21540                         UnallocatedT32(instr);
   21541                       }
   21542                       break;
   21543                     }
   21544                     case 0x0000f0a0: {
   21545                       // 0xfa90f0a0
   21546                       if (((instr >> 16) & 0xf) == (instr & 0xf)) {
   21547                         unsigned rd = (instr >> 8) & 0xf;
   21548                         unsigned rm = instr & 0xf;
   21549                         // RBIT{<c>}{<q>} <Rd>, <Rm> ; T1
   21550                         rbit(CurrentCond(), Register(rd), Register(rm));
   21551                       } else {
   21552                         UnallocatedT32(instr);
   21553                       }
   21554                       break;
   21555                     }
   21556                     case 0x0000f0b0: {
   21557                       // 0xfa90f0b0
   21558                       if (((instr >> 16) & 0xf) == (instr & 0xf)) {
   21559                         unsigned rd = (instr >> 8) & 0xf;
   21560                         unsigned rm = instr & 0xf;
   21561                         if ((rd < kNumberOfT32LowRegisters) &&
   21562                             (rm < kNumberOfT32LowRegisters)) {
   21563                           // REVSH{<c>}.W <Rd>, <Rm> ; T2
   21564                           revsh(CurrentCond(),
   21565                                 Wide,
   21566                                 Register(rd),
   21567                                 Register(rm));
   21568                         } else {
   21569                           // REVSH{<c>}{<q>} <Rd>, <Rm> ; T2
   21570                           revsh(CurrentCond(),
   21571                                 Best,
   21572                                 Register(rd),
   21573                                 Register(rm));
   21574                         }
   21575                       } else {
   21576                         UnallocatedT32(instr);
   21577                       }
   21578                       break;
   21579                     }
   21580                     case 0x0020f080: {
   21581                       // 0xfab0f080
   21582                       if (((instr >> 16) & 0xf) == (instr & 0xf)) {
   21583                         unsigned rd = (instr >> 8) & 0xf;
   21584                         unsigned rm = instr & 0xf;
   21585                         // CLZ{<c>}{<q>} <Rd>, <Rm> ; T1
   21586                         clz(CurrentCond(), Register(rd), Register(rm));
   21587                       } else {
   21588                         UnallocatedT32(instr);
   21589                       }
   21590                       break;
   21591                     }
   21592                     case 0x0040f000: {
   21593                       // 0xfad0f000
   21594                       unsigned rd = (instr >> 8) & 0xf;
   21595                       unsigned rn = (instr >> 16) & 0xf;
   21596                       unsigned rm = instr & 0xf;
   21597                       // SSUB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
   21598                       ssub16(CurrentCond(),
   21599                              Register(rd),
   21600                              Register(rn),
   21601                              Register(rm));
   21602                       break;
   21603                     }
   21604                     case 0x0040f010: {
   21605                       // 0xfad0f010
   21606                       unsigned rd = (instr >> 8) & 0xf;
   21607                       unsigned rn = (instr >> 16) & 0xf;
   21608                       unsigned rm = instr & 0xf;
   21609                       // QSUB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
   21610                       qsub16(CurrentCond(),
   21611                              Register(rd),
   21612                              Register(rn),
   21613                              Register(rm));
   21614                       break;
   21615                     }
   21616                     case 0x0040f020: {
   21617                       // 0xfad0f020
   21618                       unsigned rd = (instr >> 8) & 0xf;
   21619                       unsigned rn = (instr >> 16) & 0xf;
   21620                       unsigned rm = instr & 0xf;
   21621                       // SHSUB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
   21622                       shsub16(CurrentCond(),
   21623                               Register(rd),
   21624                               Register(rn),
   21625                               Register(rm));
   21626                       break;
   21627                     }
   21628                     case 0x0040f040: {
   21629                       // 0xfad0f040
   21630                       unsigned rd = (instr >> 8) & 0xf;
   21631                       unsigned rn = (instr >> 16) & 0xf;
   21632                       unsigned rm = instr & 0xf;
   21633                       // USUB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
   21634                       usub16(CurrentCond(),
   21635                              Register(rd),
   21636                              Register(rn),
   21637                              Register(rm));
   21638                       break;
   21639                     }
   21640                     case 0x0040f050: {
   21641                       // 0xfad0f050
   21642                       unsigned rd = (instr >> 8) & 0xf;
   21643                       unsigned rn = (instr >> 16) & 0xf;
   21644                       unsigned rm = instr & 0xf;
   21645                       // UQSUB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
   21646                       uqsub16(CurrentCond(),
   21647                               Register(rd),
   21648                               Register(rn),
   21649                               Register(rm));
   21650                       break;
   21651                     }
   21652                     case 0x0040f060: {
   21653                       // 0xfad0f060
   21654                       unsigned rd = (instr >> 8) & 0xf;
   21655                       unsigned rn = (instr >> 16) & 0xf;
   21656                       unsigned rm = instr & 0xf;
   21657                       // UHSUB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
   21658                       uhsub16(CurrentCond(),
   21659                               Register(rd),
   21660                               Register(rn),
   21661                               Register(rm));
   21662                       break;
   21663                     }
   21664                     case 0x0040f080: {
   21665                       // 0xfad0f080
   21666                       unsigned rd = (instr >> 8) & 0xf;
   21667                       unsigned rn = (instr >> 16) & 0xf;
   21668                       unsigned rm = instr & 0xf;
   21669                       // CRC32CB{<q>} <Rd>, <Rn>, <Rm> ; T1
   21670                       crc32cb(Condition::None(),
   21671                               Register(rd),
   21672                               Register(rn),
   21673                               Register(rm));
   21674                       break;
   21675                     }
   21676                     case 0x0040f090: {
   21677                       // 0xfad0f090
   21678                       unsigned rd = (instr >> 8) & 0xf;
   21679                       unsigned rn = (instr >> 16) & 0xf;
   21680                       unsigned rm = instr & 0xf;
   21681                       // CRC32CH{<q>} <Rd>, <Rn>, <Rm> ; T1
   21682                       crc32ch(Condition::None(),
   21683                               Register(rd),
   21684                               Register(rn),
   21685                               Register(rm));
   21686                       break;
   21687                     }
   21688                     case 0x0040f0a0: {
   21689                       // 0xfad0f0a0
   21690                       unsigned rd = (instr >> 8) & 0xf;
   21691                       unsigned rn = (instr >> 16) & 0xf;
   21692                       unsigned rm = instr & 0xf;
   21693                       // CRC32CW{<q>} <Rd>, <Rn>, <Rm> ; T1
   21694                       crc32cw(Condition::None(),
   21695                               Register(rd),
   21696                               Register(rn),
   21697                               Register(rm));
   21698                       break;
   21699                     }
   21700                     default:
   21701                       UnallocatedT32(instr);
   21702                       break;
   21703                   }
   21704                   break;
   21705                 }
   21706                 case 0x11000000: {
   21707                   // 0xfb000000
   21708                   switch (instr & 0x006000f0) {
   21709                     case 0x00000000: {
   21710                       // 0xfb000000
   21711                       switch (instr & 0x0000f000) {
   21712                         case 0x0000f000: {
   21713                           // 0xfb00f000
   21714                           unsigned rd = (instr >> 8) & 0xf;
   21715                           unsigned rn = (instr >> 16) & 0xf;
   21716                           unsigned rm = instr & 0xf;
   21717                           if (InITBlock() &&
   21718                               ((rd == rm) && (rd < kNumberOfT32LowRegisters) &&
   21719                                (rn < kNumberOfT32LowRegisters))) {
   21720                             // MUL<c>.W <Rd>, <Rn>, {<Rm>} ; T2
   21721                             mul(CurrentCond(),
   21722                                 Wide,
   21723                                 Register(rd),
   21724                                 Register(rn),
   21725                                 Register(rm));
   21726                           } else {
   21727                             // MUL{<c>}{<q>} <Rd>, <Rn>, {<Rm>} ; T2
   21728                             mul(CurrentCond(),
   21729                                 Best,
   21730                                 Register(rd),
   21731                                 Register(rn),
   21732                                 Register(rm));
   21733                           }
   21734                           break;
   21735                         }
   21736                         default: {
   21737                           if (((instr & 0xf000) == 0xf000)) {
   21738                             UnallocatedT32(instr);
   21739                             return;
   21740                           }
   21741                           unsigned rd = (instr >> 8) & 0xf;
   21742                           unsigned rn = (instr >> 16) & 0xf;
   21743                           unsigned rm = instr & 0xf;
   21744                           unsigned ra = (instr >> 12) & 0xf;
   21745                           // MLA{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
   21746                           mla(CurrentCond(),
   21747                               Register(rd),
   21748                               Register(rn),
   21749                               Register(rm),
   21750                               Register(ra));
   21751                           break;
   21752                         }
   21753                       }
   21754                       break;
   21755                     }
   21756                     case 0x00000010: {
   21757                       // 0xfb000010
   21758                       unsigned rd = (instr >> 8) & 0xf;
   21759                       unsigned rn = (instr >> 16) & 0xf;
   21760                       unsigned rm = instr & 0xf;
   21761                       unsigned ra = (instr >> 12) & 0xf;
   21762                       // MLS{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
   21763                       mls(CurrentCond(),
   21764                           Register(rd),
   21765                           Register(rn),
   21766                           Register(rm),
   21767                           Register(ra));
   21768                       break;
   21769                     }
   21770                     case 0x00200000: {
   21771                       // 0xfb200000
   21772                       switch (instr & 0x0000f000) {
   21773                         case 0x0000f000: {
   21774                           // 0xfb20f000
   21775                           unsigned rd = (instr >> 8) & 0xf;
   21776                           unsigned rn = (instr >> 16) & 0xf;
   21777                           unsigned rm = instr & 0xf;
   21778                           // SMUAD{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
   21779                           smuad(CurrentCond(),
   21780                                 Register(rd),
   21781                                 Register(rn),
   21782                                 Register(rm));
   21783                           break;
   21784                         }
   21785                         default: {
   21786                           if (((instr & 0xf000) == 0xf000)) {
   21787                             UnallocatedT32(instr);
   21788                             return;
   21789                           }
   21790                           unsigned rd = (instr >> 8) & 0xf;
   21791                           unsigned rn = (instr >> 16) & 0xf;
   21792                           unsigned rm = instr & 0xf;
   21793                           unsigned ra = (instr >> 12) & 0xf;
   21794                           // SMLAD{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
   21795                           smlad(CurrentCond(),
   21796                                 Register(rd),
   21797                                 Register(rn),
   21798                                 Register(rm),
   21799                                 Register(ra));
   21800                           break;
   21801                         }
   21802                       }
   21803                       break;
   21804                     }
   21805                     case 0x00200010: {
   21806                       // 0xfb200010
   21807                       switch (instr & 0x0000f000) {
   21808                         case 0x0000f000: {
   21809                           // 0xfb20f010
   21810                           unsigned rd = (instr >> 8) & 0xf;
   21811                           unsigned rn = (instr >> 16) & 0xf;
   21812                           unsigned rm = instr & 0xf;
   21813                           // SMUADX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
   21814                           smuadx(CurrentCond(),
   21815                                  Register(rd),
   21816                                  Register(rn),
   21817                                  Register(rm));
   21818                           break;
   21819                         }
   21820                         default: {
   21821                           if (((instr & 0xf000) == 0xf000)) {
   21822                             UnallocatedT32(instr);
   21823                             return;
   21824                           }
   21825                           unsigned rd = (instr >> 8) & 0xf;
   21826                           unsigned rn = (instr >> 16) & 0xf;
   21827                           unsigned rm = instr & 0xf;
   21828                           unsigned ra = (instr >> 12) & 0xf;
   21829                           // SMLADX{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
   21830                           smladx(CurrentCond(),
   21831                                  Register(rd),
   21832                                  Register(rn),
   21833                                  Register(rm),
   21834                                  Register(ra));
   21835                           break;
   21836                         }
   21837                       }
   21838                       break;
   21839                     }
   21840                     case 0x00400000: {
   21841                       // 0xfb400000
   21842                       switch (instr & 0x0000f000) {
   21843                         case 0x0000f000: {
   21844                           // 0xfb40f000
   21845                           unsigned rd = (instr >> 8) & 0xf;
   21846                           unsigned rn = (instr >> 16) & 0xf;
   21847                           unsigned rm = instr & 0xf;
   21848                           // SMUSD{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
   21849                           smusd(CurrentCond(),
   21850                                 Register(rd),
   21851                                 Register(rn),
   21852                                 Register(rm));
   21853                           break;
   21854                         }
   21855                         default: {
   21856                           if (((instr & 0xf000) == 0xf000)) {
   21857                             UnallocatedT32(instr);
   21858                             return;
   21859                           }
   21860                           unsigned rd = (instr >> 8) & 0xf;
   21861                           unsigned rn = (instr >> 16) & 0xf;
   21862                           unsigned rm = instr & 0xf;
   21863                           unsigned ra = (instr >> 12) & 0xf;
   21864                           // SMLSD{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
   21865                           smlsd(CurrentCond(),
   21866                                 Register(rd),
   21867                                 Register(rn),
   21868                                 Register(rm),
   21869                                 Register(ra));
   21870                           break;
   21871                         }
   21872                       }
   21873                       break;
   21874                     }
   21875                     case 0x00400010: {
   21876                       // 0xfb400010
   21877                       switch (instr & 0x0000f000) {
   21878                         case 0x0000f000: {
   21879                           // 0xfb40f010
   21880                           unsigned rd = (instr >> 8) & 0xf;
   21881                           unsigned rn = (instr >> 16) & 0xf;
   21882                           unsigned rm = instr & 0xf;
   21883                           // SMUSDX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
   21884                           smusdx(CurrentCond(),
   21885                                  Register(rd),
   21886                                  Register(rn),
   21887                                  Register(rm));
   21888                           break;
   21889                         }
   21890                         default: {
   21891                           if (((instr & 0xf000) == 0xf000)) {
   21892                             UnallocatedT32(instr);
   21893                             return;
   21894                           }
   21895                           unsigned rd = (instr >> 8) & 0xf;
   21896                           unsigned rn = (instr >> 16) & 0xf;
   21897                           unsigned rm = instr & 0xf;
   21898                           unsigned ra = (instr >> 12) & 0xf;
   21899                           // SMLSDX{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
   21900                           smlsdx(CurrentCond(),
   21901                                  Register(rd),
   21902                                  Register(rn),
   21903                                  Register(rm),
   21904                                  Register(ra));
   21905                           break;
   21906                         }
   21907                       }
   21908                       break;
   21909                     }
   21910                     case 0x00600000: {
   21911                       // 0xfb600000
   21912                       unsigned rd = (instr >> 8) & 0xf;
   21913                       unsigned rn = (instr >> 16) & 0xf;
   21914                       unsigned rm = instr & 0xf;
   21915                       unsigned ra = (instr >> 12) & 0xf;
   21916                       // SMMLS{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
   21917                       smmls(CurrentCond(),
   21918                             Register(rd),
   21919                             Register(rn),
   21920                             Register(rm),
   21921                             Register(ra));
   21922                       break;
   21923                     }
   21924                     case 0x00600010: {
   21925                       // 0xfb600010
   21926                       unsigned rd = (instr >> 8) & 0xf;
   21927                       unsigned rn = (instr >> 16) & 0xf;
   21928                       unsigned rm = instr & 0xf;
   21929                       unsigned ra = (instr >> 12) & 0xf;
   21930                       // SMMLSR{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
   21931                       smmlsr(CurrentCond(),
   21932                              Register(rd),
   21933                              Register(rn),
   21934                              Register(rm),
   21935                              Register(ra));
   21936                       break;
   21937                     }
   21938                     default:
   21939                       UnallocatedT32(instr);
   21940                       break;
   21941                   }
   21942                   break;
   21943                 }
   21944                 case 0x11100000: {
   21945                   // 0xfb100000
   21946                   switch (instr & 0x006000f0) {
   21947                     case 0x00000000: {
   21948                       // 0xfb100000
   21949                       switch (instr & 0x0000f000) {
   21950                         case 0x0000f000: {
   21951                           // 0xfb10f000
   21952                           unsigned rd = (instr >> 8) & 0xf;
   21953                           unsigned rn = (instr >> 16) & 0xf;
   21954                           unsigned rm = instr & 0xf;
   21955                           // SMULBB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
   21956                           smulbb(CurrentCond(),
   21957                                  Register(rd),
   21958                                  Register(rn),
   21959                                  Register(rm));
   21960                           break;
   21961                         }
   21962                         default: {
   21963                           if (((instr & 0xf000) == 0xf000)) {
   21964                             UnallocatedT32(instr);
   21965                             return;
   21966                           }
   21967                           unsigned rd = (instr >> 8) & 0xf;
   21968                           unsigned rn = (instr >> 16) & 0xf;
   21969                           unsigned rm = instr & 0xf;
   21970                           unsigned ra = (instr >> 12) & 0xf;
   21971                           // SMLABB{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
   21972                           smlabb(CurrentCond(),
   21973                                  Register(rd),
   21974                                  Register(rn),
   21975                                  Register(rm),
   21976                                  Register(ra));
   21977                           break;
   21978                         }
   21979                       }
   21980                       break;
   21981                     }
   21982                     case 0x00000010: {
   21983                       // 0xfb100010
   21984                       switch (instr & 0x0000f000) {
   21985                         case 0x0000f000: {
   21986                           // 0xfb10f010
   21987                           unsigned rd = (instr >> 8) & 0xf;
   21988                           unsigned rn = (instr >> 16) & 0xf;
   21989                           unsigned rm = instr & 0xf;
   21990                           // SMULBT{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
   21991                           smulbt(CurrentCond(),
   21992                                  Register(rd),
   21993                                  Register(rn),
   21994                                  Register(rm));
   21995                           break;
   21996                         }
   21997                         default: {
   21998                           if (((instr & 0xf000) == 0xf000)) {
   21999                             UnallocatedT32(instr);
   22000                             return;
   22001                           }
   22002                           unsigned rd = (instr >> 8) & 0xf;
   22003                           unsigned rn = (instr >> 16) & 0xf;
   22004                           unsigned rm = instr & 0xf;
   22005                           unsigned ra = (instr >> 12) & 0xf;
   22006                           // SMLABT{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
   22007                           smlabt(CurrentCond(),
   22008                                  Register(rd),
   22009                                  Register(rn),
   22010                                  Register(rm),
   22011                                  Register(ra));
   22012                           break;
   22013                         }
   22014                       }
   22015                       break;
   22016                     }
   22017                     case 0x00000020: {
   22018                       // 0xfb100020
   22019                       switch (instr & 0x0000f000) {
   22020                         case 0x0000f000: {
   22021                           // 0xfb10f020
   22022                           unsigned rd = (instr >> 8) & 0xf;
   22023                           unsigned rn = (instr >> 16) & 0xf;
   22024                           unsigned rm = instr & 0xf;
   22025                           // SMULTB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
   22026                           smultb(CurrentCond(),
   22027                                  Register(rd),
   22028                                  Register(rn),
   22029                                  Register(rm));
   22030                           break;
   22031                         }
   22032                         default: {
   22033                           if (((instr & 0xf000) == 0xf000)) {
   22034                             UnallocatedT32(instr);
   22035                             return;
   22036                           }
   22037                           unsigned rd = (instr >> 8) & 0xf;
   22038                           unsigned rn = (instr >> 16) & 0xf;
   22039                           unsigned rm = instr & 0xf;
   22040                           unsigned ra = (instr >> 12) & 0xf;
   22041                           // SMLATB{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
   22042                           smlatb(CurrentCond(),
   22043                                  Register(rd),
   22044                                  Register(rn),
   22045                                  Register(rm),
   22046                                  Register(ra));
   22047                           break;
   22048                         }
   22049                       }
   22050                       break;
   22051                     }
   22052                     case 0x00000030: {
   22053                       // 0xfb100030
   22054                       switch (instr & 0x0000f000) {
   22055                         case 0x0000f000: {
   22056                           // 0xfb10f030
   22057                           unsigned rd = (instr >> 8) & 0xf;
   22058                           unsigned rn = (instr >> 16) & 0xf;
   22059                           unsigned rm = instr & 0xf;
   22060                           // SMULTT{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
   22061                           smultt(CurrentCond(),
   22062                                  Register(rd),
   22063                                  Register(rn),
   22064                                  Register(rm));
   22065                           break;
   22066                         }
   22067                         default: {
   22068                           if (((instr & 0xf000) == 0xf000)) {
   22069                             UnallocatedT32(instr);
   22070                             return;
   22071                           }
   22072                           unsigned rd = (instr >> 8) & 0xf;
   22073                           unsigned rn = (instr >> 16) & 0xf;
   22074                           unsigned rm = instr & 0xf;
   22075                           unsigned ra = (instr >> 12) & 0xf;
   22076                           // SMLATT{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
   22077                           smlatt(CurrentCond(),
   22078                                  Register(rd),
   22079                                  Register(rn),
   22080                                  Register(rm),
   22081                                  Register(ra));
   22082                           break;
   22083                         }
   22084                       }
   22085                       break;
   22086                     }
   22087                     case 0x00200000: {
   22088                       // 0xfb300000
   22089                       switch (instr & 0x0000f000) {
   22090                         case 0x0000f000: {
   22091                           // 0xfb30f000
   22092                           unsigned rd = (instr >> 8) & 0xf;
   22093                           unsigned rn = (instr >> 16) & 0xf;
   22094                           unsigned rm = instr & 0xf;
   22095                           // SMULWB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
   22096                           smulwb(CurrentCond(),
   22097                                  Register(rd),
   22098                                  Register(rn),
   22099                                  Register(rm));
   22100                           break;
   22101                         }
   22102                         default: {
   22103                           if (((instr & 0xf000) == 0xf000)) {
   22104                             UnallocatedT32(instr);
   22105                             return;
   22106                           }
   22107                           unsigned rd = (instr >> 8) & 0xf;
   22108                           unsigned rn = (instr >> 16) & 0xf;
   22109                           unsigned rm = instr & 0xf;
   22110                           unsigned ra = (instr >> 12) & 0xf;
   22111                           // SMLAWB{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
   22112                           smlawb(CurrentCond(),
   22113                                  Register(rd),
   22114                                  Register(rn),
   22115                                  Register(rm),
   22116                                  Register(ra));
   22117                           break;
   22118                         }
   22119                       }
   22120                       break;
   22121                     }
   22122                     case 0x00200010: {
   22123                       // 0xfb300010
   22124                       switch (instr & 0x0000f000) {
   22125                         case 0x0000f000: {
   22126                           // 0xfb30f010
   22127                           unsigned rd = (instr >> 8) & 0xf;
   22128                           unsigned rn = (instr >> 16) & 0xf;
   22129                           unsigned rm = instr & 0xf;
   22130                           // SMULWT{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
   22131                           smulwt(CurrentCond(),
   22132                                  Register(rd),
   22133                                  Register(rn),
   22134                                  Register(rm));
   22135                           break;
   22136                         }
   22137                         default: {
   22138                           if (((instr & 0xf000) == 0xf000)) {
   22139                             UnallocatedT32(instr);
   22140                             return;
   22141                           }
   22142                           unsigned rd = (instr >> 8) & 0xf;
   22143                           unsigned rn = (instr >> 16) & 0xf;
   22144                           unsigned rm = instr & 0xf;
   22145                           unsigned ra = (instr >> 12) & 0xf;
   22146                           // SMLAWT{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
   22147                           smlawt(CurrentCond(),
   22148                                  Register(rd),
   22149                                  Register(rn),
   22150                                  Register(rm),
   22151                                  Register(ra));
   22152                           break;
   22153                         }
   22154                       }
   22155                       break;
   22156                     }
   22157                     case 0x00400000: {
   22158                       // 0xfb500000
   22159                       switch (instr & 0x0000f000) {
   22160                         case 0x0000f000: {
   22161                           // 0xfb50f000
   22162                           unsigned rd = (instr >> 8) & 0xf;
   22163                           unsigned rn = (instr >> 16) & 0xf;
   22164                           unsigned rm = instr & 0xf;
   22165                           // SMMUL{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
   22166                           smmul(CurrentCond(),
   22167                                 Register(rd),
   22168                                 Register(rn),
   22169                                 Register(rm));
   22170                           break;
   22171                         }
   22172                         default: {
   22173                           if (((instr & 0xf000) == 0xf000)) {
   22174                             UnallocatedT32(instr);
   22175                             return;
   22176                           }
   22177                           unsigned rd = (instr >> 8) & 0xf;
   22178                           unsigned rn = (instr >> 16) & 0xf;
   22179                           unsigned rm = instr & 0xf;
   22180                           unsigned ra = (instr >> 12) & 0xf;
   22181                           // SMMLA{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
   22182                           smmla(CurrentCond(),
   22183                                 Register(rd),
   22184                                 Register(rn),
   22185                                 Register(rm),
   22186                                 Register(ra));
   22187                           break;
   22188                         }
   22189                       }
   22190                       break;
   22191                     }
   22192                     case 0x00400010: {
   22193                       // 0xfb500010
   22194                       switch (instr & 0x0000f000) {
   22195                         case 0x0000f000: {
   22196                           // 0xfb50f010
   22197                           unsigned rd = (instr >> 8) & 0xf;
   22198                           unsigned rn = (instr >> 16) & 0xf;
   22199                           unsigned rm = instr & 0xf;
   22200                           // SMMULR{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
   22201                           smmulr(CurrentCond(),
   22202                                  Register(rd),
   22203                                  Register(rn),
   22204                                  Register(rm));
   22205                           break;
   22206                         }
   22207                         default: {
   22208                           if (((instr & 0xf000) == 0xf000)) {
   22209                             UnallocatedT32(instr);
   22210                             return;
   22211                           }
   22212                           unsigned rd = (instr >> 8) & 0xf;
   22213                           unsigned rn = (instr >> 16) & 0xf;
   22214                           unsigned rm = instr & 0xf;
   22215                           unsigned ra = (instr >> 12) & 0xf;
   22216                           // SMMLAR{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
   22217                           smmlar(CurrentCond(),
   22218                                  Register(rd),
   22219                                  Register(rn),
   22220                                  Register(rm),
   22221                                  Register(ra));
   22222                           break;
   22223                         }
   22224                       }
   22225                       break;
   22226                     }
   22227                     case 0x00600000: {
   22228                       // 0xfb700000
   22229                       switch (instr & 0x0000f000) {
   22230                         case 0x0000f000: {
   22231                           // 0xfb70f000
   22232                           unsigned rd = (instr >> 8) & 0xf;
   22233                           unsigned rn = (instr >> 16) & 0xf;
   22234                           unsigned rm = instr & 0xf;
   22235                           // USAD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
   22236                           usad8(CurrentCond(),
   22237                                 Register(rd),
   22238                                 Register(rn),
   22239                                 Register(rm));
   22240                           break;
   22241                         }
   22242                         default: {
   22243                           if (((instr & 0xf000) == 0xf000)) {
   22244                             UnallocatedT32(instr);
   22245                             return;
   22246                           }
   22247                           unsigned rd = (instr >> 8) & 0xf;
   22248                           unsigned rn = (instr >> 16) & 0xf;
   22249                           unsigned rm = instr & 0xf;
   22250                           unsigned ra = (instr >> 12) & 0xf;
   22251                           // USADA8{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
   22252                           usada8(CurrentCond(),
   22253                                  Register(rd),
   22254                                  Register(rn),
   22255                                  Register(rm),
   22256                                  Register(ra));
   22257                           break;
   22258                         }
   22259                       }
   22260                       break;
   22261                     }
   22262                     default:
   22263                       UnallocatedT32(instr);
   22264                       break;
   22265                   }
   22266                   break;
   22267                 }
   22268                 case 0x11800000: {
   22269                   // 0xfb800000
   22270                   switch (instr & 0x006000f0) {
   22271                     case 0x00000000: {
   22272                       // 0xfb800000
   22273                       unsigned rdlo = (instr >> 12) & 0xf;
   22274                       unsigned rdhi = (instr >> 8) & 0xf;
   22275                       unsigned rn = (instr >> 16) & 0xf;
   22276                       unsigned rm = instr & 0xf;
   22277                       // SMULL{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; T1
   22278                       smull(CurrentCond(),
   22279                             Register(rdlo),
   22280                             Register(rdhi),
   22281                             Register(rn),
   22282                             Register(rm));
   22283                       break;
   22284                     }
   22285                     case 0x00200000: {
   22286                       // 0xfba00000
   22287                       unsigned rdlo = (instr >> 12) & 0xf;
   22288                       unsigned rdhi = (instr >> 8) & 0xf;
   22289                       unsigned rn = (instr >> 16) & 0xf;
   22290                       unsigned rm = instr & 0xf;
   22291                       // UMULL{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; T1
   22292                       umull(CurrentCond(),
   22293                             Register(rdlo),
   22294                             Register(rdhi),
   22295                             Register(rn),
   22296                             Register(rm));
   22297                       break;
   22298                     }
   22299                     case 0x00400000: {
   22300                       // 0xfbc00000
   22301                       unsigned rdlo = (instr >> 12) & 0xf;
   22302                       unsigned rdhi = (instr >> 8) & 0xf;
   22303                       unsigned rn = (instr >> 16) & 0xf;
   22304                       unsigned rm = instr & 0xf;
   22305                       // SMLAL{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; T1
   22306                       smlal(CurrentCond(),
   22307                             Register(rdlo),
   22308                             Register(rdhi),
   22309                             Register(rn),
   22310                             Register(rm));
   22311                       break;
   22312                     }
   22313                     case 0x00400080: {
   22314                       // 0xfbc00080
   22315                       unsigned rdlo = (instr >> 12) & 0xf;
   22316                       unsigned rdhi = (instr >> 8) & 0xf;
   22317                       unsigned rn = (instr >> 16) & 0xf;
   22318                       unsigned rm = instr & 0xf;
   22319                       // SMLALBB{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; T1
   22320                       smlalbb(CurrentCond(),
   22321                               Register(rdlo),
   22322                               Register(rdhi),
   22323                               Register(rn),
   22324                               Register(rm));
   22325                       break;
   22326                     }
   22327                     case 0x00400090: {
   22328                       // 0xfbc00090
   22329                       unsigned rdlo = (instr >> 12) & 0xf;
   22330                       unsigned rdhi = (instr >> 8) & 0xf;
   22331                       unsigned rn = (instr >> 16) & 0xf;
   22332                       unsigned rm = instr & 0xf;
   22333                       // SMLALBT{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; T1
   22334                       smlalbt(CurrentCond(),
   22335                               Register(rdlo),
   22336                               Register(rdhi),
   22337                               Register(rn),
   22338                               Register(rm));
   22339                       break;
   22340                     }
   22341                     case 0x004000a0: {
   22342                       // 0xfbc000a0
   22343                       unsigned rdlo = (instr >> 12) & 0xf;
   22344                       unsigned rdhi = (instr >> 8) & 0xf;
   22345                       unsigned rn = (instr >> 16) & 0xf;
   22346                       unsigned rm = instr & 0xf;
   22347                       // SMLALTB{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; T1
   22348                       smlaltb(CurrentCond(),
   22349                               Register(rdlo),
   22350                               Register(rdhi),
   22351                               Register(rn),
   22352                               Register(rm));
   22353                       break;
   22354                     }
   22355                     case 0x004000b0: {
   22356                       // 0xfbc000b0
   22357                       unsigned rdlo = (instr >> 12) & 0xf;
   22358                       unsigned rdhi = (instr >> 8) & 0xf;
   22359                       unsigned rn = (instr >> 16) & 0xf;
   22360                       unsigned rm = instr & 0xf;
   22361                       // SMLALTT{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; T1
   22362                       smlaltt(CurrentCond(),
   22363                               Register(rdlo),
   22364                               Register(rdhi),
   22365                               Register(rn),
   22366                               Register(rm));
   22367                       break;
   22368                     }
   22369                     case 0x004000c0: {
   22370                       // 0xfbc000c0
   22371                       unsigned rdlo = (instr >> 12) & 0xf;
   22372                       unsigned rdhi = (instr >> 8) & 0xf;
   22373                       unsigned rn = (instr >> 16) & 0xf;
   22374                       unsigned rm = instr & 0xf;
   22375                       // SMLALD{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; T1
   22376                       smlald(CurrentCond(),
   22377                              Register(rdlo),
   22378                              Register(rdhi),
   22379                              Register(rn),
   22380                              Register(rm));
   22381                       break;
   22382                     }
   22383                     case 0x004000d0: {
   22384                       // 0xfbc000d0
   22385                       unsigned rdlo = (instr >> 12) & 0xf;
   22386                       unsigned rdhi = (instr >> 8) & 0xf;
   22387                       unsigned rn = (instr >> 16) & 0xf;
   22388                       unsigned rm = instr & 0xf;
   22389                       // SMLALDX{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; T1
   22390                       smlaldx(CurrentCond(),
   22391                               Register(rdlo),
   22392                               Register(rdhi),
   22393                               Register(rn),
   22394                               Register(rm));
   22395                       break;
   22396                     }
   22397                     case 0x00600000: {
   22398                       // 0xfbe00000
   22399                       unsigned rdlo = (instr >> 12) & 0xf;
   22400                       unsigned rdhi = (instr >> 8) & 0xf;
   22401                       unsigned rn = (instr >> 16) & 0xf;
   22402                       unsigned rm = instr & 0xf;
   22403                       // UMLAL{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; T1
   22404                       umlal(CurrentCond(),
   22405                             Register(rdlo),
   22406                             Register(rdhi),
   22407                             Register(rn),
   22408                             Register(rm));
   22409                       break;
   22410                     }
   22411                     case 0x00600060: {
   22412                       // 0xfbe00060
   22413                       unsigned rdlo = (instr >> 12) & 0xf;
   22414                       unsigned rdhi = (instr >> 8) & 0xf;
   22415                       unsigned rn = (instr >> 16) & 0xf;
   22416                       unsigned rm = instr & 0xf;
   22417                       // UMAAL{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; T1
   22418                       umaal(CurrentCond(),
   22419                             Register(rdlo),
   22420                             Register(rdhi),
   22421                             Register(rn),
   22422                             Register(rm));
   22423                       break;
   22424                     }
   22425                     default:
   22426                       UnallocatedT32(instr);
   22427                       break;
   22428                   }
   22429                   break;
   22430                 }
   22431                 case 0x11900000: {
   22432                   // 0xfb900000
   22433                   switch (instr & 0x006000f0) {
   22434                     case 0x000000f0: {
   22435                       // 0xfb9000f0
   22436                       unsigned rd = (instr >> 8) & 0xf;
   22437                       unsigned rn = (instr >> 16) & 0xf;
   22438                       unsigned rm = instr & 0xf;
   22439                       // SDIV{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
   22440                       sdiv(CurrentCond(),
   22441                            Register(rd),
   22442                            Register(rn),
   22443                            Register(rm));
   22444                       if (((instr & 0xfff0f0f0) != 0xfb90f0f0)) {
   22445                         UnpredictableT32(instr);
   22446                       }
   22447                       break;
   22448                     }
   22449                     case 0x002000f0: {
   22450                       // 0xfbb000f0
   22451                       unsigned rd = (instr >> 8) & 0xf;
   22452                       unsigned rn = (instr >> 16) & 0xf;
   22453                       unsigned rm = instr & 0xf;
   22454                       // UDIV{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
   22455                       udiv(CurrentCond(),
   22456                            Register(rd),
   22457                            Register(rn),
   22458                            Register(rm));
   22459                       if (((instr & 0xfff0f0f0) != 0xfbb0f0f0)) {
   22460                         UnpredictableT32(instr);
   22461                       }
   22462                       break;
   22463                     }
   22464                     case 0x004000c0: {
   22465                       // 0xfbd000c0
   22466                       unsigned rdlo = (instr >> 12) & 0xf;
   22467                       unsigned rdhi = (instr >> 8) & 0xf;
   22468                       unsigned rn = (instr >> 16) & 0xf;
   22469                       unsigned rm = instr & 0xf;
   22470                       // SMLSLD{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; T1
   22471                       smlsld(CurrentCond(),
   22472                              Register(rdlo),
   22473                              Register(rdhi),
   22474                              Register(rn),
   22475                              Register(rm));
   22476                       break;
   22477                     }
   22478                     case 0x004000d0: {
   22479                       // 0xfbd000d0
   22480                       unsigned rdlo = (instr >> 12) & 0xf;
   22481                       unsigned rdhi = (instr >> 8) & 0xf;
   22482                       unsigned rn = (instr >> 16) & 0xf;
   22483                       unsigned rm = instr & 0xf;
   22484                       // SMLSLDX{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; T1
   22485                       smlsldx(CurrentCond(),
   22486                               Register(rdlo),
   22487                               Register(rdhi),
   22488                               Register(rn),
   22489                               Register(rm));
   22490                       break;
   22491                     }
   22492                     default:
   22493                       UnallocatedT32(instr);
   22494                       break;
   22495                   }
   22496                   break;
   22497                 }
   22498               }
   22499               break;
   22500             }
   22501             case 0x04000000: {
   22502               // 0xec000000
   22503               switch (instr & 0x11100000) {
   22504                 case 0x00000000: {
   22505                   // 0xec000000
   22506                   switch (instr & 0x00000e00) {
   22507                     case 0x00000a00: {
   22508                       // 0xec000a00
   22509                       switch (instr & 0x00800100) {
   22510                         case 0x00000000: {
   22511                           // 0xec000a00
   22512                           if ((instr & 0x006000d0) == 0x00400010) {
   22513                             unsigned rm = ExtractSRegister(instr, 5, 0);
   22514                             unsigned rt = (instr >> 12) & 0xf;
   22515                             unsigned rt2 = (instr >> 16) & 0xf;
   22516                             // VMOV{<c>}{<q>} <Sm>, <Sm1>, <Rt>, <Rt2> ; T1
   22517                             vmov(CurrentCond(),
   22518                                  SRegister(rm),
   22519                                  SRegister(rm + 1),
   22520                                  Register(rt),
   22521                                  Register(rt2));
   22522                           } else {
   22523                             UnallocatedT32(instr);
   22524                           }
   22525                           break;
   22526                         }
   22527                         case 0x00000100: {
   22528                           // 0xec000b00
   22529                           if ((instr & 0x006000d0) == 0x00400010) {
   22530                             unsigned rm = ExtractDRegister(instr, 5, 0);
   22531                             unsigned rt = (instr >> 12) & 0xf;
   22532                             unsigned rt2 = (instr >> 16) & 0xf;
   22533                             // VMOV{<c>}{<q>} <Dm>, <Rt>, <Rt2> ; T1
   22534                             vmov(CurrentCond(),
   22535                                  DRegister(rm),
   22536                                  Register(rt),
   22537                                  Register(rt2));
   22538                           } else {
   22539                             UnallocatedT32(instr);
   22540                           }
   22541                           break;
   22542                         }
   22543                         case 0x00800000: {
   22544                           // 0xec800a00
   22545                           unsigned rn = (instr >> 16) & 0xf;
   22546                           WriteBack write_back((instr >> 21) & 0x1);
   22547                           unsigned first = ExtractSRegister(instr, 22, 12);
   22548                           unsigned len = instr & 0xff;
   22549                           // VSTM{<c>}{<q>}{.<size>} <Rn>{!}, <sreglist> ; T2
   22550                           vstm(CurrentCond(),
   22551                                kDataTypeValueNone,
   22552                                Register(rn),
   22553                                write_back,
   22554                                SRegisterList(SRegister(first), len));
   22555                           if ((len == 0) ||
   22556                               ((first + len) > kNumberOfSRegisters)) {
   22557                             UnpredictableT32(instr);
   22558                           }
   22559                           break;
   22560                         }
   22561                         case 0x00800100: {
   22562                           // 0xec800b00
   22563                           switch (instr & 0x00000001) {
   22564                             case 0x00000000: {
   22565                               // 0xec800b00
   22566                               unsigned rn = (instr >> 16) & 0xf;
   22567                               WriteBack write_back((instr >> 21) & 0x1);
   22568                               unsigned first = ExtractDRegister(instr, 22, 12);
   22569                               unsigned imm8 = (instr & 0xff);
   22570                               unsigned len = imm8 / 2;
   22571                               unsigned end = first + len;
   22572                               // VSTM{<c>}{<q>}{.<size>} <Rn>{!}, <dreglist> ; T1 NOLINT(whitespace/line_length)
   22573                               vstm(CurrentCond(),
   22574                                    kDataTypeValueNone,
   22575                                    Register(rn),
   22576                                    write_back,
   22577                                    DRegisterList(DRegister(first), len));
   22578                               if ((len == 0) || (len > 16) ||
   22579                                   (end > kMaxNumberOfDRegisters)) {
   22580                                 UnpredictableT32(instr);
   22581                               }
   22582                               break;
   22583                             }
   22584                             case 0x00000001: {
   22585                               // 0xec800b01
   22586                               unsigned rn = (instr >> 16) & 0xf;
   22587                               WriteBack write_back((instr >> 21) & 0x1);
   22588                               unsigned first = ExtractDRegister(instr, 22, 12);
   22589                               unsigned imm8 = (instr & 0xff);
   22590                               unsigned len = imm8 / 2;
   22591                               unsigned end = first + len;
   22592                               // FSTMIAX{<c>}{<q>} <Rn>{!}, <dreglist> ; T1
   22593                               fstmiax(CurrentCond(),
   22594                                       Register(rn),
   22595                                       write_back,
   22596                                       DRegisterList(DRegister(first), len));
   22597                               if ((len == 0) || (len > 16) || (end > 16)) {
   22598                                 UnpredictableT32(instr);
   22599                               }
   22600                               break;
   22601                             }
   22602                           }
   22603                           break;
   22604                         }
   22605                       }
   22606                       break;
   22607                     }
   22608                     default: {
   22609                       switch (instr & 0x00200000) {
   22610                         case 0x00000000: {
   22611                           // 0xec000000
   22612                           switch (instr & 0x00800000) {
   22613                             case 0x00000000: {
   22614                               // 0xec000000
   22615                               if ((instr & 0x00400000) == 0x00400000) {
   22616                                 if (((instr & 0xe00) == 0xa00)) {
   22617                                   UnallocatedT32(instr);
   22618                                   return;
   22619                                 }
   22620                                 UnimplementedT32_32("MCRR", instr);
   22621                               } else {
   22622                                 UnallocatedT32(instr);
   22623                               }
   22624                               break;
   22625                             }
   22626                             case 0x00800000: {
   22627                               // 0xec800000
   22628                               if (((instr & 0xe00) == 0xa00)) {
   22629                                 UnallocatedT32(instr);
   22630                                 return;
   22631                               }
   22632                               UnimplementedT32_32("STC", instr);
   22633                               break;
   22634                             }
   22635                           }
   22636                           break;
   22637                         }
   22638                         case 0x00200000: {
   22639                           // 0xec200000
   22640                           if (((instr & 0xe00) == 0xa00)) {
   22641                             UnallocatedT32(instr);
   22642                             return;
   22643                           }
   22644                           UnimplementedT32_32("STC", instr);
   22645                           break;
   22646                         }
   22647                       }
   22648                       break;
   22649                     }
   22650                   }
   22651                   break;
   22652                 }
   22653                 case 0x00100000: {
   22654                   // 0xec100000
   22655                   switch (instr & 0x00000e00) {
   22656                     case 0x00000a00: {
   22657                       // 0xec100a00
   22658                       switch (instr & 0x00800100) {
   22659                         case 0x00000000: {
   22660                           // 0xec100a00
   22661                           if ((instr & 0x006000d0) == 0x00400010) {
   22662                             unsigned rt = (instr >> 12) & 0xf;
   22663                             unsigned rt2 = (instr >> 16) & 0xf;
   22664                             unsigned rm = ExtractSRegister(instr, 5, 0);
   22665                             // VMOV{<c>}{<q>} <Rt>, <Rt2>, <Sm>, <Sm1> ; T1
   22666                             vmov(CurrentCond(),
   22667                                  Register(rt),
   22668                                  Register(rt2),
   22669                                  SRegister(rm),
   22670                                  SRegister(rm + 1));
   22671                           } else {
   22672                             UnallocatedT32(instr);
   22673                           }
   22674                           break;
   22675                         }
   22676                         case 0x00000100: {
   22677                           // 0xec100b00
   22678                           if ((instr & 0x006000d0) == 0x00400010) {
   22679                             unsigned rt = (instr >> 12) & 0xf;
   22680                             unsigned rt2 = (instr >> 16) & 0xf;
   22681                             unsigned rm = ExtractDRegister(instr, 5, 0);
   22682                             // VMOV{<c>}{<q>} <Rt>, <Rt2>, <Dm> ; T1
   22683                             vmov(CurrentCond(),
   22684                                  Register(rt),
   22685                                  Register(rt2),
   22686                                  DRegister(rm));
   22687                           } else {
   22688                             UnallocatedT32(instr);
   22689                           }
   22690                           break;
   22691                         }
   22692                         case 0x00800000: {
   22693                           // 0xec900a00
   22694                           if (((Uint32((instr >> 21)) & Uint32(0x1)) ==
   22695                                Uint32(0x1)) &&
   22696                               ((Uint32((instr >> 16)) & Uint32(0xf)) ==
   22697                                Uint32(0xd))) {
   22698                             unsigned first = ExtractSRegister(instr, 22, 12);
   22699                             unsigned len = instr & 0xff;
   22700                             // VPOP{<c>}{<q>}{.<size>} <sreglist> ; T2
   22701                             vpop(CurrentCond(),
   22702                                  kDataTypeValueNone,
   22703                                  SRegisterList(SRegister(first), len));
   22704                             if ((len == 0) ||
   22705                                 ((first + len) > kNumberOfSRegisters)) {
   22706                               UnpredictableT32(instr);
   22707                             }
   22708                             return;
   22709                           }
   22710                           unsigned rn = (instr >> 16) & 0xf;
   22711                           WriteBack write_back((instr >> 21) & 0x1);
   22712                           unsigned first = ExtractSRegister(instr, 22, 12);
   22713                           unsigned len = instr & 0xff;
   22714                           // VLDM{<c>}{<q>}{.<size>} <Rn>{!}, <sreglist> ; T2
   22715                           vldm(CurrentCond(),
   22716                                kDataTypeValueNone,
   22717                                Register(rn),
   22718                                write_back,
   22719                                SRegisterList(SRegister(first), len));
   22720                           if ((len == 0) ||
   22721                               ((first + len) > kNumberOfSRegisters)) {
   22722                             UnpredictableT32(instr);
   22723                           }
   22724                           break;
   22725                         }
   22726                         case 0x00800100: {
   22727                           // 0xec900b00
   22728                           switch (instr & 0x00000001) {
   22729                             case 0x00000000: {
   22730                               // 0xec900b00
   22731                               if (((Uint32((instr >> 21)) & Uint32(0x1)) ==
   22732                                    Uint32(0x1)) &&
   22733                                   ((Uint32((instr >> 16)) & Uint32(0xf)) ==
   22734                                    Uint32(0xd))) {
   22735                                 unsigned first =
   22736                                     ExtractDRegister(instr, 22, 12);
   22737                                 unsigned imm8 = (instr & 0xff);
   22738                                 unsigned len = imm8 / 2;
   22739                                 unsigned end = first + len;
   22740                                 // VPOP{<c>}{<q>}{.<size>} <dreglist> ; T1
   22741                                 vpop(CurrentCond(),
   22742                                      kDataTypeValueNone,
   22743                                      DRegisterList(DRegister(first), len));
   22744                                 if ((len == 0) || (len > 16) ||
   22745                                     (end > kMaxNumberOfDRegisters)) {
   22746                                   UnpredictableT32(instr);
   22747                                 }
   22748                                 return;
   22749                               }
   22750                               unsigned rn = (instr >> 16) & 0xf;
   22751                               WriteBack write_back((instr >> 21) & 0x1);
   22752                               unsigned first = ExtractDRegister(instr, 22, 12);
   22753                               unsigned imm8 = (instr & 0xff);
   22754                               unsigned len = imm8 / 2;
   22755                               unsigned end = first + len;
   22756                               // VLDM{<c>}{<q>}{.<size>} <Rn>{!}, <dreglist> ; T1 NOLINT(whitespace/line_length)
   22757                               vldm(CurrentCond(),
   22758                                    kDataTypeValueNone,
   22759                                    Register(rn),
   22760                                    write_back,
   22761                                    DRegisterList(DRegister(first), len));
   22762                               if ((len == 0) || (len > 16) ||
   22763                                   (end > kMaxNumberOfDRegisters)) {
   22764                                 UnpredictableT32(instr);
   22765                               }
   22766                               break;
   22767                             }
   22768                             case 0x00000001: {
   22769                               // 0xec900b01
   22770                               unsigned rn = (instr >> 16) & 0xf;
   22771                               WriteBack write_back((instr >> 21) & 0x1);
   22772                               unsigned first = ExtractDRegister(instr, 22, 12);
   22773                               unsigned imm8 = (instr & 0xff);
   22774                               unsigned len = imm8 / 2;
   22775                               unsigned end = first + len;
   22776                               // FLDMIAX{<c>}{<q>} <Rn>{!}, <dreglist> ; T1
   22777                               fldmiax(CurrentCond(),
   22778                                       Register(rn),
   22779                                       write_back,
   22780                                       DRegisterList(DRegister(first), len));
   22781                               if ((len == 0) || (len > 16) || (end > 16)) {
   22782                                 UnpredictableT32(instr);
   22783                               }
   22784                               break;
   22785                             }
   22786                           }
   22787                           break;
   22788                         }
   22789                       }
   22790                       break;
   22791                     }
   22792                     default: {
   22793                       switch (instr & 0x00200000) {
   22794                         case 0x00000000: {
   22795                           // 0xec100000
   22796                           switch (instr & 0x00800000) {
   22797                             case 0x00000000: {
   22798                               // 0xec100000
   22799                               if ((instr & 0x00400000) == 0x00400000) {
   22800                                 if (((instr & 0xe00) == 0xa00)) {
   22801                                   UnallocatedT32(instr);
   22802                                   return;
   22803                                 }
   22804                                 UnimplementedT32_32("MRRC", instr);
   22805                               } else {
   22806                                 UnallocatedT32(instr);
   22807                               }
   22808                               break;
   22809                             }
   22810                             case 0x00800000: {
   22811                               // 0xec900000
   22812                               if (((instr & 0xf0000) == 0xf0000) ||
   22813                                   ((instr & 0xe00) == 0xa00)) {
   22814                                 UnallocatedT32(instr);
   22815                                 return;
   22816                               }
   22817                               UnimplementedT32_32("LDC", instr);
   22818                               break;
   22819                             }
   22820                           }
   22821                           break;
   22822                         }
   22823                         case 0x00200000: {
   22824                           // 0xec300000
   22825                           if (((instr & 0xf0000) == 0xf0000) ||
   22826                               ((instr & 0xe00) == 0xa00)) {
   22827                             UnallocatedT32(instr);
   22828                             return;
   22829                           }
   22830                           UnimplementedT32_32("LDC", instr);
   22831                           break;
   22832                         }
   22833                       }
   22834                       break;
   22835                     }
   22836                   }
   22837                   break;
   22838                 }
   22839                 case 0x01000000: {
   22840                   // 0xed000000
   22841                   switch (instr & 0x00200000) {
   22842                     case 0x00000000: {
   22843                       // 0xed000000
   22844                       switch (instr & 0x00000e00) {
   22845                         case 0x00000a00: {
   22846                           // 0xed000a00
   22847                           switch (instr & 0x00000100) {
   22848                             case 0x00000000: {
   22849                               // 0xed000a00
   22850                               unsigned rd = ExtractSRegister(instr, 22, 12);
   22851                               unsigned rn = (instr >> 16) & 0xf;
   22852                               Sign sign((((instr >> 23) & 0x1) == 0) ? minus
   22853                                                                      : plus);
   22854                               int32_t offset = (instr & 0xff) << 2;
   22855                               // VSTR{<c>}{<q>}{.32} <Sd>, [<Rn>{, #{+/-}<imm>}] ; T2 NOLINT(whitespace/line_length)
   22856                               vstr(CurrentCond(),
   22857                                    kDataTypeValueNone,
   22858                                    SRegister(rd),
   22859                                    MemOperand(Register(rn),
   22860                                               sign,
   22861                                               offset,
   22862                                               Offset));
   22863                               break;
   22864                             }
   22865                             case 0x00000100: {
   22866                               // 0xed000b00
   22867                               unsigned rd = ExtractDRegister(instr, 22, 12);
   22868                               unsigned rn = (instr >> 16) & 0xf;
   22869                               Sign sign((((instr >> 23) & 0x1) == 0) ? minus
   22870                                                                      : plus);
   22871                               int32_t offset = (instr & 0xff) << 2;
   22872                               // VSTR{<c>}{<q>}{.64} <Dd>, [<Rn>{, #{+/-}<imm>}] ; T1 NOLINT(whitespace/line_length)
   22873                               vstr(CurrentCond(),
   22874                                    kDataTypeValueNone,
   22875                                    DRegister(rd),
   22876                                    MemOperand(Register(rn),
   22877                                               sign,
   22878                                               offset,
   22879                                               Offset));
   22880                               break;
   22881                             }
   22882                           }
   22883                           break;
   22884                         }
   22885                         default: {
   22886                           if (((instr & 0xe00) == 0xa00)) {
   22887                             UnallocatedT32(instr);
   22888                             return;
   22889                           }
   22890                           UnimplementedT32_32("STC", instr);
   22891                           break;
   22892                         }
   22893                       }
   22894                       break;
   22895                     }
   22896                     case 0x00200000: {
   22897                       // 0xed200000
   22898                       switch (instr & 0x00000e00) {
   22899                         case 0x00000a00: {
   22900                           // 0xed200a00
   22901                           switch (instr & 0x00800100) {
   22902                             case 0x00000000: {
   22903                               // 0xed200a00
   22904                               if (((Uint32((instr >> 16)) & Uint32(0xf)) ==
   22905                                    Uint32(0xd))) {
   22906                                 unsigned first =
   22907                                     ExtractSRegister(instr, 22, 12);
   22908                                 unsigned len = instr & 0xff;
   22909                                 // VPUSH{<c>}{<q>}{.<size>} <sreglist> ; T2
   22910                                 vpush(CurrentCond(),
   22911                                       kDataTypeValueNone,
   22912                                       SRegisterList(SRegister(first), len));
   22913                                 if ((len == 0) ||
   22914                                     ((first + len) > kNumberOfSRegisters)) {
   22915                                   UnpredictableT32(instr);
   22916                                 }
   22917                                 return;
   22918                               }
   22919                               unsigned rn = (instr >> 16) & 0xf;
   22920                               unsigned first = ExtractSRegister(instr, 22, 12);
   22921                               unsigned len = instr & 0xff;
   22922                               // VSTMDB{<c>}{<q>}{.<size>} <Rn>!, <sreglist> ; T2 NOLINT(whitespace/line_length)
   22923                               vstmdb(CurrentCond(),
   22924                                      kDataTypeValueNone,
   22925                                      Register(rn),
   22926                                      WriteBack(WRITE_BACK),
   22927                                      SRegisterList(SRegister(first), len));
   22928                               if ((len == 0) ||
   22929                                   ((first + len) > kNumberOfSRegisters)) {
   22930                                 UnpredictableT32(instr);
   22931                               }
   22932                               break;
   22933                             }
   22934                             case 0x00000100: {
   22935                               // 0xed200b00
   22936                               switch (instr & 0x00000001) {
   22937                                 case 0x00000000: {
   22938                                   // 0xed200b00
   22939                                   if (((Uint32((instr >> 16)) & Uint32(0xf)) ==
   22940                                        Uint32(0xd))) {
   22941                                     unsigned first =
   22942                                         ExtractDRegister(instr, 22, 12);
   22943                                     unsigned imm8 = (instr & 0xff);
   22944                                     unsigned len = imm8 / 2;
   22945                                     unsigned end = first + len;
   22946                                     // VPUSH{<c>}{<q>}{.<size>} <dreglist> ; T1
   22947                                     vpush(CurrentCond(),
   22948                                           kDataTypeValueNone,
   22949                                           DRegisterList(DRegister(first), len));
   22950                                     if ((len == 0) || (len > 16) ||
   22951                                         (end > kMaxNumberOfDRegisters)) {
   22952                                       UnpredictableT32(instr);
   22953                                     }
   22954                                     return;
   22955                                   }
   22956                                   unsigned rn = (instr >> 16) & 0xf;
   22957                                   unsigned first =
   22958                                       ExtractDRegister(instr, 22, 12);
   22959                                   unsigned imm8 = (instr & 0xff);
   22960                                   unsigned len = imm8 / 2;
   22961                                   unsigned end = first + len;
   22962                                   // VSTMDB{<c>}{<q>}{.<size>} <Rn>!, <dreglist> ; T1 NOLINT(whitespace/line_length)
   22963                                   vstmdb(CurrentCond(),
   22964                                          kDataTypeValueNone,
   22965                                          Register(rn),
   22966                                          WriteBack(WRITE_BACK),
   22967                                          DRegisterList(DRegister(first), len));
   22968                                   if ((len == 0) || (len > 16) ||
   22969                                       (end > kMaxNumberOfDRegisters)) {
   22970                                     UnpredictableT32(instr);
   22971                                   }
   22972                                   break;
   22973                                 }
   22974                                 case 0x00000001: {
   22975                                   // 0xed200b01
   22976                                   unsigned rn = (instr >> 16) & 0xf;
   22977                                   unsigned first =
   22978                                       ExtractDRegister(instr, 22, 12);
   22979                                   unsigned imm8 = (instr & 0xff);
   22980                                   unsigned len = imm8 / 2;
   22981                                   unsigned end = first + len;
   22982                                   // FSTMDBX{<c>}{<q>} <Rn>!, <dreglist> ; T1
   22983                                   fstmdbx(CurrentCond(),
   22984                                           Register(rn),
   22985                                           WriteBack(WRITE_BACK),
   22986                                           DRegisterList(DRegister(first), len));
   22987                                   if ((len == 0) || (len > 16) || (end > 16)) {
   22988                                     UnpredictableT32(instr);
   22989                                   }
   22990                                   break;
   22991                                 }
   22992                               }
   22993                               break;
   22994                             }
   22995                             default:
   22996                               UnallocatedT32(instr);
   22997                               break;
   22998                           }
   22999                           break;
   23000                         }
   23001                         default: {
   23002                           if (((instr & 0xe00) == 0xa00)) {
   23003                             UnallocatedT32(instr);
   23004                             return;
   23005                           }
   23006                           UnimplementedT32_32("STC", instr);
   23007                           break;
   23008                         }
   23009                       }
   23010                       break;
   23011                     }
   23012                   }
   23013                   break;
   23014                 }
   23015                 case 0x01100000: {
   23016                   // 0xed100000
   23017                   switch (instr & 0x00200000) {
   23018                     case 0x00000000: {
   23019                       // 0xed100000
   23020                       switch (instr & 0x000f0000) {
   23021                         case 0x000f0000: {
   23022                           // 0xed1f0000
   23023                           switch (instr & 0x00000e00) {
   23024                             case 0x00000a00: {
   23025                               // 0xed1f0a00
   23026                               switch (instr & 0x00000100) {
   23027                                 case 0x00000000: {
   23028                                   // 0xed1f0a00
   23029                                   unsigned rd = ExtractSRegister(instr, 22, 12);
   23030                                   uint32_t U = (instr >> 23) & 0x1;
   23031                                   int32_t imm = instr & 0xff;
   23032                                   imm <<= 2;
   23033                                   if (U == 0) imm = -imm;
   23034                                   bool minus_zero = (imm == 0) && (U == 0);
   23035                                   Label label(imm, kT32PcDelta, minus_zero);
   23036                                   // VLDR{<c>}{<q>}{.32} <Sd>, <label> ; T2
   23037                                   vldr(CurrentCond(),
   23038                                        kDataTypeValueNone,
   23039                                        SRegister(rd),
   23040                                        &label);
   23041                                   break;
   23042                                 }
   23043                                 case 0x00000100: {
   23044                                   // 0xed1f0b00
   23045                                   unsigned rd = ExtractDRegister(instr, 22, 12);
   23046                                   uint32_t U = (instr >> 23) & 0x1;
   23047                                   int32_t imm = instr & 0xff;
   23048                                   imm <<= 2;
   23049                                   if (U == 0) imm = -imm;
   23050                                   bool minus_zero = (imm == 0) && (U == 0);
   23051                                   Label label(imm, kT32PcDelta, minus_zero);
   23052                                   // VLDR{<c>}{<q>}{.64} <Dd>, <label> ; T1
   23053                                   vldr(CurrentCond(),
   23054                                        kDataTypeValueNone,
   23055                                        DRegister(rd),
   23056                                        &label);
   23057                                   break;
   23058                                 }
   23059                               }
   23060                               break;
   23061                             }
   23062                             default: {
   23063                               if (((instr & 0xe00) == 0xa00)) {
   23064                                 UnallocatedT32(instr);
   23065                                 return;
   23066                               }
   23067                               UnimplementedT32_32("LDC", instr);
   23068                               break;
   23069                             }
   23070                           }
   23071                           break;
   23072                         }
   23073                         default: {
   23074                           switch (instr & 0x00000e00) {
   23075                             case 0x00000a00: {
   23076                               // 0xed100a00
   23077                               switch (instr & 0x00000100) {
   23078                                 case 0x00000000: {
   23079                                   // 0xed100a00
   23080                                   if (((instr & 0xf0000) == 0xf0000)) {
   23081                                     UnallocatedT32(instr);
   23082                                     return;
   23083                                   }
   23084                                   unsigned rd = ExtractSRegister(instr, 22, 12);
   23085                                   unsigned rn = (instr >> 16) & 0xf;
   23086                                   Sign sign((((instr >> 23) & 0x1) == 0)
   23087                                                 ? minus
   23088                                                 : plus);
   23089                                   int32_t offset = (instr & 0xff) << 2;
   23090                                   // VLDR{<c>}{<q>}{.32} <Sd>, [<Rn>{, #{+/-}<imm>}] ; T2 NOLINT(whitespace/line_length)
   23091                                   vldr(CurrentCond(),
   23092                                        kDataTypeValueNone,
   23093                                        SRegister(rd),
   23094                                        MemOperand(Register(rn),
   23095                                                   sign,
   23096                                                   offset,
   23097                                                   Offset));
   23098                                   break;
   23099                                 }
   23100                                 case 0x00000100: {
   23101                                   // 0xed100b00
   23102                                   if (((instr & 0xf0000) == 0xf0000)) {
   23103                                     UnallocatedT32(instr);
   23104                                     return;
   23105                                   }
   23106                                   unsigned rd = ExtractDRegister(instr, 22, 12);
   23107                                   unsigned rn = (instr >> 16) & 0xf;
   23108                                   Sign sign((((instr >> 23) & 0x1) == 0)
   23109                                                 ? minus
   23110                                                 : plus);
   23111                                   int32_t offset = (instr & 0xff) << 2;
   23112                                   // VLDR{<c>}{<q>}{.64} <Dd>, [<Rn>{, #{+/-}<imm>}] ; T1 NOLINT(whitespace/line_length)
   23113                                   vldr(CurrentCond(),
   23114                                        kDataTypeValueNone,
   23115                                        DRegister(rd),
   23116                                        MemOperand(Register(rn),
   23117                                                   sign,
   23118                                                   offset,
   23119                                                   Offset));
   23120                                   break;
   23121                                 }
   23122                               }
   23123                               break;
   23124                             }
   23125                             default: {
   23126                               if (((instr & 0xf0000) == 0xf0000) ||
   23127                                   ((instr & 0xe00) == 0xa00)) {
   23128                                 UnallocatedT32(instr);
   23129                                 return;
   23130                               }
   23131                               UnimplementedT32_32("LDC", instr);
   23132                               break;
   23133                             }
   23134                           }
   23135                           break;
   23136                         }
   23137                       }
   23138                       break;
   23139                     }
   23140                     case 0x00200000: {
   23141                       // 0xed300000
   23142                       switch (instr & 0x00000e00) {
   23143                         case 0x00000a00: {
   23144                           // 0xed300a00
   23145                           switch (instr & 0x00800100) {
   23146                             case 0x00000000: {
   23147                               // 0xed300a00
   23148                               unsigned rn = (instr >> 16) & 0xf;
   23149                               unsigned first = ExtractSRegister(instr, 22, 12);
   23150                               unsigned len = instr & 0xff;
   23151                               // VLDMDB{<c>}{<q>}{.<size>} <Rn>!, <sreglist> ; T2 NOLINT(whitespace/line_length)
   23152                               vldmdb(CurrentCond(),
   23153                                      kDataTypeValueNone,
   23154                                      Register(rn),
   23155                                      WriteBack(WRITE_BACK),
   23156                                      SRegisterList(SRegister(first), len));
   23157                               if ((len == 0) ||
   23158                                   ((first + len) > kNumberOfSRegisters)) {
   23159                                 UnpredictableT32(instr);
   23160                               }
   23161                               break;
   23162                             }
   23163                             case 0x00000100: {
   23164                               // 0xed300b00
   23165                               switch (instr & 0x00000001) {
   23166                                 case 0x00000000: {
   23167                                   // 0xed300b00
   23168                                   unsigned rn = (instr >> 16) & 0xf;
   23169                                   unsigned first =
   23170                                       ExtractDRegister(instr, 22, 12);
   23171                                   unsigned imm8 = (instr & 0xff);
   23172                                   unsigned len = imm8 / 2;
   23173                                   unsigned end = first + len;
   23174                                   // VLDMDB{<c>}{<q>}{.<size>} <Rn>!, <dreglist> ; T1 NOLINT(whitespace/line_length)
   23175                                   vldmdb(CurrentCond(),
   23176                                          kDataTypeValueNone,
   23177                                          Register(rn),
   23178                                          WriteBack(WRITE_BACK),
   23179                                          DRegisterList(DRegister(first), len));
   23180                                   if ((len == 0) || (len > 16) ||
   23181                                       (end > kMaxNumberOfDRegisters)) {
   23182                                     UnpredictableT32(instr);
   23183                                   }
   23184                                   break;
   23185                                 }
   23186                                 case 0x00000001: {
   23187                                   // 0xed300b01
   23188                                   unsigned rn = (instr >> 16) & 0xf;
   23189                                   unsigned first =
   23190                                       ExtractDRegister(instr, 22, 12);
   23191                                   unsigned imm8 = (instr & 0xff);
   23192                                   unsigned len = imm8 / 2;
   23193                                   unsigned end = first + len;
   23194                                   // FLDMDBX{<c>}{<q>} <Rn>!, <dreglist> ; T1
   23195                                   fldmdbx(CurrentCond(),
   23196                                           Register(rn),
   23197                                           WriteBack(WRITE_BACK),
   23198                                           DRegisterList(DRegister(first), len));
   23199                                   if ((len == 0) || (len > 16) || (end > 16)) {
   23200                                     UnpredictableT32(instr);
   23201                                   }
   23202                                   break;
   23203                                 }
   23204                               }
   23205                               break;
   23206                             }
   23207                             default:
   23208                               UnallocatedT32(instr);
   23209                               break;
   23210                           }
   23211                           break;
   23212                         }
   23213                         default: {
   23214                           if (((instr & 0xf0000) == 0xf0000) ||
   23215                               ((instr & 0xe00) == 0xa00)) {
   23216                             UnallocatedT32(instr);
   23217                             return;
   23218                           }
   23219                           UnimplementedT32_32("LDC", instr);
   23220                           break;
   23221                         }
   23222                       }
   23223                       break;
   23224                     }
   23225                   }
   23226                   break;
   23227                 }
   23228                 case 0x10000000: {
   23229                   // 0xfc000000
   23230                   switch (instr & 0x00200000) {
   23231                     case 0x00000000: {
   23232                       // 0xfc000000
   23233                       switch (instr & 0x00800000) {
   23234                         case 0x00000000: {
   23235                           // 0xfc000000
   23236                           if ((instr & 0x00400000) == 0x00400000) {
   23237                             if (((instr & 0xe00) == 0xa00)) {
   23238                               UnallocatedT32(instr);
   23239                               return;
   23240                             }
   23241                             UnimplementedT32_32("MCRR2", instr);
   23242                           } else {
   23243                             UnallocatedT32(instr);
   23244                           }
   23245                           break;
   23246                         }
   23247                         case 0x00800000: {
   23248                           // 0xfc800000
   23249                           if (((instr & 0xe00) == 0xa00)) {
   23250                             UnallocatedT32(instr);
   23251                             return;
   23252                           }
   23253                           UnimplementedT32_32("STC2", instr);
   23254                           break;
   23255                         }
   23256                       }
   23257                       break;
   23258                     }
   23259                     case 0x00200000: {
   23260                       // 0xfc200000
   23261                       if (((instr & 0xe00) == 0xa00)) {
   23262                         UnallocatedT32(instr);
   23263                         return;
   23264                       }
   23265                       UnimplementedT32_32("STC2", instr);
   23266                       break;
   23267                     }
   23268                   }
   23269                   break;
   23270                 }
   23271                 case 0x10100000: {
   23272                   // 0xfc100000
   23273                   switch (instr & 0x00200000) {
   23274                     case 0x00000000: {
   23275                       // 0xfc100000
   23276                       switch (instr & 0x00800000) {
   23277                         case 0x00000000: {
   23278                           // 0xfc100000
   23279                           if ((instr & 0x00400000) == 0x00400000) {
   23280                             if (((instr & 0xe00) == 0xa00)) {
   23281                               UnallocatedT32(instr);
   23282                               return;
   23283                             }
   23284                             UnimplementedT32_32("MRRC2", instr);
   23285                           } else {
   23286                             UnallocatedT32(instr);
   23287                           }
   23288                           break;
   23289                         }
   23290                         case 0x00800000: {
   23291                           // 0xfc900000
   23292                           if (((instr & 0xf0000) == 0xf0000) ||
   23293                               ((instr & 0xe00) == 0xa00)) {
   23294                             UnallocatedT32(instr);
   23295                             return;
   23296                           }
   23297                           UnimplementedT32_32("LDC2", instr);
   23298                           break;
   23299                         }
   23300                       }
   23301                       break;
   23302                     }
   23303                     case 0x00200000: {
   23304                       // 0xfc300000
   23305                       if (((instr & 0xf0000) == 0xf0000) ||
   23306                           ((instr & 0xe00) == 0xa00)) {
   23307                         UnallocatedT32(instr);
   23308                         return;
   23309                       }
   23310                       UnimplementedT32_32("LDC2", instr);
   23311                       break;
   23312                     }
   23313                   }
   23314                   break;
   23315                 }
   23316                 case 0x11000000: {
   23317                   // 0xfd000000
   23318                   switch (instr & 0x00200000) {
   23319                     case 0x00000000: {
   23320                       // 0xfd000000
   23321                       if (((instr & 0xe00) == 0xa00)) {
   23322                         UnallocatedT32(instr);
   23323                         return;
   23324                       }
   23325                       UnimplementedT32_32("STC2", instr);
   23326                       break;
   23327                     }
   23328                     case 0x00200000: {
   23329                       // 0xfd200000
   23330                       if (((instr & 0xe00) == 0xa00)) {
   23331                         UnallocatedT32(instr);
   23332                         return;
   23333                       }
   23334                       UnimplementedT32_32("STC2", instr);
   23335                       break;
   23336                     }
   23337                   }
   23338                   break;
   23339                 }
   23340                 case 0x11100000: {
   23341                   // 0xfd100000
   23342                   switch (instr & 0x00200000) {
   23343                     case 0x00000000: {
   23344                       // 0xfd100000
   23345                       switch (instr & 0x00000e00) {
   23346                         case 0x00000a00: {
   23347                           // 0xfd100a00
   23348                           UnallocatedT32(instr);
   23349                           break;
   23350                         }
   23351                         default: {
   23352                           switch (instr & 0x000f0000) {
   23353                             case 0x000f0000: {
   23354                               // 0xfd1f0000
   23355                               if (((instr & 0xe00) == 0xa00)) {
   23356                                 UnallocatedT32(instr);
   23357                                 return;
   23358                               }
   23359                               UnimplementedT32_32("LDC2", instr);
   23360                               break;
   23361                             }
   23362                             default: {
   23363                               if (((instr & 0xf0000) == 0xf0000) ||
   23364                                   ((instr & 0xe00) == 0xa00)) {
   23365                                 UnallocatedT32(instr);
   23366                                 return;
   23367                               }
   23368                               UnimplementedT32_32("LDC2", instr);
   23369                               break;
   23370                             }
   23371                           }
   23372                           break;
   23373                         }
   23374                       }
   23375                       break;
   23376                     }
   23377                     case 0x00200000: {
   23378                       // 0xfd300000
   23379                       if (((instr & 0xf0000) == 0xf0000) ||
   23380                           ((instr & 0xe00) == 0xa00)) {
   23381                         UnallocatedT32(instr);
   23382                         return;
   23383                       }
   23384                       UnimplementedT32_32("LDC2", instr);
   23385                       break;
   23386                     }
   23387                   }
   23388                   break;
   23389                 }
   23390               }
   23391               break;
   23392             }
   23393             case 0x06000000: {
   23394               // 0xee000000
   23395               switch (instr & 0x01000010) {
   23396                 case 0x00000000: {
   23397                   // 0xee000000
   23398                   switch (instr & 0x10000000) {
   23399                     case 0x00000000: {
   23400                       // 0xee000000
   23401                       switch (instr & 0x00000e00) {
   23402                         case 0x00000a00: {
   23403                           // 0xee000a00
   23404                           switch (instr & 0x00b00140) {
   23405                             case 0x00000000: {
   23406                               // 0xee000a00
   23407                               unsigned rd = ExtractSRegister(instr, 22, 12);
   23408                               unsigned rn = ExtractSRegister(instr, 7, 16);
   23409                               unsigned rm = ExtractSRegister(instr, 5, 0);
   23410                               // VMLA{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; T2
   23411                               vmla(CurrentCond(),
   23412                                    F32,
   23413                                    SRegister(rd),
   23414                                    SRegister(rn),
   23415                                    SRegister(rm));
   23416                               break;
   23417                             }
   23418                             case 0x00000040: {
   23419                               // 0xee000a40
   23420                               unsigned rd = ExtractSRegister(instr, 22, 12);
   23421                               unsigned rn = ExtractSRegister(instr, 7, 16);
   23422                               unsigned rm = ExtractSRegister(instr, 5, 0);
   23423                               // VMLS{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; T2
   23424                               vmls(CurrentCond(),
   23425                                    F32,
   23426                                    SRegister(rd),
   23427                                    SRegister(rn),
   23428                                    SRegister(rm));
   23429                               break;
   23430                             }
   23431                             case 0x00000100: {
   23432                               // 0xee000b00
   23433                               unsigned rd = ExtractDRegister(instr, 22, 12);
   23434                               unsigned rn = ExtractDRegister(instr, 7, 16);
   23435                               unsigned rm = ExtractDRegister(instr, 5, 0);
   23436                               // VMLA{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; T2
   23437                               vmla(CurrentCond(),
   23438                                    F64,
   23439                                    DRegister(rd),
   23440                                    DRegister(rn),
   23441                                    DRegister(rm));
   23442                               break;
   23443                             }
   23444                             case 0x00000140: {
   23445                               // 0xee000b40
   23446                               unsigned rd = ExtractDRegister(instr, 22, 12);
   23447                               unsigned rn = ExtractDRegister(instr, 7, 16);
   23448                               unsigned rm = ExtractDRegister(instr, 5, 0);
   23449                               // VMLS{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; T2
   23450                               vmls(CurrentCond(),
   23451                                    F64,
   23452                                    DRegister(rd),
   23453                                    DRegister(rn),
   23454                                    DRegister(rm));
   23455                               break;
   23456                             }
   23457                             case 0x00100000: {
   23458                               // 0xee100a00
   23459                               unsigned rd = ExtractSRegister(instr, 22, 12);
   23460                               unsigned rn = ExtractSRegister(instr, 7, 16);
   23461                               unsigned rm = ExtractSRegister(instr, 5, 0);
   23462                               // VNMLS{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; T1
   23463                               vnmls(CurrentCond(),
   23464                                     F32,
   23465                                     SRegister(rd),
   23466                                     SRegister(rn),
   23467                                     SRegister(rm));
   23468                               break;
   23469                             }
   23470                             case 0x00100040: {
   23471                               // 0xee100a40
   23472                               unsigned rd = ExtractSRegister(instr, 22, 12);
   23473                               unsigned rn = ExtractSRegister(instr, 7, 16);
   23474                               unsigned rm = ExtractSRegister(instr, 5, 0);
   23475                               // VNMLA{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; T1
   23476                               vnmla(CurrentCond(),
   23477                                     F32,
   23478                                     SRegister(rd),
   23479                                     SRegister(rn),
   23480                                     SRegister(rm));
   23481                               break;
   23482                             }
   23483                             case 0x00100100: {
   23484                               // 0xee100b00
   23485                               unsigned rd = ExtractDRegister(instr, 22, 12);
   23486                               unsigned rn = ExtractDRegister(instr, 7, 16);
   23487                               unsigned rm = ExtractDRegister(instr, 5, 0);
   23488                               // VNMLS{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; T1
   23489                               vnmls(CurrentCond(),
   23490                                     F64,
   23491                                     DRegister(rd),
   23492                                     DRegister(rn),
   23493                                     DRegister(rm));
   23494                               break;
   23495                             }
   23496                             case 0x00100140: {
   23497                               // 0xee100b40
   23498                               unsigned rd = ExtractDRegister(instr, 22, 12);
   23499                               unsigned rn = ExtractDRegister(instr, 7, 16);
   23500                               unsigned rm = ExtractDRegister(instr, 5, 0);
   23501                               // VNMLA{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; T1
   23502                               vnmla(CurrentCond(),
   23503                                     F64,
   23504                                     DRegister(rd),
   23505                                     DRegister(rn),
   23506                                     DRegister(rm));
   23507                               break;
   23508                             }
   23509                             case 0x00200000: {
   23510                               // 0xee200a00
   23511                               unsigned rd = ExtractSRegister(instr, 22, 12);
   23512                               unsigned rn = ExtractSRegister(instr, 7, 16);
   23513                               unsigned rm = ExtractSRegister(instr, 5, 0);
   23514                               // VMUL{<c>}{<q>}.F32 {<Sd>}, <Sn>, <Sm> ; T2
   23515                               vmul(CurrentCond(),
   23516                                    F32,
   23517                                    SRegister(rd),
   23518                                    SRegister(rn),
   23519                                    SRegister(rm));
   23520                               break;
   23521                             }
   23522                             case 0x00200040: {
   23523                               // 0xee200a40
   23524                               unsigned rd = ExtractSRegister(instr, 22, 12);
   23525                               unsigned rn = ExtractSRegister(instr, 7, 16);
   23526                               unsigned rm = ExtractSRegister(instr, 5, 0);
   23527                               // VNMUL{<c>}{<q>}.F32 {<Sd>}, <Sn>, <Sm> ; T1
   23528                               vnmul(CurrentCond(),
   23529                                     F32,
   23530                                     SRegister(rd),
   23531                                     SRegister(rn),
   23532                                     SRegister(rm));
   23533                               break;
   23534                             }
   23535                             case 0x00200100: {
   23536                               // 0xee200b00
   23537                               unsigned rd = ExtractDRegister(instr, 22, 12);
   23538                               unsigned rn = ExtractDRegister(instr, 7, 16);
   23539                               unsigned rm = ExtractDRegister(instr, 5, 0);
   23540                               // VMUL{<c>}{<q>}.F64 {<Dd>}, <Dn>, <Dm> ; T2
   23541                               vmul(CurrentCond(),
   23542                                    F64,
   23543                                    DRegister(rd),
   23544                                    DRegister(rn),
   23545                                    DRegister(rm));
   23546                               break;
   23547                             }
   23548                             case 0x00200140: {
   23549                               // 0xee200b40
   23550                               unsigned rd = ExtractDRegister(instr, 22, 12);
   23551                               unsigned rn = ExtractDRegister(instr, 7, 16);
   23552                               unsigned rm = ExtractDRegister(instr, 5, 0);
   23553                               // VNMUL{<c>}{<q>}.F64 {<Dd>}, <Dn>, <Dm> ; T1
   23554                               vnmul(CurrentCond(),
   23555                                     F64,
   23556                                     DRegister(rd),
   23557                                     DRegister(rn),
   23558                                     DRegister(rm));
   23559                               break;
   23560                             }
   23561                             case 0x00300000: {
   23562                               // 0xee300a00
   23563                               unsigned rd = ExtractSRegister(instr, 22, 12);
   23564                               unsigned rn = ExtractSRegister(instr, 7, 16);
   23565                               unsigned rm = ExtractSRegister(instr, 5, 0);
   23566                               // VADD{<c>}{<q>}.F32 {<Sd>}, <Sn>, <Sm> ; T2
   23567                               vadd(CurrentCond(),
   23568                                    F32,
   23569                                    SRegister(rd),
   23570                                    SRegister(rn),
   23571                                    SRegister(rm));
   23572                               break;
   23573                             }
   23574                             case 0x00300040: {
   23575                               // 0xee300a40
   23576                               unsigned rd = ExtractSRegister(instr, 22, 12);
   23577                               unsigned rn = ExtractSRegister(instr, 7, 16);
   23578                               unsigned rm = ExtractSRegister(instr, 5, 0);
   23579                               // VSUB{<c>}{<q>}.F32 {<Sd>}, <Sn>, <Sm> ; T2
   23580                               vsub(CurrentCond(),
   23581                                    F32,
   23582                                    SRegister(rd),
   23583                                    SRegister(rn),
   23584                                    SRegister(rm));
   23585                               break;
   23586                             }
   23587                             case 0x00300100: {
   23588                               // 0xee300b00
   23589                               unsigned rd = ExtractDRegister(instr, 22, 12);
   23590                               unsigned rn = ExtractDRegister(instr, 7, 16);
   23591                               unsigned rm = ExtractDRegister(instr, 5, 0);
   23592                               // VADD{<c>}{<q>}.F64 {<Dd>}, <Dn>, <Dm> ; T2
   23593                               vadd(CurrentCond(),
   23594                                    F64,
   23595                                    DRegister(rd),
   23596                                    DRegister(rn),
   23597                                    DRegister(rm));
   23598                               break;
   23599                             }
   23600                             case 0x00300140: {
   23601                               // 0xee300b40
   23602                               unsigned rd = ExtractDRegister(instr, 22, 12);
   23603                               unsigned rn = ExtractDRegister(instr, 7, 16);
   23604                               unsigned rm = ExtractDRegister(instr, 5, 0);
   23605                               // VSUB{<c>}{<q>}.F64 {<Dd>}, <Dn>, <Dm> ; T2
   23606                               vsub(CurrentCond(),
   23607                                    F64,
   23608                                    DRegister(rd),
   23609                                    DRegister(rn),
   23610                                    DRegister(rm));
   23611                               break;
   23612                             }
   23613                             case 0x00800000: {
   23614                               // 0xee800a00
   23615                               unsigned rd = ExtractSRegister(instr, 22, 12);
   23616                               unsigned rn = ExtractSRegister(instr, 7, 16);
   23617                               unsigned rm = ExtractSRegister(instr, 5, 0);
   23618                               // VDIV{<c>}{<q>}.F32 {<Sd>}, <Sn>, <Sm> ; T1
   23619                               vdiv(CurrentCond(),
   23620                                    F32,
   23621                                    SRegister(rd),
   23622                                    SRegister(rn),
   23623                                    SRegister(rm));
   23624                               break;
   23625                             }
   23626                             case 0x00800100: {
   23627                               // 0xee800b00
   23628                               unsigned rd = ExtractDRegister(instr, 22, 12);
   23629                               unsigned rn = ExtractDRegister(instr, 7, 16);
   23630                               unsigned rm = ExtractDRegister(instr, 5, 0);
   23631                               // VDIV{<c>}{<q>}.F64 {<Dd>}, <Dn>, <Dm> ; T1
   23632                               vdiv(CurrentCond(),
   23633                                    F64,
   23634                                    DRegister(rd),
   23635                                    DRegister(rn),
   23636                                    DRegister(rm));
   23637                               break;
   23638                             }
   23639                             case 0x00900000: {
   23640                               // 0xee900a00
   23641                               unsigned rd = ExtractSRegister(instr, 22, 12);
   23642                               unsigned rn = ExtractSRegister(instr, 7, 16);
   23643                               unsigned rm = ExtractSRegister(instr, 5, 0);
   23644                               // VFNMS{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; T1
   23645                               vfnms(CurrentCond(),
   23646                                     F32,
   23647                                     SRegister(rd),
   23648                                     SRegister(rn),
   23649                                     SRegister(rm));
   23650                               break;
   23651                             }
   23652                             case 0x00900040: {
   23653                               // 0xee900a40
   23654                               unsigned rd = ExtractSRegister(instr, 22, 12);
   23655                               unsigned rn = ExtractSRegister(instr, 7, 16);
   23656                               unsigned rm = ExtractSRegister(instr, 5, 0);
   23657                               // VFNMA{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; T1
   23658                               vfnma(CurrentCond(),
   23659                                     F32,
   23660                                     SRegister(rd),
   23661                                     SRegister(rn),
   23662                                     SRegister(rm));
   23663                               break;
   23664                             }
   23665                             case 0x00900100: {
   23666                               // 0xee900b00
   23667                               unsigned rd = ExtractDRegister(instr, 22, 12);
   23668                               unsigned rn = ExtractDRegister(instr, 7, 16);
   23669                               unsigned rm = ExtractDRegister(instr, 5, 0);
   23670                               // VFNMS{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; T1
   23671                               vfnms(CurrentCond(),
   23672                                     F64,
   23673                                     DRegister(rd),
   23674                                     DRegister(rn),
   23675                                     DRegister(rm));
   23676                               break;
   23677                             }
   23678                             case 0x00900140: {
   23679                               // 0xee900b40
   23680                               unsigned rd = ExtractDRegister(instr, 22, 12);
   23681                               unsigned rn = ExtractDRegister(instr, 7, 16);
   23682                               unsigned rm = ExtractDRegister(instr, 5, 0);
   23683                               // VFNMA{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; T1
   23684                               vfnma(CurrentCond(),
   23685                                     F64,
   23686                                     DRegister(rd),
   23687                                     DRegister(rn),
   23688                                     DRegister(rm));
   23689                               break;
   23690                             }
   23691                             case 0x00a00000: {
   23692                               // 0xeea00a00
   23693                               unsigned rd = ExtractSRegister(instr, 22, 12);
   23694                               unsigned rn = ExtractSRegister(instr, 7, 16);
   23695                               unsigned rm = ExtractSRegister(instr, 5, 0);
   23696                               // VFMA{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; T2
   23697                               vfma(CurrentCond(),
   23698                                    F32,
   23699                                    SRegister(rd),
   23700                                    SRegister(rn),
   23701                                    SRegister(rm));
   23702                               break;
   23703                             }
   23704                             case 0x00a00040: {
   23705                               // 0xeea00a40
   23706                               unsigned rd = ExtractSRegister(instr, 22, 12);
   23707                               unsigned rn = ExtractSRegister(instr, 7, 16);
   23708                               unsigned rm = ExtractSRegister(instr, 5, 0);
   23709                               // VFMS{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; T2
   23710                               vfms(CurrentCond(),
   23711                                    F32,
   23712                                    SRegister(rd),
   23713                                    SRegister(rn),
   23714                                    SRegister(rm));
   23715                               break;
   23716                             }
   23717                             case 0x00a00100: {
   23718                               // 0xeea00b00
   23719                               unsigned rd = ExtractDRegister(instr, 22, 12);
   23720                               unsigned rn = ExtractDRegister(instr, 7, 16);
   23721                               unsigned rm = ExtractDRegister(instr, 5, 0);
   23722                               // VFMA{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; T2
   23723                               vfma(CurrentCond(),
   23724                                    F64,
   23725                                    DRegister(rd),
   23726                                    DRegister(rn),
   23727                                    DRegister(rm));
   23728                               break;
   23729                             }
   23730                             case 0x00a00140: {
   23731                               // 0xeea00b40
   23732                               unsigned rd = ExtractDRegister(instr, 22, 12);
   23733                               unsigned rn = ExtractDRegister(instr, 7, 16);
   23734                               unsigned rm = ExtractDRegister(instr, 5, 0);
   23735                               // VFMS{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; T2
   23736                               vfms(CurrentCond(),
   23737                                    F64,
   23738                                    DRegister(rd),
   23739                                    DRegister(rn),
   23740                                    DRegister(rm));
   23741                               break;
   23742                             }
   23743                             case 0x00b00000: {
   23744                               // 0xeeb00a00
   23745                               unsigned rd = ExtractSRegister(instr, 22, 12);
   23746                               uint32_t encoded_imm =
   23747                                   (instr & 0xf) | ((instr >> 12) & 0xf0);
   23748                               NeonImmediate imm =
   23749                                   ImmediateVFP::Decode<float>(encoded_imm);
   23750                               // VMOV{<c>}{<q>}.F32 <Sd>, #<imm> ; T2
   23751                               vmov(CurrentCond(), F32, SRegister(rd), imm);
   23752                               if (((instr & 0xffb00ff0) != 0xeeb00a00)) {
   23753                                 UnpredictableT32(instr);
   23754                               }
   23755                               break;
   23756                             }
   23757                             case 0x00b00040: {
   23758                               // 0xeeb00a40
   23759                               switch (instr & 0x000e0000) {
   23760                                 case 0x00000000: {
   23761                                   // 0xeeb00a40
   23762                                   switch (instr & 0x00010080) {
   23763                                     case 0x00000000: {
   23764                                       // 0xeeb00a40
   23765                                       unsigned rd =
   23766                                           ExtractSRegister(instr, 22, 12);
   23767                                       unsigned rm =
   23768                                           ExtractSRegister(instr, 5, 0);
   23769                                       // VMOV{<c>}{<q>}.F32 <Sd>, <Sm> ; T2
   23770                                       vmov(CurrentCond(),
   23771                                            F32,
   23772                                            SRegister(rd),
   23773                                            SRegister(rm));
   23774                                       break;
   23775                                     }
   23776                                     case 0x00000080: {
   23777                                       // 0xeeb00ac0
   23778                                       unsigned rd =
   23779                                           ExtractSRegister(instr, 22, 12);
   23780                                       unsigned rm =
   23781                                           ExtractSRegister(instr, 5, 0);
   23782                                       // VABS{<c>}{<q>}.F32 <Sd>, <Sm> ; T2
   23783                                       vabs(CurrentCond(),
   23784                                            F32,
   23785                                            SRegister(rd),
   23786                                            SRegister(rm));
   23787                                       break;
   23788                                     }
   23789                                     case 0x00010000: {
   23790                                       // 0xeeb10a40
   23791                                       unsigned rd =
   23792                                           ExtractSRegister(instr, 22, 12);
   23793                                       unsigned rm =
   23794                                           ExtractSRegister(instr, 5, 0);
   23795                                       // VNEG{<c>}{<q>}.F32 <Sd>, <Sm> ; T2
   23796                                       vneg(CurrentCond(),
   23797                                            F32,
   23798                                            SRegister(rd),
   23799                                            SRegister(rm));
   23800                                       break;
   23801                                     }
   23802                                     case 0x00010080: {
   23803                                       // 0xeeb10ac0
   23804                                       unsigned rd =
   23805                                           ExtractSRegister(instr, 22, 12);
   23806                                       unsigned rm =
   23807                                           ExtractSRegister(instr, 5, 0);
   23808                                       // VSQRT{<c>}{<q>}.F32 <Sd>, <Sm> ; T1
   23809                                       vsqrt(CurrentCond(),
   23810                                             F32,
   23811                                             SRegister(rd),
   23812                                             SRegister(rm));
   23813                                       break;
   23814                                     }
   23815                                   }
   23816                                   break;
   23817                                 }
   23818                                 case 0x00020000: {
   23819                                   // 0xeeb20a40
   23820                                   switch (instr & 0x00010080) {
   23821                                     case 0x00000000: {
   23822                                       // 0xeeb20a40
   23823                                       unsigned rd =
   23824                                           ExtractSRegister(instr, 22, 12);
   23825                                       unsigned rm =
   23826                                           ExtractSRegister(instr, 5, 0);
   23827                                       // VCVTB{<c>}{<q>}.F32.F16 <Sd>, <Sm> ; T1
   23828                                       vcvtb(CurrentCond(),
   23829                                             F32,
   23830                                             F16,
   23831                                             SRegister(rd),
   23832                                             SRegister(rm));
   23833                                       break;
   23834                                     }
   23835                                     case 0x00000080: {
   23836                                       // 0xeeb20ac0
   23837                                       unsigned rd =
   23838                                           ExtractSRegister(instr, 22, 12);
   23839                                       unsigned rm =
   23840                                           ExtractSRegister(instr, 5, 0);
   23841                                       // VCVTT{<c>}{<q>}.F32.F16 <Sd>, <Sm> ; T1
   23842                                       vcvtt(CurrentCond(),
   23843                                             F32,
   23844                                             F16,
   23845                                             SRegister(rd),
   23846                                             SRegister(rm));
   23847                                       break;
   23848                                     }
   23849                                     case 0x00010000: {
   23850                                       // 0xeeb30a40
   23851                                       unsigned rd =
   23852                                           ExtractSRegister(instr, 22, 12);
   23853                                       unsigned rm =
   23854                                           ExtractSRegister(instr, 5, 0);
   23855                                       // VCVTB{<c>}{<q>}.F16.F32 <Sd>, <Sm> ; T1
   23856                                       vcvtb(CurrentCond(),
   23857                                             F16,
   23858                                             F32,
   23859                                             SRegister(rd),
   23860                                             SRegister(rm));
   23861                                       break;
   23862                                     }
   23863                                     case 0x00010080: {
   23864                                       // 0xeeb30ac0
   23865                                       unsigned rd =
   23866                                           ExtractSRegister(instr, 22, 12);
   23867                                       unsigned rm =
   23868                                           ExtractSRegister(instr, 5, 0);
   23869                                       // VCVTT{<c>}{<q>}.F16.F32 <Sd>, <Sm> ; T1
   23870                                       vcvtt(CurrentCond(),
   23871                                             F16,
   23872                                             F32,
   23873                                             SRegister(rd),
   23874                                             SRegister(rm));
   23875                                       break;
   23876                                     }
   23877                                   }
   23878                                   break;
   23879                                 }
   23880                                 case 0x00040000: {
   23881                                   // 0xeeb40a40
   23882                                   switch (instr & 0x00010080) {
   23883                                     case 0x00000000: {
   23884                                       // 0xeeb40a40
   23885                                       unsigned rd =
   23886                                           ExtractSRegister(instr, 22, 12);
   23887                                       unsigned rm =
   23888                                           ExtractSRegister(instr, 5, 0);
   23889                                       // VCMP{<c>}{<q>}.F32 <Sd>, <Sm> ; T1
   23890                                       vcmp(CurrentCond(),
   23891                                            F32,
   23892                                            SRegister(rd),
   23893                                            SRegister(rm));
   23894                                       break;
   23895                                     }
   23896                                     case 0x00000080: {
   23897                                       // 0xeeb40ac0
   23898                                       unsigned rd =
   23899                                           ExtractSRegister(instr, 22, 12);
   23900                                       unsigned rm =
   23901                                           ExtractSRegister(instr, 5, 0);
   23902                                       // VCMPE{<c>}{<q>}.F32 <Sd>, <Sm> ; T1
   23903                                       vcmpe(CurrentCond(),
   23904                                             F32,
   23905                                             SRegister(rd),
   23906                                             SRegister(rm));
   23907                                       break;
   23908                                     }
   23909                                     case 0x00010000: {
   23910                                       // 0xeeb50a40
   23911                                       unsigned rd =
   23912                                           ExtractSRegister(instr, 22, 12);
   23913                                       // VCMP{<c>}{<q>}.F32 <Sd>, #0.0 ; T2
   23914                                       vcmp(CurrentCond(),
   23915                                            F32,
   23916                                            SRegister(rd),
   23917                                            0.0);
   23918                                       if (((instr & 0xffbf0fff) !=
   23919                                            0xeeb50a40)) {
   23920                                         UnpredictableT32(instr);
   23921                                       }
   23922                                       break;
   23923                                     }
   23924                                     case 0x00010080: {
   23925                                       // 0xeeb50ac0
   23926                                       unsigned rd =
   23927                                           ExtractSRegister(instr, 22, 12);
   23928                                       // VCMPE{<c>}{<q>}.F32 <Sd>, #0.0 ; T2
   23929                                       vcmpe(CurrentCond(),
   23930                                             F32,
   23931                                             SRegister(rd),
   23932                                             0.0);
   23933                                       if (((instr & 0xffbf0fff) !=
   23934                                            0xeeb50ac0)) {
   23935                                         UnpredictableT32(instr);
   23936                                       }
   23937                                       break;
   23938                                     }
   23939                                   }
   23940                                   break;
   23941                                 }
   23942                                 case 0x00060000: {
   23943                                   // 0xeeb60a40
   23944                                   switch (instr & 0x00010080) {
   23945                                     case 0x00000000: {
   23946                                       // 0xeeb60a40
   23947                                       unsigned rd =
   23948                                           ExtractSRegister(instr, 22, 12);
   23949                                       unsigned rm =
   23950                                           ExtractSRegister(instr, 5, 0);
   23951                                       // VRINTR{<c>}{<q>}.F32.F32 <Sd>, <Sm> ; T1 NOLINT(whitespace/line_length)
   23952                                       vrintr(CurrentCond(),
   23953                                              F32,
   23954                                              F32,
   23955                                              SRegister(rd),
   23956                                              SRegister(rm));
   23957                                       break;
   23958                                     }
   23959                                     case 0x00000080: {
   23960                                       // 0xeeb60ac0
   23961                                       unsigned rd =
   23962                                           ExtractSRegister(instr, 22, 12);
   23963                                       unsigned rm =
   23964                                           ExtractSRegister(instr, 5, 0);
   23965                                       // VRINTZ{<c>}{<q>}.F32.F32 <Sd>, <Sm> ; T1 NOLINT(whitespace/line_length)
   23966                                       vrintz(CurrentCond(),
   23967                                              F32,
   23968                                              F32,
   23969                                              SRegister(rd),
   23970                                              SRegister(rm));
   23971                                       break;
   23972                                     }
   23973                                     case 0x00010000: {
   23974                                       // 0xeeb70a40
   23975                                       unsigned rd =
   23976                                           ExtractSRegister(instr, 22, 12);
   23977                                       unsigned rm =
   23978                                           ExtractSRegister(instr, 5, 0);
   23979                                       // VRINTX{<c>}{<q>}.F32.F32 <Sd>, <Sm> ; T1 NOLINT(whitespace/line_length)
   23980                                       vrintx(CurrentCond(),
   23981                                              F32,
   23982                                              F32,
   23983                                              SRegister(rd),
   23984                                              SRegister(rm));
   23985                                       break;
   23986                                     }
   23987                                     case 0x00010080: {
   23988                                       // 0xeeb70ac0
   23989                                       unsigned rd =
   23990                                           ExtractDRegister(instr, 22, 12);
   23991                                       unsigned rm =
   23992                                           ExtractSRegister(instr, 5, 0);
   23993                                       // VCVT{<c>}{<q>}.F64.F32 <Dd>, <Sm> ; T1
   23994                                       vcvt(CurrentCond(),
   23995                                            F64,
   23996                                            F32,
   23997                                            DRegister(rd),
   23998                                            SRegister(rm));
   23999                                       break;
   24000                                     }
   24001                                   }
   24002                                   break;
   24003                                 }
   24004                                 case 0x00080000: {
   24005                                   // 0xeeb80a40
   24006                                   if ((instr & 0x00010000) == 0x00000000) {
   24007                                     DataType dt =
   24008                                         Dt_op_2_Decode((instr >> 7) & 0x1);
   24009                                     if (dt.Is(kDataTypeValueInvalid)) {
   24010                                       UnallocatedT32(instr);
   24011                                       return;
   24012                                     }
   24013                                     unsigned rd =
   24014                                         ExtractSRegister(instr, 22, 12);
   24015                                     unsigned rm = ExtractSRegister(instr, 5, 0);
   24016                                     // VCVT{<c>}{<q>}.F32.<dt> <Sd>, <Sm> ; T1
   24017                                     vcvt(CurrentCond(),
   24018                                          F32,
   24019                                          dt,
   24020                                          SRegister(rd),
   24021                                          SRegister(rm));
   24022                                   } else {
   24023                                     UnallocatedT32(instr);
   24024                                   }
   24025                                   break;
   24026                                 }
   24027                                 case 0x000a0000: {
   24028                                   // 0xeeba0a40
   24029                                   DataType dt =
   24030                                       Dt_U_sx_1_Decode(((instr >> 7) & 0x1) |
   24031                                                        ((instr >> 15) & 0x2));
   24032                                   if (dt.Is(kDataTypeValueInvalid)) {
   24033                                     UnallocatedT32(instr);
   24034                                     return;
   24035                                   }
   24036                                   unsigned rd = ExtractSRegister(instr, 22, 12);
   24037                                   unsigned offset = 32;
   24038                                   if (dt.Is(S16) || dt.Is(U16)) {
   24039                                     offset = 16;
   24040                                   }
   24041                                   uint32_t fbits =
   24042                                       offset - (((instr >> 5) & 0x1) |
   24043                                                 ((instr << 1) & 0x1e));
   24044                                   // VCVT{<c>}{<q>}.F32.<dt> <Sdm>, <Sdm>, #<fbits> ; T1 NOLINT(whitespace/line_length)
   24045                                   vcvt(CurrentCond(),
   24046                                        F32,
   24047                                        dt,
   24048                                        SRegister(rd),
   24049                                        SRegister(rd),
   24050                                        fbits);
   24051                                   break;
   24052                                 }
   24053                                 case 0x000c0000: {
   24054                                   // 0xeebc0a40
   24055                                   switch (instr & 0x00010080) {
   24056                                     case 0x00000000: {
   24057                                       // 0xeebc0a40
   24058                                       unsigned rd =
   24059                                           ExtractSRegister(instr, 22, 12);
   24060                                       unsigned rm =
   24061                                           ExtractSRegister(instr, 5, 0);
   24062                                       // VCVTR{<c>}{<q>}.U32.F32 <Sd>, <Sm> ; T1
   24063                                       vcvtr(CurrentCond(),
   24064                                             U32,
   24065                                             F32,
   24066                                             SRegister(rd),
   24067                                             SRegister(rm));
   24068                                       break;
   24069                                     }
   24070                                     case 0x00000080: {
   24071                                       // 0xeebc0ac0
   24072                                       unsigned rd =
   24073                                           ExtractSRegister(instr, 22, 12);
   24074                                       unsigned rm =
   24075                                           ExtractSRegister(instr, 5, 0);
   24076                                       // VCVT{<c>}{<q>}.U32.F32 <Sd>, <Sm> ; T1
   24077                                       vcvt(CurrentCond(),
   24078                                            U32,
   24079                                            F32,
   24080                                            SRegister(rd),
   24081                                            SRegister(rm));
   24082                                       break;
   24083                                     }
   24084                                     case 0x00010000: {
   24085                                       // 0xeebd0a40
   24086                                       unsigned rd =
   24087                                           ExtractSRegister(instr, 22, 12);
   24088                                       unsigned rm =
   24089                                           ExtractSRegister(instr, 5, 0);
   24090                                       // VCVTR{<c>}{<q>}.S32.F32 <Sd>, <Sm> ; T1
   24091                                       vcvtr(CurrentCond(),
   24092                                             S32,
   24093                                             F32,
   24094                                             SRegister(rd),
   24095                                             SRegister(rm));
   24096                                       break;
   24097                                     }
   24098                                     case 0x00010080: {
   24099                                       // 0xeebd0ac0
   24100                                       unsigned rd =
   24101                                           ExtractSRegister(instr, 22, 12);
   24102                                       unsigned rm =
   24103                                           ExtractSRegister(instr, 5, 0);
   24104                                       // VCVT{<c>}{<q>}.S32.F32 <Sd>, <Sm> ; T1
   24105                                       vcvt(CurrentCond(),
   24106                                            S32,
   24107                                            F32,
   24108                                            SRegister(rd),
   24109                                            SRegister(rm));
   24110                                       break;
   24111                                     }
   24112                                   }
   24113                                   break;
   24114                                 }
   24115                                 case 0x000e0000: {
   24116                                   // 0xeebe0a40
   24117                                   DataType dt =
   24118                                       Dt_U_sx_1_Decode(((instr >> 7) & 0x1) |
   24119                                                        ((instr >> 15) & 0x2));
   24120                                   if (dt.Is(kDataTypeValueInvalid)) {
   24121                                     UnallocatedT32(instr);
   24122                                     return;
   24123                                   }
   24124                                   unsigned rd = ExtractSRegister(instr, 22, 12);
   24125                                   unsigned offset = 32;
   24126                                   if (dt.Is(S16) || dt.Is(U16)) {
   24127                                     offset = 16;
   24128                                   }
   24129                                   uint32_t fbits =
   24130                                       offset - (((instr >> 5) & 0x1) |
   24131                                                 ((instr << 1) & 0x1e));
   24132                                   // VCVT{<c>}{<q>}.<dt>.F32 <Sdm>, <Sdm>, #<fbits> ; T1 NOLINT(whitespace/line_length)
   24133                                   vcvt(CurrentCond(),
   24134                                        dt,
   24135                                        F32,
   24136                                        SRegister(rd),
   24137                                        SRegister(rd),
   24138                                        fbits);
   24139                                   break;
   24140                                 }
   24141                               }
   24142                               break;
   24143                             }
   24144                             case 0x00b00100: {
   24145                               // 0xeeb00b00
   24146                               unsigned rd = ExtractDRegister(instr, 22, 12);
   24147                               uint32_t encoded_imm =
   24148                                   (instr & 0xf) | ((instr >> 12) & 0xf0);
   24149                               NeonImmediate imm =
   24150                                   ImmediateVFP::Decode<double>(encoded_imm);
   24151                               // VMOV{<c>}{<q>}.F64 <Dd>, #<imm> ; T2
   24152                               vmov(CurrentCond(), F64, DRegister(rd), imm);
   24153                               if (((instr & 0xffb00ff0) != 0xeeb00b00)) {
   24154                                 UnpredictableT32(instr);
   24155                               }
   24156                               break;
   24157                             }
   24158                             case 0x00b00140: {
   24159                               // 0xeeb00b40
   24160                               switch (instr & 0x000e0000) {
   24161                                 case 0x00000000: {
   24162                                   // 0xeeb00b40
   24163                                   switch (instr & 0x00010080) {
   24164                                     case 0x00000000: {
   24165                                       // 0xeeb00b40
   24166                                       unsigned rd =
   24167                                           ExtractDRegister(instr, 22, 12);
   24168                                       unsigned rm =
   24169                                           ExtractDRegister(instr, 5, 0);
   24170                                       // VMOV{<c>}{<q>}.F64 <Dd>, <Dm> ; T2
   24171                                       vmov(CurrentCond(),
   24172                                            F64,
   24173                                            DRegister(rd),
   24174                                            DRegister(rm));
   24175                                       break;
   24176                                     }
   24177                                     case 0x00000080: {
   24178                                       // 0xeeb00bc0
   24179                                       unsigned rd =
   24180                                           ExtractDRegister(instr, 22, 12);
   24181                                       unsigned rm =
   24182                                           ExtractDRegister(instr, 5, 0);
   24183                                       // VABS{<c>}{<q>}.F64 <Dd>, <Dm> ; T2
   24184                                       vabs(CurrentCond(),
   24185                                            F64,
   24186                                            DRegister(rd),
   24187                                            DRegister(rm));
   24188                                       break;
   24189                                     }
   24190                                     case 0x00010000: {
   24191                                       // 0xeeb10b40
   24192                                       unsigned rd =
   24193                                           ExtractDRegister(instr, 22, 12);
   24194                                       unsigned rm =
   24195                                           ExtractDRegister(instr, 5, 0);
   24196                                       // VNEG{<c>}{<q>}.F64 <Dd>, <Dm> ; T2
   24197                                       vneg(CurrentCond(),
   24198                                            F64,
   24199                                            DRegister(rd),
   24200                                            DRegister(rm));
   24201                                       break;
   24202                                     }
   24203                                     case 0x00010080: {
   24204                                       // 0xeeb10bc0
   24205                                       unsigned rd =
   24206                                           ExtractDRegister(instr, 22, 12);
   24207                                       unsigned rm =
   24208                                           ExtractDRegister(instr, 5, 0);
   24209                                       // VSQRT{<c>}{<q>}.F64 <Dd>, <Dm> ; T1
   24210                                       vsqrt(CurrentCond(),
   24211                                             F64,
   24212                                             DRegister(rd),
   24213                                             DRegister(rm));
   24214                                       break;
   24215                                     }
   24216                                   }
   24217                                   break;
   24218                                 }
   24219                                 case 0x00020000: {
   24220                                   // 0xeeb20b40
   24221                                   switch (instr & 0x00010080) {
   24222                                     case 0x00000000: {
   24223                                       // 0xeeb20b40
   24224                                       unsigned rd =
   24225                                           ExtractDRegister(instr, 22, 12);
   24226                                       unsigned rm =
   24227                                           ExtractSRegister(instr, 5, 0);
   24228                                       // VCVTB{<c>}{<q>}.F64.F16 <Dd>, <Sm> ; T1
   24229                                       vcvtb(CurrentCond(),
   24230                                             F64,
   24231                                             F16,
   24232                                             DRegister(rd),
   24233                                             SRegister(rm));
   24234                                       break;
   24235                                     }
   24236                                     case 0x00000080: {
   24237                                       // 0xeeb20bc0
   24238                                       unsigned rd =
   24239                                           ExtractDRegister(instr, 22, 12);
   24240                                       unsigned rm =
   24241                                           ExtractSRegister(instr, 5, 0);
   24242                                       // VCVTT{<c>}{<q>}.F64.F16 <Dd>, <Sm> ; T1
   24243                                       vcvtt(CurrentCond(),
   24244                                             F64,
   24245                                             F16,
   24246                                             DRegister(rd),
   24247                                             SRegister(rm));
   24248                                       break;
   24249                                     }
   24250                                     case 0x00010000: {
   24251                                       // 0xeeb30b40
   24252                                       unsigned rd =
   24253                                           ExtractSRegister(instr, 22, 12);
   24254                                       unsigned rm =
   24255                                           ExtractDRegister(instr, 5, 0);
   24256                                       // VCVTB{<c>}{<q>}.F16.F64 <Sd>, <Dm> ; T1
   24257                                       vcvtb(CurrentCond(),
   24258                                             F16,
   24259                                             F64,
   24260                                             SRegister(rd),
   24261                                             DRegister(rm));
   24262                                       break;
   24263                                     }
   24264                                     case 0x00010080: {
   24265                                       // 0xeeb30bc0
   24266                                       unsigned rd =
   24267                                           ExtractSRegister(instr, 22, 12);
   24268                                       unsigned rm =
   24269                                           ExtractDRegister(instr, 5, 0);
   24270                                       // VCVTT{<c>}{<q>}.F16.F64 <Sd>, <Dm> ; T1
   24271                                       vcvtt(CurrentCond(),
   24272                                             F16,
   24273                                             F64,
   24274                                             SRegister(rd),
   24275                                             DRegister(rm));
   24276                                       break;
   24277                                     }
   24278                                   }
   24279                                   break;
   24280                                 }
   24281                                 case 0x00040000: {
   24282                                   // 0xeeb40b40
   24283                                   switch (instr & 0x00010080) {
   24284                                     case 0x00000000: {
   24285                                       // 0xeeb40b40
   24286                                       unsigned rd =
   24287                                           ExtractDRegister(instr, 22, 12);
   24288                                       unsigned rm =
   24289                                           ExtractDRegister(instr, 5, 0);
   24290                                       // VCMP{<c>}{<q>}.F64 <Dd>, <Dm> ; T1
   24291                                       vcmp(CurrentCond(),
   24292                                            F64,
   24293                                            DRegister(rd),
   24294                                            DRegister(rm));
   24295                                       break;
   24296                                     }
   24297                                     case 0x00000080: {
   24298                                       // 0xeeb40bc0
   24299                                       unsigned rd =
   24300                                           ExtractDRegister(instr, 22, 12);
   24301                                       unsigned rm =
   24302                                           ExtractDRegister(instr, 5, 0);
   24303                                       // VCMPE{<c>}{<q>}.F64 <Dd>, <Dm> ; T1
   24304                                       vcmpe(CurrentCond(),
   24305                                             F64,
   24306                                             DRegister(rd),
   24307                                             DRegister(rm));
   24308                                       break;
   24309                                     }
   24310                                     case 0x00010000: {
   24311                                       // 0xeeb50b40
   24312                                       unsigned rd =
   24313                                           ExtractDRegister(instr, 22, 12);
   24314                                       // VCMP{<c>}{<q>}.F64 <Dd>, #0.0 ; T2
   24315                                       vcmp(CurrentCond(),
   24316                                            F64,
   24317                                            DRegister(rd),
   24318                                            0.0);
   24319                                       if (((instr & 0xffbf0fff) !=
   24320                                            0xeeb50b40)) {
   24321                                         UnpredictableT32(instr);
   24322                                       }
   24323                                       break;
   24324                                     }
   24325                                     case 0x00010080: {
   24326                                       // 0xeeb50bc0
   24327                                       unsigned rd =
   24328                                           ExtractDRegister(instr, 22, 12);
   24329                                       // VCMPE{<c>}{<q>}.F64 <Dd>, #0.0 ; T2
   24330                                       vcmpe(CurrentCond(),
   24331                                             F64,
   24332                                             DRegister(rd),
   24333                                             0.0);
   24334                                       if (((instr & 0xffbf0fff) !=
   24335                                            0xeeb50bc0)) {
   24336                                         UnpredictableT32(instr);
   24337                                       }
   24338                                       break;
   24339                                     }
   24340                                   }
   24341                                   break;
   24342                                 }
   24343                                 case 0x00060000: {
   24344                                   // 0xeeb60b40
   24345                                   switch (instr & 0x00010080) {
   24346                                     case 0x00000000: {
   24347                                       // 0xeeb60b40
   24348                                       unsigned rd =
   24349                                           ExtractDRegister(instr, 22, 12);
   24350                                       unsigned rm =
   24351                                           ExtractDRegister(instr, 5, 0);
   24352                                       // VRINTR{<c>}{<q>}.F64.F64 <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
   24353                                       vrintr(CurrentCond(),
   24354                                              F64,
   24355                                              F64,
   24356                                              DRegister(rd),
   24357                                              DRegister(rm));
   24358                                       break;
   24359                                     }
   24360                                     case 0x00000080: {
   24361                                       // 0xeeb60bc0
   24362                                       unsigned rd =
   24363                                           ExtractDRegister(instr, 22, 12);
   24364                                       unsigned rm =
   24365                                           ExtractDRegister(instr, 5, 0);
   24366                                       // VRINTZ{<c>}{<q>}.F64.F64 <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
   24367                                       vrintz(CurrentCond(),
   24368                                              F64,
   24369                                              F64,
   24370                                              DRegister(rd),
   24371                                              DRegister(rm));
   24372                                       break;
   24373                                     }
   24374                                     case 0x00010000: {
   24375                                       // 0xeeb70b40
   24376                                       unsigned rd =
   24377                                           ExtractDRegister(instr, 22, 12);
   24378                                       unsigned rm =
   24379                                           ExtractDRegister(instr, 5, 0);
   24380                                       // VRINTX{<c>}{<q>}.F64.F64 <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
   24381                                       vrintx(CurrentCond(),
   24382                                              F64,
   24383                                              F64,
   24384                                              DRegister(rd),
   24385                                              DRegister(rm));
   24386                                       break;
   24387                                     }
   24388                                     case 0x00010080: {
   24389                                       // 0xeeb70bc0
   24390                                       unsigned rd =
   24391                                           ExtractSRegister(instr, 22, 12);
   24392                                       unsigned rm =
   24393                                           ExtractDRegister(instr, 5, 0);
   24394                                       // VCVT{<c>}{<q>}.F32.F64 <Sd>, <Dm> ; T1
   24395                                       vcvt(CurrentCond(),
   24396                                            F32,
   24397                                            F64,
   24398                                            SRegister(rd),
   24399                                            DRegister(rm));
   24400                                       break;
   24401                                     }
   24402                                   }
   24403                                   break;
   24404                                 }
   24405                                 case 0x00080000: {
   24406                                   // 0xeeb80b40
   24407                                   if ((instr & 0x00010000) == 0x00000000) {
   24408                                     DataType dt =
   24409                                         Dt_op_2_Decode((instr >> 7) & 0x1);
   24410                                     if (dt.Is(kDataTypeValueInvalid)) {
   24411                                       UnallocatedT32(instr);
   24412                                       return;
   24413                                     }
   24414                                     unsigned rd =
   24415                                         ExtractDRegister(instr, 22, 12);
   24416                                     unsigned rm = ExtractSRegister(instr, 5, 0);
   24417                                     // VCVT{<c>}{<q>}.F64.<dt> <Dd>, <Sm> ; T1
   24418                                     vcvt(CurrentCond(),
   24419                                          F64,
   24420                                          dt,
   24421                                          DRegister(rd),
   24422                                          SRegister(rm));
   24423                                   } else {
   24424                                     UnallocatedT32(instr);
   24425                                   }
   24426                                   break;
   24427                                 }
   24428                                 case 0x000a0000: {
   24429                                   // 0xeeba0b40
   24430                                   DataType dt =
   24431                                       Dt_U_sx_1_Decode(((instr >> 7) & 0x1) |
   24432                                                        ((instr >> 15) & 0x2));
   24433                                   if (dt.Is(kDataTypeValueInvalid)) {
   24434                                     UnallocatedT32(instr);
   24435                                     return;
   24436                                   }
   24437                                   unsigned rd = ExtractDRegister(instr, 22, 12);
   24438                                   unsigned offset = 32;
   24439                                   if (dt.Is(S16) || dt.Is(U16)) {
   24440                                     offset = 16;
   24441                                   }
   24442                                   uint32_t fbits =
   24443                                       offset - (((instr >> 5) & 0x1) |
   24444                                                 ((instr << 1) & 0x1e));
   24445                                   // VCVT{<c>}{<q>}.F64.<dt> <Ddm>, <Ddm>, #<fbits> ; T1 NOLINT(whitespace/line_length)
   24446                                   vcvt(CurrentCond(),
   24447                                        F64,
   24448                                        dt,
   24449                                        DRegister(rd),
   24450                                        DRegister(rd),
   24451                                        fbits);
   24452                                   break;
   24453                                 }
   24454                                 case 0x000c0000: {
   24455                                   // 0xeebc0b40
   24456                                   switch (instr & 0x00010080) {
   24457                                     case 0x00000000: {
   24458                                       // 0xeebc0b40
   24459                                       unsigned rd =
   24460                                           ExtractSRegister(instr, 22, 12);
   24461                                       unsigned rm =
   24462                                           ExtractDRegister(instr, 5, 0);
   24463                                       // VCVTR{<c>}{<q>}.U32.F64 <Sd>, <Dm> ; T1
   24464                                       vcvtr(CurrentCond(),
   24465                                             U32,
   24466                                             F64,
   24467                                             SRegister(rd),
   24468                                             DRegister(rm));
   24469                                       break;
   24470                                     }
   24471                                     case 0x00000080: {
   24472                                       // 0xeebc0bc0
   24473                                       unsigned rd =
   24474                                           ExtractSRegister(instr, 22, 12);
   24475                                       unsigned rm =
   24476                                           ExtractDRegister(instr, 5, 0);
   24477                                       // VCVT{<c>}{<q>}.U32.F64 <Sd>, <Dm> ; T1
   24478                                       vcvt(CurrentCond(),
   24479                                            U32,
   24480                                            F64,
   24481                                            SRegister(rd),
   24482                                            DRegister(rm));
   24483                                       break;
   24484                                     }
   24485                                     case 0x00010000: {
   24486                                       // 0xeebd0b40
   24487                                       unsigned rd =
   24488                                           ExtractSRegister(instr, 22, 12);
   24489                                       unsigned rm =
   24490                                           ExtractDRegister(instr, 5, 0);
   24491                                       // VCVTR{<c>}{<q>}.S32.F64 <Sd>, <Dm> ; T1
   24492                                       vcvtr(CurrentCond(),
   24493                                             S32,
   24494                                             F64,
   24495                                             SRegister(rd),
   24496                                             DRegister(rm));
   24497                                       break;
   24498                                     }
   24499                                     case 0x00010080: {
   24500                                       // 0xeebd0bc0
   24501                                       unsigned rd =
   24502                                           ExtractSRegister(instr, 22, 12);
   24503                                       unsigned rm =
   24504                                           ExtractDRegister(instr, 5, 0);
   24505                                       // VCVT{<c>}{<q>}.S32.F64 <Sd>, <Dm> ; T1
   24506                                       vcvt(CurrentCond(),
   24507                                            S32,
   24508                                            F64,
   24509                                            SRegister(rd),
   24510                                            DRegister(rm));
   24511                                       break;
   24512                                     }
   24513                                   }
   24514                                   break;
   24515                                 }
   24516                                 case 0x000e0000: {
   24517                                   // 0xeebe0b40
   24518                                   DataType dt =
   24519                                       Dt_U_sx_1_Decode(((instr >> 7) & 0x1) |
   24520                                                        ((instr >> 15) & 0x2));
   24521                                   if (dt.Is(kDataTypeValueInvalid)) {
   24522                                     UnallocatedT32(instr);
   24523                                     return;
   24524                                   }
   24525                                   unsigned rd = ExtractDRegister(instr, 22, 12);
   24526                                   unsigned offset = 32;
   24527                                   if (dt.Is(S16) || dt.Is(U16)) {
   24528                                     offset = 16;
   24529                                   }
   24530                                   uint32_t fbits =
   24531                                       offset - (((instr >> 5) & 0x1) |
   24532                                                 ((instr << 1) & 0x1e));
   24533                                   // VCVT{<c>}{<q>}.<dt>.F64 <Ddm>, <Ddm>, #<fbits> ; T1 NOLINT(whitespace/line_length)
   24534                                   vcvt(CurrentCond(),
   24535                                        dt,
   24536                                        F64,
   24537                                        DRegister(rd),
   24538                                        DRegister(rd),
   24539                                        fbits);
   24540                                   break;
   24541                                 }
   24542                               }
   24543                               break;
   24544                             }
   24545                             default:
   24546                               UnallocatedT32(instr);
   24547                               break;
   24548                           }
   24549                           break;
   24550                         }
   24551                         default: {
   24552                           if (((instr & 0xe00) == 0xa00)) {
   24553                             UnallocatedT32(instr);
   24554                             return;
   24555                           }
   24556                           UnimplementedT32_32("CDP", instr);
   24557                           break;
   24558                         }
   24559                       }
   24560                       break;
   24561                     }
   24562                     case 0x10000000: {
   24563                       // 0xfe000000
   24564                       switch (instr & 0x00000e00) {
   24565                         case 0x00000a00: {
   24566                           // 0xfe000a00
   24567                           switch (instr & 0x00b00140) {
   24568                             case 0x00000000: {
   24569                               // 0xfe000a00
   24570                               unsigned rd = ExtractSRegister(instr, 22, 12);
   24571                               unsigned rn = ExtractSRegister(instr, 7, 16);
   24572                               unsigned rm = ExtractSRegister(instr, 5, 0);
   24573                               // VSELEQ.F32 <Sd>, <Sn>, <Sm> ; T1
   24574                               vseleq(F32,
   24575                                      SRegister(rd),
   24576                                      SRegister(rn),
   24577                                      SRegister(rm));
   24578                               break;
   24579                             }
   24580                             case 0x00000100: {
   24581                               // 0xfe000b00
   24582                               unsigned rd = ExtractDRegister(instr, 22, 12);
   24583                               unsigned rn = ExtractDRegister(instr, 7, 16);
   24584                               unsigned rm = ExtractDRegister(instr, 5, 0);
   24585                               // VSELEQ.F64 <Dd>, <Dn>, <Dm> ; T1
   24586                               vseleq(F64,
   24587                                      DRegister(rd),
   24588                                      DRegister(rn),
   24589                                      DRegister(rm));
   24590                               break;
   24591                             }
   24592                             case 0x00100000: {
   24593                               // 0xfe100a00
   24594                               unsigned rd = ExtractSRegister(instr, 22, 12);
   24595                               unsigned rn = ExtractSRegister(instr, 7, 16);
   24596                               unsigned rm = ExtractSRegister(instr, 5, 0);
   24597                               // VSELVS.F32 <Sd>, <Sn>, <Sm> ; T1
   24598                               vselvs(F32,
   24599                                      SRegister(rd),
   24600                                      SRegister(rn),
   24601                                      SRegister(rm));
   24602                               break;
   24603                             }
   24604                             case 0x00100100: {
   24605                               // 0xfe100b00
   24606                               unsigned rd = ExtractDRegister(instr, 22, 12);
   24607                               unsigned rn = ExtractDRegister(instr, 7, 16);
   24608                               unsigned rm = ExtractDRegister(instr, 5, 0);
   24609                               // VSELVS.F64 <Dd>, <Dn>, <Dm> ; T1
   24610                               vselvs(F64,
   24611                                      DRegister(rd),
   24612                                      DRegister(rn),
   24613                                      DRegister(rm));
   24614                               break;
   24615                             }
   24616                             case 0x00200000: {
   24617                               // 0xfe200a00
   24618                               unsigned rd = ExtractSRegister(instr, 22, 12);
   24619                               unsigned rn = ExtractSRegister(instr, 7, 16);
   24620                               unsigned rm = ExtractSRegister(instr, 5, 0);
   24621                               // VSELGE.F32 <Sd>, <Sn>, <Sm> ; T1
   24622                               vselge(F32,
   24623                                      SRegister(rd),
   24624                                      SRegister(rn),
   24625                                      SRegister(rm));
   24626                               break;
   24627                             }
   24628                             case 0x00200100: {
   24629                               // 0xfe200b00
   24630                               unsigned rd = ExtractDRegister(instr, 22, 12);
   24631                               unsigned rn = ExtractDRegister(instr, 7, 16);
   24632                               unsigned rm = ExtractDRegister(instr, 5, 0);
   24633                               // VSELGE.F64 <Dd>, <Dn>, <Dm> ; T1
   24634                               vselge(F64,
   24635                                      DRegister(rd),
   24636                                      DRegister(rn),
   24637                                      DRegister(rm));
   24638                               break;
   24639                             }
   24640                             case 0x00300000: {
   24641                               // 0xfe300a00
   24642                               unsigned rd = ExtractSRegister(instr, 22, 12);
   24643                               unsigned rn = ExtractSRegister(instr, 7, 16);
   24644                               unsigned rm = ExtractSRegister(instr, 5, 0);
   24645                               // VSELGT.F32 <Sd>, <Sn>, <Sm> ; T1
   24646                               vselgt(F32,
   24647                                      SRegister(rd),
   24648                                      SRegister(rn),
   24649                                      SRegister(rm));
   24650                               break;
   24651                             }
   24652                             case 0x00300100: {
   24653                               // 0xfe300b00
   24654                               unsigned rd = ExtractDRegister(instr, 22, 12);
   24655                               unsigned rn = ExtractDRegister(instr, 7, 16);
   24656                               unsigned rm = ExtractDRegister(instr, 5, 0);
   24657                               // VSELGT.F64 <Dd>, <Dn>, <Dm> ; T1
   24658                               vselgt(F64,
   24659                                      DRegister(rd),
   24660                                      DRegister(rn),
   24661                                      DRegister(rm));
   24662                               break;
   24663                             }
   24664                             case 0x00800000: {
   24665                               // 0xfe800a00
   24666                               unsigned rd = ExtractSRegister(instr, 22, 12);
   24667                               unsigned rn = ExtractSRegister(instr, 7, 16);
   24668                               unsigned rm = ExtractSRegister(instr, 5, 0);
   24669                               // VMAXNM{<q>}.F32 <Sd>, <Sn>, <Sm> ; T2
   24670                               vmaxnm(F32,
   24671                                      SRegister(rd),
   24672                                      SRegister(rn),
   24673                                      SRegister(rm));
   24674                               break;
   24675                             }
   24676                             case 0x00800040: {
   24677                               // 0xfe800a40
   24678                               unsigned rd = ExtractSRegister(instr, 22, 12);
   24679                               unsigned rn = ExtractSRegister(instr, 7, 16);
   24680                               unsigned rm = ExtractSRegister(instr, 5, 0);
   24681                               // VMINNM{<q>}.F32 <Sd>, <Sn>, <Sm> ; T2
   24682                               vminnm(F32,
   24683                                      SRegister(rd),
   24684                                      SRegister(rn),
   24685                                      SRegister(rm));
   24686                               break;
   24687                             }
   24688                             case 0x00800100: {
   24689                               // 0xfe800b00
   24690                               unsigned rd = ExtractDRegister(instr, 22, 12);
   24691                               unsigned rn = ExtractDRegister(instr, 7, 16);
   24692                               unsigned rm = ExtractDRegister(instr, 5, 0);
   24693                               // VMAXNM{<q>}.F64 <Dd>, <Dn>, <Dm> ; T2
   24694                               vmaxnm(F64,
   24695                                      DRegister(rd),
   24696                                      DRegister(rn),
   24697                                      DRegister(rm));
   24698                               break;
   24699                             }
   24700                             case 0x00800140: {
   24701                               // 0xfe800b40
   24702                               unsigned rd = ExtractDRegister(instr, 22, 12);
   24703                               unsigned rn = ExtractDRegister(instr, 7, 16);
   24704                               unsigned rm = ExtractDRegister(instr, 5, 0);
   24705                               // VMINNM{<q>}.F64 <Dd>, <Dn>, <Dm> ; T2
   24706                               vminnm(F64,
   24707                                      DRegister(rd),
   24708                                      DRegister(rn),
   24709                                      DRegister(rm));
   24710                               break;
   24711                             }
   24712                             case 0x00b00040: {
   24713                               // 0xfeb00a40
   24714                               switch (instr & 0x000f0000) {
   24715                                 case 0x00080000: {
   24716                                   // 0xfeb80a40
   24717                                   if ((instr & 0x00000080) == 0x00000000) {
   24718                                     unsigned rd =
   24719                                         ExtractSRegister(instr, 22, 12);
   24720                                     unsigned rm = ExtractSRegister(instr, 5, 0);
   24721                                     // VRINTA{<q>}.F32.F32 <Sd>, <Sm> ; T1
   24722                                     vrinta(F32,
   24723                                            F32,
   24724                                            SRegister(rd),
   24725                                            SRegister(rm));
   24726                                   } else {
   24727                                     UnallocatedT32(instr);
   24728                                   }
   24729                                   break;
   24730                                 }
   24731                                 case 0x00090000: {
   24732                                   // 0xfeb90a40
   24733                                   if ((instr & 0x00000080) == 0x00000000) {
   24734                                     unsigned rd =
   24735                                         ExtractSRegister(instr, 22, 12);
   24736                                     unsigned rm = ExtractSRegister(instr, 5, 0);
   24737                                     // VRINTN{<q>}.F32.F32 <Sd>, <Sm> ; T1
   24738                                     vrintn(F32,
   24739                                            F32,
   24740                                            SRegister(rd),
   24741                                            SRegister(rm));
   24742                                   } else {
   24743                                     UnallocatedT32(instr);
   24744                                   }
   24745                                   break;
   24746                                 }
   24747                                 case 0x000a0000: {
   24748                                   // 0xfeba0a40
   24749                                   if ((instr & 0x00000080) == 0x00000000) {
   24750                                     unsigned rd =
   24751                                         ExtractSRegister(instr, 22, 12);
   24752                                     unsigned rm = ExtractSRegister(instr, 5, 0);
   24753                                     // VRINTP{<q>}.F32.F32 <Sd>, <Sm> ; T1
   24754                                     vrintp(F32,
   24755                                            F32,
   24756                                            SRegister(rd),
   24757                                            SRegister(rm));
   24758                                   } else {
   24759                                     UnallocatedT32(instr);
   24760                                   }
   24761                                   break;
   24762                                 }
   24763                                 case 0x000b0000: {
   24764                                   // 0xfebb0a40
   24765                                   if ((instr & 0x00000080) == 0x00000000) {
   24766                                     unsigned rd =
   24767                                         ExtractSRegister(instr, 22, 12);
   24768                                     unsigned rm = ExtractSRegister(instr, 5, 0);
   24769                                     // VRINTM{<q>}.F32.F32 <Sd>, <Sm> ; T1
   24770                                     vrintm(F32,
   24771                                            F32,
   24772                                            SRegister(rd),
   24773                                            SRegister(rm));
   24774                                   } else {
   24775                                     UnallocatedT32(instr);
   24776                                   }
   24777                                   break;
   24778                                 }
   24779                                 case 0x000c0000: {
   24780                                   // 0xfebc0a40
   24781                                   DataType dt =
   24782                                       Dt_op_2_Decode((instr >> 7) & 0x1);
   24783                                   if (dt.Is(kDataTypeValueInvalid)) {
   24784                                     UnallocatedT32(instr);
   24785                                     return;
   24786                                   }
   24787                                   unsigned rd = ExtractSRegister(instr, 22, 12);
   24788                                   unsigned rm = ExtractSRegister(instr, 5, 0);
   24789                                   // VCVTA{<q>}.<dt>.F32 <Sd>, <Sm> ; T1
   24790                                   vcvta(dt, F32, SRegister(rd), SRegister(rm));
   24791                                   break;
   24792                                 }
   24793                                 case 0x000d0000: {
   24794                                   // 0xfebd0a40
   24795                                   DataType dt =
   24796                                       Dt_op_2_Decode((instr >> 7) & 0x1);
   24797                                   if (dt.Is(kDataTypeValueInvalid)) {
   24798                                     UnallocatedT32(instr);
   24799                                     return;
   24800                                   }
   24801                                   unsigned rd = ExtractSRegister(instr, 22, 12);
   24802                                   unsigned rm = ExtractSRegister(instr, 5, 0);
   24803                                   // VCVTN{<q>}.<dt>.F32 <Sd>, <Sm> ; T1
   24804                                   vcvtn(dt, F32, SRegister(rd), SRegister(rm));
   24805                                   break;
   24806                                 }
   24807                                 case 0x000e0000: {
   24808                                   // 0xfebe0a40
   24809                                   DataType dt =
   24810                                       Dt_op_2_Decode((instr >> 7) & 0x1);
   24811                                   if (dt.Is(kDataTypeValueInvalid)) {
   24812                                     UnallocatedT32(instr);
   24813                                     return;
   24814                                   }
   24815                                   unsigned rd = ExtractSRegister(instr, 22, 12);
   24816                                   unsigned rm = ExtractSRegister(instr, 5, 0);
   24817                                   // VCVTP{<q>}.<dt>.F32 <Sd>, <Sm> ; T1
   24818                                   vcvtp(dt, F32, SRegister(rd), SRegister(rm));
   24819                                   break;
   24820                                 }
   24821                                 case 0x000f0000: {
   24822                                   // 0xfebf0a40
   24823                                   DataType dt =
   24824                                       Dt_op_2_Decode((instr >> 7) & 0x1);
   24825                                   if (dt.Is(kDataTypeValueInvalid)) {
   24826                                     UnallocatedT32(instr);
   24827                                     return;
   24828                                   }
   24829                                   unsigned rd = ExtractSRegister(instr, 22, 12);
   24830                                   unsigned rm = ExtractSRegister(instr, 5, 0);
   24831                                   // VCVTM{<q>}.<dt>.F32 <Sd>, <Sm> ; T1
   24832                                   vcvtm(dt, F32, SRegister(rd), SRegister(rm));
   24833                                   break;
   24834                                 }
   24835                                 default:
   24836                                   UnallocatedT32(instr);
   24837                                   break;
   24838                               }
   24839                               break;
   24840                             }
   24841                             case 0x00b00140: {
   24842                               // 0xfeb00b40
   24843                               switch (instr & 0x000f0000) {
   24844                                 case 0x00080000: {
   24845                                   // 0xfeb80b40
   24846                                   if ((instr & 0x00000080) == 0x00000000) {
   24847                                     unsigned rd =
   24848                                         ExtractDRegister(instr, 22, 12);
   24849                                     unsigned rm = ExtractDRegister(instr, 5, 0);
   24850                                     // VRINTA{<q>}.F64.F64 <Dd>, <Dm> ; T1
   24851                                     vrinta(F64,
   24852                                            F64,
   24853                                            DRegister(rd),
   24854                                            DRegister(rm));
   24855                                   } else {
   24856                                     UnallocatedT32(instr);
   24857                                   }
   24858                                   break;
   24859                                 }
   24860                                 case 0x00090000: {
   24861                                   // 0xfeb90b40
   24862                                   if ((instr & 0x00000080) == 0x00000000) {
   24863                                     unsigned rd =
   24864                                         ExtractDRegister(instr, 22, 12);
   24865                                     unsigned rm = ExtractDRegister(instr, 5, 0);
   24866                                     // VRINTN{<q>}.F64.F64 <Dd>, <Dm> ; T1
   24867                                     vrintn(F64,
   24868                                            F64,
   24869                                            DRegister(rd),
   24870                                            DRegister(rm));
   24871                                   } else {
   24872                                     UnallocatedT32(instr);
   24873                                   }
   24874                                   break;
   24875                                 }
   24876                                 case 0x000a0000: {
   24877                                   // 0xfeba0b40
   24878                                   if ((instr & 0x00000080) == 0x00000000) {
   24879                                     unsigned rd =
   24880                                         ExtractDRegister(instr, 22, 12);
   24881                                     unsigned rm = ExtractDRegister(instr, 5, 0);
   24882                                     // VRINTP{<q>}.F64.F64 <Dd>, <Dm> ; T1
   24883                                     vrintp(F64,
   24884                                            F64,
   24885                                            DRegister(rd),
   24886                                            DRegister(rm));
   24887                                   } else {
   24888                                     UnallocatedT32(instr);
   24889                                   }
   24890                                   break;
   24891                                 }
   24892                                 case 0x000b0000: {
   24893                                   // 0xfebb0b40
   24894                                   if ((instr & 0x00000080) == 0x00000000) {
   24895                                     unsigned rd =
   24896                                         ExtractDRegister(instr, 22, 12);
   24897                                     unsigned rm = ExtractDRegister(instr, 5, 0);
   24898                                     // VRINTM{<q>}.F64.F64 <Dd>, <Dm> ; T1
   24899                                     vrintm(F64,
   24900                                            F64,
   24901                                            DRegister(rd),
   24902                                            DRegister(rm));
   24903                                   } else {
   24904                                     UnallocatedT32(instr);
   24905                                   }
   24906                                   break;
   24907                                 }
   24908                                 case 0x000c0000: {
   24909                                   // 0xfebc0b40
   24910                                   DataType dt =
   24911                                       Dt_op_2_Decode((instr >> 7) & 0x1);
   24912                                   if (dt.Is(kDataTypeValueInvalid)) {
   24913                                     UnallocatedT32(instr);
   24914                                     return;
   24915                                   }
   24916                                   unsigned rd = ExtractSRegister(instr, 22, 12);
   24917                                   unsigned rm = ExtractDRegister(instr, 5, 0);
   24918                                   // VCVTA{<q>}.<dt>.F64 <Sd>, <Dm> ; T1
   24919                                   vcvta(dt, F64, SRegister(rd), DRegister(rm));
   24920                                   break;
   24921                                 }
   24922                                 case 0x000d0000: {
   24923                                   // 0xfebd0b40
   24924                                   DataType dt =
   24925                                       Dt_op_2_Decode((instr >> 7) & 0x1);
   24926                                   if (dt.Is(kDataTypeValueInvalid)) {
   24927                                     UnallocatedT32(instr);
   24928                                     return;
   24929                                   }
   24930                                   unsigned rd = ExtractSRegister(instr, 22, 12);
   24931                                   unsigned rm = ExtractDRegister(instr, 5, 0);
   24932                                   // VCVTN{<q>}.<dt>.F64 <Sd>, <Dm> ; T1
   24933                                   vcvtn(dt, F64, SRegister(rd), DRegister(rm));
   24934                                   break;
   24935                                 }
   24936                                 case 0x000e0000: {
   24937                                   // 0xfebe0b40
   24938                                   DataType dt =
   24939                                       Dt_op_2_Decode((instr >> 7) & 0x1);
   24940                                   if (dt.Is(kDataTypeValueInvalid)) {
   24941                                     UnallocatedT32(instr);
   24942                                     return;
   24943                                   }
   24944                                   unsigned rd = ExtractSRegister(instr, 22, 12);
   24945                                   unsigned rm = ExtractDRegister(instr, 5, 0);
   24946                                   // VCVTP{<q>}.<dt>.F64 <Sd>, <Dm> ; T1
   24947                                   vcvtp(dt, F64, SRegister(rd), DRegister(rm));
   24948                                   break;
   24949                                 }
   24950                                 case 0x000f0000: {
   24951                                   // 0xfebf0b40
   24952                                   DataType dt =
   24953                                       Dt_op_2_Decode((instr >> 7) & 0x1);
   24954                                   if (dt.Is(kDataTypeValueInvalid)) {
   24955                                     UnallocatedT32(instr);
   24956                                     return;
   24957                                   }
   24958                                   unsigned rd = ExtractSRegister(instr, 22, 12);
   24959                                   unsigned rm = ExtractDRegister(instr, 5, 0);
   24960                                   // VCVTM{<q>}.<dt>.F64 <Sd>, <Dm> ; T1
   24961                                   vcvtm(dt, F64, SRegister(rd), DRegister(rm));
   24962                                   break;
   24963                                 }
   24964                                 default:
   24965                                   UnallocatedT32(instr);
   24966                                   break;
   24967                               }
   24968                               break;
   24969                             }
   24970                             default:
   24971                               UnallocatedT32(instr);
   24972                               break;
   24973                           }
   24974                           break;
   24975                         }
   24976                         default: {
   24977                           if (((instr & 0xe00) == 0xa00)) {
   24978                             UnallocatedT32(instr);
   24979                             return;
   24980                           }
   24981                           UnimplementedT32_32("CDP2", instr);
   24982                           break;
   24983                         }
   24984                       }
   24985                       break;
   24986                     }
   24987                   }
   24988                   break;
   24989                 }
   24990                 case 0x00000010: {
   24991                   // 0xee000010
   24992                   switch (instr & 0x10100000) {
   24993                     case 0x00000000: {
   24994                       // 0xee000010
   24995                       switch (instr & 0x00000e00) {
   24996                         case 0x00000a00: {
   24997                           // 0xee000a10
   24998                           switch (instr & 0x00800100) {
   24999                             case 0x00000000: {
   25000                               // 0xee000a10
   25001                               if ((instr & 0x00600000) == 0x00000000) {
   25002                                 unsigned rn = ExtractSRegister(instr, 7, 16);
   25003                                 unsigned rt = (instr >> 12) & 0xf;
   25004                                 // VMOV{<c>}{<q>} <Sn>, <Rt> ; T1
   25005                                 vmov(CurrentCond(),
   25006                                      SRegister(rn),
   25007                                      Register(rt));
   25008                                 if (((instr & 0xfff00f7f) != 0xee000a10)) {
   25009                                   UnpredictableT32(instr);
   25010                                 }
   25011                               } else {
   25012                                 UnallocatedT32(instr);
   25013                               }
   25014                               break;
   25015                             }
   25016                             case 0x00000100: {
   25017                               // 0xee000b10
   25018                               unsigned lane;
   25019                               DataType dt =
   25020                                   Dt_opc1_opc2_1_Decode(((instr >> 5) & 0x3) |
   25021                                                             ((instr >> 19) &
   25022                                                              0xc),
   25023                                                         &lane);
   25024                               if (dt.Is(kDataTypeValueInvalid)) {
   25025                                 UnallocatedT32(instr);
   25026                                 return;
   25027                               }
   25028                               unsigned rd = ExtractDRegister(instr, 7, 16);
   25029                               unsigned rt = (instr >> 12) & 0xf;
   25030                               // VMOV{<c>}{<q>}{.<size>} <Dd[x]>, <Rt> ; T1
   25031                               vmov(CurrentCond(),
   25032                                    dt,
   25033                                    DRegisterLane(rd, lane),
   25034                                    Register(rt));
   25035                               if (((instr & 0xff900f1f) != 0xee000b10)) {
   25036                                 UnpredictableT32(instr);
   25037                               }
   25038                               break;
   25039                             }
   25040                             case 0x00800000: {
   25041                               // 0xee800a10
   25042                               if ((instr & 0x00600000) == 0x00600000) {
   25043                                 unsigned spec_reg = (instr >> 16) & 0xf;
   25044                                 unsigned rt = (instr >> 12) & 0xf;
   25045                                 switch (spec_reg) {
   25046                                   case 0x0:
   25047                                   case 0x1:
   25048                                   case 0x8: {
   25049                                     // VMSR{<c>}{<q>} <spec_reg>, <Rt> ; T1
   25050                                     vmsr(CurrentCond(),
   25051                                          SpecialFPRegister(spec_reg),
   25052                                          Register(rt));
   25053                                     if (((instr & 0xfff00fff) != 0xeee00a10)) {
   25054                                       UnpredictableT32(instr);
   25055                                     }
   25056                                     break;
   25057                                   }
   25058                                   default:
   25059                                     UnallocatedT32(instr);
   25060                                     break;
   25061                                 }
   25062                               } else {
   25063                                 UnallocatedT32(instr);
   25064                               }
   25065                               break;
   25066                             }
   25067                             case 0x00800100: {
   25068                               // 0xee800b10
   25069                               switch (instr & 0x00200040) {
   25070                                 case 0x00000000: {
   25071                                   // 0xee800b10
   25072                                   DataType dt =
   25073                                       Dt_B_E_1_Decode(((instr >> 5) & 0x1) |
   25074                                                       ((instr >> 21) & 0x2));
   25075                                   if (dt.Is(kDataTypeValueInvalid)) {
   25076                                     UnallocatedT32(instr);
   25077                                     return;
   25078                                   }
   25079                                   unsigned rd = ExtractDRegister(instr, 7, 16);
   25080                                   unsigned rt = (instr >> 12) & 0xf;
   25081                                   // VDUP{<c>}{<q>}.<dt> <Dd>, <Rt> ; T1
   25082                                   vdup(CurrentCond(),
   25083                                        dt,
   25084                                        DRegister(rd),
   25085                                        Register(rt));
   25086                                   if (((instr & 0xffb00f5f) != 0xee800b10)) {
   25087                                     UnpredictableT32(instr);
   25088                                   }
   25089                                   break;
   25090                                 }
   25091                                 case 0x00200000: {
   25092                                   // 0xeea00b10
   25093                                   DataType dt =
   25094                                       Dt_B_E_1_Decode(((instr >> 5) & 0x1) |
   25095                                                       ((instr >> 21) & 0x2));
   25096                                   if (dt.Is(kDataTypeValueInvalid)) {
   25097                                     UnallocatedT32(instr);
   25098                                     return;
   25099                                   }
   25100                                   if (((instr >> 16) & 1) != 0) {
   25101                                     UnallocatedT32(instr);
   25102                                     return;
   25103                                   }
   25104                                   unsigned rd = ExtractQRegister(instr, 7, 16);
   25105                                   unsigned rt = (instr >> 12) & 0xf;
   25106                                   // VDUP{<c>}{<q>}.<dt> <Qd>, <Rt> ; T1
   25107                                   vdup(CurrentCond(),
   25108                                        dt,
   25109                                        QRegister(rd),
   25110                                        Register(rt));
   25111                                   if (((instr & 0xffb00f5f) != 0xeea00b10)) {
   25112                                     UnpredictableT32(instr);
   25113                                   }
   25114                                   break;
   25115                                 }
   25116                                 default:
   25117                                   UnallocatedT32(instr);
   25118                                   break;
   25119                               }
   25120                               break;
   25121                             }
   25122                           }
   25123                           break;
   25124                         }
   25125                         default: {
   25126                           if (((instr & 0xe00) == 0xa00)) {
   25127                             UnallocatedT32(instr);
   25128                             return;
   25129                           }
   25130                           UnimplementedT32_32("MCR", instr);
   25131                           break;
   25132                         }
   25133                       }
   25134                       break;
   25135                     }
   25136                     case 0x00100000: {
   25137                       // 0xee100010
   25138                       switch (instr & 0x00000e00) {
   25139                         case 0x00000a00: {
   25140                           // 0xee100a10
   25141                           switch (instr & 0x00000100) {
   25142                             case 0x00000000: {
   25143                               // 0xee100a10
   25144                               switch (instr & 0x00e00000) {
   25145                                 case 0x00000000: {
   25146                                   // 0xee100a10
   25147                                   unsigned rt = (instr >> 12) & 0xf;
   25148                                   unsigned rn = ExtractSRegister(instr, 7, 16);
   25149                                   // VMOV{<c>}{<q>} <Rt>, <Sn> ; T1
   25150                                   vmov(CurrentCond(),
   25151                                        Register(rt),
   25152                                        SRegister(rn));
   25153                                   if (((instr & 0xfff00f7f) != 0xee100a10)) {
   25154                                     UnpredictableT32(instr);
   25155                                   }
   25156                                   break;
   25157                                 }
   25158                                 case 0x00e00000: {
   25159                                   // 0xeef00a10
   25160                                   unsigned rt = (instr >> 12) & 0xf;
   25161                                   unsigned spec_reg = (instr >> 16) & 0xf;
   25162                                   switch (spec_reg) {
   25163                                     case 0x0:
   25164                                     case 0x1:
   25165                                     case 0x5:
   25166                                     case 0x6:
   25167                                     case 0x7:
   25168                                     case 0x8: {
   25169                                       // VMRS{<c>}{<q>} <Rt>, <spec_reg> ; T1
   25170                                       vmrs(CurrentCond(),
   25171                                            RegisterOrAPSR_nzcv(rt),
   25172                                            SpecialFPRegister(spec_reg));
   25173                                       if (((instr & 0xfff00fff) !=
   25174                                            0xeef00a10)) {
   25175                                         UnpredictableT32(instr);
   25176                                       }
   25177                                       break;
   25178                                     }
   25179                                     default:
   25180                                       UnallocatedT32(instr);
   25181                                       break;
   25182                                   }
   25183                                   break;
   25184                                 }
   25185                                 default:
   25186                                   UnallocatedT32(instr);
   25187                                   break;
   25188                               }
   25189                               break;
   25190                             }
   25191                             case 0x00000100: {
   25192                               // 0xee100b10
   25193                               unsigned lane;
   25194                               DataType dt =
   25195                                   Dt_U_opc1_opc2_1_Decode(((instr >> 5) & 0x3) |
   25196                                                               ((instr >> 19) &
   25197                                                                0xc) |
   25198                                                               ((instr >> 19) &
   25199                                                                0x10),
   25200                                                           &lane);
   25201                               if (dt.Is(kDataTypeValueInvalid)) {
   25202                                 UnallocatedT32(instr);
   25203                                 return;
   25204                               }
   25205                               unsigned rt = (instr >> 12) & 0xf;
   25206                               unsigned rn = ExtractDRegister(instr, 7, 16);
   25207                               // VMOV{<c>}{<q>}{.<dt>} <Rt>, <Dn[x]> ; T1
   25208                               vmov(CurrentCond(),
   25209                                    dt,
   25210                                    Register(rt),
   25211                                    DRegisterLane(rn, lane));
   25212                               if (((instr & 0xff100f1f) != 0xee100b10)) {
   25213                                 UnpredictableT32(instr);
   25214                               }
   25215                               break;
   25216                             }
   25217                           }
   25218                           break;
   25219                         }
   25220                         default: {
   25221                           if (((instr & 0xe00) == 0xa00)) {
   25222                             UnallocatedT32(instr);
   25223                             return;
   25224                           }
   25225                           UnimplementedT32_32("MRC", instr);
   25226                           break;
   25227                         }
   25228                       }
   25229                       break;
   25230                     }
   25231                     case 0x10000000: {
   25232                       // 0xfe000010
   25233                       if (((instr & 0xe00) == 0xa00)) {
   25234                         UnallocatedT32(instr);
   25235                         return;
   25236                       }
   25237                       UnimplementedT32_32("MCR2", instr);
   25238                       break;
   25239                     }
   25240                     case 0x10100000: {
   25241                       // 0xfe100010
   25242                       if (((instr & 0xe00) == 0xa00)) {
   25243                         UnallocatedT32(instr);
   25244                         return;
   25245                       }
   25246                       UnimplementedT32_32("MRC2", instr);
   25247                       break;
   25248                     }
   25249                   }
   25250                   break;
   25251                 }
   25252                 case 0x01000000: {
   25253                   // 0xef000000
   25254                   switch (instr & 0x00800000) {
   25255                     case 0x00000000: {
   25256                       // 0xef000000
   25257                       switch (instr & 0x00000f40) {
   25258                         case 0x00000000: {
   25259                           // 0xef000000
   25260                           DataType dt = Dt_U_size_1_Decode(
   25261                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
   25262                           if (dt.Is(kDataTypeValueInvalid)) {
   25263                             UnallocatedT32(instr);
   25264                             return;
   25265                           }
   25266                           unsigned rd = ExtractDRegister(instr, 22, 12);
   25267                           unsigned rn = ExtractDRegister(instr, 7, 16);
   25268                           unsigned rm = ExtractDRegister(instr, 5, 0);
   25269                           // VHADD{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
   25270                           vhadd(CurrentCond(),
   25271                                 dt,
   25272                                 DRegister(rd),
   25273                                 DRegister(rn),
   25274                                 DRegister(rm));
   25275                           break;
   25276                         }
   25277                         case 0x00000040: {
   25278                           // 0xef000040
   25279                           DataType dt = Dt_U_size_1_Decode(
   25280                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
   25281                           if (dt.Is(kDataTypeValueInvalid)) {
   25282                             UnallocatedT32(instr);
   25283                             return;
   25284                           }
   25285                           if (((instr >> 12) & 1) != 0) {
   25286                             UnallocatedT32(instr);
   25287                             return;
   25288                           }
   25289                           unsigned rd = ExtractQRegister(instr, 22, 12);
   25290                           if (((instr >> 16) & 1) != 0) {
   25291                             UnallocatedT32(instr);
   25292                             return;
   25293                           }
   25294                           unsigned rn = ExtractQRegister(instr, 7, 16);
   25295                           if ((instr & 1) != 0) {
   25296                             UnallocatedT32(instr);
   25297                             return;
   25298                           }
   25299                           unsigned rm = ExtractQRegister(instr, 5, 0);
   25300                           // VHADD{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
   25301                           vhadd(CurrentCond(),
   25302                                 dt,
   25303                                 QRegister(rd),
   25304                                 QRegister(rn),
   25305                                 QRegister(rm));
   25306                           break;
   25307                         }
   25308                         case 0x00000100: {
   25309                           // 0xef000100
   25310                           DataType dt = Dt_U_size_1_Decode(
   25311                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
   25312                           if (dt.Is(kDataTypeValueInvalid)) {
   25313                             UnallocatedT32(instr);
   25314                             return;
   25315                           }
   25316                           unsigned rd = ExtractDRegister(instr, 22, 12);
   25317                           unsigned rn = ExtractDRegister(instr, 7, 16);
   25318                           unsigned rm = ExtractDRegister(instr, 5, 0);
   25319                           // VRHADD{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
   25320                           vrhadd(CurrentCond(),
   25321                                  dt,
   25322                                  DRegister(rd),
   25323                                  DRegister(rn),
   25324                                  DRegister(rm));
   25325                           break;
   25326                         }
   25327                         case 0x00000140: {
   25328                           // 0xef000140
   25329                           DataType dt = Dt_U_size_1_Decode(
   25330                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
   25331                           if (dt.Is(kDataTypeValueInvalid)) {
   25332                             UnallocatedT32(instr);
   25333                             return;
   25334                           }
   25335                           if (((instr >> 12) & 1) != 0) {
   25336                             UnallocatedT32(instr);
   25337                             return;
   25338                           }
   25339                           unsigned rd = ExtractQRegister(instr, 22, 12);
   25340                           if (((instr >> 16) & 1) != 0) {
   25341                             UnallocatedT32(instr);
   25342                             return;
   25343                           }
   25344                           unsigned rn = ExtractQRegister(instr, 7, 16);
   25345                           if ((instr & 1) != 0) {
   25346                             UnallocatedT32(instr);
   25347                             return;
   25348                           }
   25349                           unsigned rm = ExtractQRegister(instr, 5, 0);
   25350                           // VRHADD{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
   25351                           vrhadd(CurrentCond(),
   25352                                  dt,
   25353                                  QRegister(rd),
   25354                                  QRegister(rn),
   25355                                  QRegister(rm));
   25356                           break;
   25357                         }
   25358                         case 0x00000200: {
   25359                           // 0xef000200
   25360                           DataType dt = Dt_U_size_1_Decode(
   25361                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
   25362                           if (dt.Is(kDataTypeValueInvalid)) {
   25363                             UnallocatedT32(instr);
   25364                             return;
   25365                           }
   25366                           unsigned rd = ExtractDRegister(instr, 22, 12);
   25367                           unsigned rn = ExtractDRegister(instr, 7, 16);
   25368                           unsigned rm = ExtractDRegister(instr, 5, 0);
   25369                           // VHSUB{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
   25370                           vhsub(CurrentCond(),
   25371                                 dt,
   25372                                 DRegister(rd),
   25373                                 DRegister(rn),
   25374                                 DRegister(rm));
   25375                           break;
   25376                         }
   25377                         case 0x00000240: {
   25378                           // 0xef000240
   25379                           DataType dt = Dt_U_size_1_Decode(
   25380                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
   25381                           if (dt.Is(kDataTypeValueInvalid)) {
   25382                             UnallocatedT32(instr);
   25383                             return;
   25384                           }
   25385                           if (((instr >> 12) & 1) != 0) {
   25386                             UnallocatedT32(instr);
   25387                             return;
   25388                           }
   25389                           unsigned rd = ExtractQRegister(instr, 22, 12);
   25390                           if (((instr >> 16) & 1) != 0) {
   25391                             UnallocatedT32(instr);
   25392                             return;
   25393                           }
   25394                           unsigned rn = ExtractQRegister(instr, 7, 16);
   25395                           if ((instr & 1) != 0) {
   25396                             UnallocatedT32(instr);
   25397                             return;
   25398                           }
   25399                           unsigned rm = ExtractQRegister(instr, 5, 0);
   25400                           // VHSUB{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
   25401                           vhsub(CurrentCond(),
   25402                                 dt,
   25403                                 QRegister(rd),
   25404                                 QRegister(rn),
   25405                                 QRegister(rm));
   25406                           break;
   25407                         }
   25408                         case 0x00000300: {
   25409                           // 0xef000300
   25410                           DataType dt = Dt_U_size_1_Decode(
   25411                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
   25412                           if (dt.Is(kDataTypeValueInvalid)) {
   25413                             UnallocatedT32(instr);
   25414                             return;
   25415                           }
   25416                           unsigned rd = ExtractDRegister(instr, 22, 12);
   25417                           unsigned rn = ExtractDRegister(instr, 7, 16);
   25418                           unsigned rm = ExtractDRegister(instr, 5, 0);
   25419                           // VCGT{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
   25420                           vcgt(CurrentCond(),
   25421                                dt,
   25422                                DRegister(rd),
   25423                                DRegister(rn),
   25424                                DRegister(rm));
   25425                           break;
   25426                         }
   25427                         case 0x00000340: {
   25428                           // 0xef000340
   25429                           DataType dt = Dt_U_size_1_Decode(
   25430                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
   25431                           if (dt.Is(kDataTypeValueInvalid)) {
   25432                             UnallocatedT32(instr);
   25433                             return;
   25434                           }
   25435                           if (((instr >> 12) & 1) != 0) {
   25436                             UnallocatedT32(instr);
   25437                             return;
   25438                           }
   25439                           unsigned rd = ExtractQRegister(instr, 22, 12);
   25440                           if (((instr >> 16) & 1) != 0) {
   25441                             UnallocatedT32(instr);
   25442                             return;
   25443                           }
   25444                           unsigned rn = ExtractQRegister(instr, 7, 16);
   25445                           if ((instr & 1) != 0) {
   25446                             UnallocatedT32(instr);
   25447                             return;
   25448                           }
   25449                           unsigned rm = ExtractQRegister(instr, 5, 0);
   25450                           // VCGT{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
   25451                           vcgt(CurrentCond(),
   25452                                dt,
   25453                                QRegister(rd),
   25454                                QRegister(rn),
   25455                                QRegister(rm));
   25456                           break;
   25457                         }
   25458                         case 0x00000400: {
   25459                           // 0xef000400
   25460                           DataType dt = Dt_U_size_3_Decode(
   25461                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
   25462                           if (dt.Is(kDataTypeValueInvalid)) {
   25463                             UnallocatedT32(instr);
   25464                             return;
   25465                           }
   25466                           unsigned rd = ExtractDRegister(instr, 22, 12);
   25467                           unsigned rm = ExtractDRegister(instr, 5, 0);
   25468                           unsigned rn = ExtractDRegister(instr, 7, 16);
   25469                           // VSHL{<c>}{<q>}.<dt> {<Dd>}, <Dm>, <Dn> ; T1
   25470                           vshl(CurrentCond(),
   25471                                dt,
   25472                                DRegister(rd),
   25473                                DRegister(rm),
   25474                                DRegister(rn));
   25475                           break;
   25476                         }
   25477                         case 0x00000440: {
   25478                           // 0xef000440
   25479                           DataType dt = Dt_U_size_3_Decode(
   25480                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
   25481                           if (dt.Is(kDataTypeValueInvalid)) {
   25482                             UnallocatedT32(instr);
   25483                             return;
   25484                           }
   25485                           if (((instr >> 12) & 1) != 0) {
   25486                             UnallocatedT32(instr);
   25487                             return;
   25488                           }
   25489                           unsigned rd = ExtractQRegister(instr, 22, 12);
   25490                           if ((instr & 1) != 0) {
   25491                             UnallocatedT32(instr);
   25492                             return;
   25493                           }
   25494                           unsigned rm = ExtractQRegister(instr, 5, 0);
   25495                           if (((instr >> 16) & 1) != 0) {
   25496                             UnallocatedT32(instr);
   25497                             return;
   25498                           }
   25499                           unsigned rn = ExtractQRegister(instr, 7, 16);
   25500                           // VSHL{<c>}{<q>}.<dt> {<Qd>}, <Qm>, <Qn> ; T1
   25501                           vshl(CurrentCond(),
   25502                                dt,
   25503                                QRegister(rd),
   25504                                QRegister(rm),
   25505                                QRegister(rn));
   25506                           break;
   25507                         }
   25508                         case 0x00000500: {
   25509                           // 0xef000500
   25510                           DataType dt = Dt_U_size_3_Decode(
   25511                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
   25512                           if (dt.Is(kDataTypeValueInvalid)) {
   25513                             UnallocatedT32(instr);
   25514                             return;
   25515                           }
   25516                           unsigned rd = ExtractDRegister(instr, 22, 12);
   25517                           unsigned rm = ExtractDRegister(instr, 5, 0);
   25518                           unsigned rn = ExtractDRegister(instr, 7, 16);
   25519                           // VRSHL{<c>}{<q>}.<dt> {<Dd>}, <Dm>, <Dn> ; T1
   25520                           vrshl(CurrentCond(),
   25521                                 dt,
   25522                                 DRegister(rd),
   25523                                 DRegister(rm),
   25524                                 DRegister(rn));
   25525                           break;
   25526                         }
   25527                         case 0x00000540: {
   25528                           // 0xef000540
   25529                           DataType dt = Dt_U_size_3_Decode(
   25530                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
   25531                           if (dt.Is(kDataTypeValueInvalid)) {
   25532                             UnallocatedT32(instr);
   25533                             return;
   25534                           }
   25535                           if (((instr >> 12) & 1) != 0) {
   25536                             UnallocatedT32(instr);
   25537                             return;
   25538                           }
   25539                           unsigned rd = ExtractQRegister(instr, 22, 12);
   25540                           if ((instr & 1) != 0) {
   25541                             UnallocatedT32(instr);
   25542                             return;
   25543                           }
   25544                           unsigned rm = ExtractQRegister(instr, 5, 0);
   25545                           if (((instr >> 16) & 1) != 0) {
   25546                             UnallocatedT32(instr);
   25547                             return;
   25548                           }
   25549                           unsigned rn = ExtractQRegister(instr, 7, 16);
   25550                           // VRSHL{<c>}{<q>}.<dt> {<Qd>}, <Qm>, <Qn> ; T1
   25551                           vrshl(CurrentCond(),
   25552                                 dt,
   25553                                 QRegister(rd),
   25554                                 QRegister(rm),
   25555                                 QRegister(rn));
   25556                           break;
   25557                         }
   25558                         case 0x00000600: {
   25559                           // 0xef000600
   25560                           DataType dt = Dt_U_size_1_Decode(
   25561                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
   25562                           if (dt.Is(kDataTypeValueInvalid)) {
   25563                             UnallocatedT32(instr);
   25564                             return;
   25565                           }
   25566                           unsigned rd = ExtractDRegister(instr, 22, 12);
   25567                           unsigned rn = ExtractDRegister(instr, 7, 16);
   25568                           unsigned rm = ExtractDRegister(instr, 5, 0);
   25569                           // VMAX{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
   25570                           vmax(CurrentCond(),
   25571                                dt,
   25572                                DRegister(rd),
   25573                                DRegister(rn),
   25574                                DRegister(rm));
   25575                           break;
   25576                         }
   25577                         case 0x00000640: {
   25578                           // 0xef000640
   25579                           DataType dt = Dt_U_size_1_Decode(
   25580                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
   25581                           if (dt.Is(kDataTypeValueInvalid)) {
   25582                             UnallocatedT32(instr);
   25583                             return;
   25584                           }
   25585                           if (((instr >> 12) & 1) != 0) {
   25586                             UnallocatedT32(instr);
   25587                             return;
   25588                           }
   25589                           unsigned rd = ExtractQRegister(instr, 22, 12);
   25590                           if (((instr >> 16) & 1) != 0) {
   25591                             UnallocatedT32(instr);
   25592                             return;
   25593                           }
   25594                           unsigned rn = ExtractQRegister(instr, 7, 16);
   25595                           if ((instr & 1) != 0) {
   25596                             UnallocatedT32(instr);
   25597                             return;
   25598                           }
   25599                           unsigned rm = ExtractQRegister(instr, 5, 0);
   25600                           // VMAX{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
   25601                           vmax(CurrentCond(),
   25602                                dt,
   25603                                QRegister(rd),
   25604                                QRegister(rn),
   25605                                QRegister(rm));
   25606                           break;
   25607                         }
   25608                         case 0x00000700: {
   25609                           // 0xef000700
   25610                           DataType dt = Dt_U_size_1_Decode(
   25611                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
   25612                           if (dt.Is(kDataTypeValueInvalid)) {
   25613                             UnallocatedT32(instr);
   25614                             return;
   25615                           }
   25616                           unsigned rd = ExtractDRegister(instr, 22, 12);
   25617                           unsigned rn = ExtractDRegister(instr, 7, 16);
   25618                           unsigned rm = ExtractDRegister(instr, 5, 0);
   25619                           // VABD{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
   25620                           vabd(CurrentCond(),
   25621                                dt,
   25622                                DRegister(rd),
   25623                                DRegister(rn),
   25624                                DRegister(rm));
   25625                           break;
   25626                         }
   25627                         case 0x00000740: {
   25628                           // 0xef000740
   25629                           DataType dt = Dt_U_size_1_Decode(
   25630                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
   25631                           if (dt.Is(kDataTypeValueInvalid)) {
   25632                             UnallocatedT32(instr);
   25633                             return;
   25634                           }
   25635                           if (((instr >> 12) & 1) != 0) {
   25636                             UnallocatedT32(instr);
   25637                             return;
   25638                           }
   25639                           unsigned rd = ExtractQRegister(instr, 22, 12);
   25640                           if (((instr >> 16) & 1) != 0) {
   25641                             UnallocatedT32(instr);
   25642                             return;
   25643                           }
   25644                           unsigned rn = ExtractQRegister(instr, 7, 16);
   25645                           if ((instr & 1) != 0) {
   25646                             UnallocatedT32(instr);
   25647                             return;
   25648                           }
   25649                           unsigned rm = ExtractQRegister(instr, 5, 0);
   25650                           // VABD{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
   25651                           vabd(CurrentCond(),
   25652                                dt,
   25653                                QRegister(rd),
   25654                                QRegister(rn),
   25655                                QRegister(rm));
   25656                           break;
   25657                         }
   25658                         case 0x00000800: {
   25659                           // 0xef000800
   25660                           switch (instr & 0x10000000) {
   25661                             case 0x00000000: {
   25662                               // 0xef000800
   25663                               DataType dt =
   25664                                   Dt_size_2_Decode((instr >> 20) & 0x3);
   25665                               if (dt.Is(kDataTypeValueInvalid)) {
   25666                                 UnallocatedT32(instr);
   25667                                 return;
   25668                               }
   25669                               unsigned rd = ExtractDRegister(instr, 22, 12);
   25670                               unsigned rn = ExtractDRegister(instr, 7, 16);
   25671                               unsigned rm = ExtractDRegister(instr, 5, 0);
   25672                               // VADD{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
   25673                               vadd(CurrentCond(),
   25674                                    dt,
   25675                                    DRegister(rd),
   25676                                    DRegister(rn),
   25677                                    DRegister(rm));
   25678                               break;
   25679                             }
   25680                             case 0x10000000: {
   25681                               // 0xff000800
   25682                               DataType dt =
   25683                                   Dt_size_2_Decode((instr >> 20) & 0x3);
   25684                               if (dt.Is(kDataTypeValueInvalid)) {
   25685                                 UnallocatedT32(instr);
   25686                                 return;
   25687                               }
   25688                               unsigned rd = ExtractDRegister(instr, 22, 12);
   25689                               unsigned rn = ExtractDRegister(instr, 7, 16);
   25690                               unsigned rm = ExtractDRegister(instr, 5, 0);
   25691                               // VSUB{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
   25692                               vsub(CurrentCond(),
   25693                                    dt,
   25694                                    DRegister(rd),
   25695                                    DRegister(rn),
   25696                                    DRegister(rm));
   25697                               break;
   25698                             }
   25699                           }
   25700                           break;
   25701                         }
   25702                         case 0x00000840: {
   25703                           // 0xef000840
   25704                           switch (instr & 0x10000000) {
   25705                             case 0x00000000: {
   25706                               // 0xef000840
   25707                               DataType dt =
   25708                                   Dt_size_2_Decode((instr >> 20) & 0x3);
   25709                               if (dt.Is(kDataTypeValueInvalid)) {
   25710                                 UnallocatedT32(instr);
   25711                                 return;
   25712                               }
   25713                               if (((instr >> 12) & 1) != 0) {
   25714                                 UnallocatedT32(instr);
   25715                                 return;
   25716                               }
   25717                               unsigned rd = ExtractQRegister(instr, 22, 12);
   25718                               if (((instr >> 16) & 1) != 0) {
   25719                                 UnallocatedT32(instr);
   25720                                 return;
   25721                               }
   25722                               unsigned rn = ExtractQRegister(instr, 7, 16);
   25723                               if ((instr & 1) != 0) {
   25724                                 UnallocatedT32(instr);
   25725                                 return;
   25726                               }
   25727                               unsigned rm = ExtractQRegister(instr, 5, 0);
   25728                               // VADD{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
   25729                               vadd(CurrentCond(),
   25730                                    dt,
   25731                                    QRegister(rd),
   25732                                    QRegister(rn),
   25733                                    QRegister(rm));
   25734                               break;
   25735                             }
   25736                             case 0x10000000: {
   25737                               // 0xff000840
   25738                               DataType dt =
   25739                                   Dt_size_2_Decode((instr >> 20) & 0x3);
   25740                               if (dt.Is(kDataTypeValueInvalid)) {
   25741                                 UnallocatedT32(instr);
   25742                                 return;
   25743                               }
   25744                               if (((instr >> 12) & 1) != 0) {
   25745                                 UnallocatedT32(instr);
   25746                                 return;
   25747                               }
   25748                               unsigned rd = ExtractQRegister(instr, 22, 12);
   25749                               if (((instr >> 16) & 1) != 0) {
   25750                                 UnallocatedT32(instr);
   25751                                 return;
   25752                               }
   25753                               unsigned rn = ExtractQRegister(instr, 7, 16);
   25754                               if ((instr & 1) != 0) {
   25755                                 UnallocatedT32(instr);
   25756                                 return;
   25757                               }
   25758                               unsigned rm = ExtractQRegister(instr, 5, 0);
   25759                               // VSUB{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
   25760                               vsub(CurrentCond(),
   25761                                    dt,
   25762                                    QRegister(rd),
   25763                                    QRegister(rn),
   25764                                    QRegister(rm));
   25765                               break;
   25766                             }
   25767                           }
   25768                           break;
   25769                         }
   25770                         case 0x00000900: {
   25771                           // 0xef000900
   25772                           switch (instr & 0x10000000) {
   25773                             case 0x00000000: {
   25774                               // 0xef000900
   25775                               DataType dt =
   25776                                   Dt_size_10_Decode((instr >> 20) & 0x3);
   25777                               if (dt.Is(kDataTypeValueInvalid)) {
   25778                                 UnallocatedT32(instr);
   25779                                 return;
   25780                               }
   25781                               unsigned rd = ExtractDRegister(instr, 22, 12);
   25782                               unsigned rn = ExtractDRegister(instr, 7, 16);
   25783                               unsigned rm = ExtractDRegister(instr, 5, 0);
   25784                               // VMLA{<c>}{<q>}.<type><size> <Dd>, <Dn>, <Dm> ; T1 NOLINT(whitespace/line_length)
   25785                               vmla(CurrentCond(),
   25786                                    dt,
   25787                                    DRegister(rd),
   25788                                    DRegister(rn),
   25789                                    DRegister(rm));
   25790                               break;
   25791                             }
   25792                             case 0x10000000: {
   25793                               // 0xff000900
   25794                               DataType dt =
   25795                                   Dt_size_10_Decode((instr >> 20) & 0x3);
   25796                               if (dt.Is(kDataTypeValueInvalid)) {
   25797                                 UnallocatedT32(instr);
   25798                                 return;
   25799                               }
   25800                               unsigned rd = ExtractDRegister(instr, 22, 12);
   25801                               unsigned rn = ExtractDRegister(instr, 7, 16);
   25802                               unsigned rm = ExtractDRegister(instr, 5, 0);
   25803                               // VMLS{<c>}{<q>}.<type><size> <Dd>, <Dn>, <Dm> ; T1 NOLINT(whitespace/line_length)
   25804                               vmls(CurrentCond(),
   25805                                    dt,
   25806                                    DRegister(rd),
   25807                                    DRegister(rn),
   25808                                    DRegister(rm));
   25809                               break;
   25810                             }
   25811                           }
   25812                           break;
   25813                         }
   25814                         case 0x00000940: {
   25815                           // 0xef000940
   25816                           switch (instr & 0x10000000) {
   25817                             case 0x00000000: {
   25818                               // 0xef000940
   25819                               DataType dt =
   25820                                   Dt_size_10_Decode((instr >> 20) & 0x3);
   25821                               if (dt.Is(kDataTypeValueInvalid)) {
   25822                                 UnallocatedT32(instr);
   25823                                 return;
   25824                               }
   25825                               if (((instr >> 12) & 1) != 0) {
   25826                                 UnallocatedT32(instr);
   25827                                 return;
   25828                               }
   25829                               unsigned rd = ExtractQRegister(instr, 22, 12);
   25830                               if (((instr >> 16) & 1) != 0) {
   25831                                 UnallocatedT32(instr);
   25832                                 return;
   25833                               }
   25834                               unsigned rn = ExtractQRegister(instr, 7, 16);
   25835                               if ((instr & 1) != 0) {
   25836                                 UnallocatedT32(instr);
   25837                                 return;
   25838                               }
   25839                               unsigned rm = ExtractQRegister(instr, 5, 0);
   25840                               // VMLA{<c>}{<q>}.<type><size> <Qd>, <Qn>, <Qm> ; T1 NOLINT(whitespace/line_length)
   25841                               vmla(CurrentCond(),
   25842                                    dt,
   25843                                    QRegister(rd),
   25844                                    QRegister(rn),
   25845                                    QRegister(rm));
   25846                               break;
   25847                             }
   25848                             case 0x10000000: {
   25849                               // 0xff000940
   25850                               DataType dt =
   25851                                   Dt_size_10_Decode((instr >> 20) & 0x3);
   25852                               if (dt.Is(kDataTypeValueInvalid)) {
   25853                                 UnallocatedT32(instr);
   25854                                 return;
   25855                               }
   25856                               if (((instr >> 12) & 1) != 0) {
   25857                                 UnallocatedT32(instr);
   25858                                 return;
   25859                               }
   25860                               unsigned rd = ExtractQRegister(instr, 22, 12);
   25861                               if (((instr >> 16) & 1) != 0) {
   25862                                 UnallocatedT32(instr);
   25863                                 return;
   25864                               }
   25865                               unsigned rn = ExtractQRegister(instr, 7, 16);
   25866                               if ((instr & 1) != 0) {
   25867                                 UnallocatedT32(instr);
   25868                                 return;
   25869                               }
   25870                               unsigned rm = ExtractQRegister(instr, 5, 0);
   25871                               // VMLS{<c>}{<q>}.<type><size> <Qd>, <Qn>, <Qm> ; T1 NOLINT(whitespace/line_length)
   25872                               vmls(CurrentCond(),
   25873                                    dt,
   25874                                    QRegister(rd),
   25875                                    QRegister(rn),
   25876                                    QRegister(rm));
   25877                               break;
   25878                             }
   25879                           }
   25880                           break;
   25881                         }
   25882                         case 0x00000a00: {
   25883                           // 0xef000a00
   25884                           DataType dt = Dt_U_size_1_Decode(
   25885                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
   25886                           if (dt.Is(kDataTypeValueInvalid)) {
   25887                             UnallocatedT32(instr);
   25888                             return;
   25889                           }
   25890                           unsigned rd = ExtractDRegister(instr, 22, 12);
   25891                           unsigned rn = ExtractDRegister(instr, 7, 16);
   25892                           unsigned rm = ExtractDRegister(instr, 5, 0);
   25893                           // VPMAX{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
   25894                           vpmax(CurrentCond(),
   25895                                 dt,
   25896                                 DRegister(rd),
   25897                                 DRegister(rn),
   25898                                 DRegister(rm));
   25899                           break;
   25900                         }
   25901                         case 0x00000b00: {
   25902                           // 0xef000b00
   25903                           switch (instr & 0x10000000) {
   25904                             case 0x00000000: {
   25905                               // 0xef000b00
   25906                               DataType dt =
   25907                                   Dt_size_13_Decode((instr >> 20) & 0x3);
   25908                               if (dt.Is(kDataTypeValueInvalid)) {
   25909                                 UnallocatedT32(instr);
   25910                                 return;
   25911                               }
   25912                               unsigned rd = ExtractDRegister(instr, 22, 12);
   25913                               unsigned rn = ExtractDRegister(instr, 7, 16);
   25914                               unsigned rm = ExtractDRegister(instr, 5, 0);
   25915                               // VQDMULH{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
   25916                               vqdmulh(CurrentCond(),
   25917                                       dt,
   25918                                       DRegister(rd),
   25919                                       DRegister(rn),
   25920                                       DRegister(rm));
   25921                               break;
   25922                             }
   25923                             case 0x10000000: {
   25924                               // 0xff000b00
   25925                               DataType dt =
   25926                                   Dt_size_13_Decode((instr >> 20) & 0x3);
   25927                               if (dt.Is(kDataTypeValueInvalid)) {
   25928                                 UnallocatedT32(instr);
   25929                                 return;
   25930                               }
   25931                               unsigned rd = ExtractDRegister(instr, 22, 12);
   25932                               unsigned rn = ExtractDRegister(instr, 7, 16);
   25933                               unsigned rm = ExtractDRegister(instr, 5, 0);
   25934                               // VQRDMULH{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
   25935                               vqrdmulh(CurrentCond(),
   25936                                        dt,
   25937                                        DRegister(rd),
   25938                                        DRegister(rn),
   25939                                        DRegister(rm));
   25940                               break;
   25941                             }
   25942                           }
   25943                           break;
   25944                         }
   25945                         case 0x00000b40: {
   25946                           // 0xef000b40
   25947                           switch (instr & 0x10000000) {
   25948                             case 0x00000000: {
   25949                               // 0xef000b40
   25950                               DataType dt =
   25951                                   Dt_size_13_Decode((instr >> 20) & 0x3);
   25952                               if (dt.Is(kDataTypeValueInvalid)) {
   25953                                 UnallocatedT32(instr);
   25954                                 return;
   25955                               }
   25956                               if (((instr >> 12) & 1) != 0) {
   25957                                 UnallocatedT32(instr);
   25958                                 return;
   25959                               }
   25960                               unsigned rd = ExtractQRegister(instr, 22, 12);
   25961                               if (((instr >> 16) & 1) != 0) {
   25962                                 UnallocatedT32(instr);
   25963                                 return;
   25964                               }
   25965                               unsigned rn = ExtractQRegister(instr, 7, 16);
   25966                               if ((instr & 1) != 0) {
   25967                                 UnallocatedT32(instr);
   25968                                 return;
   25969                               }
   25970                               unsigned rm = ExtractQRegister(instr, 5, 0);
   25971                               // VQDMULH{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
   25972                               vqdmulh(CurrentCond(),
   25973                                       dt,
   25974                                       QRegister(rd),
   25975                                       QRegister(rn),
   25976                                       QRegister(rm));
   25977                               break;
   25978                             }
   25979                             case 0x10000000: {
   25980                               // 0xff000b40
   25981                               DataType dt =
   25982                                   Dt_size_13_Decode((instr >> 20) & 0x3);
   25983                               if (dt.Is(kDataTypeValueInvalid)) {
   25984                                 UnallocatedT32(instr);
   25985                                 return;
   25986                               }
   25987                               if (((instr >> 12) & 1) != 0) {
   25988                                 UnallocatedT32(instr);
   25989                                 return;
   25990                               }
   25991                               unsigned rd = ExtractQRegister(instr, 22, 12);
   25992                               if (((instr >> 16) & 1) != 0) {
   25993                                 UnallocatedT32(instr);
   25994                                 return;
   25995                               }
   25996                               unsigned rn = ExtractQRegister(instr, 7, 16);
   25997                               if ((instr & 1) != 0) {
   25998                                 UnallocatedT32(instr);
   25999                                 return;
   26000                               }
   26001                               unsigned rm = ExtractQRegister(instr, 5, 0);
   26002                               // VQRDMULH{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
   26003                               vqrdmulh(CurrentCond(),
   26004                                        dt,
   26005                                        QRegister(rd),
   26006                                        QRegister(rn),
   26007                                        QRegister(rm));
   26008                               break;
   26009                             }
   26010                           }
   26011                           break;
   26012                         }
   26013                         case 0x00000c40: {
   26014                           // 0xef000c40
   26015                           switch (instr & 0x10300000) {
   26016                             case 0x00000000: {
   26017                               // 0xef000c40
   26018                               UnimplementedT32_32("SHA1C", instr);
   26019                               break;
   26020                             }
   26021                             case 0x00100000: {
   26022                               // 0xef100c40
   26023                               UnimplementedT32_32("SHA1P", instr);
   26024                               break;
   26025                             }
   26026                             case 0x00200000: {
   26027                               // 0xef200c40
   26028                               UnimplementedT32_32("SHA1M", instr);
   26029                               break;
   26030                             }
   26031                             case 0x00300000: {
   26032                               // 0xef300c40
   26033                               UnimplementedT32_32("SHA1SU0", instr);
   26034                               break;
   26035                             }
   26036                             case 0x10000000: {
   26037                               // 0xff000c40
   26038                               UnimplementedT32_32("SHA256H", instr);
   26039                               break;
   26040                             }
   26041                             case 0x10100000: {
   26042                               // 0xff100c40
   26043                               UnimplementedT32_32("SHA256H2", instr);
   26044                               break;
   26045                             }
   26046                             case 0x10200000: {
   26047                               // 0xff200c40
   26048                               UnimplementedT32_32("SHA256SU1", instr);
   26049                               break;
   26050                             }
   26051                             default:
   26052                               UnallocatedT32(instr);
   26053                               break;
   26054                           }
   26055                           break;
   26056                         }
   26057                         case 0x00000d00: {
   26058                           // 0xef000d00
   26059                           switch (instr & 0x10300000) {
   26060                             case 0x00000000: {
   26061                               // 0xef000d00
   26062                               unsigned rd = ExtractDRegister(instr, 22, 12);
   26063                               unsigned rn = ExtractDRegister(instr, 7, 16);
   26064                               unsigned rm = ExtractDRegister(instr, 5, 0);
   26065                               // VADD{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T1
   26066                               vadd(CurrentCond(),
   26067                                    F32,
   26068                                    DRegister(rd),
   26069                                    DRegister(rn),
   26070                                    DRegister(rm));
   26071                               break;
   26072                             }
   26073                             case 0x00200000: {
   26074                               // 0xef200d00
   26075                               unsigned rd = ExtractDRegister(instr, 22, 12);
   26076                               unsigned rn = ExtractDRegister(instr, 7, 16);
   26077                               unsigned rm = ExtractDRegister(instr, 5, 0);
   26078                               // VSUB{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T1
   26079                               vsub(CurrentCond(),
   26080                                    F32,
   26081                                    DRegister(rd),
   26082                                    DRegister(rn),
   26083                                    DRegister(rm));
   26084                               break;
   26085                             }
   26086                             case 0x10000000: {
   26087                               // 0xff000d00
   26088                               unsigned rd = ExtractDRegister(instr, 22, 12);
   26089                               unsigned rn = ExtractDRegister(instr, 7, 16);
   26090                               unsigned rm = ExtractDRegister(instr, 5, 0);
   26091                               // VPADD{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T1
   26092                               vpadd(CurrentCond(),
   26093                                     F32,
   26094                                     DRegister(rd),
   26095                                     DRegister(rn),
   26096                                     DRegister(rm));
   26097                               break;
   26098                             }
   26099                             case 0x10200000: {
   26100                               // 0xff200d00
   26101                               unsigned rd = ExtractDRegister(instr, 22, 12);
   26102                               unsigned rn = ExtractDRegister(instr, 7, 16);
   26103                               unsigned rm = ExtractDRegister(instr, 5, 0);
   26104                               // VABD{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T1
   26105                               vabd(CurrentCond(),
   26106                                    F32,
   26107                                    DRegister(rd),
   26108                                    DRegister(rn),
   26109                                    DRegister(rm));
   26110                               break;
   26111                             }
   26112                             default:
   26113                               UnallocatedT32(instr);
   26114                               break;
   26115                           }
   26116                           break;
   26117                         }
   26118                         case 0x00000d40: {
   26119                           // 0xef000d40
   26120                           switch (instr & 0x10300000) {
   26121                             case 0x00000000: {
   26122                               // 0xef000d40
   26123                               if (((instr >> 12) & 1) != 0) {
   26124                                 UnallocatedT32(instr);
   26125                                 return;
   26126                               }
   26127                               unsigned rd = ExtractQRegister(instr, 22, 12);
   26128                               if (((instr >> 16) & 1) != 0) {
   26129                                 UnallocatedT32(instr);
   26130                                 return;
   26131                               }
   26132                               unsigned rn = ExtractQRegister(instr, 7, 16);
   26133                               if ((instr & 1) != 0) {
   26134                                 UnallocatedT32(instr);
   26135                                 return;
   26136                               }
   26137                               unsigned rm = ExtractQRegister(instr, 5, 0);
   26138                               // VADD{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; T1
   26139                               vadd(CurrentCond(),
   26140                                    F32,
   26141                                    QRegister(rd),
   26142                                    QRegister(rn),
   26143                                    QRegister(rm));
   26144                               break;
   26145                             }
   26146                             case 0x00200000: {
   26147                               // 0xef200d40
   26148                               if (((instr >> 12) & 1) != 0) {
   26149                                 UnallocatedT32(instr);
   26150                                 return;
   26151                               }
   26152                               unsigned rd = ExtractQRegister(instr, 22, 12);
   26153                               if (((instr >> 16) & 1) != 0) {
   26154                                 UnallocatedT32(instr);
   26155                                 return;
   26156                               }
   26157                               unsigned rn = ExtractQRegister(instr, 7, 16);
   26158                               if ((instr & 1) != 0) {
   26159                                 UnallocatedT32(instr);
   26160                                 return;
   26161                               }
   26162                               unsigned rm = ExtractQRegister(instr, 5, 0);
   26163                               // VSUB{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; T1
   26164                               vsub(CurrentCond(),
   26165                                    F32,
   26166                                    QRegister(rd),
   26167                                    QRegister(rn),
   26168                                    QRegister(rm));
   26169                               break;
   26170                             }
   26171                             case 0x10200000: {
   26172                               // 0xff200d40
   26173                               if (((instr >> 12) & 1) != 0) {
   26174                                 UnallocatedT32(instr);
   26175                                 return;
   26176                               }
   26177                               unsigned rd = ExtractQRegister(instr, 22, 12);
   26178                               if (((instr >> 16) & 1) != 0) {
   26179                                 UnallocatedT32(instr);
   26180                                 return;
   26181                               }
   26182                               unsigned rn = ExtractQRegister(instr, 7, 16);
   26183                               if ((instr & 1) != 0) {
   26184                                 UnallocatedT32(instr);
   26185                                 return;
   26186                               }
   26187                               unsigned rm = ExtractQRegister(instr, 5, 0);
   26188                               // VABD{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; T1
   26189                               vabd(CurrentCond(),
   26190                                    F32,
   26191                                    QRegister(rd),
   26192                                    QRegister(rn),
   26193                                    QRegister(rm));
   26194                               break;
   26195                             }
   26196                             default:
   26197                               UnallocatedT32(instr);
   26198                               break;
   26199                           }
   26200                           break;
   26201                         }
   26202                         case 0x00000e00: {
   26203                           // 0xef000e00
   26204                           switch (instr & 0x10200000) {
   26205                             case 0x00000000: {
   26206                               // 0xef000e00
   26207                               DataType dt = Dt_sz_1_Decode((instr >> 20) & 0x1);
   26208                               if (dt.Is(kDataTypeValueInvalid)) {
   26209                                 UnallocatedT32(instr);
   26210                                 return;
   26211                               }
   26212                               unsigned rd = ExtractDRegister(instr, 22, 12);
   26213                               unsigned rn = ExtractDRegister(instr, 7, 16);
   26214                               unsigned rm = ExtractDRegister(instr, 5, 0);
   26215                               // VCEQ{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T2
   26216                               vceq(CurrentCond(),
   26217                                    dt,
   26218                                    DRegister(rd),
   26219                                    DRegister(rn),
   26220                                    DRegister(rm));
   26221                               break;
   26222                             }
   26223                             case 0x10000000: {
   26224                               // 0xff000e00
   26225                               if ((instr & 0x00100000) == 0x00000000) {
   26226                                 unsigned rd = ExtractDRegister(instr, 22, 12);
   26227                                 unsigned rn = ExtractDRegister(instr, 7, 16);
   26228                                 unsigned rm = ExtractDRegister(instr, 5, 0);
   26229                                 // VCGE{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T2
   26230                                 vcge(CurrentCond(),
   26231                                      F32,
   26232                                      DRegister(rd),
   26233                                      DRegister(rn),
   26234                                      DRegister(rm));
   26235                               } else {
   26236                                 UnallocatedT32(instr);
   26237                               }
   26238                               break;
   26239                             }
   26240                             case 0x10200000: {
   26241                               // 0xff200e00
   26242                               if ((instr & 0x00100000) == 0x00000000) {
   26243                                 unsigned rd = ExtractDRegister(instr, 22, 12);
   26244                                 unsigned rn = ExtractDRegister(instr, 7, 16);
   26245                                 unsigned rm = ExtractDRegister(instr, 5, 0);
   26246                                 // VCGT{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T2
   26247                                 vcgt(CurrentCond(),
   26248                                      F32,
   26249                                      DRegister(rd),
   26250                                      DRegister(rn),
   26251                                      DRegister(rm));
   26252                               } else {
   26253                                 UnallocatedT32(instr);
   26254                               }
   26255                               break;
   26256                             }
   26257                             default:
   26258                               UnallocatedT32(instr);
   26259                               break;
   26260                           }
   26261                           break;
   26262                         }
   26263                         case 0x00000e40: {
   26264                           // 0xef000e40
   26265                           switch (instr & 0x10200000) {
   26266                             case 0x00000000: {
   26267                               // 0xef000e40
   26268                               DataType dt = Dt_sz_1_Decode((instr >> 20) & 0x1);
   26269                               if (dt.Is(kDataTypeValueInvalid)) {
   26270                                 UnallocatedT32(instr);
   26271                                 return;
   26272                               }
   26273                               if (((instr >> 12) & 1) != 0) {
   26274                                 UnallocatedT32(instr);
   26275                                 return;
   26276                               }
   26277                               unsigned rd = ExtractQRegister(instr, 22, 12);
   26278                               if (((instr >> 16) & 1) != 0) {
   26279                                 UnallocatedT32(instr);
   26280                                 return;
   26281                               }
   26282                               unsigned rn = ExtractQRegister(instr, 7, 16);
   26283                               if ((instr & 1) != 0) {
   26284                                 UnallocatedT32(instr);
   26285                                 return;
   26286                               }
   26287                               unsigned rm = ExtractQRegister(instr, 5, 0);
   26288                               // VCEQ{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T2
   26289                               vceq(CurrentCond(),
   26290                                    dt,
   26291                                    QRegister(rd),
   26292                                    QRegister(rn),
   26293                                    QRegister(rm));
   26294                               break;
   26295                             }
   26296                             case 0x10000000: {
   26297                               // 0xff000e40
   26298                               if ((instr & 0x00100000) == 0x00000000) {
   26299                                 if (((instr >> 12) & 1) != 0) {
   26300                                   UnallocatedT32(instr);
   26301                                   return;
   26302                                 }
   26303                                 unsigned rd = ExtractQRegister(instr, 22, 12);
   26304                                 if (((instr >> 16) & 1) != 0) {
   26305                                   UnallocatedT32(instr);
   26306                                   return;
   26307                                 }
   26308                                 unsigned rn = ExtractQRegister(instr, 7, 16);
   26309                                 if ((instr & 1) != 0) {
   26310                                   UnallocatedT32(instr);
   26311                                   return;
   26312                                 }
   26313                                 unsigned rm = ExtractQRegister(instr, 5, 0);
   26314                                 // VCGE{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; T2
   26315                                 vcge(CurrentCond(),
   26316                                      F32,
   26317                                      QRegister(rd),
   26318                                      QRegister(rn),
   26319                                      QRegister(rm));
   26320                               } else {
   26321                                 UnallocatedT32(instr);
   26322                               }
   26323                               break;
   26324                             }
   26325                             case 0x10200000: {
   26326                               // 0xff200e40
   26327                               if ((instr & 0x00100000) == 0x00000000) {
   26328                                 if (((instr >> 12) & 1) != 0) {
   26329                                   UnallocatedT32(instr);
   26330                                   return;
   26331                                 }
   26332                                 unsigned rd = ExtractQRegister(instr, 22, 12);
   26333                                 if (((instr >> 16) & 1) != 0) {
   26334                                   UnallocatedT32(instr);
   26335                                   return;
   26336                                 }
   26337                                 unsigned rn = ExtractQRegister(instr, 7, 16);
   26338                                 if ((instr & 1) != 0) {
   26339                                   UnallocatedT32(instr);
   26340                                   return;
   26341                                 }
   26342                                 unsigned rm = ExtractQRegister(instr, 5, 0);
   26343                                 // VCGT{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; T2
   26344                                 vcgt(CurrentCond(),
   26345                                      F32,
   26346                                      QRegister(rd),
   26347                                      QRegister(rn),
   26348                                      QRegister(rm));
   26349                               } else {
   26350                                 UnallocatedT32(instr);
   26351                               }
   26352                               break;
   26353                             }
   26354                             default:
   26355                               UnallocatedT32(instr);
   26356                               break;
   26357                           }
   26358                           break;
   26359                         }
   26360                         case 0x00000f00: {
   26361                           // 0xef000f00
   26362                           switch (instr & 0x10300000) {
   26363                             case 0x00000000: {
   26364                               // 0xef000f00
   26365                               unsigned rd = ExtractDRegister(instr, 22, 12);
   26366                               unsigned rn = ExtractDRegister(instr, 7, 16);
   26367                               unsigned rm = ExtractDRegister(instr, 5, 0);
   26368                               // VMAX{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T1
   26369                               vmax(CurrentCond(),
   26370                                    F32,
   26371                                    DRegister(rd),
   26372                                    DRegister(rn),
   26373                                    DRegister(rm));
   26374                               break;
   26375                             }
   26376                             case 0x00200000: {
   26377                               // 0xef200f00
   26378                               unsigned rd = ExtractDRegister(instr, 22, 12);
   26379                               unsigned rn = ExtractDRegister(instr, 7, 16);
   26380                               unsigned rm = ExtractDRegister(instr, 5, 0);
   26381                               // VMIN{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T1
   26382                               vmin(CurrentCond(),
   26383                                    F32,
   26384                                    DRegister(rd),
   26385                                    DRegister(rn),
   26386                                    DRegister(rm));
   26387                               break;
   26388                             }
   26389                             case 0x10000000: {
   26390                               // 0xff000f00
   26391                               unsigned rd = ExtractDRegister(instr, 22, 12);
   26392                               unsigned rn = ExtractDRegister(instr, 7, 16);
   26393                               unsigned rm = ExtractDRegister(instr, 5, 0);
   26394                               // VPMAX{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T1
   26395                               vpmax(CurrentCond(),
   26396                                     F32,
   26397                                     DRegister(rd),
   26398                                     DRegister(rn),
   26399                                     DRegister(rm));
   26400                               break;
   26401                             }
   26402                             case 0x10200000: {
   26403                               // 0xff200f00
   26404                               unsigned rd = ExtractDRegister(instr, 22, 12);
   26405                               unsigned rn = ExtractDRegister(instr, 7, 16);
   26406                               unsigned rm = ExtractDRegister(instr, 5, 0);
   26407                               // VPMIN{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T1
   26408                               vpmin(CurrentCond(),
   26409                                     F32,
   26410                                     DRegister(rd),
   26411                                     DRegister(rn),
   26412                                     DRegister(rm));
   26413                               break;
   26414                             }
   26415                             default:
   26416                               UnallocatedT32(instr);
   26417                               break;
   26418                           }
   26419                           break;
   26420                         }
   26421                         case 0x00000f40: {
   26422                           // 0xef000f40
   26423                           switch (instr & 0x10300000) {
   26424                             case 0x00000000: {
   26425                               // 0xef000f40
   26426                               if (((instr >> 12) & 1) != 0) {
   26427                                 UnallocatedT32(instr);
   26428                                 return;
   26429                               }
   26430                               unsigned rd = ExtractQRegister(instr, 22, 12);
   26431                               if (((instr >> 16) & 1) != 0) {
   26432                                 UnallocatedT32(instr);
   26433                                 return;
   26434                               }
   26435                               unsigned rn = ExtractQRegister(instr, 7, 16);
   26436                               if ((instr & 1) != 0) {
   26437                                 UnallocatedT32(instr);
   26438                                 return;
   26439                               }
   26440                               unsigned rm = ExtractQRegister(instr, 5, 0);
   26441                               // VMAX{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; T1
   26442                               vmax(CurrentCond(),
   26443                                    F32,
   26444                                    QRegister(rd),
   26445                                    QRegister(rn),
   26446                                    QRegister(rm));
   26447                               break;
   26448                             }
   26449                             case 0x00200000: {
   26450                               // 0xef200f40
   26451                               if (((instr >> 12) & 1) != 0) {
   26452                                 UnallocatedT32(instr);
   26453                                 return;
   26454                               }
   26455                               unsigned rd = ExtractQRegister(instr, 22, 12);
   26456                               if (((instr >> 16) & 1) != 0) {
   26457                                 UnallocatedT32(instr);
   26458                                 return;
   26459                               }
   26460                               unsigned rn = ExtractQRegister(instr, 7, 16);
   26461                               if ((instr & 1) != 0) {
   26462                                 UnallocatedT32(instr);
   26463                                 return;
   26464                               }
   26465                               unsigned rm = ExtractQRegister(instr, 5, 0);
   26466                               // VMIN{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; T1
   26467                               vmin(CurrentCond(),
   26468                                    F32,
   26469                                    QRegister(rd),
   26470                                    QRegister(rn),
   26471                                    QRegister(rm));
   26472                               break;
   26473                             }
   26474                             default:
   26475                               UnallocatedT32(instr);
   26476                               break;
   26477                           }
   26478                           break;
   26479                         }
   26480                         default:
   26481                           UnallocatedT32(instr);
   26482                           break;
   26483                       }
   26484                       break;
   26485                     }
   26486                     case 0x00800000: {
   26487                       // 0xef800000
   26488                       switch (instr & 0x00300000) {
   26489                         case 0x00300000: {
   26490                           // 0xefb00000
   26491                           switch (instr & 0x10000000) {
   26492                             case 0x00000000: {
   26493                               // 0xefb00000
   26494                               switch (instr & 0x00000040) {
   26495                                 case 0x00000000: {
   26496                                   // 0xefb00000
   26497                                   if (((instr & 0x800) == 0x800)) {
   26498                                     UnallocatedT32(instr);
   26499                                     return;
   26500                                   }
   26501                                   unsigned rd = ExtractDRegister(instr, 22, 12);
   26502                                   unsigned rn = ExtractDRegister(instr, 7, 16);
   26503                                   unsigned rm = ExtractDRegister(instr, 5, 0);
   26504                                   uint32_t imm = (instr >> 8) & 0xf;
   26505                                   // VEXT{<c>}{<q>}.8 {<Dd>}, <Dn>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   26506                                   vext(CurrentCond(),
   26507                                        Untyped8,
   26508                                        DRegister(rd),
   26509                                        DRegister(rn),
   26510                                        DRegister(rm),
   26511                                        imm);
   26512                                   break;
   26513                                 }
   26514                                 case 0x00000040: {
   26515                                   // 0xefb00040
   26516                                   if (((instr >> 12) & 1) != 0) {
   26517                                     UnallocatedT32(instr);
   26518                                     return;
   26519                                   }
   26520                                   unsigned rd = ExtractQRegister(instr, 22, 12);
   26521                                   if (((instr >> 16) & 1) != 0) {
   26522                                     UnallocatedT32(instr);
   26523                                     return;
   26524                                   }
   26525                                   unsigned rn = ExtractQRegister(instr, 7, 16);
   26526                                   if ((instr & 1) != 0) {
   26527                                     UnallocatedT32(instr);
   26528                                     return;
   26529                                   }
   26530                                   unsigned rm = ExtractQRegister(instr, 5, 0);
   26531                                   uint32_t imm = (instr >> 8) & 0xf;
   26532                                   // VEXT{<c>}{<q>}.8 {<Qd>}, <Qn>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   26533                                   vext(CurrentCond(),
   26534                                        Untyped8,
   26535                                        QRegister(rd),
   26536                                        QRegister(rn),
   26537                                        QRegister(rm),
   26538                                        imm);
   26539                                   break;
   26540                                 }
   26541                               }
   26542                               break;
   26543                             }
   26544                             case 0x10000000: {
   26545                               // 0xffb00000
   26546                               switch (instr & 0x00000800) {
   26547                                 case 0x00000000: {
   26548                                   // 0xffb00000
   26549                                   switch (instr & 0x00030200) {
   26550                                     case 0x00000000: {
   26551                                       // 0xffb00000
   26552                                       switch (instr & 0x000005c0) {
   26553                                         case 0x00000000: {
   26554                                           // 0xffb00000
   26555                                           DataType dt = Dt_size_7_Decode(
   26556                                               (instr >> 18) & 0x3);
   26557                                           if (dt.Is(kDataTypeValueInvalid)) {
   26558                                             UnallocatedT32(instr);
   26559                                             return;
   26560                                           }
   26561                                           unsigned rd =
   26562                                               ExtractDRegister(instr, 22, 12);
   26563                                           unsigned rm =
   26564                                               ExtractDRegister(instr, 5, 0);
   26565                                           // VREV64{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
   26566                                           vrev64(CurrentCond(),
   26567                                                  dt,
   26568                                                  DRegister(rd),
   26569                                                  DRegister(rm));
   26570                                           break;
   26571                                         }
   26572                                         case 0x00000040: {
   26573                                           // 0xffb00040
   26574                                           DataType dt = Dt_size_7_Decode(
   26575                                               (instr >> 18) & 0x3);
   26576                                           if (dt.Is(kDataTypeValueInvalid)) {
   26577                                             UnallocatedT32(instr);
   26578                                             return;
   26579                                           }
   26580                                           if (((instr >> 12) & 1) != 0) {
   26581                                             UnallocatedT32(instr);
   26582                                             return;
   26583                                           }
   26584                                           unsigned rd =
   26585                                               ExtractQRegister(instr, 22, 12);
   26586                                           if ((instr & 1) != 0) {
   26587                                             UnallocatedT32(instr);
   26588                                             return;
   26589                                           }
   26590                                           unsigned rm =
   26591                                               ExtractQRegister(instr, 5, 0);
   26592                                           // VREV64{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
   26593                                           vrev64(CurrentCond(),
   26594                                                  dt,
   26595                                                  QRegister(rd),
   26596                                                  QRegister(rm));
   26597                                           break;
   26598                                         }
   26599                                         case 0x00000080: {
   26600                                           // 0xffb00080
   26601                                           DataType dt = Dt_size_15_Decode(
   26602                                               (instr >> 18) & 0x3);
   26603                                           if (dt.Is(kDataTypeValueInvalid)) {
   26604                                             UnallocatedT32(instr);
   26605                                             return;
   26606                                           }
   26607                                           unsigned rd =
   26608                                               ExtractDRegister(instr, 22, 12);
   26609                                           unsigned rm =
   26610                                               ExtractDRegister(instr, 5, 0);
   26611                                           // VREV32{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
   26612                                           vrev32(CurrentCond(),
   26613                                                  dt,
   26614                                                  DRegister(rd),
   26615                                                  DRegister(rm));
   26616                                           break;
   26617                                         }
   26618                                         case 0x000000c0: {
   26619                                           // 0xffb000c0
   26620                                           DataType dt = Dt_size_15_Decode(
   26621                                               (instr >> 18) & 0x3);
   26622                                           if (dt.Is(kDataTypeValueInvalid)) {
   26623                                             UnallocatedT32(instr);
   26624                                             return;
   26625                                           }
   26626                                           if (((instr >> 12) & 1) != 0) {
   26627                                             UnallocatedT32(instr);
   26628                                             return;
   26629                                           }
   26630                                           unsigned rd =
   26631                                               ExtractQRegister(instr, 22, 12);
   26632                                           if ((instr & 1) != 0) {
   26633                                             UnallocatedT32(instr);
   26634                                             return;
   26635                                           }
   26636                                           unsigned rm =
   26637                                               ExtractQRegister(instr, 5, 0);
   26638                                           // VREV32{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
   26639                                           vrev32(CurrentCond(),
   26640                                                  dt,
   26641                                                  QRegister(rd),
   26642                                                  QRegister(rm));
   26643                                           break;
   26644                                         }
   26645                                         case 0x00000100: {
   26646                                           // 0xffb00100
   26647                                           DataType dt = Dt_size_1_Decode(
   26648                                               (instr >> 18) & 0x3);
   26649                                           if (dt.Is(kDataTypeValueInvalid)) {
   26650                                             UnallocatedT32(instr);
   26651                                             return;
   26652                                           }
   26653                                           unsigned rd =
   26654                                               ExtractDRegister(instr, 22, 12);
   26655                                           unsigned rm =
   26656                                               ExtractDRegister(instr, 5, 0);
   26657                                           // VREV16{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
   26658                                           vrev16(CurrentCond(),
   26659                                                  dt,
   26660                                                  DRegister(rd),
   26661                                                  DRegister(rm));
   26662                                           break;
   26663                                         }
   26664                                         case 0x00000140: {
   26665                                           // 0xffb00140
   26666                                           DataType dt = Dt_size_1_Decode(
   26667                                               (instr >> 18) & 0x3);
   26668                                           if (dt.Is(kDataTypeValueInvalid)) {
   26669                                             UnallocatedT32(instr);
   26670                                             return;
   26671                                           }
   26672                                           if (((instr >> 12) & 1) != 0) {
   26673                                             UnallocatedT32(instr);
   26674                                             return;
   26675                                           }
   26676                                           unsigned rd =
   26677                                               ExtractQRegister(instr, 22, 12);
   26678                                           if ((instr & 1) != 0) {
   26679                                             UnallocatedT32(instr);
   26680                                             return;
   26681                                           }
   26682                                           unsigned rm =
   26683                                               ExtractQRegister(instr, 5, 0);
   26684                                           // VREV16{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
   26685                                           vrev16(CurrentCond(),
   26686                                                  dt,
   26687                                                  QRegister(rd),
   26688                                                  QRegister(rm));
   26689                                           break;
   26690                                         }
   26691                                         case 0x00000400: {
   26692                                           // 0xffb00400
   26693                                           DataType dt = Dt_size_5_Decode(
   26694                                               (instr >> 18) & 0x3);
   26695                                           if (dt.Is(kDataTypeValueInvalid)) {
   26696                                             UnallocatedT32(instr);
   26697                                             return;
   26698                                           }
   26699                                           unsigned rd =
   26700                                               ExtractDRegister(instr, 22, 12);
   26701                                           unsigned rm =
   26702                                               ExtractDRegister(instr, 5, 0);
   26703                                           // VCLS{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1
   26704                                           vcls(CurrentCond(),
   26705                                                dt,
   26706                                                DRegister(rd),
   26707                                                DRegister(rm));
   26708                                           break;
   26709                                         }
   26710                                         case 0x00000440: {
   26711                                           // 0xffb00440
   26712                                           DataType dt = Dt_size_5_Decode(
   26713                                               (instr >> 18) & 0x3);
   26714                                           if (dt.Is(kDataTypeValueInvalid)) {
   26715                                             UnallocatedT32(instr);
   26716                                             return;
   26717                                           }
   26718                                           if (((instr >> 12) & 1) != 0) {
   26719                                             UnallocatedT32(instr);
   26720                                             return;
   26721                                           }
   26722                                           unsigned rd =
   26723                                               ExtractQRegister(instr, 22, 12);
   26724                                           if ((instr & 1) != 0) {
   26725                                             UnallocatedT32(instr);
   26726                                             return;
   26727                                           }
   26728                                           unsigned rm =
   26729                                               ExtractQRegister(instr, 5, 0);
   26730                                           // VCLS{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1
   26731                                           vcls(CurrentCond(),
   26732                                                dt,
   26733                                                QRegister(rd),
   26734                                                QRegister(rm));
   26735                                           break;
   26736                                         }
   26737                                         case 0x00000480: {
   26738                                           // 0xffb00480
   26739                                           DataType dt = Dt_size_4_Decode(
   26740                                               (instr >> 18) & 0x3);
   26741                                           if (dt.Is(kDataTypeValueInvalid)) {
   26742                                             UnallocatedT32(instr);
   26743                                             return;
   26744                                           }
   26745                                           unsigned rd =
   26746                                               ExtractDRegister(instr, 22, 12);
   26747                                           unsigned rm =
   26748                                               ExtractDRegister(instr, 5, 0);
   26749                                           // VCLZ{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1
   26750                                           vclz(CurrentCond(),
   26751                                                dt,
   26752                                                DRegister(rd),
   26753                                                DRegister(rm));
   26754                                           break;
   26755                                         }
   26756                                         case 0x000004c0: {
   26757                                           // 0xffb004c0
   26758                                           DataType dt = Dt_size_4_Decode(
   26759                                               (instr >> 18) & 0x3);
   26760                                           if (dt.Is(kDataTypeValueInvalid)) {
   26761                                             UnallocatedT32(instr);
   26762                                             return;
   26763                                           }
   26764                                           if (((instr >> 12) & 1) != 0) {
   26765                                             UnallocatedT32(instr);
   26766                                             return;
   26767                                           }
   26768                                           unsigned rd =
   26769                                               ExtractQRegister(instr, 22, 12);
   26770                                           if ((instr & 1) != 0) {
   26771                                             UnallocatedT32(instr);
   26772                                             return;
   26773                                           }
   26774                                           unsigned rm =
   26775                                               ExtractQRegister(instr, 5, 0);
   26776                                           // VCLZ{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1
   26777                                           vclz(CurrentCond(),
   26778                                                dt,
   26779                                                QRegister(rd),
   26780                                                QRegister(rm));
   26781                                           break;
   26782                                         }
   26783                                         case 0x00000500: {
   26784                                           // 0xffb00500
   26785                                           if ((instr & 0x000c0000) ==
   26786                                               0x00000000) {
   26787                                             unsigned rd =
   26788                                                 ExtractDRegister(instr, 22, 12);
   26789                                             unsigned rm =
   26790                                                 ExtractDRegister(instr, 5, 0);
   26791                                             // VCNT{<c>}{<q>}.8 <Dd>, <Dm> ; T1
   26792                                             vcnt(CurrentCond(),
   26793                                                  Untyped8,
   26794                                                  DRegister(rd),
   26795                                                  DRegister(rm));
   26796                                           } else {
   26797                                             UnallocatedT32(instr);
   26798                                           }
   26799                                           break;
   26800                                         }
   26801                                         case 0x00000540: {
   26802                                           // 0xffb00540
   26803                                           if ((instr & 0x000c0000) ==
   26804                                               0x00000000) {
   26805                                             if (((instr >> 12) & 1) != 0) {
   26806                                               UnallocatedT32(instr);
   26807                                               return;
   26808                                             }
   26809                                             unsigned rd =
   26810                                                 ExtractQRegister(instr, 22, 12);
   26811                                             if ((instr & 1) != 0) {
   26812                                               UnallocatedT32(instr);
   26813                                               return;
   26814                                             }
   26815                                             unsigned rm =
   26816                                                 ExtractQRegister(instr, 5, 0);
   26817                                             // VCNT{<c>}{<q>}.8 <Qd>, <Qm> ; T1
   26818                                             vcnt(CurrentCond(),
   26819                                                  Untyped8,
   26820                                                  QRegister(rd),
   26821                                                  QRegister(rm));
   26822                                           } else {
   26823                                             UnallocatedT32(instr);
   26824                                           }
   26825                                           break;
   26826                                         }
   26827                                         case 0x00000580: {
   26828                                           // 0xffb00580
   26829                                           if ((instr & 0x000c0000) ==
   26830                                               0x00000000) {
   26831                                             unsigned rd =
   26832                                                 ExtractDRegister(instr, 22, 12);
   26833                                             unsigned rm =
   26834                                                 ExtractDRegister(instr, 5, 0);
   26835                                             // VMVN{<c>}{<q>}{.<dt>} <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
   26836                                             vmvn(CurrentCond(),
   26837                                                  kDataTypeValueNone,
   26838                                                  DRegister(rd),
   26839                                                  DRegister(rm));
   26840                                           } else {
   26841                                             UnallocatedT32(instr);
   26842                                           }
   26843                                           break;
   26844                                         }
   26845                                         case 0x000005c0: {
   26846                                           // 0xffb005c0
   26847                                           if ((instr & 0x000c0000) ==
   26848                                               0x00000000) {
   26849                                             if (((instr >> 12) & 1) != 0) {
   26850                                               UnallocatedT32(instr);
   26851                                               return;
   26852                                             }
   26853                                             unsigned rd =
   26854                                                 ExtractQRegister(instr, 22, 12);
   26855                                             if ((instr & 1) != 0) {
   26856                                               UnallocatedT32(instr);
   26857                                               return;
   26858                                             }
   26859                                             unsigned rm =
   26860                                                 ExtractQRegister(instr, 5, 0);
   26861                                             // VMVN{<c>}{<q>}{.<dt>} <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
   26862                                             vmvn(CurrentCond(),
   26863                                                  kDataTypeValueNone,
   26864                                                  QRegister(rd),
   26865                                                  QRegister(rm));
   26866                                           } else {
   26867                                             UnallocatedT32(instr);
   26868                                           }
   26869                                           break;
   26870                                         }
   26871                                         default:
   26872                                           UnallocatedT32(instr);
   26873                                           break;
   26874                                       }
   26875                                       break;
   26876                                     }
   26877                                     case 0x00000200: {
   26878                                       // 0xffb00200
   26879                                       switch (instr & 0x00000540) {
   26880                                         case 0x00000000: {
   26881                                           // 0xffb00200
   26882                                           DataType dt = Dt_op_size_2_Decode(
   26883                                               ((instr >> 18) & 0x3) |
   26884                                               ((instr >> 5) & 0x4));
   26885                                           if (dt.Is(kDataTypeValueInvalid)) {
   26886                                             UnallocatedT32(instr);
   26887                                             return;
   26888                                           }
   26889                                           unsigned rd =
   26890                                               ExtractDRegister(instr, 22, 12);
   26891                                           unsigned rm =
   26892                                               ExtractDRegister(instr, 5, 0);
   26893                                           // VPADDL{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
   26894                                           vpaddl(CurrentCond(),
   26895                                                  dt,
   26896                                                  DRegister(rd),
   26897                                                  DRegister(rm));
   26898                                           break;
   26899                                         }
   26900                                         case 0x00000040: {
   26901                                           // 0xffb00240
   26902                                           DataType dt = Dt_op_size_2_Decode(
   26903                                               ((instr >> 18) & 0x3) |
   26904                                               ((instr >> 5) & 0x4));
   26905                                           if (dt.Is(kDataTypeValueInvalid)) {
   26906                                             UnallocatedT32(instr);
   26907                                             return;
   26908                                           }
   26909                                           if (((instr >> 12) & 1) != 0) {
   26910                                             UnallocatedT32(instr);
   26911                                             return;
   26912                                           }
   26913                                           unsigned rd =
   26914                                               ExtractQRegister(instr, 22, 12);
   26915                                           if ((instr & 1) != 0) {
   26916                                             UnallocatedT32(instr);
   26917                                             return;
   26918                                           }
   26919                                           unsigned rm =
   26920                                               ExtractQRegister(instr, 5, 0);
   26921                                           // VPADDL{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
   26922                                           vpaddl(CurrentCond(),
   26923                                                  dt,
   26924                                                  QRegister(rd),
   26925                                                  QRegister(rm));
   26926                                           break;
   26927                                         }
   26928                                         case 0x00000100: {
   26929                                           // 0xffb00300
   26930                                           switch (instr & 0x00000080) {
   26931                                             case 0x00000000: {
   26932                                               // 0xffb00300
   26933                                               UnimplementedT32_32("AESE",
   26934                                                                   instr);
   26935                                               break;
   26936                                             }
   26937                                             case 0x00000080: {
   26938                                               // 0xffb00380
   26939                                               UnimplementedT32_32("AESMC",
   26940                                                                   instr);
   26941                                               break;
   26942                                             }
   26943                                           }
   26944                                           break;
   26945                                         }
   26946                                         case 0x00000140: {
   26947                                           // 0xffb00340
   26948                                           switch (instr & 0x00000080) {
   26949                                             case 0x00000000: {
   26950                                               // 0xffb00340
   26951                                               UnimplementedT32_32("AESD",
   26952                                                                   instr);
   26953                                               break;
   26954                                             }
   26955                                             case 0x00000080: {
   26956                                               // 0xffb003c0
   26957                                               UnimplementedT32_32("AESIMC",
   26958                                                                   instr);
   26959                                               break;
   26960                                             }
   26961                                           }
   26962                                           break;
   26963                                         }
   26964                                         case 0x00000400: {
   26965                                           // 0xffb00600
   26966                                           DataType dt = Dt_op_size_2_Decode(
   26967                                               ((instr >> 18) & 0x3) |
   26968                                               ((instr >> 5) & 0x4));
   26969                                           if (dt.Is(kDataTypeValueInvalid)) {
   26970                                             UnallocatedT32(instr);
   26971                                             return;
   26972                                           }
   26973                                           unsigned rd =
   26974                                               ExtractDRegister(instr, 22, 12);
   26975                                           unsigned rm =
   26976                                               ExtractDRegister(instr, 5, 0);
   26977                                           // VPADAL{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
   26978                                           vpadal(CurrentCond(),
   26979                                                  dt,
   26980                                                  DRegister(rd),
   26981                                                  DRegister(rm));
   26982                                           break;
   26983                                         }
   26984                                         case 0x00000440: {
   26985                                           // 0xffb00640
   26986                                           DataType dt = Dt_op_size_2_Decode(
   26987                                               ((instr >> 18) & 0x3) |
   26988                                               ((instr >> 5) & 0x4));
   26989                                           if (dt.Is(kDataTypeValueInvalid)) {
   26990                                             UnallocatedT32(instr);
   26991                                             return;
   26992                                           }
   26993                                           if (((instr >> 12) & 1) != 0) {
   26994                                             UnallocatedT32(instr);
   26995                                             return;
   26996                                           }
   26997                                           unsigned rd =
   26998                                               ExtractQRegister(instr, 22, 12);
   26999                                           if ((instr & 1) != 0) {
   27000                                             UnallocatedT32(instr);
   27001                                             return;
   27002                                           }
   27003                                           unsigned rm =
   27004                                               ExtractQRegister(instr, 5, 0);
   27005                                           // VPADAL{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
   27006                                           vpadal(CurrentCond(),
   27007                                                  dt,
   27008                                                  QRegister(rd),
   27009                                                  QRegister(rm));
   27010                                           break;
   27011                                         }
   27012                                         case 0x00000500: {
   27013                                           // 0xffb00700
   27014                                           switch (instr & 0x00000080) {
   27015                                             case 0x00000000: {
   27016                                               // 0xffb00700
   27017                                               DataType dt = Dt_size_5_Decode(
   27018                                                   (instr >> 18) & 0x3);
   27019                                               if (dt.Is(
   27020                                                       kDataTypeValueInvalid)) {
   27021                                                 UnallocatedT32(instr);
   27022                                                 return;
   27023                                               }
   27024                                               unsigned rd =
   27025                                                   ExtractDRegister(instr,
   27026                                                                    22,
   27027                                                                    12);
   27028                                               unsigned rm =
   27029                                                   ExtractDRegister(instr, 5, 0);
   27030                                               // VQABS{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
   27031                                               vqabs(CurrentCond(),
   27032                                                     dt,
   27033                                                     DRegister(rd),
   27034                                                     DRegister(rm));
   27035                                               break;
   27036                                             }
   27037                                             case 0x00000080: {
   27038                                               // 0xffb00780
   27039                                               DataType dt = Dt_size_5_Decode(
   27040                                                   (instr >> 18) & 0x3);
   27041                                               if (dt.Is(
   27042                                                       kDataTypeValueInvalid)) {
   27043                                                 UnallocatedT32(instr);
   27044                                                 return;
   27045                                               }
   27046                                               unsigned rd =
   27047                                                   ExtractDRegister(instr,
   27048                                                                    22,
   27049                                                                    12);
   27050                                               unsigned rm =
   27051                                                   ExtractDRegister(instr, 5, 0);
   27052                                               // VQNEG{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
   27053                                               vqneg(CurrentCond(),
   27054                                                     dt,
   27055                                                     DRegister(rd),
   27056                                                     DRegister(rm));
   27057                                               break;
   27058                                             }
   27059                                           }
   27060                                           break;
   27061                                         }
   27062                                         case 0x00000540: {
   27063                                           // 0xffb00740
   27064                                           switch (instr & 0x00000080) {
   27065                                             case 0x00000000: {
   27066                                               // 0xffb00740
   27067                                               DataType dt = Dt_size_5_Decode(
   27068                                                   (instr >> 18) & 0x3);
   27069                                               if (dt.Is(
   27070                                                       kDataTypeValueInvalid)) {
   27071                                                 UnallocatedT32(instr);
   27072                                                 return;
   27073                                               }
   27074                                               if (((instr >> 12) & 1) != 0) {
   27075                                                 UnallocatedT32(instr);
   27076                                                 return;
   27077                                               }
   27078                                               unsigned rd =
   27079                                                   ExtractQRegister(instr,
   27080                                                                    22,
   27081                                                                    12);
   27082                                               if ((instr & 1) != 0) {
   27083                                                 UnallocatedT32(instr);
   27084                                                 return;
   27085                                               }
   27086                                               unsigned rm =
   27087                                                   ExtractQRegister(instr, 5, 0);
   27088                                               // VQABS{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
   27089                                               vqabs(CurrentCond(),
   27090                                                     dt,
   27091                                                     QRegister(rd),
   27092                                                     QRegister(rm));
   27093                                               break;
   27094                                             }
   27095                                             case 0x00000080: {
   27096                                               // 0xffb007c0
   27097                                               DataType dt = Dt_size_5_Decode(
   27098                                                   (instr >> 18) & 0x3);
   27099                                               if (dt.Is(
   27100                                                       kDataTypeValueInvalid)) {
   27101                                                 UnallocatedT32(instr);
   27102                                                 return;
   27103                                               }
   27104                                               if (((instr >> 12) & 1) != 0) {
   27105                                                 UnallocatedT32(instr);
   27106                                                 return;
   27107                                               }
   27108                                               unsigned rd =
   27109                                                   ExtractQRegister(instr,
   27110                                                                    22,
   27111                                                                    12);
   27112                                               if ((instr & 1) != 0) {
   27113                                                 UnallocatedT32(instr);
   27114                                                 return;
   27115                                               }
   27116                                               unsigned rm =
   27117                                                   ExtractQRegister(instr, 5, 0);
   27118                                               // VQNEG{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
   27119                                               vqneg(CurrentCond(),
   27120                                                     dt,
   27121                                                     QRegister(rd),
   27122                                                     QRegister(rm));
   27123                                               break;
   27124                                             }
   27125                                           }
   27126                                           break;
   27127                                         }
   27128                                       }
   27129                                       break;
   27130                                     }
   27131                                     case 0x00010000: {
   27132                                       // 0xffb10000
   27133                                       switch (instr & 0x000001c0) {
   27134                                         case 0x00000000: {
   27135                                           // 0xffb10000
   27136                                           DataType dt = Dt_F_size_1_Decode(
   27137                                               ((instr >> 18) & 0x3) |
   27138                                               ((instr >> 8) & 0x4));
   27139                                           if (dt.Is(kDataTypeValueInvalid)) {
   27140                                             UnallocatedT32(instr);
   27141                                             return;
   27142                                           }
   27143                                           unsigned rd =
   27144                                               ExtractDRegister(instr, 22, 12);
   27145                                           unsigned rm =
   27146                                               ExtractDRegister(instr, 5, 0);
   27147                                           // VCGT{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #0 ; T1 NOLINT(whitespace/line_length)
   27148                                           vcgt(CurrentCond(),
   27149                                                dt,
   27150                                                DRegister(rd),
   27151                                                DRegister(rm),
   27152                                                UINT32_C(0));
   27153                                           break;
   27154                                         }
   27155                                         case 0x00000040: {
   27156                                           // 0xffb10040
   27157                                           DataType dt = Dt_F_size_1_Decode(
   27158                                               ((instr >> 18) & 0x3) |
   27159                                               ((instr >> 8) & 0x4));
   27160                                           if (dt.Is(kDataTypeValueInvalid)) {
   27161                                             UnallocatedT32(instr);
   27162                                             return;
   27163                                           }
   27164                                           if (((instr >> 12) & 1) != 0) {
   27165                                             UnallocatedT32(instr);
   27166                                             return;
   27167                                           }
   27168                                           unsigned rd =
   27169                                               ExtractQRegister(instr, 22, 12);
   27170                                           if ((instr & 1) != 0) {
   27171                                             UnallocatedT32(instr);
   27172                                             return;
   27173                                           }
   27174                                           unsigned rm =
   27175                                               ExtractQRegister(instr, 5, 0);
   27176                                           // VCGT{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #0 ; T1 NOLINT(whitespace/line_length)
   27177                                           vcgt(CurrentCond(),
   27178                                                dt,
   27179                                                QRegister(rd),
   27180                                                QRegister(rm),
   27181                                                UINT32_C(0));
   27182                                           break;
   27183                                         }
   27184                                         case 0x00000080: {
   27185                                           // 0xffb10080
   27186                                           DataType dt = Dt_F_size_1_Decode(
   27187                                               ((instr >> 18) & 0x3) |
   27188                                               ((instr >> 8) & 0x4));
   27189                                           if (dt.Is(kDataTypeValueInvalid)) {
   27190                                             UnallocatedT32(instr);
   27191                                             return;
   27192                                           }
   27193                                           unsigned rd =
   27194                                               ExtractDRegister(instr, 22, 12);
   27195                                           unsigned rm =
   27196                                               ExtractDRegister(instr, 5, 0);
   27197                                           // VCGE{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #0 ; T1 NOLINT(whitespace/line_length)
   27198                                           vcge(CurrentCond(),
   27199                                                dt,
   27200                                                DRegister(rd),
   27201                                                DRegister(rm),
   27202                                                UINT32_C(0));
   27203                                           break;
   27204                                         }
   27205                                         case 0x000000c0: {
   27206                                           // 0xffb100c0
   27207                                           DataType dt = Dt_F_size_1_Decode(
   27208                                               ((instr >> 18) & 0x3) |
   27209                                               ((instr >> 8) & 0x4));
   27210                                           if (dt.Is(kDataTypeValueInvalid)) {
   27211                                             UnallocatedT32(instr);
   27212                                             return;
   27213                                           }
   27214                                           if (((instr >> 12) & 1) != 0) {
   27215                                             UnallocatedT32(instr);
   27216                                             return;
   27217                                           }
   27218                                           unsigned rd =
   27219                                               ExtractQRegister(instr, 22, 12);
   27220                                           if ((instr & 1) != 0) {
   27221                                             UnallocatedT32(instr);
   27222                                             return;
   27223                                           }
   27224                                           unsigned rm =
   27225                                               ExtractQRegister(instr, 5, 0);
   27226                                           // VCGE{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #0 ; T1 NOLINT(whitespace/line_length)
   27227                                           vcge(CurrentCond(),
   27228                                                dt,
   27229                                                QRegister(rd),
   27230                                                QRegister(rm),
   27231                                                UINT32_C(0));
   27232                                           break;
   27233                                         }
   27234                                         case 0x00000100: {
   27235                                           // 0xffb10100
   27236                                           DataType dt = Dt_F_size_2_Decode(
   27237                                               ((instr >> 18) & 0x3) |
   27238                                               ((instr >> 8) & 0x4));
   27239                                           if (dt.Is(kDataTypeValueInvalid)) {
   27240                                             UnallocatedT32(instr);
   27241                                             return;
   27242                                           }
   27243                                           unsigned rd =
   27244                                               ExtractDRegister(instr, 22, 12);
   27245                                           unsigned rm =
   27246                                               ExtractDRegister(instr, 5, 0);
   27247                                           // VCEQ{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #0 ; T1 NOLINT(whitespace/line_length)
   27248                                           vceq(CurrentCond(),
   27249                                                dt,
   27250                                                DRegister(rd),
   27251                                                DRegister(rm),
   27252                                                UINT32_C(0));
   27253                                           break;
   27254                                         }
   27255                                         case 0x00000140: {
   27256                                           // 0xffb10140
   27257                                           DataType dt = Dt_F_size_2_Decode(
   27258                                               ((instr >> 18) & 0x3) |
   27259                                               ((instr >> 8) & 0x4));
   27260                                           if (dt.Is(kDataTypeValueInvalid)) {
   27261                                             UnallocatedT32(instr);
   27262                                             return;
   27263                                           }
   27264                                           if (((instr >> 12) & 1) != 0) {
   27265                                             UnallocatedT32(instr);
   27266                                             return;
   27267                                           }
   27268                                           unsigned rd =
   27269                                               ExtractQRegister(instr, 22, 12);
   27270                                           if ((instr & 1) != 0) {
   27271                                             UnallocatedT32(instr);
   27272                                             return;
   27273                                           }
   27274                                           unsigned rm =
   27275                                               ExtractQRegister(instr, 5, 0);
   27276                                           // VCEQ{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #0 ; T1 NOLINT(whitespace/line_length)
   27277                                           vceq(CurrentCond(),
   27278                                                dt,
   27279                                                QRegister(rd),
   27280                                                QRegister(rm),
   27281                                                UINT32_C(0));
   27282                                           break;
   27283                                         }
   27284                                         case 0x00000180: {
   27285                                           // 0xffb10180
   27286                                           DataType dt = Dt_F_size_1_Decode(
   27287                                               ((instr >> 18) & 0x3) |
   27288                                               ((instr >> 8) & 0x4));
   27289                                           if (dt.Is(kDataTypeValueInvalid)) {
   27290                                             UnallocatedT32(instr);
   27291                                             return;
   27292                                           }
   27293                                           unsigned rd =
   27294                                               ExtractDRegister(instr, 22, 12);
   27295                                           unsigned rm =
   27296                                               ExtractDRegister(instr, 5, 0);
   27297                                           // VCLE{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #0 ; T1 NOLINT(whitespace/line_length)
   27298                                           vcle(CurrentCond(),
   27299                                                dt,
   27300                                                DRegister(rd),
   27301                                                DRegister(rm),
   27302                                                UINT32_C(0));
   27303                                           break;
   27304                                         }
   27305                                         case 0x000001c0: {
   27306                                           // 0xffb101c0
   27307                                           DataType dt = Dt_F_size_1_Decode(
   27308                                               ((instr >> 18) & 0x3) |
   27309                                               ((instr >> 8) & 0x4));
   27310                                           if (dt.Is(kDataTypeValueInvalid)) {
   27311                                             UnallocatedT32(instr);
   27312                                             return;
   27313                                           }
   27314                                           if (((instr >> 12) & 1) != 0) {
   27315                                             UnallocatedT32(instr);
   27316                                             return;
   27317                                           }
   27318                                           unsigned rd =
   27319                                               ExtractQRegister(instr, 22, 12);
   27320                                           if ((instr & 1) != 0) {
   27321                                             UnallocatedT32(instr);
   27322                                             return;
   27323                                           }
   27324                                           unsigned rm =
   27325                                               ExtractQRegister(instr, 5, 0);
   27326                                           // VCLE{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #0 ; T1 NOLINT(whitespace/line_length)
   27327                                           vcle(CurrentCond(),
   27328                                                dt,
   27329                                                QRegister(rd),
   27330                                                QRegister(rm),
   27331                                                UINT32_C(0));
   27332                                           break;
   27333                                         }
   27334                                       }
   27335                                       break;
   27336                                     }
   27337                                     case 0x00010200: {
   27338                                       // 0xffb10200
   27339                                       switch (instr & 0x000001c0) {
   27340                                         case 0x00000000: {
   27341                                           // 0xffb10200
   27342                                           DataType dt = Dt_F_size_1_Decode(
   27343                                               ((instr >> 18) & 0x3) |
   27344                                               ((instr >> 8) & 0x4));
   27345                                           if (dt.Is(kDataTypeValueInvalid)) {
   27346                                             UnallocatedT32(instr);
   27347                                             return;
   27348                                           }
   27349                                           unsigned rd =
   27350                                               ExtractDRegister(instr, 22, 12);
   27351                                           unsigned rm =
   27352                                               ExtractDRegister(instr, 5, 0);
   27353                                           // VCLT{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #0 ; T1 NOLINT(whitespace/line_length)
   27354                                           vclt(CurrentCond(),
   27355                                                dt,
   27356                                                DRegister(rd),
   27357                                                DRegister(rm),
   27358                                                UINT32_C(0));
   27359                                           break;
   27360                                         }
   27361                                         case 0x00000040: {
   27362                                           // 0xffb10240
   27363                                           DataType dt = Dt_F_size_1_Decode(
   27364                                               ((instr >> 18) & 0x3) |
   27365                                               ((instr >> 8) & 0x4));
   27366                                           if (dt.Is(kDataTypeValueInvalid)) {
   27367                                             UnallocatedT32(instr);
   27368                                             return;
   27369                                           }
   27370                                           if (((instr >> 12) & 1) != 0) {
   27371                                             UnallocatedT32(instr);
   27372                                             return;
   27373                                           }
   27374                                           unsigned rd =
   27375                                               ExtractQRegister(instr, 22, 12);
   27376                                           if ((instr & 1) != 0) {
   27377                                             UnallocatedT32(instr);
   27378                                             return;
   27379                                           }
   27380                                           unsigned rm =
   27381                                               ExtractQRegister(instr, 5, 0);
   27382                                           // VCLT{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #0 ; T1 NOLINT(whitespace/line_length)
   27383                                           vclt(CurrentCond(),
   27384                                                dt,
   27385                                                QRegister(rd),
   27386                                                QRegister(rm),
   27387                                                UINT32_C(0));
   27388                                           break;
   27389                                         }
   27390                                         case 0x000000c0: {
   27391                                           // 0xffb102c0
   27392                                           if ((instr & 0x000c0400) ==
   27393                                               0x00080000) {
   27394                                             UnimplementedT32_32("SHA1H", instr);
   27395                                           } else {
   27396                                             UnallocatedT32(instr);
   27397                                           }
   27398                                           break;
   27399                                         }
   27400                                         case 0x00000100: {
   27401                                           // 0xffb10300
   27402                                           DataType dt = Dt_F_size_1_Decode(
   27403                                               ((instr >> 18) & 0x3) |
   27404                                               ((instr >> 8) & 0x4));
   27405                                           if (dt.Is(kDataTypeValueInvalid)) {
   27406                                             UnallocatedT32(instr);
   27407                                             return;
   27408                                           }
   27409                                           unsigned rd =
   27410                                               ExtractDRegister(instr, 22, 12);
   27411                                           unsigned rm =
   27412                                               ExtractDRegister(instr, 5, 0);
   27413                                           // VABS{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1
   27414                                           vabs(CurrentCond(),
   27415                                                dt,
   27416                                                DRegister(rd),
   27417                                                DRegister(rm));
   27418                                           break;
   27419                                         }
   27420                                         case 0x00000140: {
   27421                                           // 0xffb10340
   27422                                           DataType dt = Dt_F_size_1_Decode(
   27423                                               ((instr >> 18) & 0x3) |
   27424                                               ((instr >> 8) & 0x4));
   27425                                           if (dt.Is(kDataTypeValueInvalid)) {
   27426                                             UnallocatedT32(instr);
   27427                                             return;
   27428                                           }
   27429                                           if (((instr >> 12) & 1) != 0) {
   27430                                             UnallocatedT32(instr);
   27431                                             return;
   27432                                           }
   27433                                           unsigned rd =
   27434                                               ExtractQRegister(instr, 22, 12);
   27435                                           if ((instr & 1) != 0) {
   27436                                             UnallocatedT32(instr);
   27437                                             return;
   27438                                           }
   27439                                           unsigned rm =
   27440                                               ExtractQRegister(instr, 5, 0);
   27441                                           // VABS{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1
   27442                                           vabs(CurrentCond(),
   27443                                                dt,
   27444                                                QRegister(rd),
   27445                                                QRegister(rm));
   27446                                           break;
   27447                                         }
   27448                                         case 0x00000180: {
   27449                                           // 0xffb10380
   27450                                           DataType dt = Dt_F_size_1_Decode(
   27451                                               ((instr >> 18) & 0x3) |
   27452                                               ((instr >> 8) & 0x4));
   27453                                           if (dt.Is(kDataTypeValueInvalid)) {
   27454                                             UnallocatedT32(instr);
   27455                                             return;
   27456                                           }
   27457                                           unsigned rd =
   27458                                               ExtractDRegister(instr, 22, 12);
   27459                                           unsigned rm =
   27460                                               ExtractDRegister(instr, 5, 0);
   27461                                           // VNEG{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1
   27462                                           vneg(CurrentCond(),
   27463                                                dt,
   27464                                                DRegister(rd),
   27465                                                DRegister(rm));
   27466                                           break;
   27467                                         }
   27468                                         case 0x000001c0: {
   27469                                           // 0xffb103c0
   27470                                           DataType dt = Dt_F_size_1_Decode(
   27471                                               ((instr >> 18) & 0x3) |
   27472                                               ((instr >> 8) & 0x4));
   27473                                           if (dt.Is(kDataTypeValueInvalid)) {
   27474                                             UnallocatedT32(instr);
   27475                                             return;
   27476                                           }
   27477                                           if (((instr >> 12) & 1) != 0) {
   27478                                             UnallocatedT32(instr);
   27479                                             return;
   27480                                           }
   27481                                           unsigned rd =
   27482                                               ExtractQRegister(instr, 22, 12);
   27483                                           if ((instr & 1) != 0) {
   27484                                             UnallocatedT32(instr);
   27485                                             return;
   27486                                           }
   27487                                           unsigned rm =
   27488                                               ExtractQRegister(instr, 5, 0);
   27489                                           // VNEG{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1
   27490                                           vneg(CurrentCond(),
   27491                                                dt,
   27492                                                QRegister(rd),
   27493                                                QRegister(rm));
   27494                                           break;
   27495                                         }
   27496                                         default:
   27497                                           UnallocatedT32(instr);
   27498                                           break;
   27499                                       }
   27500                                       break;
   27501                                     }
   27502                                     case 0x00020000: {
   27503                                       // 0xffb20000
   27504                                       switch (instr & 0x000005c0) {
   27505                                         case 0x00000000: {
   27506                                           // 0xffb20000
   27507                                           if ((instr & 0x000c0000) ==
   27508                                               0x00000000) {
   27509                                             unsigned rd =
   27510                                                 ExtractDRegister(instr, 22, 12);
   27511                                             unsigned rm =
   27512                                                 ExtractDRegister(instr, 5, 0);
   27513                                             // VSWP{<c>}{<q>}{.<dt>} <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
   27514                                             vswp(CurrentCond(),
   27515                                                  kDataTypeValueNone,
   27516                                                  DRegister(rd),
   27517                                                  DRegister(rm));
   27518                                           } else {
   27519                                             UnallocatedT32(instr);
   27520                                           }
   27521                                           break;
   27522                                         }
   27523                                         case 0x00000040: {
   27524                                           // 0xffb20040
   27525                                           if ((instr & 0x000c0000) ==
   27526                                               0x00000000) {
   27527                                             if (((instr >> 12) & 1) != 0) {
   27528                                               UnallocatedT32(instr);
   27529                                               return;
   27530                                             }
   27531                                             unsigned rd =
   27532                                                 ExtractQRegister(instr, 22, 12);
   27533                                             if ((instr & 1) != 0) {
   27534                                               UnallocatedT32(instr);
   27535                                               return;
   27536                                             }
   27537                                             unsigned rm =
   27538                                                 ExtractQRegister(instr, 5, 0);
   27539                                             // VSWP{<c>}{<q>}{.<dt>} <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
   27540                                             vswp(CurrentCond(),
   27541                                                  kDataTypeValueNone,
   27542                                                  QRegister(rd),
   27543                                                  QRegister(rm));
   27544                                           } else {
   27545                                             UnallocatedT32(instr);
   27546                                           }
   27547                                           break;
   27548                                         }
   27549                                         case 0x00000080: {
   27550                                           // 0xffb20080
   27551                                           DataType dt = Dt_size_7_Decode(
   27552                                               (instr >> 18) & 0x3);
   27553                                           if (dt.Is(kDataTypeValueInvalid)) {
   27554                                             UnallocatedT32(instr);
   27555                                             return;
   27556                                           }
   27557                                           unsigned rd =
   27558                                               ExtractDRegister(instr, 22, 12);
   27559                                           unsigned rm =
   27560                                               ExtractDRegister(instr, 5, 0);
   27561                                           // VTRN{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1
   27562                                           vtrn(CurrentCond(),
   27563                                                dt,
   27564                                                DRegister(rd),
   27565                                                DRegister(rm));
   27566                                           break;
   27567                                         }
   27568                                         case 0x000000c0: {
   27569                                           // 0xffb200c0
   27570                                           DataType dt = Dt_size_7_Decode(
   27571                                               (instr >> 18) & 0x3);
   27572                                           if (dt.Is(kDataTypeValueInvalid)) {
   27573                                             UnallocatedT32(instr);
   27574                                             return;
   27575                                           }
   27576                                           if (((instr >> 12) & 1) != 0) {
   27577                                             UnallocatedT32(instr);
   27578                                             return;
   27579                                           }
   27580                                           unsigned rd =
   27581                                               ExtractQRegister(instr, 22, 12);
   27582                                           if ((instr & 1) != 0) {
   27583                                             UnallocatedT32(instr);
   27584                                             return;
   27585                                           }
   27586                                           unsigned rm =
   27587                                               ExtractQRegister(instr, 5, 0);
   27588                                           // VTRN{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1
   27589                                           vtrn(CurrentCond(),
   27590                                                dt,
   27591                                                QRegister(rd),
   27592                                                QRegister(rm));
   27593                                           break;
   27594                                         }
   27595                                         case 0x00000100: {
   27596                                           // 0xffb20100
   27597                                           DataType dt = Dt_size_15_Decode(
   27598                                               (instr >> 18) & 0x3);
   27599                                           if (dt.Is(kDataTypeValueInvalid)) {
   27600                                             UnallocatedT32(instr);
   27601                                             return;
   27602                                           }
   27603                                           unsigned rd =
   27604                                               ExtractDRegister(instr, 22, 12);
   27605                                           unsigned rm =
   27606                                               ExtractDRegister(instr, 5, 0);
   27607                                           // VUZP{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1
   27608                                           vuzp(CurrentCond(),
   27609                                                dt,
   27610                                                DRegister(rd),
   27611                                                DRegister(rm));
   27612                                           break;
   27613                                         }
   27614                                         case 0x00000140: {
   27615                                           // 0xffb20140
   27616                                           DataType dt = Dt_size_7_Decode(
   27617                                               (instr >> 18) & 0x3);
   27618                                           if (dt.Is(kDataTypeValueInvalid)) {
   27619                                             UnallocatedT32(instr);
   27620                                             return;
   27621                                           }
   27622                                           if (((instr >> 12) & 1) != 0) {
   27623                                             UnallocatedT32(instr);
   27624                                             return;
   27625                                           }
   27626                                           unsigned rd =
   27627                                               ExtractQRegister(instr, 22, 12);
   27628                                           if ((instr & 1) != 0) {
   27629                                             UnallocatedT32(instr);
   27630                                             return;
   27631                                           }
   27632                                           unsigned rm =
   27633                                               ExtractQRegister(instr, 5, 0);
   27634                                           // VUZP{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1
   27635                                           vuzp(CurrentCond(),
   27636                                                dt,
   27637                                                QRegister(rd),
   27638                                                QRegister(rm));
   27639                                           break;
   27640                                         }
   27641                                         case 0x00000180: {
   27642                                           // 0xffb20180
   27643                                           DataType dt = Dt_size_15_Decode(
   27644                                               (instr >> 18) & 0x3);
   27645                                           if (dt.Is(kDataTypeValueInvalid)) {
   27646                                             UnallocatedT32(instr);
   27647                                             return;
   27648                                           }
   27649                                           unsigned rd =
   27650                                               ExtractDRegister(instr, 22, 12);
   27651                                           unsigned rm =
   27652                                               ExtractDRegister(instr, 5, 0);
   27653                                           // VZIP{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1
   27654                                           vzip(CurrentCond(),
   27655                                                dt,
   27656                                                DRegister(rd),
   27657                                                DRegister(rm));
   27658                                           break;
   27659                                         }
   27660                                         case 0x000001c0: {
   27661                                           // 0xffb201c0
   27662                                           DataType dt = Dt_size_7_Decode(
   27663                                               (instr >> 18) & 0x3);
   27664                                           if (dt.Is(kDataTypeValueInvalid)) {
   27665                                             UnallocatedT32(instr);
   27666                                             return;
   27667                                           }
   27668                                           if (((instr >> 12) & 1) != 0) {
   27669                                             UnallocatedT32(instr);
   27670                                             return;
   27671                                           }
   27672                                           unsigned rd =
   27673                                               ExtractQRegister(instr, 22, 12);
   27674                                           if ((instr & 1) != 0) {
   27675                                             UnallocatedT32(instr);
   27676                                             return;
   27677                                           }
   27678                                           unsigned rm =
   27679                                               ExtractQRegister(instr, 5, 0);
   27680                                           // VZIP{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1
   27681                                           vzip(CurrentCond(),
   27682                                                dt,
   27683                                                QRegister(rd),
   27684                                                QRegister(rm));
   27685                                           break;
   27686                                         }
   27687                                         case 0x00000400: {
   27688                                           // 0xffb20400
   27689                                           if ((instr & 0x000c0000) ==
   27690                                               0x00080000) {
   27691                                             unsigned rd =
   27692                                                 ExtractDRegister(instr, 22, 12);
   27693                                             unsigned rm =
   27694                                                 ExtractDRegister(instr, 5, 0);
   27695                                             // VRINTN{<q>}.F32.F32 <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
   27696                                             vrintn(F32,
   27697                                                    F32,
   27698                                                    DRegister(rd),
   27699                                                    DRegister(rm));
   27700                                           } else {
   27701                                             UnallocatedT32(instr);
   27702                                           }
   27703                                           break;
   27704                                         }
   27705                                         case 0x00000440: {
   27706                                           // 0xffb20440
   27707                                           if ((instr & 0x000c0000) ==
   27708                                               0x00080000) {
   27709                                             if (((instr >> 12) & 1) != 0) {
   27710                                               UnallocatedT32(instr);
   27711                                               return;
   27712                                             }
   27713                                             unsigned rd =
   27714                                                 ExtractQRegister(instr, 22, 12);
   27715                                             if ((instr & 1) != 0) {
   27716                                               UnallocatedT32(instr);
   27717                                               return;
   27718                                             }
   27719                                             unsigned rm =
   27720                                                 ExtractQRegister(instr, 5, 0);
   27721                                             // VRINTN{<q>}.F32.F32 <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
   27722                                             vrintn(F32,
   27723                                                    F32,
   27724                                                    QRegister(rd),
   27725                                                    QRegister(rm));
   27726                                           } else {
   27727                                             UnallocatedT32(instr);
   27728                                           }
   27729                                           break;
   27730                                         }
   27731                                         case 0x00000480: {
   27732                                           // 0xffb20480
   27733                                           if ((instr & 0x000c0000) ==
   27734                                               0x00080000) {
   27735                                             unsigned rd =
   27736                                                 ExtractDRegister(instr, 22, 12);
   27737                                             unsigned rm =
   27738                                                 ExtractDRegister(instr, 5, 0);
   27739                                             // VRINTX{<q>}.F32.F32 <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
   27740                                             vrintx(Condition::None(),
   27741                                                    F32,
   27742                                                    F32,
   27743                                                    DRegister(rd),
   27744                                                    DRegister(rm));
   27745                                           } else {
   27746                                             UnallocatedT32(instr);
   27747                                           }
   27748                                           break;
   27749                                         }
   27750                                         case 0x000004c0: {
   27751                                           // 0xffb204c0
   27752                                           if ((instr & 0x000c0000) ==
   27753                                               0x00080000) {
   27754                                             if (((instr >> 12) & 1) != 0) {
   27755                                               UnallocatedT32(instr);
   27756                                               return;
   27757                                             }
   27758                                             unsigned rd =
   27759                                                 ExtractQRegister(instr, 22, 12);
   27760                                             if ((instr & 1) != 0) {
   27761                                               UnallocatedT32(instr);
   27762                                               return;
   27763                                             }
   27764                                             unsigned rm =
   27765                                                 ExtractQRegister(instr, 5, 0);
   27766                                             // VRINTX{<q>}.F32.F32 <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
   27767                                             vrintx(F32,
   27768                                                    F32,
   27769                                                    QRegister(rd),
   27770                                                    QRegister(rm));
   27771                                           } else {
   27772                                             UnallocatedT32(instr);
   27773                                           }
   27774                                           break;
   27775                                         }
   27776                                         case 0x00000500: {
   27777                                           // 0xffb20500
   27778                                           if ((instr & 0x000c0000) ==
   27779                                               0x00080000) {
   27780                                             unsigned rd =
   27781                                                 ExtractDRegister(instr, 22, 12);
   27782                                             unsigned rm =
   27783                                                 ExtractDRegister(instr, 5, 0);
   27784                                             // VRINTA{<q>}.F32.F32 <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
   27785                                             vrinta(F32,
   27786                                                    F32,
   27787                                                    DRegister(rd),
   27788                                                    DRegister(rm));
   27789                                           } else {
   27790                                             UnallocatedT32(instr);
   27791                                           }
   27792                                           break;
   27793                                         }
   27794                                         case 0x00000540: {
   27795                                           // 0xffb20540
   27796                                           if ((instr & 0x000c0000) ==
   27797                                               0x00080000) {
   27798                                             if (((instr >> 12) & 1) != 0) {
   27799                                               UnallocatedT32(instr);
   27800                                               return;
   27801                                             }
   27802                                             unsigned rd =
   27803                                                 ExtractQRegister(instr, 22, 12);
   27804                                             if ((instr & 1) != 0) {
   27805                                               UnallocatedT32(instr);
   27806                                               return;
   27807                                             }
   27808                                             unsigned rm =
   27809                                                 ExtractQRegister(instr, 5, 0);
   27810                                             // VRINTA{<q>}.F32.F32 <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
   27811                                             vrinta(F32,
   27812                                                    F32,
   27813                                                    QRegister(rd),
   27814                                                    QRegister(rm));
   27815                                           } else {
   27816                                             UnallocatedT32(instr);
   27817                                           }
   27818                                           break;
   27819                                         }
   27820                                         case 0x00000580: {
   27821                                           // 0xffb20580
   27822                                           if ((instr & 0x000c0000) ==
   27823                                               0x00080000) {
   27824                                             unsigned rd =
   27825                                                 ExtractDRegister(instr, 22, 12);
   27826                                             unsigned rm =
   27827                                                 ExtractDRegister(instr, 5, 0);
   27828                                             // VRINTZ{<q>}.F32.F32 <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
   27829                                             vrintz(Condition::None(),
   27830                                                    F32,
   27831                                                    F32,
   27832                                                    DRegister(rd),
   27833                                                    DRegister(rm));
   27834                                           } else {
   27835                                             UnallocatedT32(instr);
   27836                                           }
   27837                                           break;
   27838                                         }
   27839                                         case 0x000005c0: {
   27840                                           // 0xffb205c0
   27841                                           if ((instr & 0x000c0000) ==
   27842                                               0x00080000) {
   27843                                             if (((instr >> 12) & 1) != 0) {
   27844                                               UnallocatedT32(instr);
   27845                                               return;
   27846                                             }
   27847                                             unsigned rd =
   27848                                                 ExtractQRegister(instr, 22, 12);
   27849                                             if ((instr & 1) != 0) {
   27850                                               UnallocatedT32(instr);
   27851                                               return;
   27852                                             }
   27853                                             unsigned rm =
   27854                                                 ExtractQRegister(instr, 5, 0);
   27855                                             // VRINTZ{<q>}.F32.F32 <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
   27856                                             vrintz(F32,
   27857                                                    F32,
   27858                                                    QRegister(rd),
   27859                                                    QRegister(rm));
   27860                                           } else {
   27861                                             UnallocatedT32(instr);
   27862                                           }
   27863                                           break;
   27864                                         }
   27865                                       }
   27866                                       break;
   27867                                     }
   27868                                     case 0x00020200: {
   27869                                       // 0xffb20200
   27870                                       switch (instr & 0x00000580) {
   27871                                         case 0x00000000: {
   27872                                           // 0xffb20200
   27873                                           switch (instr & 0x00000040) {
   27874                                             case 0x00000000: {
   27875                                               // 0xffb20200
   27876                                               DataType dt = Dt_size_3_Decode(
   27877                                                   (instr >> 18) & 0x3);
   27878                                               if (dt.Is(
   27879                                                       kDataTypeValueInvalid)) {
   27880                                                 UnallocatedT32(instr);
   27881                                                 return;
   27882                                               }
   27883                                               unsigned rd =
   27884                                                   ExtractDRegister(instr,
   27885                                                                    22,
   27886                                                                    12);
   27887                                               if ((instr & 1) != 0) {
   27888                                                 UnallocatedT32(instr);
   27889                                                 return;
   27890                                               }
   27891                                               unsigned rm =
   27892                                                   ExtractQRegister(instr, 5, 0);
   27893                                               // VMOVN{<c>}{<q>}.<dt> <Dd>, <Qm> ; T1 NOLINT(whitespace/line_length)
   27894                                               vmovn(CurrentCond(),
   27895                                                     dt,
   27896                                                     DRegister(rd),
   27897                                                     QRegister(rm));
   27898                                               break;
   27899                                             }
   27900                                             case 0x00000040: {
   27901                                               // 0xffb20240
   27902                                               DataType dt = Dt_size_14_Decode(
   27903                                                   (instr >> 18) & 0x3);
   27904                                               if (dt.Is(
   27905                                                       kDataTypeValueInvalid)) {
   27906                                                 UnallocatedT32(instr);
   27907                                                 return;
   27908                                               }
   27909                                               unsigned rd =
   27910                                                   ExtractDRegister(instr,
   27911                                                                    22,
   27912                                                                    12);
   27913                                               if ((instr & 1) != 0) {
   27914                                                 UnallocatedT32(instr);
   27915                                                 return;
   27916                                               }
   27917                                               unsigned rm =
   27918                                                   ExtractQRegister(instr, 5, 0);
   27919                                               // VQMOVUN{<c>}{<q>}.<dt> <Dd>, <Qm> ; T1 NOLINT(whitespace/line_length)
   27920                                               vqmovun(CurrentCond(),
   27921                                                       dt,
   27922                                                       DRegister(rd),
   27923                                                       QRegister(rm));
   27924                                               break;
   27925                                             }
   27926                                           }
   27927                                           break;
   27928                                         }
   27929                                         case 0x00000080: {
   27930                                           // 0xffb20280
   27931                                           DataType dt = Dt_op_size_3_Decode(
   27932                                               ((instr >> 18) & 0x3) |
   27933                                               ((instr >> 4) & 0x4));
   27934                                           if (dt.Is(kDataTypeValueInvalid)) {
   27935                                             UnallocatedT32(instr);
   27936                                             return;
   27937                                           }
   27938                                           unsigned rd =
   27939                                               ExtractDRegister(instr, 22, 12);
   27940                                           if ((instr & 1) != 0) {
   27941                                             UnallocatedT32(instr);
   27942                                             return;
   27943                                           }
   27944                                           unsigned rm =
   27945                                               ExtractQRegister(instr, 5, 0);
   27946                                           // VQMOVN{<c>}{<q>}.<dt> <Dd>, <Qm> ; T1 NOLINT(whitespace/line_length)
   27947                                           vqmovn(CurrentCond(),
   27948                                                  dt,
   27949                                                  DRegister(rd),
   27950                                                  QRegister(rm));
   27951                                           break;
   27952                                         }
   27953                                         case 0x00000100: {
   27954                                           // 0xffb20300
   27955                                           if ((instr & 0x00000040) ==
   27956                                               0x00000000) {
   27957                                             DataType dt = Dt_size_16_Decode(
   27958                                                 (instr >> 18) & 0x3);
   27959                                             if (dt.Is(kDataTypeValueInvalid)) {
   27960                                               UnallocatedT32(instr);
   27961                                               return;
   27962                                             }
   27963                                             if (((instr >> 12) & 1) != 0) {
   27964                                               UnallocatedT32(instr);
   27965                                               return;
   27966                                             }
   27967                                             unsigned rd =
   27968                                                 ExtractQRegister(instr, 22, 12);
   27969                                             unsigned rm =
   27970                                                 ExtractDRegister(instr, 5, 0);
   27971                                             uint32_t imm = dt.GetSize();
   27972                                             // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T2 NOLINT(whitespace/line_length)
   27973                                             vshll(CurrentCond(),
   27974                                                   dt,
   27975                                                   QRegister(rd),
   27976                                                   DRegister(rm),
   27977                                                   imm);
   27978                                           } else {
   27979                                             UnallocatedT32(instr);
   27980                                           }
   27981                                           break;
   27982                                         }
   27983                                         case 0x00000180: {
   27984                                           // 0xffb20380
   27985                                           switch (instr & 0x000c0040) {
   27986                                             case 0x00080000: {
   27987                                               // 0xffba0380
   27988                                               UnimplementedT32_32("SHA1SU1",
   27989                                                                   instr);
   27990                                               break;
   27991                                             }
   27992                                             case 0x00080040: {
   27993                                               // 0xffba03c0
   27994                                               UnimplementedT32_32("SHA256SU0",
   27995                                                                   instr);
   27996                                               break;
   27997                                             }
   27998                                             default:
   27999                                               UnallocatedT32(instr);
   28000                                               break;
   28001                                           }
   28002                                           break;
   28003                                         }
   28004                                         case 0x00000400: {
   28005                                           // 0xffb20600
   28006                                           if ((instr & 0x000c0040) ==
   28007                                               0x00040000) {
   28008                                             unsigned rd =
   28009                                                 ExtractDRegister(instr, 22, 12);
   28010                                             if ((instr & 1) != 0) {
   28011                                               UnallocatedT32(instr);
   28012                                               return;
   28013                                             }
   28014                                             unsigned rm =
   28015                                                 ExtractQRegister(instr, 5, 0);
   28016                                             // VCVT{<c>}{<q>}.F16.F32 <Dd>, <Qm> ; T1 NOLINT(whitespace/line_length)
   28017                                             vcvt(CurrentCond(),
   28018                                                  F16,
   28019                                                  F32,
   28020                                                  DRegister(rd),
   28021                                                  QRegister(rm));
   28022                                           } else {
   28023                                             UnallocatedT32(instr);
   28024                                           }
   28025                                           break;
   28026                                         }
   28027                                         case 0x00000480: {
   28028                                           // 0xffb20680
   28029                                           switch (instr & 0x000c0040) {
   28030                                             case 0x00080000: {
   28031                                               // 0xffba0680
   28032                                               unsigned rd =
   28033                                                   ExtractDRegister(instr,
   28034                                                                    22,
   28035                                                                    12);
   28036                                               unsigned rm =
   28037                                                   ExtractDRegister(instr, 5, 0);
   28038                                               // VRINTM{<q>}.F32.F32 <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
   28039                                               vrintm(F32,
   28040                                                      F32,
   28041                                                      DRegister(rd),
   28042                                                      DRegister(rm));
   28043                                               break;
   28044                                             }
   28045                                             case 0x00080040: {
   28046                                               // 0xffba06c0
   28047                                               if (((instr >> 12) & 1) != 0) {
   28048                                                 UnallocatedT32(instr);
   28049                                                 return;
   28050                                               }
   28051                                               unsigned rd =
   28052                                                   ExtractQRegister(instr,
   28053                                                                    22,
   28054                                                                    12);
   28055                                               if ((instr & 1) != 0) {
   28056                                                 UnallocatedT32(instr);
   28057                                                 return;
   28058                                               }
   28059                                               unsigned rm =
   28060                                                   ExtractQRegister(instr, 5, 0);
   28061                                               // VRINTM{<q>}.F32.F32 <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
   28062                                               vrintm(F32,
   28063                                                      F32,
   28064                                                      QRegister(rd),
   28065                                                      QRegister(rm));
   28066                                               break;
   28067                                             }
   28068                                             default:
   28069                                               UnallocatedT32(instr);
   28070                                               break;
   28071                                           }
   28072                                           break;
   28073                                         }
   28074                                         case 0x00000500: {
   28075                                           // 0xffb20700
   28076                                           if ((instr & 0x000c0040) ==
   28077                                               0x00040000) {
   28078                                             if (((instr >> 12) & 1) != 0) {
   28079                                               UnallocatedT32(instr);
   28080                                               return;
   28081                                             }
   28082                                             unsigned rd =
   28083                                                 ExtractQRegister(instr, 22, 12);
   28084                                             unsigned rm =
   28085                                                 ExtractDRegister(instr, 5, 0);
   28086                                             // VCVT{<c>}{<q>}.F32.F16 <Qd>, <Dm> ; T1 NOLINT(whitespace/line_length)
   28087                                             vcvt(CurrentCond(),
   28088                                                  F32,
   28089                                                  F16,
   28090                                                  QRegister(rd),
   28091                                                  DRegister(rm));
   28092                                           } else {
   28093                                             UnallocatedT32(instr);
   28094                                           }
   28095                                           break;
   28096                                         }
   28097                                         case 0x00000580: {
   28098                                           // 0xffb20780
   28099                                           switch (instr & 0x000c0040) {
   28100                                             case 0x00080000: {
   28101                                               // 0xffba0780
   28102                                               unsigned rd =
   28103                                                   ExtractDRegister(instr,
   28104                                                                    22,
   28105                                                                    12);
   28106                                               unsigned rm =
   28107                                                   ExtractDRegister(instr, 5, 0);
   28108                                               // VRINTP{<q>}.F32.F32 <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
   28109                                               vrintp(F32,
   28110                                                      F32,
   28111                                                      DRegister(rd),
   28112                                                      DRegister(rm));
   28113                                               break;
   28114                                             }
   28115                                             case 0x00080040: {
   28116                                               // 0xffba07c0
   28117                                               if (((instr >> 12) & 1) != 0) {
   28118                                                 UnallocatedT32(instr);
   28119                                                 return;
   28120                                               }
   28121                                               unsigned rd =
   28122                                                   ExtractQRegister(instr,
   28123                                                                    22,
   28124                                                                    12);
   28125                                               if ((instr & 1) != 0) {
   28126                                                 UnallocatedT32(instr);
   28127                                                 return;
   28128                                               }
   28129                                               unsigned rm =
   28130                                                   ExtractQRegister(instr, 5, 0);
   28131                                               // VRINTP{<q>}.F32.F32 <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
   28132                                               vrintp(F32,
   28133                                                      F32,
   28134                                                      QRegister(rd),
   28135                                                      QRegister(rm));
   28136                                               break;
   28137                                             }
   28138                                             default:
   28139                                               UnallocatedT32(instr);
   28140                                               break;
   28141                                           }
   28142                                           break;
   28143                                         }
   28144                                       }
   28145                                       break;
   28146                                     }
   28147                                     case 0x00030000: {
   28148                                       // 0xffb30000
   28149                                       switch (instr & 0x00000440) {
   28150                                         case 0x00000000: {
   28151                                           // 0xffb30000
   28152                                           switch (instr & 0x000c0100) {
   28153                                             case 0x00080000: {
   28154                                               // 0xffbb0000
   28155                                               DataType dt = Dt_op_3_Decode(
   28156                                                   (instr >> 7) & 0x1);
   28157                                               if (dt.Is(
   28158                                                       kDataTypeValueInvalid)) {
   28159                                                 UnallocatedT32(instr);
   28160                                                 return;
   28161                                               }
   28162                                               unsigned rd =
   28163                                                   ExtractDRegister(instr,
   28164                                                                    22,
   28165                                                                    12);
   28166                                               unsigned rm =
   28167                                                   ExtractDRegister(instr, 5, 0);
   28168                                               // VCVTA{<q>}.<dt>.F32 <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
   28169                                               vcvta(dt,
   28170                                                     F32,
   28171                                                     DRegister(rd),
   28172                                                     DRegister(rm));
   28173                                               break;
   28174                                             }
   28175                                             case 0x00080100: {
   28176                                               // 0xffbb0100
   28177                                               DataType dt = Dt_op_3_Decode(
   28178                                                   (instr >> 7) & 0x1);
   28179                                               if (dt.Is(
   28180                                                       kDataTypeValueInvalid)) {
   28181                                                 UnallocatedT32(instr);
   28182                                                 return;
   28183                                               }
   28184                                               unsigned rd =
   28185                                                   ExtractDRegister(instr,
   28186                                                                    22,
   28187                                                                    12);
   28188                                               unsigned rm =
   28189                                                   ExtractDRegister(instr, 5, 0);
   28190                                               // VCVTN{<q>}.<dt>.F32 <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
   28191                                               vcvtn(dt,
   28192                                                     F32,
   28193                                                     DRegister(rd),
   28194                                                     DRegister(rm));
   28195                                               break;
   28196                                             }
   28197                                             default:
   28198                                               UnallocatedT32(instr);
   28199                                               break;
   28200                                           }
   28201                                           break;
   28202                                         }
   28203                                         case 0x00000040: {
   28204                                           // 0xffb30040
   28205                                           switch (instr & 0x000c0100) {
   28206                                             case 0x00080000: {
   28207                                               // 0xffbb0040
   28208                                               DataType dt = Dt_op_3_Decode(
   28209                                                   (instr >> 7) & 0x1);
   28210                                               if (dt.Is(
   28211                                                       kDataTypeValueInvalid)) {
   28212                                                 UnallocatedT32(instr);
   28213                                                 return;
   28214                                               }
   28215                                               if (((instr >> 12) & 1) != 0) {
   28216                                                 UnallocatedT32(instr);
   28217                                                 return;
   28218                                               }
   28219                                               unsigned rd =
   28220                                                   ExtractQRegister(instr,
   28221                                                                    22,
   28222                                                                    12);
   28223                                               if ((instr & 1) != 0) {
   28224                                                 UnallocatedT32(instr);
   28225                                                 return;
   28226                                               }
   28227                                               unsigned rm =
   28228                                                   ExtractQRegister(instr, 5, 0);
   28229                                               // VCVTA{<q>}.<dt>.F32 <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
   28230                                               vcvta(dt,
   28231                                                     F32,
   28232                                                     QRegister(rd),
   28233                                                     QRegister(rm));
   28234                                               break;
   28235                                             }
   28236                                             case 0x00080100: {
   28237                                               // 0xffbb0140
   28238                                               DataType dt = Dt_op_3_Decode(
   28239                                                   (instr >> 7) & 0x1);
   28240                                               if (dt.Is(
   28241                                                       kDataTypeValueInvalid)) {
   28242                                                 UnallocatedT32(instr);
   28243                                                 return;
   28244                                               }
   28245                                               if (((instr >> 12) & 1) != 0) {
   28246                                                 UnallocatedT32(instr);
   28247                                                 return;
   28248                                               }
   28249                                               unsigned rd =
   28250                                                   ExtractQRegister(instr,
   28251                                                                    22,
   28252                                                                    12);
   28253                                               if ((instr & 1) != 0) {
   28254                                                 UnallocatedT32(instr);
   28255                                                 return;
   28256                                               }
   28257                                               unsigned rm =
   28258                                                   ExtractQRegister(instr, 5, 0);
   28259                                               // VCVTN{<q>}.<dt>.F32 <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
   28260                                               vcvtn(dt,
   28261                                                     F32,
   28262                                                     QRegister(rd),
   28263                                                     QRegister(rm));
   28264                                               break;
   28265                                             }
   28266                                             default:
   28267                                               UnallocatedT32(instr);
   28268                                               break;
   28269                                           }
   28270                                           break;
   28271                                         }
   28272                                         case 0x00000400: {
   28273                                           // 0xffb30400
   28274                                           switch (instr & 0x00000080) {
   28275                                             case 0x00000000: {
   28276                                               // 0xffb30400
   28277                                               DataType dt = Dt_F_size_4_Decode(
   28278                                                   ((instr >> 18) & 0x3) |
   28279                                                   ((instr >> 6) & 0x4));
   28280                                               if (dt.Is(
   28281                                                       kDataTypeValueInvalid)) {
   28282                                                 UnallocatedT32(instr);
   28283                                                 return;
   28284                                               }
   28285                                               unsigned rd =
   28286                                                   ExtractDRegister(instr,
   28287                                                                    22,
   28288                                                                    12);
   28289                                               unsigned rm =
   28290                                                   ExtractDRegister(instr, 5, 0);
   28291                                               // VRECPE{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
   28292                                               vrecpe(CurrentCond(),
   28293                                                      dt,
   28294                                                      DRegister(rd),
   28295                                                      DRegister(rm));
   28296                                               break;
   28297                                             }
   28298                                             case 0x00000080: {
   28299                                               // 0xffb30480
   28300                                               DataType dt = Dt_F_size_4_Decode(
   28301                                                   ((instr >> 18) & 0x3) |
   28302                                                   ((instr >> 6) & 0x4));
   28303                                               if (dt.Is(
   28304                                                       kDataTypeValueInvalid)) {
   28305                                                 UnallocatedT32(instr);
   28306                                                 return;
   28307                                               }
   28308                                               unsigned rd =
   28309                                                   ExtractDRegister(instr,
   28310                                                                    22,
   28311                                                                    12);
   28312                                               unsigned rm =
   28313                                                   ExtractDRegister(instr, 5, 0);
   28314                                               // VRSQRTE{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
   28315                                               vrsqrte(CurrentCond(),
   28316                                                       dt,
   28317                                                       DRegister(rd),
   28318                                                       DRegister(rm));
   28319                                               break;
   28320                                             }
   28321                                           }
   28322                                           break;
   28323                                         }
   28324                                         case 0x00000440: {
   28325                                           // 0xffb30440
   28326                                           switch (instr & 0x00000080) {
   28327                                             case 0x00000000: {
   28328                                               // 0xffb30440
   28329                                               DataType dt = Dt_F_size_4_Decode(
   28330                                                   ((instr >> 18) & 0x3) |
   28331                                                   ((instr >> 6) & 0x4));
   28332                                               if (dt.Is(
   28333                                                       kDataTypeValueInvalid)) {
   28334                                                 UnallocatedT32(instr);
   28335                                                 return;
   28336                                               }
   28337                                               if (((instr >> 12) & 1) != 0) {
   28338                                                 UnallocatedT32(instr);
   28339                                                 return;
   28340                                               }
   28341                                               unsigned rd =
   28342                                                   ExtractQRegister(instr,
   28343                                                                    22,
   28344                                                                    12);
   28345                                               if ((instr & 1) != 0) {
   28346                                                 UnallocatedT32(instr);
   28347                                                 return;
   28348                                               }
   28349                                               unsigned rm =
   28350                                                   ExtractQRegister(instr, 5, 0);
   28351                                               // VRECPE{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
   28352                                               vrecpe(CurrentCond(),
   28353                                                      dt,
   28354                                                      QRegister(rd),
   28355                                                      QRegister(rm));
   28356                                               break;
   28357                                             }
   28358                                             case 0x00000080: {
   28359                                               // 0xffb304c0
   28360                                               DataType dt = Dt_F_size_4_Decode(
   28361                                                   ((instr >> 18) & 0x3) |
   28362                                                   ((instr >> 6) & 0x4));
   28363                                               if (dt.Is(
   28364                                                       kDataTypeValueInvalid)) {
   28365                                                 UnallocatedT32(instr);
   28366                                                 return;
   28367                                               }
   28368                                               if (((instr >> 12) & 1) != 0) {
   28369                                                 UnallocatedT32(instr);
   28370                                                 return;
   28371                                               }
   28372                                               unsigned rd =
   28373                                                   ExtractQRegister(instr,
   28374                                                                    22,
   28375                                                                    12);
   28376                                               if ((instr & 1) != 0) {
   28377                                                 UnallocatedT32(instr);
   28378                                                 return;
   28379                                               }
   28380                                               unsigned rm =
   28381                                                   ExtractQRegister(instr, 5, 0);
   28382                                               // VRSQRTE{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
   28383                                               vrsqrte(CurrentCond(),
   28384                                                       dt,
   28385                                                       QRegister(rd),
   28386                                                       QRegister(rm));
   28387                                               break;
   28388                                             }
   28389                                           }
   28390                                           break;
   28391                                         }
   28392                                       }
   28393                                       break;
   28394                                     }
   28395                                     case 0x00030200: {
   28396                                       // 0xffb30200
   28397                                       switch (instr & 0x000c0440) {
   28398                                         case 0x00080000: {
   28399                                           // 0xffbb0200
   28400                                           switch (instr & 0x00000100) {
   28401                                             case 0x00000000: {
   28402                                               // 0xffbb0200
   28403                                               DataType dt = Dt_op_3_Decode(
   28404                                                   (instr >> 7) & 0x1);
   28405                                               if (dt.Is(
   28406                                                       kDataTypeValueInvalid)) {
   28407                                                 UnallocatedT32(instr);
   28408                                                 return;
   28409                                               }
   28410                                               unsigned rd =
   28411                                                   ExtractDRegister(instr,
   28412                                                                    22,
   28413                                                                    12);
   28414                                               unsigned rm =
   28415                                                   ExtractDRegister(instr, 5, 0);
   28416                                               // VCVTP{<q>}.<dt>.F32 <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
   28417                                               vcvtp(dt,
   28418                                                     F32,
   28419                                                     DRegister(rd),
   28420                                                     DRegister(rm));
   28421                                               break;
   28422                                             }
   28423                                             case 0x00000100: {
   28424                                               // 0xffbb0300
   28425                                               DataType dt = Dt_op_3_Decode(
   28426                                                   (instr >> 7) & 0x1);
   28427                                               if (dt.Is(
   28428                                                       kDataTypeValueInvalid)) {
   28429                                                 UnallocatedT32(instr);
   28430                                                 return;
   28431                                               }
   28432                                               unsigned rd =
   28433                                                   ExtractDRegister(instr,
   28434                                                                    22,
   28435                                                                    12);
   28436                                               unsigned rm =
   28437                                                   ExtractDRegister(instr, 5, 0);
   28438                                               // VCVTM{<q>}.<dt>.F32 <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
   28439                                               vcvtm(dt,
   28440                                                     F32,
   28441                                                     DRegister(rd),
   28442                                                     DRegister(rm));
   28443                                               break;
   28444                                             }
   28445                                           }
   28446                                           break;
   28447                                         }
   28448                                         case 0x00080040: {
   28449                                           // 0xffbb0240
   28450                                           switch (instr & 0x00000100) {
   28451                                             case 0x00000000: {
   28452                                               // 0xffbb0240
   28453                                               DataType dt = Dt_op_3_Decode(
   28454                                                   (instr >> 7) & 0x1);
   28455                                               if (dt.Is(
   28456                                                       kDataTypeValueInvalid)) {
   28457                                                 UnallocatedT32(instr);
   28458                                                 return;
   28459                                               }
   28460                                               if (((instr >> 12) & 1) != 0) {
   28461                                                 UnallocatedT32(instr);
   28462                                                 return;
   28463                                               }
   28464                                               unsigned rd =
   28465                                                   ExtractQRegister(instr,
   28466                                                                    22,
   28467                                                                    12);
   28468                                               if ((instr & 1) != 0) {
   28469                                                 UnallocatedT32(instr);
   28470                                                 return;
   28471                                               }
   28472                                               unsigned rm =
   28473                                                   ExtractQRegister(instr, 5, 0);
   28474                                               // VCVTP{<q>}.<dt>.F32 <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
   28475                                               vcvtp(dt,
   28476                                                     F32,
   28477                                                     QRegister(rd),
   28478                                                     QRegister(rm));
   28479                                               break;
   28480                                             }
   28481                                             case 0x00000100: {
   28482                                               // 0xffbb0340
   28483                                               DataType dt = Dt_op_3_Decode(
   28484                                                   (instr >> 7) & 0x1);
   28485                                               if (dt.Is(
   28486                                                       kDataTypeValueInvalid)) {
   28487                                                 UnallocatedT32(instr);
   28488                                                 return;
   28489                                               }
   28490                                               if (((instr >> 12) & 1) != 0) {
   28491                                                 UnallocatedT32(instr);
   28492                                                 return;
   28493                                               }
   28494                                               unsigned rd =
   28495                                                   ExtractQRegister(instr,
   28496                                                                    22,
   28497                                                                    12);
   28498                                               if ((instr & 1) != 0) {
   28499                                                 UnallocatedT32(instr);
   28500                                                 return;
   28501                                               }
   28502                                               unsigned rm =
   28503                                                   ExtractQRegister(instr, 5, 0);
   28504                                               // VCVTM{<q>}.<dt>.F32 <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
   28505                                               vcvtm(dt,
   28506                                                     F32,
   28507                                                     QRegister(rd),
   28508                                                     QRegister(rm));
   28509                                               break;
   28510                                             }
   28511                                           }
   28512                                           break;
   28513                                         }
   28514                                         case 0x00080400: {
   28515                                           // 0xffbb0600
   28516                                           DataType dt1 = Dt_op_1_Decode1(
   28517                                               (instr >> 7) & 0x3);
   28518                                           if (dt1.Is(kDataTypeValueInvalid)) {
   28519                                             UnallocatedT32(instr);
   28520                                             return;
   28521                                           }
   28522                                           DataType dt2 = Dt_op_1_Decode2(
   28523                                               (instr >> 7) & 0x3);
   28524                                           if (dt2.Is(kDataTypeValueInvalid)) {
   28525                                             UnallocatedT32(instr);
   28526                                             return;
   28527                                           }
   28528                                           unsigned rd =
   28529                                               ExtractDRegister(instr, 22, 12);
   28530                                           unsigned rm =
   28531                                               ExtractDRegister(instr, 5, 0);
   28532                                           // VCVT{<c>}{<q>}.<dt>.<dt> <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
   28533                                           vcvt(CurrentCond(),
   28534                                                dt1,
   28535                                                dt2,
   28536                                                DRegister(rd),
   28537                                                DRegister(rm));
   28538                                           break;
   28539                                         }
   28540                                         case 0x00080440: {
   28541                                           // 0xffbb0640
   28542                                           DataType dt1 = Dt_op_1_Decode1(
   28543                                               (instr >> 7) & 0x3);
   28544                                           if (dt1.Is(kDataTypeValueInvalid)) {
   28545                                             UnallocatedT32(instr);
   28546                                             return;
   28547                                           }
   28548                                           DataType dt2 = Dt_op_1_Decode2(
   28549                                               (instr >> 7) & 0x3);
   28550                                           if (dt2.Is(kDataTypeValueInvalid)) {
   28551                                             UnallocatedT32(instr);
   28552                                             return;
   28553                                           }
   28554                                           if (((instr >> 12) & 1) != 0) {
   28555                                             UnallocatedT32(instr);
   28556                                             return;
   28557                                           }
   28558                                           unsigned rd =
   28559                                               ExtractQRegister(instr, 22, 12);
   28560                                           if ((instr & 1) != 0) {
   28561                                             UnallocatedT32(instr);
   28562                                             return;
   28563                                           }
   28564                                           unsigned rm =
   28565                                               ExtractQRegister(instr, 5, 0);
   28566                                           // VCVT{<c>}{<q>}.<dt>.<dt> <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
   28567                                           vcvt(CurrentCond(),
   28568                                                dt1,
   28569                                                dt2,
   28570                                                QRegister(rd),
   28571                                                QRegister(rm));
   28572                                           break;
   28573                                         }
   28574                                         default:
   28575                                           UnallocatedT32(instr);
   28576                                           break;
   28577                                       }
   28578                                       break;
   28579                                     }
   28580                                   }
   28581                                   break;
   28582                                 }
   28583                                 case 0x00000800: {
   28584                                   // 0xffb00800
   28585                                   switch (instr & 0x00000440) {
   28586                                     case 0x00000000: {
   28587                                       // 0xffb00800
   28588                                       unsigned rd =
   28589                                           ExtractDRegister(instr, 22, 12);
   28590                                       unsigned first =
   28591                                           ExtractDRegister(instr, 7, 16);
   28592                                       unsigned length;
   28593                                       SpacingType spacing = kSingle;
   28594                                       switch ((instr >> 8) & 0x3) {
   28595                                         default:
   28596                                           VIXL_UNREACHABLE_OR_FALLTHROUGH();
   28597                                         case 0x0:
   28598                                           length = 1;
   28599                                           break;
   28600                                         case 0x1:
   28601                                           length = 2;
   28602                                           break;
   28603                                         case 0x2:
   28604                                           length = 3;
   28605                                           break;
   28606                                         case 0x3:
   28607                                           length = 4;
   28608                                           break;
   28609                                       }
   28610                                       unsigned last = first + length - 1;
   28611                                       TransferType transfer = kMultipleLanes;
   28612                                       unsigned rm =
   28613                                           ExtractDRegister(instr, 5, 0);
   28614                                       // VTBL{<c>}{<q>}.8 <Dd>, <list>, <Dm> ; T1 NOLINT(whitespace/line_length)
   28615                                       vtbl(CurrentCond(),
   28616                                            Untyped8,
   28617                                            DRegister(rd),
   28618                                            NeonRegisterList(DRegister(first),
   28619                                                             DRegister(last),
   28620                                                             spacing,
   28621                                                             transfer),
   28622                                            DRegister(rm));
   28623                                       break;
   28624                                     }
   28625                                     case 0x00000040: {
   28626                                       // 0xffb00840
   28627                                       unsigned rd =
   28628                                           ExtractDRegister(instr, 22, 12);
   28629                                       unsigned first =
   28630                                           ExtractDRegister(instr, 7, 16);
   28631                                       unsigned length;
   28632                                       SpacingType spacing = kSingle;
   28633                                       switch ((instr >> 8) & 0x3) {
   28634                                         default:
   28635                                           VIXL_UNREACHABLE_OR_FALLTHROUGH();
   28636                                         case 0x0:
   28637                                           length = 1;
   28638                                           break;
   28639                                         case 0x1:
   28640                                           length = 2;
   28641                                           break;
   28642                                         case 0x2:
   28643                                           length = 3;
   28644                                           break;
   28645                                         case 0x3:
   28646                                           length = 4;
   28647                                           break;
   28648                                       }
   28649                                       unsigned last = first + length - 1;
   28650                                       TransferType transfer = kMultipleLanes;
   28651                                       unsigned rm =
   28652                                           ExtractDRegister(instr, 5, 0);
   28653                                       // VTBX{<c>}{<q>}.8 <Dd>, <list>, <Dm> ; T1 NOLINT(whitespace/line_length)
   28654                                       vtbx(CurrentCond(),
   28655                                            Untyped8,
   28656                                            DRegister(rd),
   28657                                            NeonRegisterList(DRegister(first),
   28658                                                             DRegister(last),
   28659                                                             spacing,
   28660                                                             transfer),
   28661                                            DRegister(rm));
   28662                                       break;
   28663                                     }
   28664                                     case 0x00000400: {
   28665                                       // 0xffb00c00
   28666                                       if ((instr & 0x00000380) == 0x00000000) {
   28667                                         unsigned lane;
   28668                                         DataType dt =
   28669                                             Dt_imm4_1_Decode((instr >> 16) &
   28670                                                                  0xf,
   28671                                                              &lane);
   28672                                         if (dt.Is(kDataTypeValueInvalid)) {
   28673                                           UnallocatedT32(instr);
   28674                                           return;
   28675                                         }
   28676                                         unsigned rd =
   28677                                             ExtractDRegister(instr, 22, 12);
   28678                                         unsigned rm =
   28679                                             ExtractDRegister(instr, 5, 0);
   28680                                         // VDUP{<c>}{<q>}.<dt> <Dd>, <Dm[x]> ; T1 NOLINT(whitespace/line_length)
   28681                                         vdup(CurrentCond(),
   28682                                              dt,
   28683                                              DRegister(rd),
   28684                                              DRegisterLane(rm, lane));
   28685                                       } else {
   28686                                         UnallocatedT32(instr);
   28687                                       }
   28688                                       break;
   28689                                     }
   28690                                     case 0x00000440: {
   28691                                       // 0xffb00c40
   28692                                       if ((instr & 0x00000380) == 0x00000000) {
   28693                                         unsigned lane;
   28694                                         DataType dt =
   28695                                             Dt_imm4_1_Decode((instr >> 16) &
   28696                                                                  0xf,
   28697                                                              &lane);
   28698                                         if (dt.Is(kDataTypeValueInvalid)) {
   28699                                           UnallocatedT32(instr);
   28700                                           return;
   28701                                         }
   28702                                         if (((instr >> 12) & 1) != 0) {
   28703                                           UnallocatedT32(instr);
   28704                                           return;
   28705                                         }
   28706                                         unsigned rd =
   28707                                             ExtractQRegister(instr, 22, 12);
   28708                                         unsigned rm =
   28709                                             ExtractDRegister(instr, 5, 0);
   28710                                         // VDUP{<c>}{<q>}.<dt> <Qd>, <Dm[x]> ; T1 NOLINT(whitespace/line_length)
   28711                                         vdup(CurrentCond(),
   28712                                              dt,
   28713                                              QRegister(rd),
   28714                                              DRegisterLane(rm, lane));
   28715                                       } else {
   28716                                         UnallocatedT32(instr);
   28717                                       }
   28718                                       break;
   28719                                     }
   28720                                   }
   28721                                   break;
   28722                                 }
   28723                               }
   28724                               break;
   28725                             }
   28726                           }
   28727                           break;
   28728                         }
   28729                         default: {
   28730                           switch (instr & 0x00000c40) {
   28731                             case 0x00000000: {
   28732                               // 0xef800000
   28733                               switch (instr & 0x00000300) {
   28734                                 case 0x00000000: {
   28735                                   // 0xef800000
   28736                                   if (((instr & 0x300000) == 0x300000)) {
   28737                                     UnallocatedT32(instr);
   28738                                     return;
   28739                                   }
   28740                                   DataType dt =
   28741                                       Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
   28742                                                          ((instr >> 26) & 0x4));
   28743                                   if (dt.Is(kDataTypeValueInvalid)) {
   28744                                     UnallocatedT32(instr);
   28745                                     return;
   28746                                   }
   28747                                   if (((instr >> 12) & 1) != 0) {
   28748                                     UnallocatedT32(instr);
   28749                                     return;
   28750                                   }
   28751                                   unsigned rd = ExtractQRegister(instr, 22, 12);
   28752                                   unsigned rn = ExtractDRegister(instr, 7, 16);
   28753                                   unsigned rm = ExtractDRegister(instr, 5, 0);
   28754                                   // VADDL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; T1
   28755                                   vaddl(CurrentCond(),
   28756                                         dt,
   28757                                         QRegister(rd),
   28758                                         DRegister(rn),
   28759                                         DRegister(rm));
   28760                                   break;
   28761                                 }
   28762                                 case 0x00000100: {
   28763                                   // 0xef800100
   28764                                   if (((instr & 0x300000) == 0x300000)) {
   28765                                     UnallocatedT32(instr);
   28766                                     return;
   28767                                   }
   28768                                   DataType dt =
   28769                                       Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
   28770                                                          ((instr >> 26) & 0x4));
   28771                                   if (dt.Is(kDataTypeValueInvalid)) {
   28772                                     UnallocatedT32(instr);
   28773                                     return;
   28774                                   }
   28775                                   if (((instr >> 12) & 1) != 0) {
   28776                                     UnallocatedT32(instr);
   28777                                     return;
   28778                                   }
   28779                                   unsigned rd = ExtractQRegister(instr, 22, 12);
   28780                                   if (((instr >> 16) & 1) != 0) {
   28781                                     UnallocatedT32(instr);
   28782                                     return;
   28783                                   }
   28784                                   unsigned rn = ExtractQRegister(instr, 7, 16);
   28785                                   unsigned rm = ExtractDRegister(instr, 5, 0);
   28786                                   // VADDW{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Dm> ; T1 NOLINT(whitespace/line_length)
   28787                                   vaddw(CurrentCond(),
   28788                                         dt,
   28789                                         QRegister(rd),
   28790                                         QRegister(rn),
   28791                                         DRegister(rm));
   28792                                   break;
   28793                                 }
   28794                                 case 0x00000200: {
   28795                                   // 0xef800200
   28796                                   if (((instr & 0x300000) == 0x300000)) {
   28797                                     UnallocatedT32(instr);
   28798                                     return;
   28799                                   }
   28800                                   DataType dt =
   28801                                       Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
   28802                                                          ((instr >> 26) & 0x4));
   28803                                   if (dt.Is(kDataTypeValueInvalid)) {
   28804                                     UnallocatedT32(instr);
   28805                                     return;
   28806                                   }
   28807                                   if (((instr >> 12) & 1) != 0) {
   28808                                     UnallocatedT32(instr);
   28809                                     return;
   28810                                   }
   28811                                   unsigned rd = ExtractQRegister(instr, 22, 12);
   28812                                   unsigned rn = ExtractDRegister(instr, 7, 16);
   28813                                   unsigned rm = ExtractDRegister(instr, 5, 0);
   28814                                   // VSUBL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; T1
   28815                                   vsubl(CurrentCond(),
   28816                                         dt,
   28817                                         QRegister(rd),
   28818                                         DRegister(rn),
   28819                                         DRegister(rm));
   28820                                   break;
   28821                                 }
   28822                                 case 0x00000300: {
   28823                                   // 0xef800300
   28824                                   if (((instr & 0x300000) == 0x300000)) {
   28825                                     UnallocatedT32(instr);
   28826                                     return;
   28827                                   }
   28828                                   DataType dt =
   28829                                       Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
   28830                                                          ((instr >> 26) & 0x4));
   28831                                   if (dt.Is(kDataTypeValueInvalid)) {
   28832                                     UnallocatedT32(instr);
   28833                                     return;
   28834                                   }
   28835                                   if (((instr >> 12) & 1) != 0) {
   28836                                     UnallocatedT32(instr);
   28837                                     return;
   28838                                   }
   28839                                   unsigned rd = ExtractQRegister(instr, 22, 12);
   28840                                   if (((instr >> 16) & 1) != 0) {
   28841                                     UnallocatedT32(instr);
   28842                                     return;
   28843                                   }
   28844                                   unsigned rn = ExtractQRegister(instr, 7, 16);
   28845                                   unsigned rm = ExtractDRegister(instr, 5, 0);
   28846                                   // VSUBW{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Dm> ; T1 NOLINT(whitespace/line_length)
   28847                                   vsubw(CurrentCond(),
   28848                                         dt,
   28849                                         QRegister(rd),
   28850                                         QRegister(rn),
   28851                                         DRegister(rm));
   28852                                   break;
   28853                                 }
   28854                               }
   28855                               break;
   28856                             }
   28857                             case 0x00000040: {
   28858                               // 0xef800040
   28859                               switch (instr & 0x00000200) {
   28860                                 case 0x00000000: {
   28861                                   // 0xef800040
   28862                                   switch (instr & 0x10000000) {
   28863                                     case 0x00000000: {
   28864                                       // 0xef800040
   28865                                       if (((instr & 0x300000) == 0x300000)) {
   28866                                         UnallocatedT32(instr);
   28867                                         return;
   28868                                       }
   28869                                       DataType dt =
   28870                                           Dt_size_9_Decode((instr >> 20) & 0x3,
   28871                                                            (instr >> 8) & 0x1);
   28872                                       if (dt.Is(kDataTypeValueInvalid)) {
   28873                                         UnallocatedT32(instr);
   28874                                         return;
   28875                                       }
   28876                                       unsigned rd =
   28877                                           ExtractDRegister(instr, 22, 12);
   28878                                       unsigned rn =
   28879                                           ExtractDRegister(instr, 7, 16);
   28880                                       int lane;
   28881                                       unsigned rm =
   28882                                           ExtractDRegisterAndLane(instr,
   28883                                                                   dt,
   28884                                                                   5,
   28885                                                                   0,
   28886                                                                   &lane);
   28887                                       // VMLA{<c>}{<q>}.<type><size> <Dd>, <Dn>, <Dm[x]> ; T1 NOLINT(whitespace/line_length)
   28888                                       vmla(CurrentCond(),
   28889                                            dt,
   28890                                            DRegister(rd),
   28891                                            DRegister(rn),
   28892                                            DRegisterLane(rm, lane));
   28893                                       break;
   28894                                     }
   28895                                     case 0x10000000: {
   28896                                       // 0xff800040
   28897                                       if (((instr & 0x300000) == 0x300000)) {
   28898                                         UnallocatedT32(instr);
   28899                                         return;
   28900                                       }
   28901                                       DataType dt =
   28902                                           Dt_size_9_Decode((instr >> 20) & 0x3,
   28903                                                            (instr >> 8) & 0x1);
   28904                                       if (dt.Is(kDataTypeValueInvalid)) {
   28905                                         UnallocatedT32(instr);
   28906                                         return;
   28907                                       }
   28908                                       if (((instr >> 12) & 1) != 0) {
   28909                                         UnallocatedT32(instr);
   28910                                         return;
   28911                                       }
   28912                                       unsigned rd =
   28913                                           ExtractQRegister(instr, 22, 12);
   28914                                       if (((instr >> 16) & 1) != 0) {
   28915                                         UnallocatedT32(instr);
   28916                                         return;
   28917                                       }
   28918                                       unsigned rn =
   28919                                           ExtractQRegister(instr, 7, 16);
   28920                                       int lane;
   28921                                       unsigned rm =
   28922                                           ExtractDRegisterAndLane(instr,
   28923                                                                   dt,
   28924                                                                   5,
   28925                                                                   0,
   28926                                                                   &lane);
   28927                                       // VMLA{<c>}{<q>}.<type><size> <Qd>, <Qn>, <Dm[x]> ; T1 NOLINT(whitespace/line_length)
   28928                                       vmla(CurrentCond(),
   28929                                            dt,
   28930                                            QRegister(rd),
   28931                                            QRegister(rn),
   28932                                            DRegisterLane(rm, lane));
   28933                                       break;
   28934                                     }
   28935                                   }
   28936                                   break;
   28937                                 }
   28938                                 case 0x00000200: {
   28939                                   // 0xef800240
   28940                                   switch (instr & 0x00000100) {
   28941                                     case 0x00000000: {
   28942                                       // 0xef800240
   28943                                       if (((instr & 0x300000) == 0x300000)) {
   28944                                         UnallocatedT32(instr);
   28945                                         return;
   28946                                       }
   28947                                       DataType dt =
   28948                                           Dt_size_11_Decode((instr >> 20) & 0x3,
   28949                                                             (instr >> 28) &
   28950                                                                 0x1);
   28951                                       if (dt.Is(kDataTypeValueInvalid)) {
   28952                                         UnallocatedT32(instr);
   28953                                         return;
   28954                                       }
   28955                                       if (((instr >> 12) & 1) != 0) {
   28956                                         UnallocatedT32(instr);
   28957                                         return;
   28958                                       }
   28959                                       unsigned rd =
   28960                                           ExtractQRegister(instr, 22, 12);
   28961                                       unsigned rn =
   28962                                           ExtractDRegister(instr, 7, 16);
   28963                                       int lane;
   28964                                       unsigned rm =
   28965                                           ExtractDRegisterAndLane(instr,
   28966                                                                   dt,
   28967                                                                   5,
   28968                                                                   0,
   28969                                                                   &lane);
   28970                                       // VMLAL{<c>}{<q>}.<type><size> <Qd>, <Dn>, <Dm[x]> ; T1 NOLINT(whitespace/line_length)
   28971                                       vmlal(CurrentCond(),
   28972                                             dt,
   28973                                             QRegister(rd),
   28974                                             DRegister(rn),
   28975                                             DRegisterLane(rm, lane));
   28976                                       break;
   28977                                     }
   28978                                     case 0x00000100: {
   28979                                       // 0xef800340
   28980                                       if ((instr & 0x10000000) == 0x00000000) {
   28981                                         if (((instr & 0x300000) == 0x300000)) {
   28982                                           UnallocatedT32(instr);
   28983                                           return;
   28984                                         }
   28985                                         DataType dt = Dt_size_13_Decode(
   28986                                             (instr >> 20) & 0x3);
   28987                                         if (dt.Is(kDataTypeValueInvalid)) {
   28988                                           UnallocatedT32(instr);
   28989                                           return;
   28990                                         }
   28991                                         if (((instr >> 12) & 1) != 0) {
   28992                                           UnallocatedT32(instr);
   28993                                           return;
   28994                                         }
   28995                                         unsigned rd =
   28996                                             ExtractQRegister(instr, 22, 12);
   28997                                         unsigned rn =
   28998                                             ExtractDRegister(instr, 7, 16);
   28999                                         uint32_t mvm = (instr & 0xf) |
   29000                                                        ((instr >> 1) & 0x10);
   29001                                         uint32_t shift = 4;
   29002                                         if (dt.Is(S16)) {
   29003                                           shift = 3;
   29004                                         }
   29005                                         uint32_t vm = mvm & ((1 << shift) - 1);
   29006                                         uint32_t index = mvm >> shift;
   29007                                         // VQDMLAL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm>[<index>] ; T2 NOLINT(whitespace/line_length)
   29008                                         vqdmlal(CurrentCond(),
   29009                                                 dt,
   29010                                                 QRegister(rd),
   29011                                                 DRegister(rn),
   29012                                                 DRegister(vm),
   29013                                                 index);
   29014                                       } else {
   29015                                         UnallocatedT32(instr);
   29016                                       }
   29017                                       break;
   29018                                     }
   29019                                   }
   29020                                   break;
   29021                                 }
   29022                               }
   29023                               break;
   29024                             }
   29025                             case 0x00000400: {
   29026                               // 0xef800400
   29027                               switch (instr & 0x00000300) {
   29028                                 case 0x00000000: {
   29029                                   // 0xef800400
   29030                                   switch (instr & 0x10000000) {
   29031                                     case 0x00000000: {
   29032                                       // 0xef800400
   29033                                       if (((instr & 0x300000) == 0x300000)) {
   29034                                         UnallocatedT32(instr);
   29035                                         return;
   29036                                       }
   29037                                       DataType dt =
   29038                                           Dt_size_3_Decode((instr >> 20) & 0x3);
   29039                                       if (dt.Is(kDataTypeValueInvalid)) {
   29040                                         UnallocatedT32(instr);
   29041                                         return;
   29042                                       }
   29043                                       unsigned rd =
   29044                                           ExtractDRegister(instr, 22, 12);
   29045                                       if (((instr >> 16) & 1) != 0) {
   29046                                         UnallocatedT32(instr);
   29047                                         return;
   29048                                       }
   29049                                       unsigned rn =
   29050                                           ExtractQRegister(instr, 7, 16);
   29051                                       if ((instr & 1) != 0) {
   29052                                         UnallocatedT32(instr);
   29053                                         return;
   29054                                       }
   29055                                       unsigned rm =
   29056                                           ExtractQRegister(instr, 5, 0);
   29057                                       // VADDHN{<c>}{<q>}.<dt> <Dd>, <Qn>, <Qm> ; T1 NOLINT(whitespace/line_length)
   29058                                       vaddhn(CurrentCond(),
   29059                                              dt,
   29060                                              DRegister(rd),
   29061                                              QRegister(rn),
   29062                                              QRegister(rm));
   29063                                       break;
   29064                                     }
   29065                                     case 0x10000000: {
   29066                                       // 0xff800400
   29067                                       if (((instr & 0x300000) == 0x300000)) {
   29068                                         UnallocatedT32(instr);
   29069                                         return;
   29070                                       }
   29071                                       DataType dt =
   29072                                           Dt_size_3_Decode((instr >> 20) & 0x3);
   29073                                       if (dt.Is(kDataTypeValueInvalid)) {
   29074                                         UnallocatedT32(instr);
   29075                                         return;
   29076                                       }
   29077                                       unsigned rd =
   29078                                           ExtractDRegister(instr, 22, 12);
   29079                                       if (((instr >> 16) & 1) != 0) {
   29080                                         UnallocatedT32(instr);
   29081                                         return;
   29082                                       }
   29083                                       unsigned rn =
   29084                                           ExtractQRegister(instr, 7, 16);
   29085                                       if ((instr & 1) != 0) {
   29086                                         UnallocatedT32(instr);
   29087                                         return;
   29088                                       }
   29089                                       unsigned rm =
   29090                                           ExtractQRegister(instr, 5, 0);
   29091                                       // VRADDHN{<c>}{<q>}.<dt> <Dd>, <Qn>, <Qm> ; T1 NOLINT(whitespace/line_length)
   29092                                       vraddhn(CurrentCond(),
   29093                                               dt,
   29094                                               DRegister(rd),
   29095                                               QRegister(rn),
   29096                                               QRegister(rm));
   29097                                       break;
   29098                                     }
   29099                                   }
   29100                                   break;
   29101                                 }
   29102                                 case 0x00000100: {
   29103                                   // 0xef800500
   29104                                   if (((instr & 0x300000) == 0x300000)) {
   29105                                     UnallocatedT32(instr);
   29106                                     return;
   29107                                   }
   29108                                   DataType dt =
   29109                                       Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
   29110                                                          ((instr >> 26) & 0x4));
   29111                                   if (dt.Is(kDataTypeValueInvalid)) {
   29112                                     UnallocatedT32(instr);
   29113                                     return;
   29114                                   }
   29115                                   if (((instr >> 12) & 1) != 0) {
   29116                                     UnallocatedT32(instr);
   29117                                     return;
   29118                                   }
   29119                                   unsigned rd = ExtractQRegister(instr, 22, 12);
   29120                                   unsigned rn = ExtractDRegister(instr, 7, 16);
   29121                                   unsigned rm = ExtractDRegister(instr, 5, 0);
   29122                                   // VABAL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; T1
   29123                                   vabal(CurrentCond(),
   29124                                         dt,
   29125                                         QRegister(rd),
   29126                                         DRegister(rn),
   29127                                         DRegister(rm));
   29128                                   break;
   29129                                 }
   29130                                 case 0x00000200: {
   29131                                   // 0xef800600
   29132                                   switch (instr & 0x10000000) {
   29133                                     case 0x00000000: {
   29134                                       // 0xef800600
   29135                                       if (((instr & 0x300000) == 0x300000)) {
   29136                                         UnallocatedT32(instr);
   29137                                         return;
   29138                                       }
   29139                                       DataType dt =
   29140                                           Dt_size_3_Decode((instr >> 20) & 0x3);
   29141                                       if (dt.Is(kDataTypeValueInvalid)) {
   29142                                         UnallocatedT32(instr);
   29143                                         return;
   29144                                       }
   29145                                       unsigned rd =
   29146                                           ExtractDRegister(instr, 22, 12);
   29147                                       if (((instr >> 16) & 1) != 0) {
   29148                                         UnallocatedT32(instr);
   29149                                         return;
   29150                                       }
   29151                                       unsigned rn =
   29152                                           ExtractQRegister(instr, 7, 16);
   29153                                       if ((instr & 1) != 0) {
   29154                                         UnallocatedT32(instr);
   29155                                         return;
   29156                                       }
   29157                                       unsigned rm =
   29158                                           ExtractQRegister(instr, 5, 0);
   29159                                       // VSUBHN{<c>}{<q>}.<dt> <Dd>, <Qn>, <Qm> ; T1 NOLINT(whitespace/line_length)
   29160                                       vsubhn(CurrentCond(),
   29161                                              dt,
   29162                                              DRegister(rd),
   29163                                              QRegister(rn),
   29164                                              QRegister(rm));
   29165                                       break;
   29166                                     }
   29167                                     case 0x10000000: {
   29168                                       // 0xff800600
   29169                                       if (((instr & 0x300000) == 0x300000)) {
   29170                                         UnallocatedT32(instr);
   29171                                         return;
   29172                                       }
   29173                                       DataType dt =
   29174                                           Dt_size_3_Decode((instr >> 20) & 0x3);
   29175                                       if (dt.Is(kDataTypeValueInvalid)) {
   29176                                         UnallocatedT32(instr);
   29177                                         return;
   29178                                       }
   29179                                       unsigned rd =
   29180                                           ExtractDRegister(instr, 22, 12);
   29181                                       if (((instr >> 16) & 1) != 0) {
   29182                                         UnallocatedT32(instr);
   29183                                         return;
   29184                                       }
   29185                                       unsigned rn =
   29186                                           ExtractQRegister(instr, 7, 16);
   29187                                       if ((instr & 1) != 0) {
   29188                                         UnallocatedT32(instr);
   29189                                         return;
   29190                                       }
   29191                                       unsigned rm =
   29192                                           ExtractQRegister(instr, 5, 0);
   29193                                       // VRSUBHN{<c>}{<q>}.<dt> <Dd>, <Qn>, <Qm> ; T1 NOLINT(whitespace/line_length)
   29194                                       vrsubhn(CurrentCond(),
   29195                                               dt,
   29196                                               DRegister(rd),
   29197                                               QRegister(rn),
   29198                                               QRegister(rm));
   29199                                       break;
   29200                                     }
   29201                                   }
   29202                                   break;
   29203                                 }
   29204                                 case 0x00000300: {
   29205                                   // 0xef800700
   29206                                   if (((instr & 0x300000) == 0x300000)) {
   29207                                     UnallocatedT32(instr);
   29208                                     return;
   29209                                   }
   29210                                   DataType dt =
   29211                                       Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
   29212                                                          ((instr >> 26) & 0x4));
   29213                                   if (dt.Is(kDataTypeValueInvalid)) {
   29214                                     UnallocatedT32(instr);
   29215                                     return;
   29216                                   }
   29217                                   if (((instr >> 12) & 1) != 0) {
   29218                                     UnallocatedT32(instr);
   29219                                     return;
   29220                                   }
   29221                                   unsigned rd = ExtractQRegister(instr, 22, 12);
   29222                                   unsigned rn = ExtractDRegister(instr, 7, 16);
   29223                                   unsigned rm = ExtractDRegister(instr, 5, 0);
   29224                                   // VABDL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; T1
   29225                                   vabdl(CurrentCond(),
   29226                                         dt,
   29227                                         QRegister(rd),
   29228                                         DRegister(rn),
   29229                                         DRegister(rm));
   29230                                   break;
   29231                                 }
   29232                               }
   29233                               break;
   29234                             }
   29235                             case 0x00000440: {
   29236                               // 0xef800440
   29237                               switch (instr & 0x00000200) {
   29238                                 case 0x00000000: {
   29239                                   // 0xef800440
   29240                                   switch (instr & 0x10000000) {
   29241                                     case 0x00000000: {
   29242                                       // 0xef800440
   29243                                       if (((instr & 0x300000) == 0x300000)) {
   29244                                         UnallocatedT32(instr);
   29245                                         return;
   29246                                       }
   29247                                       DataType dt =
   29248                                           Dt_size_9_Decode((instr >> 20) & 0x3,
   29249                                                            (instr >> 8) & 0x1);
   29250                                       if (dt.Is(kDataTypeValueInvalid)) {
   29251                                         UnallocatedT32(instr);
   29252                                         return;
   29253                                       }
   29254                                       unsigned rd =
   29255                                           ExtractDRegister(instr, 22, 12);
   29256                                       unsigned rn =
   29257                                           ExtractDRegister(instr, 7, 16);
   29258                                       int lane;
   29259                                       unsigned rm =
   29260                                           ExtractDRegisterAndLane(instr,
   29261                                                                   dt,
   29262                                                                   5,
   29263                                                                   0,
   29264                                                                   &lane);
   29265                                       // VMLS{<c>}{<q>}.<type><size> <Dd>, <Dn>, <Dm[x]> ; T1 NOLINT(whitespace/line_length)
   29266                                       vmls(CurrentCond(),
   29267                                            dt,
   29268                                            DRegister(rd),
   29269                                            DRegister(rn),
   29270                                            DRegisterLane(rm, lane));
   29271                                       break;
   29272                                     }
   29273                                     case 0x10000000: {
   29274                                       // 0xff800440
   29275                                       if (((instr & 0x300000) == 0x300000)) {
   29276                                         UnallocatedT32(instr);
   29277                                         return;
   29278                                       }
   29279                                       DataType dt =
   29280                                           Dt_size_9_Decode((instr >> 20) & 0x3,
   29281                                                            (instr >> 8) & 0x1);
   29282                                       if (dt.Is(kDataTypeValueInvalid)) {
   29283                                         UnallocatedT32(instr);
   29284                                         return;
   29285                                       }
   29286                                       if (((instr >> 12) & 1) != 0) {
   29287                                         UnallocatedT32(instr);
   29288                                         return;
   29289                                       }
   29290                                       unsigned rd =
   29291                                           ExtractQRegister(instr, 22, 12);
   29292                                       if (((instr >> 16) & 1) != 0) {
   29293                                         UnallocatedT32(instr);
   29294                                         return;
   29295                                       }
   29296                                       unsigned rn =
   29297                                           ExtractQRegister(instr, 7, 16);
   29298                                       int lane;
   29299                                       unsigned rm =
   29300                                           ExtractDRegisterAndLane(instr,
   29301                                                                   dt,
   29302                                                                   5,
   29303                                                                   0,
   29304                                                                   &lane);
   29305                                       // VMLS{<c>}{<q>}.<type><size> <Qd>, <Qn>, <Dm[x]> ; T1 NOLINT(whitespace/line_length)
   29306                                       vmls(CurrentCond(),
   29307                                            dt,
   29308                                            QRegister(rd),
   29309                                            QRegister(rn),
   29310                                            DRegisterLane(rm, lane));
   29311                                       break;
   29312                                     }
   29313                                   }
   29314                                   break;
   29315                                 }
   29316                                 case 0x00000200: {
   29317                                   // 0xef800640
   29318                                   switch (instr & 0x00000100) {
   29319                                     case 0x00000000: {
   29320                                       // 0xef800640
   29321                                       if (((instr & 0x300000) == 0x300000)) {
   29322                                         UnallocatedT32(instr);
   29323                                         return;
   29324                                       }
   29325                                       DataType dt =
   29326                                           Dt_size_11_Decode((instr >> 20) & 0x3,
   29327                                                             (instr >> 28) &
   29328                                                                 0x1);
   29329                                       if (dt.Is(kDataTypeValueInvalid)) {
   29330                                         UnallocatedT32(instr);
   29331                                         return;
   29332                                       }
   29333                                       if (((instr >> 12) & 1) != 0) {
   29334                                         UnallocatedT32(instr);
   29335                                         return;
   29336                                       }
   29337                                       unsigned rd =
   29338                                           ExtractQRegister(instr, 22, 12);
   29339                                       unsigned rn =
   29340                                           ExtractDRegister(instr, 7, 16);
   29341                                       int lane;
   29342                                       unsigned rm =
   29343                                           ExtractDRegisterAndLane(instr,
   29344                                                                   dt,
   29345                                                                   5,
   29346                                                                   0,
   29347                                                                   &lane);
   29348                                       // VMLSL{<c>}{<q>}.<type><size> <Qd>, <Dn>, <Dm[x]> ; T1 NOLINT(whitespace/line_length)
   29349                                       vmlsl(CurrentCond(),
   29350                                             dt,
   29351                                             QRegister(rd),
   29352                                             DRegister(rn),
   29353                                             DRegisterLane(rm, lane));
   29354                                       break;
   29355                                     }
   29356                                     case 0x00000100: {
   29357                                       // 0xef800740
   29358                                       if ((instr & 0x10000000) == 0x00000000) {
   29359                                         if (((instr & 0x300000) == 0x300000)) {
   29360                                           UnallocatedT32(instr);
   29361                                           return;
   29362                                         }
   29363                                         DataType dt = Dt_size_13_Decode(
   29364                                             (instr >> 20) & 0x3);
   29365                                         if (dt.Is(kDataTypeValueInvalid)) {
   29366                                           UnallocatedT32(instr);
   29367                                           return;
   29368                                         }
   29369                                         if (((instr >> 12) & 1) != 0) {
   29370                                           UnallocatedT32(instr);
   29371                                           return;
   29372                                         }
   29373                                         unsigned rd =
   29374                                             ExtractQRegister(instr, 22, 12);
   29375                                         unsigned rn =
   29376                                             ExtractDRegister(instr, 7, 16);
   29377                                         uint32_t mvm = (instr & 0xf) |
   29378                                                        ((instr >> 1) & 0x10);
   29379                                         uint32_t shift = 4;
   29380                                         if (dt.Is(S16)) {
   29381                                           shift = 3;
   29382                                         }
   29383                                         uint32_t vm = mvm & ((1 << shift) - 1);
   29384                                         uint32_t index = mvm >> shift;
   29385                                         // VQDMLSL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm>[<index>] ; T2 NOLINT(whitespace/line_length)
   29386                                         vqdmlsl(CurrentCond(),
   29387                                                 dt,
   29388                                                 QRegister(rd),
   29389                                                 DRegister(rn),
   29390                                                 DRegister(vm),
   29391                                                 index);
   29392                                       } else {
   29393                                         UnallocatedT32(instr);
   29394                                       }
   29395                                       break;
   29396                                     }
   29397                                   }
   29398                                   break;
   29399                                 }
   29400                               }
   29401                               break;
   29402                             }
   29403                             case 0x00000800: {
   29404                               // 0xef800800
   29405                               switch (instr & 0x00000300) {
   29406                                 case 0x00000000: {
   29407                                   // 0xef800800
   29408                                   if (((instr & 0x300000) == 0x300000)) {
   29409                                     UnallocatedT32(instr);
   29410                                     return;
   29411                                   }
   29412                                   DataType dt =
   29413                                       Dt_size_12_Decode((instr >> 20) & 0x3,
   29414                                                         (instr >> 28) & 0x1);
   29415                                   if (dt.Is(kDataTypeValueInvalid)) {
   29416                                     UnallocatedT32(instr);
   29417                                     return;
   29418                                   }
   29419                                   if (((instr >> 12) & 1) != 0) {
   29420                                     UnallocatedT32(instr);
   29421                                     return;
   29422                                   }
   29423                                   unsigned rd = ExtractQRegister(instr, 22, 12);
   29424                                   unsigned rn = ExtractDRegister(instr, 7, 16);
   29425                                   unsigned rm = ExtractDRegister(instr, 5, 0);
   29426                                   // VMLAL{<c>}{<q>}.<type><size> <Qd>, <Dn>, <Dm> ; T1 NOLINT(whitespace/line_length)
   29427                                   vmlal(CurrentCond(),
   29428                                         dt,
   29429                                         QRegister(rd),
   29430                                         DRegister(rn),
   29431                                         DRegister(rm));
   29432                                   break;
   29433                                 }
   29434                                 case 0x00000100: {
   29435                                   // 0xef800900
   29436                                   if ((instr & 0x10000000) == 0x00000000) {
   29437                                     if (((instr & 0x300000) == 0x300000)) {
   29438                                       UnallocatedT32(instr);
   29439                                       return;
   29440                                     }
   29441                                     DataType dt =
   29442                                         Dt_size_13_Decode((instr >> 20) & 0x3);
   29443                                     if (dt.Is(kDataTypeValueInvalid)) {
   29444                                       UnallocatedT32(instr);
   29445                                       return;
   29446                                     }
   29447                                     if (((instr >> 12) & 1) != 0) {
   29448                                       UnallocatedT32(instr);
   29449                                       return;
   29450                                     }
   29451                                     unsigned rd =
   29452                                         ExtractQRegister(instr, 22, 12);
   29453                                     unsigned rn =
   29454                                         ExtractDRegister(instr, 7, 16);
   29455                                     unsigned rm = ExtractDRegister(instr, 5, 0);
   29456                                     // VQDMLAL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; T1 NOLINT(whitespace/line_length)
   29457                                     vqdmlal(CurrentCond(),
   29458                                             dt,
   29459                                             QRegister(rd),
   29460                                             DRegister(rn),
   29461                                             DRegister(rm));
   29462                                   } else {
   29463                                     UnallocatedT32(instr);
   29464                                   }
   29465                                   break;
   29466                                 }
   29467                                 case 0x00000200: {
   29468                                   // 0xef800a00
   29469                                   if (((instr & 0x300000) == 0x300000)) {
   29470                                     UnallocatedT32(instr);
   29471                                     return;
   29472                                   }
   29473                                   DataType dt =
   29474                                       Dt_size_12_Decode((instr >> 20) & 0x3,
   29475                                                         (instr >> 28) & 0x1);
   29476                                   if (dt.Is(kDataTypeValueInvalid)) {
   29477                                     UnallocatedT32(instr);
   29478                                     return;
   29479                                   }
   29480                                   if (((instr >> 12) & 1) != 0) {
   29481                                     UnallocatedT32(instr);
   29482                                     return;
   29483                                   }
   29484                                   unsigned rd = ExtractQRegister(instr, 22, 12);
   29485                                   unsigned rn = ExtractDRegister(instr, 7, 16);
   29486                                   unsigned rm = ExtractDRegister(instr, 5, 0);
   29487                                   // VMLSL{<c>}{<q>}.<type><size> <Qd>, <Dn>, <Dm> ; T1 NOLINT(whitespace/line_length)
   29488                                   vmlsl(CurrentCond(),
   29489                                         dt,
   29490                                         QRegister(rd),
   29491                                         DRegister(rn),
   29492                                         DRegister(rm));
   29493                                   break;
   29494                                 }
   29495                                 case 0x00000300: {
   29496                                   // 0xef800b00
   29497                                   if ((instr & 0x10000000) == 0x00000000) {
   29498                                     if (((instr & 0x300000) == 0x300000)) {
   29499                                       UnallocatedT32(instr);
   29500                                       return;
   29501                                     }
   29502                                     DataType dt =
   29503                                         Dt_size_13_Decode((instr >> 20) & 0x3);
   29504                                     if (dt.Is(kDataTypeValueInvalid)) {
   29505                                       UnallocatedT32(instr);
   29506                                       return;
   29507                                     }
   29508                                     if (((instr >> 12) & 1) != 0) {
   29509                                       UnallocatedT32(instr);
   29510                                       return;
   29511                                     }
   29512                                     unsigned rd =
   29513                                         ExtractQRegister(instr, 22, 12);
   29514                                     unsigned rn =
   29515                                         ExtractDRegister(instr, 7, 16);
   29516                                     unsigned rm = ExtractDRegister(instr, 5, 0);
   29517                                     // VQDMLSL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; T1 NOLINT(whitespace/line_length)
   29518                                     vqdmlsl(CurrentCond(),
   29519                                             dt,
   29520                                             QRegister(rd),
   29521                                             DRegister(rn),
   29522                                             DRegister(rm));
   29523                                   } else {
   29524                                     UnallocatedT32(instr);
   29525                                   }
   29526                                   break;
   29527                                 }
   29528                               }
   29529                               break;
   29530                             }
   29531                             case 0x00000840: {
   29532                               // 0xef800840
   29533                               switch (instr & 0x00000200) {
   29534                                 case 0x00000000: {
   29535                                   // 0xef800840
   29536                                   switch (instr & 0x10000000) {
   29537                                     case 0x00000000: {
   29538                                       // 0xef800840
   29539                                       if (((instr & 0x300000) == 0x300000)) {
   29540                                         UnallocatedT32(instr);
   29541                                         return;
   29542                                       }
   29543                                       DataType dt = Dt_F_size_3_Decode(
   29544                                           ((instr >> 20) & 0x3) |
   29545                                           ((instr >> 6) & 0x4));
   29546                                       if (dt.Is(kDataTypeValueInvalid)) {
   29547                                         UnallocatedT32(instr);
   29548                                         return;
   29549                                       }
   29550                                       unsigned rd =
   29551                                           ExtractDRegister(instr, 22, 12);
   29552                                       unsigned rn =
   29553                                           ExtractDRegister(instr, 7, 16);
   29554                                       uint32_t mvm =
   29555                                           (instr & 0xf) | ((instr >> 1) & 0x10);
   29556                                       uint32_t shift = 4;
   29557                                       if (dt.Is(I16)) {
   29558                                         shift = 3;
   29559                                       }
   29560                                       uint32_t vm = mvm & ((1 << shift) - 1);
   29561                                       uint32_t index = mvm >> shift;
   29562                                       // VMUL{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm>[<index>] ; T1 NOLINT(whitespace/line_length)
   29563                                       vmul(CurrentCond(),
   29564                                            dt,
   29565                                            DRegister(rd),
   29566                                            DRegister(rn),
   29567                                            DRegister(vm),
   29568                                            index);
   29569                                       break;
   29570                                     }
   29571                                     case 0x10000000: {
   29572                                       // 0xff800840
   29573                                       if (((instr & 0x300000) == 0x300000)) {
   29574                                         UnallocatedT32(instr);
   29575                                         return;
   29576                                       }
   29577                                       DataType dt = Dt_F_size_3_Decode(
   29578                                           ((instr >> 20) & 0x3) |
   29579                                           ((instr >> 6) & 0x4));
   29580                                       if (dt.Is(kDataTypeValueInvalid)) {
   29581                                         UnallocatedT32(instr);
   29582                                         return;
   29583                                       }
   29584                                       if (((instr >> 12) & 1) != 0) {
   29585                                         UnallocatedT32(instr);
   29586                                         return;
   29587                                       }
   29588                                       unsigned rd =
   29589                                           ExtractQRegister(instr, 22, 12);
   29590                                       if (((instr >> 16) & 1) != 0) {
   29591                                         UnallocatedT32(instr);
   29592                                         return;
   29593                                       }
   29594                                       unsigned rn =
   29595                                           ExtractQRegister(instr, 7, 16);
   29596                                       uint32_t mvm =
   29597                                           (instr & 0xf) | ((instr >> 1) & 0x10);
   29598                                       uint32_t shift = 4;
   29599                                       if (dt.Is(I16)) {
   29600                                         shift = 3;
   29601                                       }
   29602                                       uint32_t vm = mvm & ((1 << shift) - 1);
   29603                                       uint32_t index = mvm >> shift;
   29604                                       // VMUL{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Dm>[<index>] ; T1 NOLINT(whitespace/line_length)
   29605                                       vmul(CurrentCond(),
   29606                                            dt,
   29607                                            QRegister(rd),
   29608                                            QRegister(rn),
   29609                                            DRegister(vm),
   29610                                            index);
   29611                                       break;
   29612                                     }
   29613                                   }
   29614                                   break;
   29615                                 }
   29616                                 case 0x00000200: {
   29617                                   // 0xef800a40
   29618                                   switch (instr & 0x00000100) {
   29619                                     case 0x00000000: {
   29620                                       // 0xef800a40
   29621                                       if (((instr & 0x300000) == 0x300000)) {
   29622                                         UnallocatedT32(instr);
   29623                                         return;
   29624                                       }
   29625                                       DataType dt = Dt_U_size_2_Decode(
   29626                                           ((instr >> 20) & 0x3) |
   29627                                           ((instr >> 26) & 0x4));
   29628                                       if (dt.Is(kDataTypeValueInvalid)) {
   29629                                         UnallocatedT32(instr);
   29630                                         return;
   29631                                       }
   29632                                       if (((instr >> 12) & 1) != 0) {
   29633                                         UnallocatedT32(instr);
   29634                                         return;
   29635                                       }
   29636                                       unsigned rd =
   29637                                           ExtractQRegister(instr, 22, 12);
   29638                                       unsigned rn =
   29639                                           ExtractDRegister(instr, 7, 16);
   29640                                       uint32_t mvm =
   29641                                           (instr & 0xf) | ((instr >> 1) & 0x10);
   29642                                       uint32_t shift = 4;
   29643                                       if (dt.Is(S16) || dt.Is(U16)) {
   29644                                         shift = 3;
   29645                                       }
   29646                                       uint32_t vm = mvm & ((1 << shift) - 1);
   29647                                       uint32_t index = mvm >> shift;
   29648                                       // VMULL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm>[<index>] ; T1 NOLINT(whitespace/line_length)
   29649                                       vmull(CurrentCond(),
   29650                                             dt,
   29651                                             QRegister(rd),
   29652                                             DRegister(rn),
   29653                                             DRegister(vm),
   29654                                             index);
   29655                                       break;
   29656                                     }
   29657                                     case 0x00000100: {
   29658                                       // 0xef800b40
   29659                                       if ((instr & 0x10000000) == 0x00000000) {
   29660                                         if (((instr & 0x300000) == 0x300000)) {
   29661                                           UnallocatedT32(instr);
   29662                                           return;
   29663                                         }
   29664                                         DataType dt = Dt_size_13_Decode(
   29665                                             (instr >> 20) & 0x3);
   29666                                         if (dt.Is(kDataTypeValueInvalid)) {
   29667                                           UnallocatedT32(instr);
   29668                                           return;
   29669                                         }
   29670                                         if (((instr >> 12) & 1) != 0) {
   29671                                           UnallocatedT32(instr);
   29672                                           return;
   29673                                         }
   29674                                         unsigned rd =
   29675                                             ExtractQRegister(instr, 22, 12);
   29676                                         unsigned rn =
   29677                                             ExtractDRegister(instr, 7, 16);
   29678                                         int lane;
   29679                                         unsigned rm =
   29680                                             ExtractDRegisterAndLane(instr,
   29681                                                                     dt,
   29682                                                                     5,
   29683                                                                     0,
   29684                                                                     &lane);
   29685                                         // VQDMULL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm[x]> ; T2 NOLINT(whitespace/line_length)
   29686                                         vqdmull(CurrentCond(),
   29687                                                 dt,
   29688                                                 QRegister(rd),
   29689                                                 DRegister(rn),
   29690                                                 DRegisterLane(rm, lane));
   29691                                       } else {
   29692                                         UnallocatedT32(instr);
   29693                                       }
   29694                                       break;
   29695                                     }
   29696                                   }
   29697                                   break;
   29698                                 }
   29699                               }
   29700                               break;
   29701                             }
   29702                             case 0x00000c00: {
   29703                               // 0xef800c00
   29704                               switch (instr & 0x00000100) {
   29705                                 case 0x00000000: {
   29706                                   // 0xef800c00
   29707                                   if (((instr & 0x300000) == 0x300000)) {
   29708                                     UnallocatedT32(instr);
   29709                                     return;
   29710                                   }
   29711                                   DataType dt = Dt_op_U_size_1_Decode(
   29712                                       ((instr >> 20) & 0x3) |
   29713                                       ((instr >> 26) & 0x4) |
   29714                                       ((instr >> 6) & 0x8));
   29715                                   if (dt.Is(kDataTypeValueInvalid)) {
   29716                                     UnallocatedT32(instr);
   29717                                     return;
   29718                                   }
   29719                                   if (((instr >> 12) & 1) != 0) {
   29720                                     UnallocatedT32(instr);
   29721                                     return;
   29722                                   }
   29723                                   unsigned rd = ExtractQRegister(instr, 22, 12);
   29724                                   unsigned rn = ExtractDRegister(instr, 7, 16);
   29725                                   unsigned rm = ExtractDRegister(instr, 5, 0);
   29726                                   // VMULL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; T1
   29727                                   vmull(CurrentCond(),
   29728                                         dt,
   29729                                         QRegister(rd),
   29730                                         DRegister(rn),
   29731                                         DRegister(rm));
   29732                                   break;
   29733                                 }
   29734                                 case 0x00000100: {
   29735                                   // 0xef800d00
   29736                                   if ((instr & 0x10000200) == 0x00000000) {
   29737                                     if (((instr & 0x300000) == 0x300000)) {
   29738                                       UnallocatedT32(instr);
   29739                                       return;
   29740                                     }
   29741                                     DataType dt =
   29742                                         Dt_size_13_Decode((instr >> 20) & 0x3);
   29743                                     if (dt.Is(kDataTypeValueInvalid)) {
   29744                                       UnallocatedT32(instr);
   29745                                       return;
   29746                                     }
   29747                                     if (((instr >> 12) & 1) != 0) {
   29748                                       UnallocatedT32(instr);
   29749                                       return;
   29750                                     }
   29751                                     unsigned rd =
   29752                                         ExtractQRegister(instr, 22, 12);
   29753                                     unsigned rn =
   29754                                         ExtractDRegister(instr, 7, 16);
   29755                                     unsigned rm = ExtractDRegister(instr, 5, 0);
   29756                                     // VQDMULL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; T1 NOLINT(whitespace/line_length)
   29757                                     vqdmull(CurrentCond(),
   29758                                             dt,
   29759                                             QRegister(rd),
   29760                                             DRegister(rn),
   29761                                             DRegister(rm));
   29762                                   } else {
   29763                                     UnallocatedT32(instr);
   29764                                   }
   29765                                   break;
   29766                                 }
   29767                               }
   29768                               break;
   29769                             }
   29770                             case 0x00000c40: {
   29771                               // 0xef800c40
   29772                               switch (instr & 0x10000300) {
   29773                                 case 0x00000000: {
   29774                                   // 0xef800c40
   29775                                   if (((instr & 0x300000) == 0x300000)) {
   29776                                     UnallocatedT32(instr);
   29777                                     return;
   29778                                   }
   29779                                   DataType dt =
   29780                                       Dt_size_13_Decode((instr >> 20) & 0x3);
   29781                                   if (dt.Is(kDataTypeValueInvalid)) {
   29782                                     UnallocatedT32(instr);
   29783                                     return;
   29784                                   }
   29785                                   unsigned rd = ExtractDRegister(instr, 22, 12);
   29786                                   unsigned rn = ExtractDRegister(instr, 7, 16);
   29787                                   int lane;
   29788                                   unsigned rm = ExtractDRegisterAndLane(instr,
   29789                                                                         dt,
   29790                                                                         5,
   29791                                                                         0,
   29792                                                                         &lane);
   29793                                   // VQDMULH{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm[x]> ; T2 NOLINT(whitespace/line_length)
   29794                                   vqdmulh(CurrentCond(),
   29795                                           dt,
   29796                                           DRegister(rd),
   29797                                           DRegister(rn),
   29798                                           DRegisterLane(rm, lane));
   29799                                   break;
   29800                                 }
   29801                                 case 0x00000100: {
   29802                                   // 0xef800d40
   29803                                   if (((instr & 0x300000) == 0x300000)) {
   29804                                     UnallocatedT32(instr);
   29805                                     return;
   29806                                   }
   29807                                   DataType dt =
   29808                                       Dt_size_13_Decode((instr >> 20) & 0x3);
   29809                                   if (dt.Is(kDataTypeValueInvalid)) {
   29810                                     UnallocatedT32(instr);
   29811                                     return;
   29812                                   }
   29813                                   unsigned rd = ExtractDRegister(instr, 22, 12);
   29814                                   unsigned rn = ExtractDRegister(instr, 7, 16);
   29815                                   int lane;
   29816                                   unsigned rm = ExtractDRegisterAndLane(instr,
   29817                                                                         dt,
   29818                                                                         5,
   29819                                                                         0,
   29820                                                                         &lane);
   29821                                   // VQRDMULH{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm[x]> ; T2 NOLINT(whitespace/line_length)
   29822                                   vqrdmulh(CurrentCond(),
   29823                                            dt,
   29824                                            DRegister(rd),
   29825                                            DRegister(rn),
   29826                                            DRegisterLane(rm, lane));
   29827                                   break;
   29828                                 }
   29829                                 case 0x10000000: {
   29830                                   // 0xff800c40
   29831                                   if (((instr & 0x300000) == 0x300000)) {
   29832                                     UnallocatedT32(instr);
   29833                                     return;
   29834                                   }
   29835                                   DataType dt =
   29836                                       Dt_size_13_Decode((instr >> 20) & 0x3);
   29837                                   if (dt.Is(kDataTypeValueInvalid)) {
   29838                                     UnallocatedT32(instr);
   29839                                     return;
   29840                                   }
   29841                                   if (((instr >> 12) & 1) != 0) {
   29842                                     UnallocatedT32(instr);
   29843                                     return;
   29844                                   }
   29845                                   unsigned rd = ExtractQRegister(instr, 22, 12);
   29846                                   if (((instr >> 16) & 1) != 0) {
   29847                                     UnallocatedT32(instr);
   29848                                     return;
   29849                                   }
   29850                                   unsigned rn = ExtractQRegister(instr, 7, 16);
   29851                                   int lane;
   29852                                   unsigned rm = ExtractDRegisterAndLane(instr,
   29853                                                                         dt,
   29854                                                                         5,
   29855                                                                         0,
   29856                                                                         &lane);
   29857                                   // VQDMULH{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Dm[x]> ; T2 NOLINT(whitespace/line_length)
   29858                                   vqdmulh(CurrentCond(),
   29859                                           dt,
   29860                                           QRegister(rd),
   29861                                           QRegister(rn),
   29862                                           DRegisterLane(rm, lane));
   29863                                   break;
   29864                                 }
   29865                                 case 0x10000100: {
   29866                                   // 0xff800d40
   29867                                   if (((instr & 0x300000) == 0x300000)) {
   29868                                     UnallocatedT32(instr);
   29869                                     return;
   29870                                   }
   29871                                   DataType dt =
   29872                                       Dt_size_13_Decode((instr >> 20) & 0x3);
   29873                                   if (dt.Is(kDataTypeValueInvalid)) {
   29874                                     UnallocatedT32(instr);
   29875                                     return;
   29876                                   }
   29877                                   if (((instr >> 12) & 1) != 0) {
   29878                                     UnallocatedT32(instr);
   29879                                     return;
   29880                                   }
   29881                                   unsigned rd = ExtractQRegister(instr, 22, 12);
   29882                                   if (((instr >> 16) & 1) != 0) {
   29883                                     UnallocatedT32(instr);
   29884                                     return;
   29885                                   }
   29886                                   unsigned rn = ExtractQRegister(instr, 7, 16);
   29887                                   int lane;
   29888                                   unsigned rm = ExtractDRegisterAndLane(instr,
   29889                                                                         dt,
   29890                                                                         5,
   29891                                                                         0,
   29892                                                                         &lane);
   29893                                   // VQRDMULH{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Dm[x]> ; T2 NOLINT(whitespace/line_length)
   29894                                   vqrdmulh(CurrentCond(),
   29895                                            dt,
   29896                                            QRegister(rd),
   29897                                            QRegister(rn),
   29898                                            DRegisterLane(rm, lane));
   29899                                   break;
   29900                                 }
   29901                                 default:
   29902                                   UnallocatedT32(instr);
   29903                                   break;
   29904                               }
   29905                               break;
   29906                             }
   29907                           }
   29908                           break;
   29909                         }
   29910                       }
   29911                       break;
   29912                     }
   29913                   }
   29914                   break;
   29915                 }
   29916                 case 0x01000010: {
   29917                   // 0xef000010
   29918                   switch (instr & 0x00800040) {
   29919                     case 0x00000000: {
   29920                       // 0xef000010
   29921                       switch (instr & 0x00000f00) {
   29922                         case 0x00000000: {
   29923                           // 0xef000010
   29924                           DataType dt = Dt_U_size_3_Decode(
   29925                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
   29926                           if (dt.Is(kDataTypeValueInvalid)) {
   29927                             UnallocatedT32(instr);
   29928                             return;
   29929                           }
   29930                           unsigned rd = ExtractDRegister(instr, 22, 12);
   29931                           unsigned rn = ExtractDRegister(instr, 7, 16);
   29932                           unsigned rm = ExtractDRegister(instr, 5, 0);
   29933                           // VQADD{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
   29934                           vqadd(CurrentCond(),
   29935                                 dt,
   29936                                 DRegister(rd),
   29937                                 DRegister(rn),
   29938                                 DRegister(rm));
   29939                           break;
   29940                         }
   29941                         case 0x00000100: {
   29942                           // 0xef000110
   29943                           switch (instr & 0x10300000) {
   29944                             case 0x00000000: {
   29945                               // 0xef000110
   29946                               unsigned rd = ExtractDRegister(instr, 22, 12);
   29947                               unsigned rn = ExtractDRegister(instr, 7, 16);
   29948                               unsigned rm = ExtractDRegister(instr, 5, 0);
   29949                               // VAND{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; T1
   29950                               vand(CurrentCond(),
   29951                                    kDataTypeValueNone,
   29952                                    DRegister(rd),
   29953                                    DRegister(rn),
   29954                                    DRegister(rm));
   29955                               break;
   29956                             }
   29957                             case 0x00100000: {
   29958                               // 0xef100110
   29959                               unsigned rd = ExtractDRegister(instr, 22, 12);
   29960                               unsigned rn = ExtractDRegister(instr, 7, 16);
   29961                               unsigned rm = ExtractDRegister(instr, 5, 0);
   29962                               // VBIC{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; T1
   29963                               vbic(CurrentCond(),
   29964                                    kDataTypeValueNone,
   29965                                    DRegister(rd),
   29966                                    DRegister(rn),
   29967                                    DRegister(rm));
   29968                               break;
   29969                             }
   29970                             case 0x00200000: {
   29971                               // 0xef200110
   29972                               if (((instr & 0x00000040) == 0x00000000) &&
   29973                                   ((((Uint32((instr >> 7)) & Uint32(0x1))
   29974                                      << 4) |
   29975                                     (Uint32((instr >> 16)) & Uint32(0xf))) ==
   29976                                    (((Uint32((instr >> 5)) & Uint32(0x1))
   29977                                      << 4) |
   29978                                     (Uint32(instr) & Uint32(0xf))))) {
   29979                                 unsigned rd = ExtractDRegister(instr, 22, 12);
   29980                                 unsigned rm = ExtractDRegister(instr, 7, 16);
   29981                                 // VMOV{<c>}{<q>}{.<dt>} <Dd>, <Dm> ; T1
   29982                                 vmov(CurrentCond(),
   29983                                      kDataTypeValueNone,
   29984                                      DRegister(rd),
   29985                                      DRegister(rm));
   29986                                 return;
   29987                               }
   29988                               unsigned rd = ExtractDRegister(instr, 22, 12);
   29989                               unsigned rn = ExtractDRegister(instr, 7, 16);
   29990                               unsigned rm = ExtractDRegister(instr, 5, 0);
   29991                               // VORR{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; T1
   29992                               vorr(CurrentCond(),
   29993                                    kDataTypeValueNone,
   29994                                    DRegister(rd),
   29995                                    DRegister(rn),
   29996                                    DRegister(rm));
   29997                               break;
   29998                             }
   29999                             case 0x00300000: {
   30000                               // 0xef300110
   30001                               unsigned rd = ExtractDRegister(instr, 22, 12);
   30002                               unsigned rn = ExtractDRegister(instr, 7, 16);
   30003                               unsigned rm = ExtractDRegister(instr, 5, 0);
   30004                               // VORN{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; T1
   30005                               vorn(CurrentCond(),
   30006                                    kDataTypeValueNone,
   30007                                    DRegister(rd),
   30008                                    DRegister(rn),
   30009                                    DRegister(rm));
   30010                               break;
   30011                             }
   30012                             case 0x10000000: {
   30013                               // 0xff000110
   30014                               unsigned rd = ExtractDRegister(instr, 22, 12);
   30015                               unsigned rn = ExtractDRegister(instr, 7, 16);
   30016                               unsigned rm = ExtractDRegister(instr, 5, 0);
   30017                               // VEOR{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; T1
   30018                               veor(CurrentCond(),
   30019                                    kDataTypeValueNone,
   30020                                    DRegister(rd),
   30021                                    DRegister(rn),
   30022                                    DRegister(rm));
   30023                               break;
   30024                             }
   30025                             case 0x10100000: {
   30026                               // 0xff100110
   30027                               unsigned rd = ExtractDRegister(instr, 22, 12);
   30028                               unsigned rn = ExtractDRegister(instr, 7, 16);
   30029                               unsigned rm = ExtractDRegister(instr, 5, 0);
   30030                               // VBSL{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; T1
   30031                               vbsl(CurrentCond(),
   30032                                    kDataTypeValueNone,
   30033                                    DRegister(rd),
   30034                                    DRegister(rn),
   30035                                    DRegister(rm));
   30036                               break;
   30037                             }
   30038                             case 0x10200000: {
   30039                               // 0xff200110
   30040                               unsigned rd = ExtractDRegister(instr, 22, 12);
   30041                               unsigned rn = ExtractDRegister(instr, 7, 16);
   30042                               unsigned rm = ExtractDRegister(instr, 5, 0);
   30043                               // VBIT{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; T1
   30044                               vbit(CurrentCond(),
   30045                                    kDataTypeValueNone,
   30046                                    DRegister(rd),
   30047                                    DRegister(rn),
   30048                                    DRegister(rm));
   30049                               break;
   30050                             }
   30051                             case 0x10300000: {
   30052                               // 0xff300110
   30053                               unsigned rd = ExtractDRegister(instr, 22, 12);
   30054                               unsigned rn = ExtractDRegister(instr, 7, 16);
   30055                               unsigned rm = ExtractDRegister(instr, 5, 0);
   30056                               // VBIF{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; T1
   30057                               vbif(CurrentCond(),
   30058                                    kDataTypeValueNone,
   30059                                    DRegister(rd),
   30060                                    DRegister(rn),
   30061                                    DRegister(rm));
   30062                               break;
   30063                             }
   30064                           }
   30065                           break;
   30066                         }
   30067                         case 0x00000200: {
   30068                           // 0xef000210
   30069                           DataType dt = Dt_U_size_3_Decode(
   30070                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
   30071                           if (dt.Is(kDataTypeValueInvalid)) {
   30072                             UnallocatedT32(instr);
   30073                             return;
   30074                           }
   30075                           unsigned rd = ExtractDRegister(instr, 22, 12);
   30076                           unsigned rn = ExtractDRegister(instr, 7, 16);
   30077                           unsigned rm = ExtractDRegister(instr, 5, 0);
   30078                           // VQSUB{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
   30079                           vqsub(CurrentCond(),
   30080                                 dt,
   30081                                 DRegister(rd),
   30082                                 DRegister(rn),
   30083                                 DRegister(rm));
   30084                           break;
   30085                         }
   30086                         case 0x00000300: {
   30087                           // 0xef000310
   30088                           DataType dt = Dt_U_size_1_Decode(
   30089                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
   30090                           if (dt.Is(kDataTypeValueInvalid)) {
   30091                             UnallocatedT32(instr);
   30092                             return;
   30093                           }
   30094                           unsigned rd = ExtractDRegister(instr, 22, 12);
   30095                           unsigned rn = ExtractDRegister(instr, 7, 16);
   30096                           unsigned rm = ExtractDRegister(instr, 5, 0);
   30097                           // VCGE{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
   30098                           vcge(CurrentCond(),
   30099                                dt,
   30100                                DRegister(rd),
   30101                                DRegister(rn),
   30102                                DRegister(rm));
   30103                           break;
   30104                         }
   30105                         case 0x00000400: {
   30106                           // 0xef000410
   30107                           DataType dt = Dt_U_size_3_Decode(
   30108                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
   30109                           if (dt.Is(kDataTypeValueInvalid)) {
   30110                             UnallocatedT32(instr);
   30111                             return;
   30112                           }
   30113                           unsigned rd = ExtractDRegister(instr, 22, 12);
   30114                           unsigned rm = ExtractDRegister(instr, 5, 0);
   30115                           unsigned rn = ExtractDRegister(instr, 7, 16);
   30116                           // VQSHL{<c>}{<q>}.<dt> {<Dd>}, <Dm>, <Dn> ; T1
   30117                           vqshl(CurrentCond(),
   30118                                 dt,
   30119                                 DRegister(rd),
   30120                                 DRegister(rm),
   30121                                 DRegister(rn));
   30122                           break;
   30123                         }
   30124                         case 0x00000500: {
   30125                           // 0xef000510
   30126                           DataType dt = Dt_U_size_3_Decode(
   30127                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
   30128                           if (dt.Is(kDataTypeValueInvalid)) {
   30129                             UnallocatedT32(instr);
   30130                             return;
   30131                           }
   30132                           unsigned rd = ExtractDRegister(instr, 22, 12);
   30133                           unsigned rm = ExtractDRegister(instr, 5, 0);
   30134                           unsigned rn = ExtractDRegister(instr, 7, 16);
   30135                           // VQRSHL{<c>}{<q>}.<dt> {<Dd>}, <Dm>, <Dn> ; T1
   30136                           vqrshl(CurrentCond(),
   30137                                  dt,
   30138                                  DRegister(rd),
   30139                                  DRegister(rm),
   30140                                  DRegister(rn));
   30141                           break;
   30142                         }
   30143                         case 0x00000600: {
   30144                           // 0xef000610
   30145                           DataType dt = Dt_U_size_1_Decode(
   30146                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
   30147                           if (dt.Is(kDataTypeValueInvalid)) {
   30148                             UnallocatedT32(instr);
   30149                             return;
   30150                           }
   30151                           unsigned rd = ExtractDRegister(instr, 22, 12);
   30152                           unsigned rn = ExtractDRegister(instr, 7, 16);
   30153                           unsigned rm = ExtractDRegister(instr, 5, 0);
   30154                           // VMIN{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
   30155                           vmin(CurrentCond(),
   30156                                dt,
   30157                                DRegister(rd),
   30158                                DRegister(rn),
   30159                                DRegister(rm));
   30160                           break;
   30161                         }
   30162                         case 0x00000700: {
   30163                           // 0xef000710
   30164                           DataType dt = Dt_U_size_1_Decode(
   30165                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
   30166                           if (dt.Is(kDataTypeValueInvalid)) {
   30167                             UnallocatedT32(instr);
   30168                             return;
   30169                           }
   30170                           unsigned rd = ExtractDRegister(instr, 22, 12);
   30171                           unsigned rn = ExtractDRegister(instr, 7, 16);
   30172                           unsigned rm = ExtractDRegister(instr, 5, 0);
   30173                           // VABA{<c>}{<q>}.<dt> <Dd>, <Dn>, <Dm> ; T1
   30174                           vaba(CurrentCond(),
   30175                                dt,
   30176                                DRegister(rd),
   30177                                DRegister(rn),
   30178                                DRegister(rm));
   30179                           break;
   30180                         }
   30181                         case 0x00000800: {
   30182                           // 0xef000810
   30183                           switch (instr & 0x10000000) {
   30184                             case 0x00000000: {
   30185                               // 0xef000810
   30186                               DataType dt =
   30187                                   Dt_size_7_Decode((instr >> 20) & 0x3);
   30188                               if (dt.Is(kDataTypeValueInvalid)) {
   30189                                 UnallocatedT32(instr);
   30190                                 return;
   30191                               }
   30192                               unsigned rd = ExtractDRegister(instr, 22, 12);
   30193                               unsigned rn = ExtractDRegister(instr, 7, 16);
   30194                               unsigned rm = ExtractDRegister(instr, 5, 0);
   30195                               // VTST{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
   30196                               vtst(CurrentCond(),
   30197                                    dt,
   30198                                    DRegister(rd),
   30199                                    DRegister(rn),
   30200                                    DRegister(rm));
   30201                               break;
   30202                             }
   30203                             case 0x10000000: {
   30204                               // 0xff000810
   30205                               DataType dt =
   30206                                   Dt_size_4_Decode((instr >> 20) & 0x3);
   30207                               if (dt.Is(kDataTypeValueInvalid)) {
   30208                                 UnallocatedT32(instr);
   30209                                 return;
   30210                               }
   30211                               unsigned rd = ExtractDRegister(instr, 22, 12);
   30212                               unsigned rn = ExtractDRegister(instr, 7, 16);
   30213                               unsigned rm = ExtractDRegister(instr, 5, 0);
   30214                               // VCEQ{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
   30215                               vceq(CurrentCond(),
   30216                                    dt,
   30217                                    DRegister(rd),
   30218                                    DRegister(rn),
   30219                                    DRegister(rm));
   30220                               break;
   30221                             }
   30222                           }
   30223                           break;
   30224                         }
   30225                         case 0x00000900: {
   30226                           // 0xef000910
   30227                           DataType dt = Dt_op_size_1_Decode(
   30228                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
   30229                           if (dt.Is(kDataTypeValueInvalid)) {
   30230                             UnallocatedT32(instr);
   30231                             return;
   30232                           }
   30233                           unsigned rd = ExtractDRegister(instr, 22, 12);
   30234                           unsigned rn = ExtractDRegister(instr, 7, 16);
   30235                           unsigned rm = ExtractDRegister(instr, 5, 0);
   30236                           // VMUL{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
   30237                           vmul(CurrentCond(),
   30238                                dt,
   30239                                DRegister(rd),
   30240                                DRegister(rn),
   30241                                DRegister(rm));
   30242                           break;
   30243                         }
   30244                         case 0x00000a00: {
   30245                           // 0xef000a10
   30246                           DataType dt = Dt_U_size_1_Decode(
   30247                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
   30248                           if (dt.Is(kDataTypeValueInvalid)) {
   30249                             UnallocatedT32(instr);
   30250                             return;
   30251                           }
   30252                           unsigned rd = ExtractDRegister(instr, 22, 12);
   30253                           unsigned rn = ExtractDRegister(instr, 7, 16);
   30254                           unsigned rm = ExtractDRegister(instr, 5, 0);
   30255                           // VPMIN{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
   30256                           vpmin(CurrentCond(),
   30257                                 dt,
   30258                                 DRegister(rd),
   30259                                 DRegister(rn),
   30260                                 DRegister(rm));
   30261                           break;
   30262                         }
   30263                         case 0x00000b00: {
   30264                           // 0xef000b10
   30265                           if ((instr & 0x10000000) == 0x00000000) {
   30266                             DataType dt = Dt_size_4_Decode((instr >> 20) & 0x3);
   30267                             if (dt.Is(kDataTypeValueInvalid)) {
   30268                               UnallocatedT32(instr);
   30269                               return;
   30270                             }
   30271                             unsigned rd = ExtractDRegister(instr, 22, 12);
   30272                             unsigned rn = ExtractDRegister(instr, 7, 16);
   30273                             unsigned rm = ExtractDRegister(instr, 5, 0);
   30274                             // VPADD{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
   30275                             vpadd(CurrentCond(),
   30276                                   dt,
   30277                                   DRegister(rd),
   30278                                   DRegister(rn),
   30279                                   DRegister(rm));
   30280                           } else {
   30281                             UnallocatedT32(instr);
   30282                           }
   30283                           break;
   30284                         }
   30285                         case 0x00000c00: {
   30286                           // 0xef000c10
   30287                           switch (instr & 0x10300000) {
   30288                             case 0x00000000: {
   30289                               // 0xef000c10
   30290                               unsigned rd = ExtractDRegister(instr, 22, 12);
   30291                               unsigned rn = ExtractDRegister(instr, 7, 16);
   30292                               unsigned rm = ExtractDRegister(instr, 5, 0);
   30293                               // VFMA{<c>}{<q>}.F32 <Dd>, <Dn>, <Dm> ; T1
   30294                               vfma(CurrentCond(),
   30295                                    F32,
   30296                                    DRegister(rd),
   30297                                    DRegister(rn),
   30298                                    DRegister(rm));
   30299                               break;
   30300                             }
   30301                             case 0x00200000: {
   30302                               // 0xef200c10
   30303                               unsigned rd = ExtractDRegister(instr, 22, 12);
   30304                               unsigned rn = ExtractDRegister(instr, 7, 16);
   30305                               unsigned rm = ExtractDRegister(instr, 5, 0);
   30306                               // VFMS{<c>}{<q>}.F32 <Dd>, <Dn>, <Dm> ; T1
   30307                               vfms(CurrentCond(),
   30308                                    F32,
   30309                                    DRegister(rd),
   30310                                    DRegister(rn),
   30311                                    DRegister(rm));
   30312                               break;
   30313                             }
   30314                             default:
   30315                               UnallocatedT32(instr);
   30316                               break;
   30317                           }
   30318                           break;
   30319                         }
   30320                         case 0x00000d00: {
   30321                           // 0xef000d10
   30322                           switch (instr & 0x10300000) {
   30323                             case 0x00000000: {
   30324                               // 0xef000d10
   30325                               unsigned rd = ExtractDRegister(instr, 22, 12);
   30326                               unsigned rn = ExtractDRegister(instr, 7, 16);
   30327                               unsigned rm = ExtractDRegister(instr, 5, 0);
   30328                               // VMLA{<c>}{<q>}.F32 <Dd>, <Dn>, <Dm> ; T1
   30329                               vmla(CurrentCond(),
   30330                                    F32,
   30331                                    DRegister(rd),
   30332                                    DRegister(rn),
   30333                                    DRegister(rm));
   30334                               break;
   30335                             }
   30336                             case 0x00200000: {
   30337                               // 0xef200d10
   30338                               unsigned rd = ExtractDRegister(instr, 22, 12);
   30339                               unsigned rn = ExtractDRegister(instr, 7, 16);
   30340                               unsigned rm = ExtractDRegister(instr, 5, 0);
   30341                               // VMLS{<c>}{<q>}.F32 <Dd>, <Dn>, <Dm> ; T1
   30342                               vmls(CurrentCond(),
   30343                                    F32,
   30344                                    DRegister(rd),
   30345                                    DRegister(rn),
   30346                                    DRegister(rm));
   30347                               break;
   30348                             }
   30349                             case 0x10000000: {
   30350                               // 0xff000d10
   30351                               unsigned rd = ExtractDRegister(instr, 22, 12);
   30352                               unsigned rn = ExtractDRegister(instr, 7, 16);
   30353                               unsigned rm = ExtractDRegister(instr, 5, 0);
   30354                               // VMUL{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T1
   30355                               vmul(CurrentCond(),
   30356                                    F32,
   30357                                    DRegister(rd),
   30358                                    DRegister(rn),
   30359                                    DRegister(rm));
   30360                               break;
   30361                             }
   30362                             default:
   30363                               UnallocatedT32(instr);
   30364                               break;
   30365                           }
   30366                           break;
   30367                         }
   30368                         case 0x00000e00: {
   30369                           // 0xef000e10
   30370                           switch (instr & 0x10300000) {
   30371                             case 0x10000000: {
   30372                               // 0xff000e10
   30373                               unsigned rd = ExtractDRegister(instr, 22, 12);
   30374                               unsigned rn = ExtractDRegister(instr, 7, 16);
   30375                               unsigned rm = ExtractDRegister(instr, 5, 0);
   30376                               // VACGE{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T1
   30377                               vacge(CurrentCond(),
   30378                                     F32,
   30379                                     DRegister(rd),
   30380                                     DRegister(rn),
   30381                                     DRegister(rm));
   30382                               break;
   30383                             }
   30384                             case 0x10200000: {
   30385                               // 0xff200e10
   30386                               unsigned rd = ExtractDRegister(instr, 22, 12);
   30387                               unsigned rn = ExtractDRegister(instr, 7, 16);
   30388                               unsigned rm = ExtractDRegister(instr, 5, 0);
   30389                               // VACGT{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T1
   30390                               vacgt(CurrentCond(),
   30391                                     F32,
   30392                                     DRegister(rd),
   30393                                     DRegister(rn),
   30394                                     DRegister(rm));
   30395                               break;
   30396                             }
   30397                             default:
   30398                               UnallocatedT32(instr);
   30399                               break;
   30400                           }
   30401                           break;
   30402                         }
   30403                         case 0x00000f00: {
   30404                           // 0xef000f10
   30405                           switch (instr & 0x10300000) {
   30406                             case 0x00000000: {
   30407                               // 0xef000f10
   30408                               unsigned rd = ExtractDRegister(instr, 22, 12);
   30409                               unsigned rn = ExtractDRegister(instr, 7, 16);
   30410                               unsigned rm = ExtractDRegister(instr, 5, 0);
   30411                               // VRECPS{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T1
   30412                               vrecps(CurrentCond(),
   30413                                      F32,
   30414                                      DRegister(rd),
   30415                                      DRegister(rn),
   30416                                      DRegister(rm));
   30417                               break;
   30418                             }
   30419                             case 0x00200000: {
   30420                               // 0xef200f10
   30421                               unsigned rd = ExtractDRegister(instr, 22, 12);
   30422                               unsigned rn = ExtractDRegister(instr, 7, 16);
   30423                               unsigned rm = ExtractDRegister(instr, 5, 0);
   30424                               // VRSQRTS{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T1
   30425                               vrsqrts(CurrentCond(),
   30426                                       F32,
   30427                                       DRegister(rd),
   30428                                       DRegister(rn),
   30429                                       DRegister(rm));
   30430                               break;
   30431                             }
   30432                             case 0x10000000: {
   30433                               // 0xff000f10
   30434                               unsigned rd = ExtractDRegister(instr, 22, 12);
   30435                               unsigned rn = ExtractDRegister(instr, 7, 16);
   30436                               unsigned rm = ExtractDRegister(instr, 5, 0);
   30437                               // VMAXNM{<q>}.F32 <Dd>, <Dn>, <Dm> ; T1
   30438                               vmaxnm(F32,
   30439                                      DRegister(rd),
   30440                                      DRegister(rn),
   30441                                      DRegister(rm));
   30442                               break;
   30443                             }
   30444                             case 0x10200000: {
   30445                               // 0xff200f10
   30446                               unsigned rd = ExtractDRegister(instr, 22, 12);
   30447                               unsigned rn = ExtractDRegister(instr, 7, 16);
   30448                               unsigned rm = ExtractDRegister(instr, 5, 0);
   30449                               // VMINNM{<q>}.F32 <Dd>, <Dn>, <Dm> ; T1
   30450                               vminnm(F32,
   30451                                      DRegister(rd),
   30452                                      DRegister(rn),
   30453                                      DRegister(rm));
   30454                               break;
   30455                             }
   30456                             default:
   30457                               UnallocatedT32(instr);
   30458                               break;
   30459                           }
   30460                           break;
   30461                         }
   30462                       }
   30463                       break;
   30464                     }
   30465                     case 0x00000040: {
   30466                       // 0xef000050
   30467                       switch (instr & 0x00000f00) {
   30468                         case 0x00000000: {
   30469                           // 0xef000050
   30470                           DataType dt = Dt_U_size_3_Decode(
   30471                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
   30472                           if (dt.Is(kDataTypeValueInvalid)) {
   30473                             UnallocatedT32(instr);
   30474                             return;
   30475                           }
   30476                           if (((instr >> 12) & 1) != 0) {
   30477                             UnallocatedT32(instr);
   30478                             return;
   30479                           }
   30480                           unsigned rd = ExtractQRegister(instr, 22, 12);
   30481                           if (((instr >> 16) & 1) != 0) {
   30482                             UnallocatedT32(instr);
   30483                             return;
   30484                           }
   30485                           unsigned rn = ExtractQRegister(instr, 7, 16);
   30486                           if ((instr & 1) != 0) {
   30487                             UnallocatedT32(instr);
   30488                             return;
   30489                           }
   30490                           unsigned rm = ExtractQRegister(instr, 5, 0);
   30491                           // VQADD{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
   30492                           vqadd(CurrentCond(),
   30493                                 dt,
   30494                                 QRegister(rd),
   30495                                 QRegister(rn),
   30496                                 QRegister(rm));
   30497                           break;
   30498                         }
   30499                         case 0x00000100: {
   30500                           // 0xef000150
   30501                           switch (instr & 0x10300000) {
   30502                             case 0x00000000: {
   30503                               // 0xef000150
   30504                               if (((instr >> 12) & 1) != 0) {
   30505                                 UnallocatedT32(instr);
   30506                                 return;
   30507                               }
   30508                               unsigned rd = ExtractQRegister(instr, 22, 12);
   30509                               if (((instr >> 16) & 1) != 0) {
   30510                                 UnallocatedT32(instr);
   30511                                 return;
   30512                               }
   30513                               unsigned rn = ExtractQRegister(instr, 7, 16);
   30514                               if ((instr & 1) != 0) {
   30515                                 UnallocatedT32(instr);
   30516                                 return;
   30517                               }
   30518                               unsigned rm = ExtractQRegister(instr, 5, 0);
   30519                               // VAND{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; T1
   30520                               vand(CurrentCond(),
   30521                                    kDataTypeValueNone,
   30522                                    QRegister(rd),
   30523                                    QRegister(rn),
   30524                                    QRegister(rm));
   30525                               break;
   30526                             }
   30527                             case 0x00100000: {
   30528                               // 0xef100150
   30529                               if (((instr >> 12) & 1) != 0) {
   30530                                 UnallocatedT32(instr);
   30531                                 return;
   30532                               }
   30533                               unsigned rd = ExtractQRegister(instr, 22, 12);
   30534                               if (((instr >> 16) & 1) != 0) {
   30535                                 UnallocatedT32(instr);
   30536                                 return;
   30537                               }
   30538                               unsigned rn = ExtractQRegister(instr, 7, 16);
   30539                               if ((instr & 1) != 0) {
   30540                                 UnallocatedT32(instr);
   30541                                 return;
   30542                               }
   30543                               unsigned rm = ExtractQRegister(instr, 5, 0);
   30544                               // VBIC{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; T1
   30545                               vbic(CurrentCond(),
   30546                                    kDataTypeValueNone,
   30547                                    QRegister(rd),
   30548                                    QRegister(rn),
   30549                                    QRegister(rm));
   30550                               break;
   30551                             }
   30552                             case 0x00200000: {
   30553                               // 0xef200150
   30554                               if (((instr & 0x00000040) == 0x00000040) &&
   30555                                   ((((Uint32((instr >> 7)) & Uint32(0x1))
   30556                                      << 4) |
   30557                                     (Uint32((instr >> 16)) & Uint32(0xf))) ==
   30558                                    (((Uint32((instr >> 5)) & Uint32(0x1))
   30559                                      << 4) |
   30560                                     (Uint32(instr) & Uint32(0xf))))) {
   30561                                 if (((instr >> 12) & 1) != 0) {
   30562                                   UnallocatedT32(instr);
   30563                                   return;
   30564                                 }
   30565                                 unsigned rd = ExtractQRegister(instr, 22, 12);
   30566                                 if (((instr >> 16) & 1) != 0) {
   30567                                   UnallocatedT32(instr);
   30568                                   return;
   30569                                 }
   30570                                 unsigned rm = ExtractQRegister(instr, 7, 16);
   30571                                 // VMOV{<c>}{<q>}{.<dt>} <Qd>, <Qm> ; T1
   30572                                 vmov(CurrentCond(),
   30573                                      kDataTypeValueNone,
   30574                                      QRegister(rd),
   30575                                      QRegister(rm));
   30576                                 return;
   30577                               }
   30578                               if (((instr >> 12) & 1) != 0) {
   30579                                 UnallocatedT32(instr);
   30580                                 return;
   30581                               }
   30582                               unsigned rd = ExtractQRegister(instr, 22, 12);
   30583                               if (((instr >> 16) & 1) != 0) {
   30584                                 UnallocatedT32(instr);
   30585                                 return;
   30586                               }
   30587                               unsigned rn = ExtractQRegister(instr, 7, 16);
   30588                               if ((instr & 1) != 0) {
   30589                                 UnallocatedT32(instr);
   30590                                 return;
   30591                               }
   30592                               unsigned rm = ExtractQRegister(instr, 5, 0);
   30593                               // VORR{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; T1
   30594                               vorr(CurrentCond(),
   30595                                    kDataTypeValueNone,
   30596                                    QRegister(rd),
   30597                                    QRegister(rn),
   30598                                    QRegister(rm));
   30599                               break;
   30600                             }
   30601                             case 0x00300000: {
   30602                               // 0xef300150
   30603                               if (((instr >> 12) & 1) != 0) {
   30604                                 UnallocatedT32(instr);
   30605                                 return;
   30606                               }
   30607                               unsigned rd = ExtractQRegister(instr, 22, 12);
   30608                               if (((instr >> 16) & 1) != 0) {
   30609                                 UnallocatedT32(instr);
   30610                                 return;
   30611                               }
   30612                               unsigned rn = ExtractQRegister(instr, 7, 16);
   30613                               if ((instr & 1) != 0) {
   30614                                 UnallocatedT32(instr);
   30615                                 return;
   30616                               }
   30617                               unsigned rm = ExtractQRegister(instr, 5, 0);
   30618                               // VORN{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; T1
   30619                               vorn(CurrentCond(),
   30620                                    kDataTypeValueNone,
   30621                                    QRegister(rd),
   30622                                    QRegister(rn),
   30623                                    QRegister(rm));
   30624                               break;
   30625                             }
   30626                             case 0x10000000: {
   30627                               // 0xff000150
   30628                               if (((instr >> 12) & 1) != 0) {
   30629                                 UnallocatedT32(instr);
   30630                                 return;
   30631                               }
   30632                               unsigned rd = ExtractQRegister(instr, 22, 12);
   30633                               if (((instr >> 16) & 1) != 0) {
   30634                                 UnallocatedT32(instr);
   30635                                 return;
   30636                               }
   30637                               unsigned rn = ExtractQRegister(instr, 7, 16);
   30638                               if ((instr & 1) != 0) {
   30639                                 UnallocatedT32(instr);
   30640                                 return;
   30641                               }
   30642                               unsigned rm = ExtractQRegister(instr, 5, 0);
   30643                               // VEOR{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; T1
   30644                               veor(CurrentCond(),
   30645                                    kDataTypeValueNone,
   30646                                    QRegister(rd),
   30647                                    QRegister(rn),
   30648                                    QRegister(rm));
   30649                               break;
   30650                             }
   30651                             case 0x10100000: {
   30652                               // 0xff100150
   30653                               if (((instr >> 12) & 1) != 0) {
   30654                                 UnallocatedT32(instr);
   30655                                 return;
   30656                               }
   30657                               unsigned rd = ExtractQRegister(instr, 22, 12);
   30658                               if (((instr >> 16) & 1) != 0) {
   30659                                 UnallocatedT32(instr);
   30660                                 return;
   30661                               }
   30662                               unsigned rn = ExtractQRegister(instr, 7, 16);
   30663                               if ((instr & 1) != 0) {
   30664                                 UnallocatedT32(instr);
   30665                                 return;
   30666                               }
   30667                               unsigned rm = ExtractQRegister(instr, 5, 0);
   30668                               // VBSL{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; T1
   30669                               vbsl(CurrentCond(),
   30670                                    kDataTypeValueNone,
   30671                                    QRegister(rd),
   30672                                    QRegister(rn),
   30673                                    QRegister(rm));
   30674                               break;
   30675                             }
   30676                             case 0x10200000: {
   30677                               // 0xff200150
   30678                               if (((instr >> 12) & 1) != 0) {
   30679                                 UnallocatedT32(instr);
   30680                                 return;
   30681                               }
   30682                               unsigned rd = ExtractQRegister(instr, 22, 12);
   30683                               if (((instr >> 16) & 1) != 0) {
   30684                                 UnallocatedT32(instr);
   30685                                 return;
   30686                               }
   30687                               unsigned rn = ExtractQRegister(instr, 7, 16);
   30688                               if ((instr & 1) != 0) {
   30689                                 UnallocatedT32(instr);
   30690                                 return;
   30691                               }
   30692                               unsigned rm = ExtractQRegister(instr, 5, 0);
   30693                               // VBIT{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; T1
   30694                               vbit(CurrentCond(),
   30695                                    kDataTypeValueNone,
   30696                                    QRegister(rd),
   30697                                    QRegister(rn),
   30698                                    QRegister(rm));
   30699                               break;
   30700                             }
   30701                             case 0x10300000: {
   30702                               // 0xff300150
   30703                               if (((instr >> 12) & 1) != 0) {
   30704                                 UnallocatedT32(instr);
   30705                                 return;
   30706                               }
   30707                               unsigned rd = ExtractQRegister(instr, 22, 12);
   30708                               if (((instr >> 16) & 1) != 0) {
   30709                                 UnallocatedT32(instr);
   30710                                 return;
   30711                               }
   30712                               unsigned rn = ExtractQRegister(instr, 7, 16);
   30713                               if ((instr & 1) != 0) {
   30714                                 UnallocatedT32(instr);
   30715                                 return;
   30716                               }
   30717                               unsigned rm = ExtractQRegister(instr, 5, 0);
   30718                               // VBIF{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; T1
   30719                               vbif(CurrentCond(),
   30720                                    kDataTypeValueNone,
   30721                                    QRegister(rd),
   30722                                    QRegister(rn),
   30723                                    QRegister(rm));
   30724                               break;
   30725                             }
   30726                           }
   30727                           break;
   30728                         }
   30729                         case 0x00000200: {
   30730                           // 0xef000250
   30731                           DataType dt = Dt_U_size_3_Decode(
   30732                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
   30733                           if (dt.Is(kDataTypeValueInvalid)) {
   30734                             UnallocatedT32(instr);
   30735                             return;
   30736                           }
   30737                           if (((instr >> 12) & 1) != 0) {
   30738                             UnallocatedT32(instr);
   30739                             return;
   30740                           }
   30741                           unsigned rd = ExtractQRegister(instr, 22, 12);
   30742                           if (((instr >> 16) & 1) != 0) {
   30743                             UnallocatedT32(instr);
   30744                             return;
   30745                           }
   30746                           unsigned rn = ExtractQRegister(instr, 7, 16);
   30747                           if ((instr & 1) != 0) {
   30748                             UnallocatedT32(instr);
   30749                             return;
   30750                           }
   30751                           unsigned rm = ExtractQRegister(instr, 5, 0);
   30752                           // VQSUB{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
   30753                           vqsub(CurrentCond(),
   30754                                 dt,
   30755                                 QRegister(rd),
   30756                                 QRegister(rn),
   30757                                 QRegister(rm));
   30758                           break;
   30759                         }
   30760                         case 0x00000300: {
   30761                           // 0xef000350
   30762                           DataType dt = Dt_U_size_1_Decode(
   30763                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
   30764                           if (dt.Is(kDataTypeValueInvalid)) {
   30765                             UnallocatedT32(instr);
   30766                             return;
   30767                           }
   30768                           if (((instr >> 12) & 1) != 0) {
   30769                             UnallocatedT32(instr);
   30770                             return;
   30771                           }
   30772                           unsigned rd = ExtractQRegister(instr, 22, 12);
   30773                           if (((instr >> 16) & 1) != 0) {
   30774                             UnallocatedT32(instr);
   30775                             return;
   30776                           }
   30777                           unsigned rn = ExtractQRegister(instr, 7, 16);
   30778                           if ((instr & 1) != 0) {
   30779                             UnallocatedT32(instr);
   30780                             return;
   30781                           }
   30782                           unsigned rm = ExtractQRegister(instr, 5, 0);
   30783                           // VCGE{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
   30784                           vcge(CurrentCond(),
   30785                                dt,
   30786                                QRegister(rd),
   30787                                QRegister(rn),
   30788                                QRegister(rm));
   30789                           break;
   30790                         }
   30791                         case 0x00000400: {
   30792                           // 0xef000450
   30793                           DataType dt = Dt_U_size_3_Decode(
   30794                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
   30795                           if (dt.Is(kDataTypeValueInvalid)) {
   30796                             UnallocatedT32(instr);
   30797                             return;
   30798                           }
   30799                           if (((instr >> 12) & 1) != 0) {
   30800                             UnallocatedT32(instr);
   30801                             return;
   30802                           }
   30803                           unsigned rd = ExtractQRegister(instr, 22, 12);
   30804                           if ((instr & 1) != 0) {
   30805                             UnallocatedT32(instr);
   30806                             return;
   30807                           }
   30808                           unsigned rm = ExtractQRegister(instr, 5, 0);
   30809                           if (((instr >> 16) & 1) != 0) {
   30810                             UnallocatedT32(instr);
   30811                             return;
   30812                           }
   30813                           unsigned rn = ExtractQRegister(instr, 7, 16);
   30814                           // VQSHL{<c>}{<q>}.<dt> {<Qd>}, <Qm>, <Qn> ; T1
   30815                           vqshl(CurrentCond(),
   30816                                 dt,
   30817                                 QRegister(rd),
   30818                                 QRegister(rm),
   30819                                 QRegister(rn));
   30820                           break;
   30821                         }
   30822                         case 0x00000500: {
   30823                           // 0xef000550
   30824                           DataType dt = Dt_U_size_3_Decode(
   30825                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
   30826                           if (dt.Is(kDataTypeValueInvalid)) {
   30827                             UnallocatedT32(instr);
   30828                             return;
   30829                           }
   30830                           if (((instr >> 12) & 1) != 0) {
   30831                             UnallocatedT32(instr);
   30832                             return;
   30833                           }
   30834                           unsigned rd = ExtractQRegister(instr, 22, 12);
   30835                           if ((instr & 1) != 0) {
   30836                             UnallocatedT32(instr);
   30837                             return;
   30838                           }
   30839                           unsigned rm = ExtractQRegister(instr, 5, 0);
   30840                           if (((instr >> 16) & 1) != 0) {
   30841                             UnallocatedT32(instr);
   30842                             return;
   30843                           }
   30844                           unsigned rn = ExtractQRegister(instr, 7, 16);
   30845                           // VQRSHL{<c>}{<q>}.<dt> {<Qd>}, <Qm>, <Qn> ; T1
   30846                           vqrshl(CurrentCond(),
   30847                                  dt,
   30848                                  QRegister(rd),
   30849                                  QRegister(rm),
   30850                                  QRegister(rn));
   30851                           break;
   30852                         }
   30853                         case 0x00000600: {
   30854                           // 0xef000650
   30855                           DataType dt = Dt_U_size_1_Decode(
   30856                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
   30857                           if (dt.Is(kDataTypeValueInvalid)) {
   30858                             UnallocatedT32(instr);
   30859                             return;
   30860                           }
   30861                           if (((instr >> 12) & 1) != 0) {
   30862                             UnallocatedT32(instr);
   30863                             return;
   30864                           }
   30865                           unsigned rd = ExtractQRegister(instr, 22, 12);
   30866                           if (((instr >> 16) & 1) != 0) {
   30867                             UnallocatedT32(instr);
   30868                             return;
   30869                           }
   30870                           unsigned rn = ExtractQRegister(instr, 7, 16);
   30871                           if ((instr & 1) != 0) {
   30872                             UnallocatedT32(instr);
   30873                             return;
   30874                           }
   30875                           unsigned rm = ExtractQRegister(instr, 5, 0);
   30876                           // VMIN{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
   30877                           vmin(CurrentCond(),
   30878                                dt,
   30879                                QRegister(rd),
   30880                                QRegister(rn),
   30881                                QRegister(rm));
   30882                           break;
   30883                         }
   30884                         case 0x00000700: {
   30885                           // 0xef000750
   30886                           DataType dt = Dt_U_size_1_Decode(
   30887                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
   30888                           if (dt.Is(kDataTypeValueInvalid)) {
   30889                             UnallocatedT32(instr);
   30890                             return;
   30891                           }
   30892                           if (((instr >> 12) & 1) != 0) {
   30893                             UnallocatedT32(instr);
   30894                             return;
   30895                           }
   30896                           unsigned rd = ExtractQRegister(instr, 22, 12);
   30897                           if (((instr >> 16) & 1) != 0) {
   30898                             UnallocatedT32(instr);
   30899                             return;
   30900                           }
   30901                           unsigned rn = ExtractQRegister(instr, 7, 16);
   30902                           if ((instr & 1) != 0) {
   30903                             UnallocatedT32(instr);
   30904                             return;
   30905                           }
   30906                           unsigned rm = ExtractQRegister(instr, 5, 0);
   30907                           // VABA{<c>}{<q>}.<dt> <Qd>, <Qn>, <Qm> ; T1
   30908                           vaba(CurrentCond(),
   30909                                dt,
   30910                                QRegister(rd),
   30911                                QRegister(rn),
   30912                                QRegister(rm));
   30913                           break;
   30914                         }
   30915                         case 0x00000800: {
   30916                           // 0xef000850
   30917                           switch (instr & 0x10000000) {
   30918                             case 0x00000000: {
   30919                               // 0xef000850
   30920                               DataType dt =
   30921                                   Dt_size_7_Decode((instr >> 20) & 0x3);
   30922                               if (dt.Is(kDataTypeValueInvalid)) {
   30923                                 UnallocatedT32(instr);
   30924                                 return;
   30925                               }
   30926                               if (((instr >> 12) & 1) != 0) {
   30927                                 UnallocatedT32(instr);
   30928                                 return;
   30929                               }
   30930                               unsigned rd = ExtractQRegister(instr, 22, 12);
   30931                               if (((instr >> 16) & 1) != 0) {
   30932                                 UnallocatedT32(instr);
   30933                                 return;
   30934                               }
   30935                               unsigned rn = ExtractQRegister(instr, 7, 16);
   30936                               if ((instr & 1) != 0) {
   30937                                 UnallocatedT32(instr);
   30938                                 return;
   30939                               }
   30940                               unsigned rm = ExtractQRegister(instr, 5, 0);
   30941                               // VTST{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
   30942                               vtst(CurrentCond(),
   30943                                    dt,
   30944                                    QRegister(rd),
   30945                                    QRegister(rn),
   30946                                    QRegister(rm));
   30947                               break;
   30948                             }
   30949                             case 0x10000000: {
   30950                               // 0xff000850
   30951                               DataType dt =
   30952                                   Dt_size_4_Decode((instr >> 20) & 0x3);
   30953                               if (dt.Is(kDataTypeValueInvalid)) {
   30954                                 UnallocatedT32(instr);
   30955                                 return;
   30956                               }
   30957                               if (((instr >> 12) & 1) != 0) {
   30958                                 UnallocatedT32(instr);
   30959                                 return;
   30960                               }
   30961                               unsigned rd = ExtractQRegister(instr, 22, 12);
   30962                               if (((instr >> 16) & 1) != 0) {
   30963                                 UnallocatedT32(instr);
   30964                                 return;
   30965                               }
   30966                               unsigned rn = ExtractQRegister(instr, 7, 16);
   30967                               if ((instr & 1) != 0) {
   30968                                 UnallocatedT32(instr);
   30969                                 return;
   30970                               }
   30971                               unsigned rm = ExtractQRegister(instr, 5, 0);
   30972                               // VCEQ{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
   30973                               vceq(CurrentCond(),
   30974                                    dt,
   30975                                    QRegister(rd),
   30976                                    QRegister(rn),
   30977                                    QRegister(rm));
   30978                               break;
   30979                             }
   30980                           }
   30981                           break;
   30982                         }
   30983                         case 0x00000900: {
   30984                           // 0xef000950
   30985                           DataType dt = Dt_op_size_1_Decode(
   30986                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
   30987                           if (dt.Is(kDataTypeValueInvalid)) {
   30988                             UnallocatedT32(instr);
   30989                             return;
   30990                           }
   30991                           if (((instr >> 12) & 1) != 0) {
   30992                             UnallocatedT32(instr);
   30993                             return;
   30994                           }
   30995                           unsigned rd = ExtractQRegister(instr, 22, 12);
   30996                           if (((instr >> 16) & 1) != 0) {
   30997                             UnallocatedT32(instr);
   30998                             return;
   30999                           }
   31000                           unsigned rn = ExtractQRegister(instr, 7, 16);
   31001                           if ((instr & 1) != 0) {
   31002                             UnallocatedT32(instr);
   31003                             return;
   31004                           }
   31005                           unsigned rm = ExtractQRegister(instr, 5, 0);
   31006                           // VMUL{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
   31007                           vmul(CurrentCond(),
   31008                                dt,
   31009                                QRegister(rd),
   31010                                QRegister(rn),
   31011                                QRegister(rm));
   31012                           break;
   31013                         }
   31014                         case 0x00000c00: {
   31015                           // 0xef000c50
   31016                           switch (instr & 0x10300000) {
   31017                             case 0x00000000: {
   31018                               // 0xef000c50
   31019                               if (((instr >> 12) & 1) != 0) {
   31020                                 UnallocatedT32(instr);
   31021                                 return;
   31022                               }
   31023                               unsigned rd = ExtractQRegister(instr, 22, 12);
   31024                               if (((instr >> 16) & 1) != 0) {
   31025                                 UnallocatedT32(instr);
   31026                                 return;
   31027                               }
   31028                               unsigned rn = ExtractQRegister(instr, 7, 16);
   31029                               if ((instr & 1) != 0) {
   31030                                 UnallocatedT32(instr);
   31031                                 return;
   31032                               }
   31033                               unsigned rm = ExtractQRegister(instr, 5, 0);
   31034                               // VFMA{<c>}{<q>}.F32 <Qd>, <Qn>, <Qm> ; T1
   31035                               vfma(CurrentCond(),
   31036                                    F32,
   31037                                    QRegister(rd),
   31038                                    QRegister(rn),
   31039                                    QRegister(rm));
   31040                               break;
   31041                             }
   31042                             case 0x00200000: {
   31043                               // 0xef200c50
   31044                               if (((instr >> 12) & 1) != 0) {
   31045                                 UnallocatedT32(instr);
   31046                                 return;
   31047                               }
   31048                               unsigned rd = ExtractQRegister(instr, 22, 12);
   31049                               if (((instr >> 16) & 1) != 0) {
   31050                                 UnallocatedT32(instr);
   31051                                 return;
   31052                               }
   31053                               unsigned rn = ExtractQRegister(instr, 7, 16);
   31054                               if ((instr & 1) != 0) {
   31055                                 UnallocatedT32(instr);
   31056                                 return;
   31057                               }
   31058                               unsigned rm = ExtractQRegister(instr, 5, 0);
   31059                               // VFMS{<c>}{<q>}.F32 <Qd>, <Qn>, <Qm> ; T1
   31060                               vfms(CurrentCond(),
   31061                                    F32,
   31062                                    QRegister(rd),
   31063                                    QRegister(rn),
   31064                                    QRegister(rm));
   31065                               break;
   31066                             }
   31067                             default:
   31068                               UnallocatedT32(instr);
   31069                               break;
   31070                           }
   31071                           break;
   31072                         }
   31073                         case 0x00000d00: {
   31074                           // 0xef000d50
   31075                           switch (instr & 0x10300000) {
   31076                             case 0x00000000: {
   31077                               // 0xef000d50
   31078                               if (((instr >> 12) & 1) != 0) {
   31079                                 UnallocatedT32(instr);
   31080                                 return;
   31081                               }
   31082                               unsigned rd = ExtractQRegister(instr, 22, 12);
   31083                               if (((instr >> 16) & 1) != 0) {
   31084                                 UnallocatedT32(instr);
   31085                                 return;
   31086                               }
   31087                               unsigned rn = ExtractQRegister(instr, 7, 16);
   31088                               if ((instr & 1) != 0) {
   31089                                 UnallocatedT32(instr);
   31090                                 return;
   31091                               }
   31092                               unsigned rm = ExtractQRegister(instr, 5, 0);
   31093                               // VMLA{<c>}{<q>}.F32 <Qd>, <Qn>, <Qm> ; T1
   31094                               vmla(CurrentCond(),
   31095                                    F32,
   31096                                    QRegister(rd),
   31097                                    QRegister(rn),
   31098                                    QRegister(rm));
   31099                               break;
   31100                             }
   31101                             case 0x00200000: {
   31102                               // 0xef200d50
   31103                               if (((instr >> 12) & 1) != 0) {
   31104                                 UnallocatedT32(instr);
   31105                                 return;
   31106                               }
   31107                               unsigned rd = ExtractQRegister(instr, 22, 12);
   31108                               if (((instr >> 16) & 1) != 0) {
   31109                                 UnallocatedT32(instr);
   31110                                 return;
   31111                               }
   31112                               unsigned rn = ExtractQRegister(instr, 7, 16);
   31113                               if ((instr & 1) != 0) {
   31114                                 UnallocatedT32(instr);
   31115                                 return;
   31116                               }
   31117                               unsigned rm = ExtractQRegister(instr, 5, 0);
   31118                               // VMLS{<c>}{<q>}.F32 <Qd>, <Qn>, <Qm> ; T1
   31119                               vmls(CurrentCond(),
   31120                                    F32,
   31121                                    QRegister(rd),
   31122                                    QRegister(rn),
   31123                                    QRegister(rm));
   31124                               break;
   31125                             }
   31126                             case 0x10000000: {
   31127                               // 0xff000d50
   31128                               if (((instr >> 12) & 1) != 0) {
   31129                                 UnallocatedT32(instr);
   31130                                 return;
   31131                               }
   31132                               unsigned rd = ExtractQRegister(instr, 22, 12);
   31133                               if (((instr >> 16) & 1) != 0) {
   31134                                 UnallocatedT32(instr);
   31135                                 return;
   31136                               }
   31137                               unsigned rn = ExtractQRegister(instr, 7, 16);
   31138                               if ((instr & 1) != 0) {
   31139                                 UnallocatedT32(instr);
   31140                                 return;
   31141                               }
   31142                               unsigned rm = ExtractQRegister(instr, 5, 0);
   31143                               // VMUL{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; T1
   31144                               vmul(CurrentCond(),
   31145                                    F32,
   31146                                    QRegister(rd),
   31147                                    QRegister(rn),
   31148                                    QRegister(rm));
   31149                               break;
   31150                             }
   31151                             default:
   31152                               UnallocatedT32(instr);
   31153                               break;
   31154                           }
   31155                           break;
   31156                         }
   31157                         case 0x00000e00: {
   31158                           // 0xef000e50
   31159                           switch (instr & 0x10300000) {
   31160                             case 0x10000000: {
   31161                               // 0xff000e50
   31162                               if (((instr >> 12) & 1) != 0) {
   31163                                 UnallocatedT32(instr);
   31164                                 return;
   31165                               }
   31166                               unsigned rd = ExtractQRegister(instr, 22, 12);
   31167                               if (((instr >> 16) & 1) != 0) {
   31168                                 UnallocatedT32(instr);
   31169                                 return;
   31170                               }
   31171                               unsigned rn = ExtractQRegister(instr, 7, 16);
   31172                               if ((instr & 1) != 0) {
   31173                                 UnallocatedT32(instr);
   31174                                 return;
   31175                               }
   31176                               unsigned rm = ExtractQRegister(instr, 5, 0);
   31177                               // VACGE{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; T1
   31178                               vacge(CurrentCond(),
   31179                                     F32,
   31180                                     QRegister(rd),
   31181                                     QRegister(rn),
   31182                                     QRegister(rm));
   31183                               break;
   31184                             }
   31185                             case 0x10200000: {
   31186                               // 0xff200e50
   31187                               if (((instr >> 12) & 1) != 0) {
   31188                                 UnallocatedT32(instr);
   31189                                 return;
   31190                               }
   31191                               unsigned rd = ExtractQRegister(instr, 22, 12);
   31192                               if (((instr >> 16) & 1) != 0) {
   31193                                 UnallocatedT32(instr);
   31194                                 return;
   31195                               }
   31196                               unsigned rn = ExtractQRegister(instr, 7, 16);
   31197                               if ((instr & 1) != 0) {
   31198                                 UnallocatedT32(instr);
   31199                                 return;
   31200                               }
   31201                               unsigned rm = ExtractQRegister(instr, 5, 0);
   31202                               // VACGT{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; T1
   31203                               vacgt(CurrentCond(),
   31204                                     F32,
   31205                                     QRegister(rd),
   31206                                     QRegister(rn),
   31207                                     QRegister(rm));
   31208                               break;
   31209                             }
   31210                             default:
   31211                               UnallocatedT32(instr);
   31212                               break;
   31213                           }
   31214                           break;
   31215                         }
   31216                         case 0x00000f00: {
   31217                           // 0xef000f50
   31218                           switch (instr & 0x10300000) {
   31219                             case 0x00000000: {
   31220                               // 0xef000f50
   31221                               if (((instr >> 12) & 1) != 0) {
   31222                                 UnallocatedT32(instr);
   31223                                 return;
   31224                               }
   31225                               unsigned rd = ExtractQRegister(instr, 22, 12);
   31226                               if (((instr >> 16) & 1) != 0) {
   31227                                 UnallocatedT32(instr);
   31228                                 return;
   31229                               }
   31230                               unsigned rn = ExtractQRegister(instr, 7, 16);
   31231                               if ((instr & 1) != 0) {
   31232                                 UnallocatedT32(instr);
   31233                                 return;
   31234                               }
   31235                               unsigned rm = ExtractQRegister(instr, 5, 0);
   31236                               // VRECPS{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; T1
   31237                               vrecps(CurrentCond(),
   31238                                      F32,
   31239                                      QRegister(rd),
   31240                                      QRegister(rn),
   31241                                      QRegister(rm));
   31242                               break;
   31243                             }
   31244                             case 0x00200000: {
   31245                               // 0xef200f50
   31246                               if (((instr >> 12) & 1) != 0) {
   31247                                 UnallocatedT32(instr);
   31248                                 return;
   31249                               }
   31250                               unsigned rd = ExtractQRegister(instr, 22, 12);
   31251                               if (((instr >> 16) & 1) != 0) {
   31252                                 UnallocatedT32(instr);
   31253                                 return;
   31254                               }
   31255                               unsigned rn = ExtractQRegister(instr, 7, 16);
   31256                               if ((instr & 1) != 0) {
   31257                                 UnallocatedT32(instr);
   31258                                 return;
   31259                               }
   31260                               unsigned rm = ExtractQRegister(instr, 5, 0);
   31261                               // VRSQRTS{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; T1
   31262                               vrsqrts(CurrentCond(),
   31263                                       F32,
   31264                                       QRegister(rd),
   31265                                       QRegister(rn),
   31266                                       QRegister(rm));
   31267                               break;
   31268                             }
   31269                             case 0x10000000: {
   31270                               // 0xff000f50
   31271                               if (((instr >> 12) & 1) != 0) {
   31272                                 UnallocatedT32(instr);
   31273                                 return;
   31274                               }
   31275                               unsigned rd = ExtractQRegister(instr, 22, 12);
   31276                               if (((instr >> 16) & 1) != 0) {
   31277                                 UnallocatedT32(instr);
   31278                                 return;
   31279                               }
   31280                               unsigned rn = ExtractQRegister(instr, 7, 16);
   31281                               if ((instr & 1) != 0) {
   31282                                 UnallocatedT32(instr);
   31283                                 return;
   31284                               }
   31285                               unsigned rm = ExtractQRegister(instr, 5, 0);
   31286                               // VMAXNM{<q>}.F32 <Qd>, <Qn>, <Qm> ; T1
   31287                               vmaxnm(F32,
   31288                                      QRegister(rd),
   31289                                      QRegister(rn),
   31290                                      QRegister(rm));
   31291                               break;
   31292                             }
   31293                             case 0x10200000: {
   31294                               // 0xff200f50
   31295                               if (((instr >> 12) & 1) != 0) {
   31296                                 UnallocatedT32(instr);
   31297                                 return;
   31298                               }
   31299                               unsigned rd = ExtractQRegister(instr, 22, 12);
   31300                               if (((instr >> 16) & 1) != 0) {
   31301                                 UnallocatedT32(instr);
   31302                                 return;
   31303                               }
   31304                               unsigned rn = ExtractQRegister(instr, 7, 16);
   31305                               if ((instr & 1) != 0) {
   31306                                 UnallocatedT32(instr);
   31307                                 return;
   31308                               }
   31309                               unsigned rm = ExtractQRegister(instr, 5, 0);
   31310                               // VMINNM{<q>}.F32 <Qd>, <Qn>, <Qm> ; T1
   31311                               vminnm(F32,
   31312                                      QRegister(rd),
   31313                                      QRegister(rn),
   31314                                      QRegister(rm));
   31315                               break;
   31316                             }
   31317                             default:
   31318                               UnallocatedT32(instr);
   31319                               break;
   31320                           }
   31321                           break;
   31322                         }
   31323                         default:
   31324                           UnallocatedT32(instr);
   31325                           break;
   31326                       }
   31327                       break;
   31328                     }
   31329                     case 0x00800000: {
   31330                       // 0xef800010
   31331                       switch (instr & 0x00000c00) {
   31332                         case 0x00000000: {
   31333                           // 0xef800010
   31334                           switch (instr & 0x00380080) {
   31335                             case 0x00000000: {
   31336                               // 0xef800010
   31337                               switch (instr & 0x00000100) {
   31338                                 case 0x00000000: {
   31339                                   // 0xef800010
   31340                                   switch (instr & 0x00000200) {
   31341                                     default: {
   31342                                       switch (instr & 0x00000020) {
   31343                                         case 0x00000020: {
   31344                                           // 0xef800030
   31345                                           if (((instr & 0xd00) == 0x100) ||
   31346                                               ((instr & 0xd00) == 0x500) ||
   31347                                               ((instr & 0xd00) == 0x900) ||
   31348                                               ((instr & 0xe00) == 0xe00)) {
   31349                                             UnallocatedT32(instr);
   31350                                             return;
   31351                                           }
   31352                                           unsigned cmode = (instr >> 8) & 0xf;
   31353                                           DataType dt =
   31354                                               ImmediateVmvn::DecodeDt(cmode);
   31355                                           if (dt.Is(kDataTypeValueInvalid)) {
   31356                                             UnallocatedT32(instr);
   31357                                             return;
   31358                                           }
   31359                                           unsigned rd =
   31360                                               ExtractDRegister(instr, 22, 12);
   31361                                           DOperand imm =
   31362                                               ImmediateVmvn::DecodeImmediate(
   31363                                                   cmode,
   31364                                                   (instr & 0xf) |
   31365                                                       ((instr >> 12) & 0x70) |
   31366                                                       ((instr >> 21) & 0x80));
   31367                                           // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
   31368                                           vmvn(CurrentCond(),
   31369                                                dt,
   31370                                                DRegister(rd),
   31371                                                imm);
   31372                                           break;
   31373                                         }
   31374                                         default: {
   31375                                           if (((instr & 0x920) == 0x100) ||
   31376                                               ((instr & 0x520) == 0x100) ||
   31377                                               ((instr & 0x820) == 0x20) ||
   31378                                               ((instr & 0x420) == 0x20) ||
   31379                                               ((instr & 0x220) == 0x20) ||
   31380                                               ((instr & 0x120) == 0x120)) {
   31381                                             UnallocatedT32(instr);
   31382                                             return;
   31383                                           }
   31384                                           unsigned cmode =
   31385                                               ((instr >> 8) & 0xf) |
   31386                                               ((instr >> 1) & 0x10);
   31387                                           DataType dt =
   31388                                               ImmediateVmov::DecodeDt(cmode);
   31389                                           if (dt.Is(kDataTypeValueInvalid)) {
   31390                                             UnallocatedT32(instr);
   31391                                             return;
   31392                                           }
   31393                                           unsigned rd =
   31394                                               ExtractDRegister(instr, 22, 12);
   31395                                           DOperand imm =
   31396                                               ImmediateVmov::DecodeImmediate(
   31397                                                   cmode,
   31398                                                   (instr & 0xf) |
   31399                                                       ((instr >> 12) & 0x70) |
   31400                                                       ((instr >> 21) & 0x80));
   31401                                           // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
   31402                                           vmov(CurrentCond(),
   31403                                                dt,
   31404                                                DRegister(rd),
   31405                                                imm);
   31406                                           break;
   31407                                         }
   31408                                       }
   31409                                       break;
   31410                                     }
   31411                                   }
   31412                                   break;
   31413                                 }
   31414                                 case 0x00000100: {
   31415                                   // 0xef800110
   31416                                   switch (instr & 0x00000020) {
   31417                                     case 0x00000000: {
   31418                                       // 0xef800110
   31419                                       if (((instr & 0x100) == 0x0) ||
   31420                                           ((instr & 0xc00) == 0xc00)) {
   31421                                         UnallocatedT32(instr);
   31422                                         return;
   31423                                       }
   31424                                       unsigned cmode = (instr >> 8) & 0xf;
   31425                                       DataType dt =
   31426                                           ImmediateVorr::DecodeDt(cmode);
   31427                                       if (dt.Is(kDataTypeValueInvalid)) {
   31428                                         UnallocatedT32(instr);
   31429                                         return;
   31430                                       }
   31431                                       unsigned rd =
   31432                                           ExtractDRegister(instr, 22, 12);
   31433                                       DOperand imm =
   31434                                           ImmediateVorr::DecodeImmediate(
   31435                                               cmode,
   31436                                               (instr & 0xf) |
   31437                                                   ((instr >> 12) & 0x70) |
   31438                                                   ((instr >> 21) & 0x80));
   31439                                       // VORR{<c>}{<q>}.<dt> {<Ddn>}, <Ddn>, #<imm> ; T1 NOLINT(whitespace/line_length)
   31440                                       vorr(CurrentCond(),
   31441                                            dt,
   31442                                            DRegister(rd),
   31443                                            DRegister(rd),
   31444                                            imm);
   31445                                       break;
   31446                                     }
   31447                                     case 0x00000020: {
   31448                                       // 0xef800130
   31449                                       if (((instr & 0x100) == 0x0) ||
   31450                                           ((instr & 0xc00) == 0xc00)) {
   31451                                         UnallocatedT32(instr);
   31452                                         return;
   31453                                       }
   31454                                       unsigned cmode = (instr >> 8) & 0xf;
   31455                                       DataType dt =
   31456                                           ImmediateVbic::DecodeDt(cmode);
   31457                                       if (dt.Is(kDataTypeValueInvalid)) {
   31458                                         UnallocatedT32(instr);
   31459                                         return;
   31460                                       }
   31461                                       unsigned rd =
   31462                                           ExtractDRegister(instr, 22, 12);
   31463                                       DOperand imm =
   31464                                           ImmediateVbic::DecodeImmediate(
   31465                                               cmode,
   31466                                               (instr & 0xf) |
   31467                                                   ((instr >> 12) & 0x70) |
   31468                                                   ((instr >> 21) & 0x80));
   31469                                       // VBIC{<c>}{<q>}.<dt> {<Ddn>}, <Ddn>, #<imm> ; T1 NOLINT(whitespace/line_length)
   31470                                       vbic(CurrentCond(),
   31471                                            dt,
   31472                                            DRegister(rd),
   31473                                            DRegister(rd),
   31474                                            imm);
   31475                                       break;
   31476                                     }
   31477                                   }
   31478                                   break;
   31479                                 }
   31480                               }
   31481                               break;
   31482                             }
   31483                             default: {
   31484                               switch (instr & 0x00000300) {
   31485                                 case 0x00000000: {
   31486                                   // 0xef800010
   31487                                   if (((instr & 0x380080) == 0x0)) {
   31488                                     UnallocatedT32(instr);
   31489                                     return;
   31490                                   }
   31491                                   DataType dt =
   31492                                       Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
   31493                                                              ((instr >> 4) &
   31494                                                               0x8),
   31495                                                          (instr >> 28) & 0x1);
   31496                                   if (dt.Is(kDataTypeValueInvalid)) {
   31497                                     UnallocatedT32(instr);
   31498                                     return;
   31499                                   }
   31500                                   unsigned rd = ExtractDRegister(instr, 22, 12);
   31501                                   unsigned rm = ExtractDRegister(instr, 5, 0);
   31502                                   uint32_t imm6 = (instr >> 16) & 0x3f;
   31503                                   uint32_t imm =
   31504                                       (dt.IsSize(64) ? 64
   31505                                                      : (dt.GetSize() * 2)) -
   31506                                       imm6;
   31507                                   // VSHR{<c>}{<q>}.<type><size> {<Dd>}, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   31508                                   vshr(CurrentCond(),
   31509                                        dt,
   31510                                        DRegister(rd),
   31511                                        DRegister(rm),
   31512                                        imm);
   31513                                   break;
   31514                                 }
   31515                                 case 0x00000100: {
   31516                                   // 0xef800110
   31517                                   if (((instr & 0x380080) == 0x0)) {
   31518                                     UnallocatedT32(instr);
   31519                                     return;
   31520                                   }
   31521                                   DataType dt =
   31522                                       Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
   31523                                                              ((instr >> 4) &
   31524                                                               0x8),
   31525                                                          (instr >> 28) & 0x1);
   31526                                   if (dt.Is(kDataTypeValueInvalid)) {
   31527                                     UnallocatedT32(instr);
   31528                                     return;
   31529                                   }
   31530                                   unsigned rd = ExtractDRegister(instr, 22, 12);
   31531                                   unsigned rm = ExtractDRegister(instr, 5, 0);
   31532                                   uint32_t imm6 = (instr >> 16) & 0x3f;
   31533                                   uint32_t imm =
   31534                                       (dt.IsSize(64) ? 64
   31535                                                      : (dt.GetSize() * 2)) -
   31536                                       imm6;
   31537                                   // VSRA{<c>}{<q>}.<type><size> {<Dd>}, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   31538                                   vsra(CurrentCond(),
   31539                                        dt,
   31540                                        DRegister(rd),
   31541                                        DRegister(rm),
   31542                                        imm);
   31543                                   break;
   31544                                 }
   31545                                 case 0x00000200: {
   31546                                   // 0xef800210
   31547                                   if (((instr & 0x380080) == 0x0)) {
   31548                                     UnallocatedT32(instr);
   31549                                     return;
   31550                                   }
   31551                                   DataType dt =
   31552                                       Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
   31553                                                              ((instr >> 4) &
   31554                                                               0x8),
   31555                                                          (instr >> 28) & 0x1);
   31556                                   if (dt.Is(kDataTypeValueInvalid)) {
   31557                                     UnallocatedT32(instr);
   31558                                     return;
   31559                                   }
   31560                                   unsigned rd = ExtractDRegister(instr, 22, 12);
   31561                                   unsigned rm = ExtractDRegister(instr, 5, 0);
   31562                                   uint32_t imm6 = (instr >> 16) & 0x3f;
   31563                                   uint32_t imm =
   31564                                       (dt.IsSize(64) ? 64
   31565                                                      : (dt.GetSize() * 2)) -
   31566                                       imm6;
   31567                                   // VRSHR{<c>}{<q>}.<type><size> {<Dd>}, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   31568                                   vrshr(CurrentCond(),
   31569                                         dt,
   31570                                         DRegister(rd),
   31571                                         DRegister(rm),
   31572                                         imm);
   31573                                   break;
   31574                                 }
   31575                                 case 0x00000300: {
   31576                                   // 0xef800310
   31577                                   if (((instr & 0x380080) == 0x0)) {
   31578                                     UnallocatedT32(instr);
   31579                                     return;
   31580                                   }
   31581                                   DataType dt =
   31582                                       Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
   31583                                                              ((instr >> 4) &
   31584                                                               0x8),
   31585                                                          (instr >> 28) & 0x1);
   31586                                   if (dt.Is(kDataTypeValueInvalid)) {
   31587                                     UnallocatedT32(instr);
   31588                                     return;
   31589                                   }
   31590                                   unsigned rd = ExtractDRegister(instr, 22, 12);
   31591                                   unsigned rm = ExtractDRegister(instr, 5, 0);
   31592                                   uint32_t imm6 = (instr >> 16) & 0x3f;
   31593                                   uint32_t imm =
   31594                                       (dt.IsSize(64) ? 64
   31595                                                      : (dt.GetSize() * 2)) -
   31596                                       imm6;
   31597                                   // VRSRA{<c>}{<q>}.<type><size> {<Dd>}, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   31598                                   vrsra(CurrentCond(),
   31599                                         dt,
   31600                                         DRegister(rd),
   31601                                         DRegister(rm),
   31602                                         imm);
   31603                                   break;
   31604                                 }
   31605                               }
   31606                               break;
   31607                             }
   31608                           }
   31609                           break;
   31610                         }
   31611                         case 0x00000400: {
   31612                           // 0xef800410
   31613                           switch (instr & 0x00380080) {
   31614                             case 0x00000000: {
   31615                               // 0xef800410
   31616                               switch (instr & 0x00000100) {
   31617                                 case 0x00000000: {
   31618                                   // 0xef800410
   31619                                   switch (instr & 0x00000200) {
   31620                                     default: {
   31621                                       switch (instr & 0x00000020) {
   31622                                         case 0x00000020: {
   31623                                           // 0xef800430
   31624                                           if (((instr & 0xd00) == 0x100) ||
   31625                                               ((instr & 0xd00) == 0x500) ||
   31626                                               ((instr & 0xd00) == 0x900) ||
   31627                                               ((instr & 0xe00) == 0xe00)) {
   31628                                             UnallocatedT32(instr);
   31629                                             return;
   31630                                           }
   31631                                           unsigned cmode = (instr >> 8) & 0xf;
   31632                                           DataType dt =
   31633                                               ImmediateVmvn::DecodeDt(cmode);
   31634                                           if (dt.Is(kDataTypeValueInvalid)) {
   31635                                             UnallocatedT32(instr);
   31636                                             return;
   31637                                           }
   31638                                           unsigned rd =
   31639                                               ExtractDRegister(instr, 22, 12);
   31640                                           DOperand imm =
   31641                                               ImmediateVmvn::DecodeImmediate(
   31642                                                   cmode,
   31643                                                   (instr & 0xf) |
   31644                                                       ((instr >> 12) & 0x70) |
   31645                                                       ((instr >> 21) & 0x80));
   31646                                           // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
   31647                                           vmvn(CurrentCond(),
   31648                                                dt,
   31649                                                DRegister(rd),
   31650                                                imm);
   31651                                           break;
   31652                                         }
   31653                                         default: {
   31654                                           if (((instr & 0x920) == 0x100) ||
   31655                                               ((instr & 0x520) == 0x100) ||
   31656                                               ((instr & 0x820) == 0x20) ||
   31657                                               ((instr & 0x420) == 0x20) ||
   31658                                               ((instr & 0x220) == 0x20) ||
   31659                                               ((instr & 0x120) == 0x120)) {
   31660                                             UnallocatedT32(instr);
   31661                                             return;
   31662                                           }
   31663                                           unsigned cmode =
   31664                                               ((instr >> 8) & 0xf) |
   31665                                               ((instr >> 1) & 0x10);
   31666                                           DataType dt =
   31667                                               ImmediateVmov::DecodeDt(cmode);
   31668                                           if (dt.Is(kDataTypeValueInvalid)) {
   31669                                             UnallocatedT32(instr);
   31670                                             return;
   31671                                           }
   31672                                           unsigned rd =
   31673                                               ExtractDRegister(instr, 22, 12);
   31674                                           DOperand imm =
   31675                                               ImmediateVmov::DecodeImmediate(
   31676                                                   cmode,
   31677                                                   (instr & 0xf) |
   31678                                                       ((instr >> 12) & 0x70) |
   31679                                                       ((instr >> 21) & 0x80));
   31680                                           // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
   31681                                           vmov(CurrentCond(),
   31682                                                dt,
   31683                                                DRegister(rd),
   31684                                                imm);
   31685                                           break;
   31686                                         }
   31687                                       }
   31688                                       break;
   31689                                     }
   31690                                   }
   31691                                   break;
   31692                                 }
   31693                                 case 0x00000100: {
   31694                                   // 0xef800510
   31695                                   switch (instr & 0x00000020) {
   31696                                     case 0x00000000: {
   31697                                       // 0xef800510
   31698                                       if (((instr & 0x100) == 0x0) ||
   31699                                           ((instr & 0xc00) == 0xc00)) {
   31700                                         UnallocatedT32(instr);
   31701                                         return;
   31702                                       }
   31703                                       unsigned cmode = (instr >> 8) & 0xf;
   31704                                       DataType dt =
   31705                                           ImmediateVorr::DecodeDt(cmode);
   31706                                       if (dt.Is(kDataTypeValueInvalid)) {
   31707                                         UnallocatedT32(instr);
   31708                                         return;
   31709                                       }
   31710                                       unsigned rd =
   31711                                           ExtractDRegister(instr, 22, 12);
   31712                                       DOperand imm =
   31713                                           ImmediateVorr::DecodeImmediate(
   31714                                               cmode,
   31715                                               (instr & 0xf) |
   31716                                                   ((instr >> 12) & 0x70) |
   31717                                                   ((instr >> 21) & 0x80));
   31718                                       // VORR{<c>}{<q>}.<dt> {<Ddn>}, <Ddn>, #<imm> ; T1 NOLINT(whitespace/line_length)
   31719                                       vorr(CurrentCond(),
   31720                                            dt,
   31721                                            DRegister(rd),
   31722                                            DRegister(rd),
   31723                                            imm);
   31724                                       break;
   31725                                     }
   31726                                     case 0x00000020: {
   31727                                       // 0xef800530
   31728                                       if (((instr & 0x100) == 0x0) ||
   31729                                           ((instr & 0xc00) == 0xc00)) {
   31730                                         UnallocatedT32(instr);
   31731                                         return;
   31732                                       }
   31733                                       unsigned cmode = (instr >> 8) & 0xf;
   31734                                       DataType dt =
   31735                                           ImmediateVbic::DecodeDt(cmode);
   31736                                       if (dt.Is(kDataTypeValueInvalid)) {
   31737                                         UnallocatedT32(instr);
   31738                                         return;
   31739                                       }
   31740                                       unsigned rd =
   31741                                           ExtractDRegister(instr, 22, 12);
   31742                                       DOperand imm =
   31743                                           ImmediateVbic::DecodeImmediate(
   31744                                               cmode,
   31745                                               (instr & 0xf) |
   31746                                                   ((instr >> 12) & 0x70) |
   31747                                                   ((instr >> 21) & 0x80));
   31748                                       // VBIC{<c>}{<q>}.<dt> {<Ddn>}, <Ddn>, #<imm> ; T1 NOLINT(whitespace/line_length)
   31749                                       vbic(CurrentCond(),
   31750                                            dt,
   31751                                            DRegister(rd),
   31752                                            DRegister(rd),
   31753                                            imm);
   31754                                       break;
   31755                                     }
   31756                                   }
   31757                                   break;
   31758                                 }
   31759                               }
   31760                               break;
   31761                             }
   31762                             default: {
   31763                               switch (instr & 0x00000300) {
   31764                                 case 0x00000000: {
   31765                                   // 0xef800410
   31766                                   if ((instr & 0x10000000) == 0x10000000) {
   31767                                     if (((instr & 0x380080) == 0x0)) {
   31768                                       UnallocatedT32(instr);
   31769                                       return;
   31770                                     }
   31771                                     DataType dt = Dt_L_imm6_4_Decode(
   31772                                         ((instr >> 19) & 0x7) |
   31773                                         ((instr >> 4) & 0x8));
   31774                                     if (dt.Is(kDataTypeValueInvalid)) {
   31775                                       UnallocatedT32(instr);
   31776                                       return;
   31777                                     }
   31778                                     unsigned rd =
   31779                                         ExtractDRegister(instr, 22, 12);
   31780                                     unsigned rm = ExtractDRegister(instr, 5, 0);
   31781                                     uint32_t imm6 = (instr >> 16) & 0x3f;
   31782                                     uint32_t imm =
   31783                                         (dt.IsSize(64) ? 64
   31784                                                        : (dt.GetSize() * 2)) -
   31785                                         imm6;
   31786                                     // VSRI{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   31787                                     vsri(CurrentCond(),
   31788                                          dt,
   31789                                          DRegister(rd),
   31790                                          DRegister(rm),
   31791                                          imm);
   31792                                   } else {
   31793                                     UnallocatedT32(instr);
   31794                                   }
   31795                                   break;
   31796                                 }
   31797                                 case 0x00000100: {
   31798                                   // 0xef800510
   31799                                   switch (instr & 0x10000000) {
   31800                                     case 0x00000000: {
   31801                                       // 0xef800510
   31802                                       if (((instr & 0x380080) == 0x0)) {
   31803                                         UnallocatedT32(instr);
   31804                                         return;
   31805                                       }
   31806                                       DataType dt = Dt_L_imm6_3_Decode(
   31807                                           ((instr >> 19) & 0x7) |
   31808                                           ((instr >> 4) & 0x8));
   31809                                       if (dt.Is(kDataTypeValueInvalid)) {
   31810                                         UnallocatedT32(instr);
   31811                                         return;
   31812                                       }
   31813                                       unsigned rd =
   31814                                           ExtractDRegister(instr, 22, 12);
   31815                                       unsigned rm =
   31816                                           ExtractDRegister(instr, 5, 0);
   31817                                       uint32_t imm6 = (instr >> 16) & 0x3f;
   31818                                       uint32_t imm =
   31819                                           imm6 -
   31820                                           (dt.IsSize(64) ? 0 : dt.GetSize());
   31821                                       // VSHL{<c>}{<q>}.I<size> {<Dd>}, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   31822                                       vshl(CurrentCond(),
   31823                                            dt,
   31824                                            DRegister(rd),
   31825                                            DRegister(rm),
   31826                                            imm);
   31827                                       break;
   31828                                     }
   31829                                     case 0x10000000: {
   31830                                       // 0xff800510
   31831                                       if (((instr & 0x380080) == 0x0)) {
   31832                                         UnallocatedT32(instr);
   31833                                         return;
   31834                                       }
   31835                                       DataType dt = Dt_L_imm6_4_Decode(
   31836                                           ((instr >> 19) & 0x7) |
   31837                                           ((instr >> 4) & 0x8));
   31838                                       if (dt.Is(kDataTypeValueInvalid)) {
   31839                                         UnallocatedT32(instr);
   31840                                         return;
   31841                                       }
   31842                                       unsigned rd =
   31843                                           ExtractDRegister(instr, 22, 12);
   31844                                       unsigned rm =
   31845                                           ExtractDRegister(instr, 5, 0);
   31846                                       uint32_t imm6 = (instr >> 16) & 0x3f;
   31847                                       uint32_t imm =
   31848                                           imm6 -
   31849                                           (dt.IsSize(64) ? 0 : dt.GetSize());
   31850                                       // VSLI{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   31851                                       vsli(CurrentCond(),
   31852                                            dt,
   31853                                            DRegister(rd),
   31854                                            DRegister(rm),
   31855                                            imm);
   31856                                       break;
   31857                                     }
   31858                                   }
   31859                                   break;
   31860                                 }
   31861                                 case 0x00000200: {
   31862                                   // 0xef800610
   31863                                   if (((instr & 0x380080) == 0x0)) {
   31864                                     UnallocatedT32(instr);
   31865                                     return;
   31866                                   }
   31867                                   DataType dt =
   31868                                       Dt_L_imm6_2_Decode(((instr >> 19) & 0x7) |
   31869                                                              ((instr >> 4) &
   31870                                                               0x8),
   31871                                                          (instr >> 28) & 0x1);
   31872                                   if (dt.Is(kDataTypeValueInvalid)) {
   31873                                     UnallocatedT32(instr);
   31874                                     return;
   31875                                   }
   31876                                   unsigned rd = ExtractDRegister(instr, 22, 12);
   31877                                   unsigned rm = ExtractDRegister(instr, 5, 0);
   31878                                   uint32_t imm6 = (instr >> 16) & 0x3f;
   31879                                   uint32_t imm =
   31880                                       imm6 - (dt.IsSize(64) ? 0 : dt.GetSize());
   31881                                   // VQSHLU{<c>}{<q>}.<type><size> {<Dd>}, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   31882                                   vqshlu(CurrentCond(),
   31883                                          dt,
   31884                                          DRegister(rd),
   31885                                          DRegister(rm),
   31886                                          imm);
   31887                                   break;
   31888                                 }
   31889                                 case 0x00000300: {
   31890                                   // 0xef800710
   31891                                   if (((instr & 0x380080) == 0x0)) {
   31892                                     UnallocatedT32(instr);
   31893                                     return;
   31894                                   }
   31895                                   DataType dt =
   31896                                       Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
   31897                                                              ((instr >> 4) &
   31898                                                               0x8),
   31899                                                          (instr >> 28) & 0x1);
   31900                                   if (dt.Is(kDataTypeValueInvalid)) {
   31901                                     UnallocatedT32(instr);
   31902                                     return;
   31903                                   }
   31904                                   unsigned rd = ExtractDRegister(instr, 22, 12);
   31905                                   unsigned rm = ExtractDRegister(instr, 5, 0);
   31906                                   uint32_t imm6 = (instr >> 16) & 0x3f;
   31907                                   uint32_t imm =
   31908                                       imm6 - (dt.IsSize(64) ? 0 : dt.GetSize());
   31909                                   // VQSHL{<c>}{<q>}.<type><size> {<Dd>}, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   31910                                   vqshl(CurrentCond(),
   31911                                         dt,
   31912                                         DRegister(rd),
   31913                                         DRegister(rm),
   31914                                         imm);
   31915                                   break;
   31916                                 }
   31917                               }
   31918                               break;
   31919                             }
   31920                           }
   31921                           break;
   31922                         }
   31923                         case 0x00000800: {
   31924                           // 0xef800810
   31925                           switch (instr & 0x00000080) {
   31926                             case 0x00000000: {
   31927                               // 0xef800810
   31928                               switch (instr & 0x00380000) {
   31929                                 case 0x00000000: {
   31930                                   // 0xef800810
   31931                                   switch (instr & 0x00000100) {
   31932                                     case 0x00000000: {
   31933                                       // 0xef800810
   31934                                       switch (instr & 0x00000200) {
   31935                                         default: {
   31936                                           switch (instr & 0x00000020) {
   31937                                             case 0x00000020: {
   31938                                               // 0xef800830
   31939                                               if (((instr & 0xd00) == 0x100) ||
   31940                                                   ((instr & 0xd00) == 0x500) ||
   31941                                                   ((instr & 0xd00) == 0x900) ||
   31942                                                   ((instr & 0xe00) == 0xe00)) {
   31943                                                 UnallocatedT32(instr);
   31944                                                 return;
   31945                                               }
   31946                                               unsigned cmode =
   31947                                                   (instr >> 8) & 0xf;
   31948                                               DataType dt =
   31949                                                   ImmediateVmvn::DecodeDt(
   31950                                                       cmode);
   31951                                               if (dt.Is(
   31952                                                       kDataTypeValueInvalid)) {
   31953                                                 UnallocatedT32(instr);
   31954                                                 return;
   31955                                               }
   31956                                               unsigned rd =
   31957                                                   ExtractDRegister(instr,
   31958                                                                    22,
   31959                                                                    12);
   31960                                               DOperand imm = ImmediateVmvn::
   31961                                                   DecodeImmediate(cmode,
   31962                                                                   (instr &
   31963                                                                    0xf) |
   31964                                                                       ((instr >>
   31965                                                                         12) &
   31966                                                                        0x70) |
   31967                                                                       ((instr >>
   31968                                                                         21) &
   31969                                                                        0x80));
   31970                                               // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
   31971                                               vmvn(CurrentCond(),
   31972                                                    dt,
   31973                                                    DRegister(rd),
   31974                                                    imm);
   31975                                               break;
   31976                                             }
   31977                                             default: {
   31978                                               if (((instr & 0x920) == 0x100) ||
   31979                                                   ((instr & 0x520) == 0x100) ||
   31980                                                   ((instr & 0x820) == 0x20) ||
   31981                                                   ((instr & 0x420) == 0x20) ||
   31982                                                   ((instr & 0x220) == 0x20) ||
   31983                                                   ((instr & 0x120) == 0x120)) {
   31984                                                 UnallocatedT32(instr);
   31985                                                 return;
   31986                                               }
   31987                                               unsigned cmode =
   31988                                                   ((instr >> 8) & 0xf) |
   31989                                                   ((instr >> 1) & 0x10);
   31990                                               DataType dt =
   31991                                                   ImmediateVmov::DecodeDt(
   31992                                                       cmode);
   31993                                               if (dt.Is(
   31994                                                       kDataTypeValueInvalid)) {
   31995                                                 UnallocatedT32(instr);
   31996                                                 return;
   31997                                               }
   31998                                               unsigned rd =
   31999                                                   ExtractDRegister(instr,
   32000                                                                    22,
   32001                                                                    12);
   32002                                               DOperand imm = ImmediateVmov::
   32003                                                   DecodeImmediate(cmode,
   32004                                                                   (instr &
   32005                                                                    0xf) |
   32006                                                                       ((instr >>
   32007                                                                         12) &
   32008                                                                        0x70) |
   32009                                                                       ((instr >>
   32010                                                                         21) &
   32011                                                                        0x80));
   32012                                               // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
   32013                                               vmov(CurrentCond(),
   32014                                                    dt,
   32015                                                    DRegister(rd),
   32016                                                    imm);
   32017                                               break;
   32018                                             }
   32019                                           }
   32020                                           break;
   32021                                         }
   32022                                       }
   32023                                       break;
   32024                                     }
   32025                                     case 0x00000100: {
   32026                                       // 0xef800910
   32027                                       switch (instr & 0x00000020) {
   32028                                         case 0x00000000: {
   32029                                           // 0xef800910
   32030                                           if (((instr & 0x100) == 0x0) ||
   32031                                               ((instr & 0xc00) == 0xc00)) {
   32032                                             UnallocatedT32(instr);
   32033                                             return;
   32034                                           }
   32035                                           unsigned cmode = (instr >> 8) & 0xf;
   32036                                           DataType dt =
   32037                                               ImmediateVorr::DecodeDt(cmode);
   32038                                           if (dt.Is(kDataTypeValueInvalid)) {
   32039                                             UnallocatedT32(instr);
   32040                                             return;
   32041                                           }
   32042                                           unsigned rd =
   32043                                               ExtractDRegister(instr, 22, 12);
   32044                                           DOperand imm =
   32045                                               ImmediateVorr::DecodeImmediate(
   32046                                                   cmode,
   32047                                                   (instr & 0xf) |
   32048                                                       ((instr >> 12) & 0x70) |
   32049                                                       ((instr >> 21) & 0x80));
   32050                                           // VORR{<c>}{<q>}.<dt> {<Ddn>}, <Ddn>, #<imm> ; T1 NOLINT(whitespace/line_length)
   32051                                           vorr(CurrentCond(),
   32052                                                dt,
   32053                                                DRegister(rd),
   32054                                                DRegister(rd),
   32055                                                imm);
   32056                                           break;
   32057                                         }
   32058                                         case 0x00000020: {
   32059                                           // 0xef800930
   32060                                           if (((instr & 0x100) == 0x0) ||
   32061                                               ((instr & 0xc00) == 0xc00)) {
   32062                                             UnallocatedT32(instr);
   32063                                             return;
   32064                                           }
   32065                                           unsigned cmode = (instr >> 8) & 0xf;
   32066                                           DataType dt =
   32067                                               ImmediateVbic::DecodeDt(cmode);
   32068                                           if (dt.Is(kDataTypeValueInvalid)) {
   32069                                             UnallocatedT32(instr);
   32070                                             return;
   32071                                           }
   32072                                           unsigned rd =
   32073                                               ExtractDRegister(instr, 22, 12);
   32074                                           DOperand imm =
   32075                                               ImmediateVbic::DecodeImmediate(
   32076                                                   cmode,
   32077                                                   (instr & 0xf) |
   32078                                                       ((instr >> 12) & 0x70) |
   32079                                                       ((instr >> 21) & 0x80));
   32080                                           // VBIC{<c>}{<q>}.<dt> {<Ddn>}, <Ddn>, #<imm> ; T1 NOLINT(whitespace/line_length)
   32081                                           vbic(CurrentCond(),
   32082                                                dt,
   32083                                                DRegister(rd),
   32084                                                DRegister(rd),
   32085                                                imm);
   32086                                           break;
   32087                                         }
   32088                                       }
   32089                                       break;
   32090                                     }
   32091                                   }
   32092                                   break;
   32093                                 }
   32094                                 case 0x00180000: {
   32095                                   // 0xef980810
   32096                                   switch (instr & 0x00000300) {
   32097                                     case 0x00000000: {
   32098                                       // 0xef980810
   32099                                       switch (instr & 0x10000000) {
   32100                                         case 0x00000000: {
   32101                                           // 0xef980810
   32102                                           if (((instr & 0x380000) == 0x0)) {
   32103                                             UnallocatedT32(instr);
   32104                                             return;
   32105                                           }
   32106                                           DataType dt = Dt_imm6_3_Decode(
   32107                                               (instr >> 19) & 0x7);
   32108                                           if (dt.Is(kDataTypeValueInvalid)) {
   32109                                             UnallocatedT32(instr);
   32110                                             return;
   32111                                           }
   32112                                           unsigned rd =
   32113                                               ExtractDRegister(instr, 22, 12);
   32114                                           if ((instr & 1) != 0) {
   32115                                             UnallocatedT32(instr);
   32116                                             return;
   32117                                           }
   32118                                           unsigned rm =
   32119                                               ExtractQRegister(instr, 5, 0);
   32120                                           uint32_t imm6 = (instr >> 16) & 0x3f;
   32121                                           uint32_t imm = dt.GetSize() - imm6;
   32122                                           // VSHRN{<c>}{<q>}.I<size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   32123                                           vshrn(CurrentCond(),
   32124                                                 dt,
   32125                                                 DRegister(rd),
   32126                                                 QRegister(rm),
   32127                                                 imm);
   32128                                           break;
   32129                                         }
   32130                                         case 0x10000000: {
   32131                                           // 0xff980810
   32132                                           if (((instr & 0x380000) == 0x0)) {
   32133                                             UnallocatedT32(instr);
   32134                                             return;
   32135                                           }
   32136                                           DataType dt =
   32137                                               Dt_imm6_2_Decode((instr >> 19) &
   32138                                                                    0x7,
   32139                                                                (instr >> 28) &
   32140                                                                    0x1);
   32141                                           if (dt.Is(kDataTypeValueInvalid)) {
   32142                                             UnallocatedT32(instr);
   32143                                             return;
   32144                                           }
   32145                                           unsigned rd =
   32146                                               ExtractDRegister(instr, 22, 12);
   32147                                           if ((instr & 1) != 0) {
   32148                                             UnallocatedT32(instr);
   32149                                             return;
   32150                                           }
   32151                                           unsigned rm =
   32152                                               ExtractQRegister(instr, 5, 0);
   32153                                           uint32_t imm6 = (instr >> 16) & 0x3f;
   32154                                           uint32_t imm = dt.GetSize() - imm6;
   32155                                           // VQSHRUN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   32156                                           vqshrun(CurrentCond(),
   32157                                                   dt,
   32158                                                   DRegister(rd),
   32159                                                   QRegister(rm),
   32160                                                   imm);
   32161                                           break;
   32162                                         }
   32163                                       }
   32164                                       break;
   32165                                     }
   32166                                     case 0x00000100: {
   32167                                       // 0xef980910
   32168                                       if (((instr & 0x380000) == 0x0)) {
   32169                                         UnallocatedT32(instr);
   32170                                         return;
   32171                                       }
   32172                                       DataType dt =
   32173                                           Dt_imm6_1_Decode((instr >> 19) & 0x7,
   32174                                                            (instr >> 28) & 0x1);
   32175                                       if (dt.Is(kDataTypeValueInvalid)) {
   32176                                         UnallocatedT32(instr);
   32177                                         return;
   32178                                       }
   32179                                       unsigned rd =
   32180                                           ExtractDRegister(instr, 22, 12);
   32181                                       if ((instr & 1) != 0) {
   32182                                         UnallocatedT32(instr);
   32183                                         return;
   32184                                       }
   32185                                       unsigned rm =
   32186                                           ExtractQRegister(instr, 5, 0);
   32187                                       uint32_t imm6 = (instr >> 16) & 0x3f;
   32188                                       uint32_t imm = dt.GetSize() - imm6;
   32189                                       // VQSHRN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   32190                                       vqshrn(CurrentCond(),
   32191                                              dt,
   32192                                              DRegister(rd),
   32193                                              QRegister(rm),
   32194                                              imm);
   32195                                       break;
   32196                                     }
   32197                                     case 0x00000200: {
   32198                                       // 0xef980a10
   32199                                       if (((instr & 0x380000) == 0x0) ||
   32200                                           ((instr & 0x3f0000) == 0x80000) ||
   32201                                           ((instr & 0x3f0000) == 0x100000) ||
   32202                                           ((instr & 0x3f0000) == 0x200000)) {
   32203                                         UnallocatedT32(instr);
   32204                                         return;
   32205                                       }
   32206                                       DataType dt =
   32207                                           Dt_imm6_4_Decode((instr >> 19) & 0x7,
   32208                                                            (instr >> 28) & 0x1);
   32209                                       if (dt.Is(kDataTypeValueInvalid)) {
   32210                                         UnallocatedT32(instr);
   32211                                         return;
   32212                                       }
   32213                                       if (((instr >> 12) & 1) != 0) {
   32214                                         UnallocatedT32(instr);
   32215                                         return;
   32216                                       }
   32217                                       unsigned rd =
   32218                                           ExtractQRegister(instr, 22, 12);
   32219                                       unsigned rm =
   32220                                           ExtractDRegister(instr, 5, 0);
   32221                                       uint32_t imm6 = (instr >> 16) & 0x3f;
   32222                                       uint32_t imm = imm6 - dt.GetSize();
   32223                                       // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   32224                                       vshll(CurrentCond(),
   32225                                             dt,
   32226                                             QRegister(rd),
   32227                                             DRegister(rm),
   32228                                             imm);
   32229                                       break;
   32230                                     }
   32231                                     default:
   32232                                       UnallocatedT32(instr);
   32233                                       break;
   32234                                   }
   32235                                   break;
   32236                                 }
   32237                                 case 0x00280000: {
   32238                                   // 0xefa80810
   32239                                   switch (instr & 0x00000300) {
   32240                                     case 0x00000000: {
   32241                                       // 0xefa80810
   32242                                       switch (instr & 0x10000000) {
   32243                                         case 0x00000000: {
   32244                                           // 0xefa80810
   32245                                           if (((instr & 0x380000) == 0x0)) {
   32246                                             UnallocatedT32(instr);
   32247                                             return;
   32248                                           }
   32249                                           DataType dt = Dt_imm6_3_Decode(
   32250                                               (instr >> 19) & 0x7);
   32251                                           if (dt.Is(kDataTypeValueInvalid)) {
   32252                                             UnallocatedT32(instr);
   32253                                             return;
   32254                                           }
   32255                                           unsigned rd =
   32256                                               ExtractDRegister(instr, 22, 12);
   32257                                           if ((instr & 1) != 0) {
   32258                                             UnallocatedT32(instr);
   32259                                             return;
   32260                                           }
   32261                                           unsigned rm =
   32262                                               ExtractQRegister(instr, 5, 0);
   32263                                           uint32_t imm6 = (instr >> 16) & 0x3f;
   32264                                           uint32_t imm = dt.GetSize() - imm6;
   32265                                           // VSHRN{<c>}{<q>}.I<size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   32266                                           vshrn(CurrentCond(),
   32267                                                 dt,
   32268                                                 DRegister(rd),
   32269                                                 QRegister(rm),
   32270                                                 imm);
   32271                                           break;
   32272                                         }
   32273                                         case 0x10000000: {
   32274                                           // 0xffa80810
   32275                                           if (((instr & 0x380000) == 0x0)) {
   32276                                             UnallocatedT32(instr);
   32277                                             return;
   32278                                           }
   32279                                           DataType dt =
   32280                                               Dt_imm6_2_Decode((instr >> 19) &
   32281                                                                    0x7,
   32282                                                                (instr >> 28) &
   32283                                                                    0x1);
   32284                                           if (dt.Is(kDataTypeValueInvalid)) {
   32285                                             UnallocatedT32(instr);
   32286                                             return;
   32287                                           }
   32288                                           unsigned rd =
   32289                                               ExtractDRegister(instr, 22, 12);
   32290                                           if ((instr & 1) != 0) {
   32291                                             UnallocatedT32(instr);
   32292                                             return;
   32293                                           }
   32294                                           unsigned rm =
   32295                                               ExtractQRegister(instr, 5, 0);
   32296                                           uint32_t imm6 = (instr >> 16) & 0x3f;
   32297                                           uint32_t imm = dt.GetSize() - imm6;
   32298                                           // VQSHRUN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   32299                                           vqshrun(CurrentCond(),
   32300                                                   dt,
   32301                                                   DRegister(rd),
   32302                                                   QRegister(rm),
   32303                                                   imm);
   32304                                           break;
   32305                                         }
   32306                                       }
   32307                                       break;
   32308                                     }
   32309                                     case 0x00000100: {
   32310                                       // 0xefa80910
   32311                                       if (((instr & 0x380000) == 0x0)) {
   32312                                         UnallocatedT32(instr);
   32313                                         return;
   32314                                       }
   32315                                       DataType dt =
   32316                                           Dt_imm6_1_Decode((instr >> 19) & 0x7,
   32317                                                            (instr >> 28) & 0x1);
   32318                                       if (dt.Is(kDataTypeValueInvalid)) {
   32319                                         UnallocatedT32(instr);
   32320                                         return;
   32321                                       }
   32322                                       unsigned rd =
   32323                                           ExtractDRegister(instr, 22, 12);
   32324                                       if ((instr & 1) != 0) {
   32325                                         UnallocatedT32(instr);
   32326                                         return;
   32327                                       }
   32328                                       unsigned rm =
   32329                                           ExtractQRegister(instr, 5, 0);
   32330                                       uint32_t imm6 = (instr >> 16) & 0x3f;
   32331                                       uint32_t imm = dt.GetSize() - imm6;
   32332                                       // VQSHRN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   32333                                       vqshrn(CurrentCond(),
   32334                                              dt,
   32335                                              DRegister(rd),
   32336                                              QRegister(rm),
   32337                                              imm);
   32338                                       break;
   32339                                     }
   32340                                     case 0x00000200: {
   32341                                       // 0xefa80a10
   32342                                       if (((instr & 0x380000) == 0x0) ||
   32343                                           ((instr & 0x3f0000) == 0x80000) ||
   32344                                           ((instr & 0x3f0000) == 0x100000) ||
   32345                                           ((instr & 0x3f0000) == 0x200000)) {
   32346                                         UnallocatedT32(instr);
   32347                                         return;
   32348                                       }
   32349                                       DataType dt =
   32350                                           Dt_imm6_4_Decode((instr >> 19) & 0x7,
   32351                                                            (instr >> 28) & 0x1);
   32352                                       if (dt.Is(kDataTypeValueInvalid)) {
   32353                                         UnallocatedT32(instr);
   32354                                         return;
   32355                                       }
   32356                                       if (((instr >> 12) & 1) != 0) {
   32357                                         UnallocatedT32(instr);
   32358                                         return;
   32359                                       }
   32360                                       unsigned rd =
   32361                                           ExtractQRegister(instr, 22, 12);
   32362                                       unsigned rm =
   32363                                           ExtractDRegister(instr, 5, 0);
   32364                                       uint32_t imm6 = (instr >> 16) & 0x3f;
   32365                                       uint32_t imm = imm6 - dt.GetSize();
   32366                                       // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   32367                                       vshll(CurrentCond(),
   32368                                             dt,
   32369                                             QRegister(rd),
   32370                                             DRegister(rm),
   32371                                             imm);
   32372                                       break;
   32373                                     }
   32374                                     default:
   32375                                       UnallocatedT32(instr);
   32376                                       break;
   32377                                   }
   32378                                   break;
   32379                                 }
   32380                                 case 0x00300000: {
   32381                                   // 0xefb00810
   32382                                   switch (instr & 0x00000300) {
   32383                                     case 0x00000000: {
   32384                                       // 0xefb00810
   32385                                       switch (instr & 0x10000000) {
   32386                                         case 0x00000000: {
   32387                                           // 0xefb00810
   32388                                           if (((instr & 0x380000) == 0x0)) {
   32389                                             UnallocatedT32(instr);
   32390                                             return;
   32391                                           }
   32392                                           DataType dt = Dt_imm6_3_Decode(
   32393                                               (instr >> 19) & 0x7);
   32394                                           if (dt.Is(kDataTypeValueInvalid)) {
   32395                                             UnallocatedT32(instr);
   32396                                             return;
   32397                                           }
   32398                                           unsigned rd =
   32399                                               ExtractDRegister(instr, 22, 12);
   32400                                           if ((instr & 1) != 0) {
   32401                                             UnallocatedT32(instr);
   32402                                             return;
   32403                                           }
   32404                                           unsigned rm =
   32405                                               ExtractQRegister(instr, 5, 0);
   32406                                           uint32_t imm6 = (instr >> 16) & 0x3f;
   32407                                           uint32_t imm = dt.GetSize() - imm6;
   32408                                           // VSHRN{<c>}{<q>}.I<size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   32409                                           vshrn(CurrentCond(),
   32410                                                 dt,
   32411                                                 DRegister(rd),
   32412                                                 QRegister(rm),
   32413                                                 imm);
   32414                                           break;
   32415                                         }
   32416                                         case 0x10000000: {
   32417                                           // 0xffb00810
   32418                                           if (((instr & 0x380000) == 0x0)) {
   32419                                             UnallocatedT32(instr);
   32420                                             return;
   32421                                           }
   32422                                           DataType dt =
   32423                                               Dt_imm6_2_Decode((instr >> 19) &
   32424                                                                    0x7,
   32425                                                                (instr >> 28) &
   32426                                                                    0x1);
   32427                                           if (dt.Is(kDataTypeValueInvalid)) {
   32428                                             UnallocatedT32(instr);
   32429                                             return;
   32430                                           }
   32431                                           unsigned rd =
   32432                                               ExtractDRegister(instr, 22, 12);
   32433                                           if ((instr & 1) != 0) {
   32434                                             UnallocatedT32(instr);
   32435                                             return;
   32436                                           }
   32437                                           unsigned rm =
   32438                                               ExtractQRegister(instr, 5, 0);
   32439                                           uint32_t imm6 = (instr >> 16) & 0x3f;
   32440                                           uint32_t imm = dt.GetSize() - imm6;
   32441                                           // VQSHRUN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   32442                                           vqshrun(CurrentCond(),
   32443                                                   dt,
   32444                                                   DRegister(rd),
   32445                                                   QRegister(rm),
   32446                                                   imm);
   32447                                           break;
   32448                                         }
   32449                                       }
   32450                                       break;
   32451                                     }
   32452                                     case 0x00000100: {
   32453                                       // 0xefb00910
   32454                                       if (((instr & 0x380000) == 0x0)) {
   32455                                         UnallocatedT32(instr);
   32456                                         return;
   32457                                       }
   32458                                       DataType dt =
   32459                                           Dt_imm6_1_Decode((instr >> 19) & 0x7,
   32460                                                            (instr >> 28) & 0x1);
   32461                                       if (dt.Is(kDataTypeValueInvalid)) {
   32462                                         UnallocatedT32(instr);
   32463                                         return;
   32464                                       }
   32465                                       unsigned rd =
   32466                                           ExtractDRegister(instr, 22, 12);
   32467                                       if ((instr & 1) != 0) {
   32468                                         UnallocatedT32(instr);
   32469                                         return;
   32470                                       }
   32471                                       unsigned rm =
   32472                                           ExtractQRegister(instr, 5, 0);
   32473                                       uint32_t imm6 = (instr >> 16) & 0x3f;
   32474                                       uint32_t imm = dt.GetSize() - imm6;
   32475                                       // VQSHRN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   32476                                       vqshrn(CurrentCond(),
   32477                                              dt,
   32478                                              DRegister(rd),
   32479                                              QRegister(rm),
   32480                                              imm);
   32481                                       break;
   32482                                     }
   32483                                     case 0x00000200: {
   32484                                       // 0xefb00a10
   32485                                       if (((instr & 0x380000) == 0x0) ||
   32486                                           ((instr & 0x3f0000) == 0x80000) ||
   32487                                           ((instr & 0x3f0000) == 0x100000) ||
   32488                                           ((instr & 0x3f0000) == 0x200000)) {
   32489                                         UnallocatedT32(instr);
   32490                                         return;
   32491                                       }
   32492                                       DataType dt =
   32493                                           Dt_imm6_4_Decode((instr >> 19) & 0x7,
   32494                                                            (instr >> 28) & 0x1);
   32495                                       if (dt.Is(kDataTypeValueInvalid)) {
   32496                                         UnallocatedT32(instr);
   32497                                         return;
   32498                                       }
   32499                                       if (((instr >> 12) & 1) != 0) {
   32500                                         UnallocatedT32(instr);
   32501                                         return;
   32502                                       }
   32503                                       unsigned rd =
   32504                                           ExtractQRegister(instr, 22, 12);
   32505                                       unsigned rm =
   32506                                           ExtractDRegister(instr, 5, 0);
   32507                                       uint32_t imm6 = (instr >> 16) & 0x3f;
   32508                                       uint32_t imm = imm6 - dt.GetSize();
   32509                                       // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   32510                                       vshll(CurrentCond(),
   32511                                             dt,
   32512                                             QRegister(rd),
   32513                                             DRegister(rm),
   32514                                             imm);
   32515                                       break;
   32516                                     }
   32517                                     default:
   32518                                       UnallocatedT32(instr);
   32519                                       break;
   32520                                   }
   32521                                   break;
   32522                                 }
   32523                                 case 0x00380000: {
   32524                                   // 0xefb80810
   32525                                   switch (instr & 0x00000300) {
   32526                                     case 0x00000000: {
   32527                                       // 0xefb80810
   32528                                       switch (instr & 0x10000000) {
   32529                                         case 0x00000000: {
   32530                                           // 0xefb80810
   32531                                           if (((instr & 0x380000) == 0x0)) {
   32532                                             UnallocatedT32(instr);
   32533                                             return;
   32534                                           }
   32535                                           DataType dt = Dt_imm6_3_Decode(
   32536                                               (instr >> 19) & 0x7);
   32537                                           if (dt.Is(kDataTypeValueInvalid)) {
   32538                                             UnallocatedT32(instr);
   32539                                             return;
   32540                                           }
   32541                                           unsigned rd =
   32542                                               ExtractDRegister(instr, 22, 12);
   32543                                           if ((instr & 1) != 0) {
   32544                                             UnallocatedT32(instr);
   32545                                             return;
   32546                                           }
   32547                                           unsigned rm =
   32548                                               ExtractQRegister(instr, 5, 0);
   32549                                           uint32_t imm6 = (instr >> 16) & 0x3f;
   32550                                           uint32_t imm = dt.GetSize() - imm6;
   32551                                           // VSHRN{<c>}{<q>}.I<size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   32552                                           vshrn(CurrentCond(),
   32553                                                 dt,
   32554                                                 DRegister(rd),
   32555                                                 QRegister(rm),
   32556                                                 imm);
   32557                                           break;
   32558                                         }
   32559                                         case 0x10000000: {
   32560                                           // 0xffb80810
   32561                                           if (((instr & 0x380000) == 0x0)) {
   32562                                             UnallocatedT32(instr);
   32563                                             return;
   32564                                           }
   32565                                           DataType dt =
   32566                                               Dt_imm6_2_Decode((instr >> 19) &
   32567                                                                    0x7,
   32568                                                                (instr >> 28) &
   32569                                                                    0x1);
   32570                                           if (dt.Is(kDataTypeValueInvalid)) {
   32571                                             UnallocatedT32(instr);
   32572                                             return;
   32573                                           }
   32574                                           unsigned rd =
   32575                                               ExtractDRegister(instr, 22, 12);
   32576                                           if ((instr & 1) != 0) {
   32577                                             UnallocatedT32(instr);
   32578                                             return;
   32579                                           }
   32580                                           unsigned rm =
   32581                                               ExtractQRegister(instr, 5, 0);
   32582                                           uint32_t imm6 = (instr >> 16) & 0x3f;
   32583                                           uint32_t imm = dt.GetSize() - imm6;
   32584                                           // VQSHRUN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   32585                                           vqshrun(CurrentCond(),
   32586                                                   dt,
   32587                                                   DRegister(rd),
   32588                                                   QRegister(rm),
   32589                                                   imm);
   32590                                           break;
   32591                                         }
   32592                                       }
   32593                                       break;
   32594                                     }
   32595                                     case 0x00000100: {
   32596                                       // 0xefb80910
   32597                                       if (((instr & 0x380000) == 0x0)) {
   32598                                         UnallocatedT32(instr);
   32599                                         return;
   32600                                       }
   32601                                       DataType dt =
   32602                                           Dt_imm6_1_Decode((instr >> 19) & 0x7,
   32603                                                            (instr >> 28) & 0x1);
   32604                                       if (dt.Is(kDataTypeValueInvalid)) {
   32605                                         UnallocatedT32(instr);
   32606                                         return;
   32607                                       }
   32608                                       unsigned rd =
   32609                                           ExtractDRegister(instr, 22, 12);
   32610                                       if ((instr & 1) != 0) {
   32611                                         UnallocatedT32(instr);
   32612                                         return;
   32613                                       }
   32614                                       unsigned rm =
   32615                                           ExtractQRegister(instr, 5, 0);
   32616                                       uint32_t imm6 = (instr >> 16) & 0x3f;
   32617                                       uint32_t imm = dt.GetSize() - imm6;
   32618                                       // VQSHRN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   32619                                       vqshrn(CurrentCond(),
   32620                                              dt,
   32621                                              DRegister(rd),
   32622                                              QRegister(rm),
   32623                                              imm);
   32624                                       break;
   32625                                     }
   32626                                     case 0x00000200: {
   32627                                       // 0xefb80a10
   32628                                       if (((instr & 0x380000) == 0x0) ||
   32629                                           ((instr & 0x3f0000) == 0x80000) ||
   32630                                           ((instr & 0x3f0000) == 0x100000) ||
   32631                                           ((instr & 0x3f0000) == 0x200000)) {
   32632                                         UnallocatedT32(instr);
   32633                                         return;
   32634                                       }
   32635                                       DataType dt =
   32636                                           Dt_imm6_4_Decode((instr >> 19) & 0x7,
   32637                                                            (instr >> 28) & 0x1);
   32638                                       if (dt.Is(kDataTypeValueInvalid)) {
   32639                                         UnallocatedT32(instr);
   32640                                         return;
   32641                                       }
   32642                                       if (((instr >> 12) & 1) != 0) {
   32643                                         UnallocatedT32(instr);
   32644                                         return;
   32645                                       }
   32646                                       unsigned rd =
   32647                                           ExtractQRegister(instr, 22, 12);
   32648                                       unsigned rm =
   32649                                           ExtractDRegister(instr, 5, 0);
   32650                                       uint32_t imm6 = (instr >> 16) & 0x3f;
   32651                                       uint32_t imm = imm6 - dt.GetSize();
   32652                                       // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   32653                                       vshll(CurrentCond(),
   32654                                             dt,
   32655                                             QRegister(rd),
   32656                                             DRegister(rm),
   32657                                             imm);
   32658                                       break;
   32659                                     }
   32660                                     default:
   32661                                       UnallocatedT32(instr);
   32662                                       break;
   32663                                   }
   32664                                   break;
   32665                                 }
   32666                                 default: {
   32667                                   switch (instr & 0x00000300) {
   32668                                     case 0x00000000: {
   32669                                       // 0xef800810
   32670                                       switch (instr & 0x10000000) {
   32671                                         case 0x00000000: {
   32672                                           // 0xef800810
   32673                                           if (((instr & 0x380000) == 0x0)) {
   32674                                             UnallocatedT32(instr);
   32675                                             return;
   32676                                           }
   32677                                           DataType dt = Dt_imm6_3_Decode(
   32678                                               (instr >> 19) & 0x7);
   32679                                           if (dt.Is(kDataTypeValueInvalid)) {
   32680                                             UnallocatedT32(instr);
   32681                                             return;
   32682                                           }
   32683                                           unsigned rd =
   32684                                               ExtractDRegister(instr, 22, 12);
   32685                                           if ((instr & 1) != 0) {
   32686                                             UnallocatedT32(instr);
   32687                                             return;
   32688                                           }
   32689                                           unsigned rm =
   32690                                               ExtractQRegister(instr, 5, 0);
   32691                                           uint32_t imm6 = (instr >> 16) & 0x3f;
   32692                                           uint32_t imm = dt.GetSize() - imm6;
   32693                                           // VSHRN{<c>}{<q>}.I<size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   32694                                           vshrn(CurrentCond(),
   32695                                                 dt,
   32696                                                 DRegister(rd),
   32697                                                 QRegister(rm),
   32698                                                 imm);
   32699                                           break;
   32700                                         }
   32701                                         case 0x10000000: {
   32702                                           // 0xff800810
   32703                                           if (((instr & 0x380000) == 0x0)) {
   32704                                             UnallocatedT32(instr);
   32705                                             return;
   32706                                           }
   32707                                           DataType dt =
   32708                                               Dt_imm6_2_Decode((instr >> 19) &
   32709                                                                    0x7,
   32710                                                                (instr >> 28) &
   32711                                                                    0x1);
   32712                                           if (dt.Is(kDataTypeValueInvalid)) {
   32713                                             UnallocatedT32(instr);
   32714                                             return;
   32715                                           }
   32716                                           unsigned rd =
   32717                                               ExtractDRegister(instr, 22, 12);
   32718                                           if ((instr & 1) != 0) {
   32719                                             UnallocatedT32(instr);
   32720                                             return;
   32721                                           }
   32722                                           unsigned rm =
   32723                                               ExtractQRegister(instr, 5, 0);
   32724                                           uint32_t imm6 = (instr >> 16) & 0x3f;
   32725                                           uint32_t imm = dt.GetSize() - imm6;
   32726                                           // VQSHRUN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   32727                                           vqshrun(CurrentCond(),
   32728                                                   dt,
   32729                                                   DRegister(rd),
   32730                                                   QRegister(rm),
   32731                                                   imm);
   32732                                           break;
   32733                                         }
   32734                                       }
   32735                                       break;
   32736                                     }
   32737                                     case 0x00000100: {
   32738                                       // 0xef800910
   32739                                       if (((instr & 0x380000) == 0x0)) {
   32740                                         UnallocatedT32(instr);
   32741                                         return;
   32742                                       }
   32743                                       DataType dt =
   32744                                           Dt_imm6_1_Decode((instr >> 19) & 0x7,
   32745                                                            (instr >> 28) & 0x1);
   32746                                       if (dt.Is(kDataTypeValueInvalid)) {
   32747                                         UnallocatedT32(instr);
   32748                                         return;
   32749                                       }
   32750                                       unsigned rd =
   32751                                           ExtractDRegister(instr, 22, 12);
   32752                                       if ((instr & 1) != 0) {
   32753                                         UnallocatedT32(instr);
   32754                                         return;
   32755                                       }
   32756                                       unsigned rm =
   32757                                           ExtractQRegister(instr, 5, 0);
   32758                                       uint32_t imm6 = (instr >> 16) & 0x3f;
   32759                                       uint32_t imm = dt.GetSize() - imm6;
   32760                                       // VQSHRN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   32761                                       vqshrn(CurrentCond(),
   32762                                              dt,
   32763                                              DRegister(rd),
   32764                                              QRegister(rm),
   32765                                              imm);
   32766                                       break;
   32767                                     }
   32768                                     case 0x00000200: {
   32769                                       // 0xef800a10
   32770                                       switch (instr & 0x00070000) {
   32771                                         case 0x00000000: {
   32772                                           // 0xef800a10
   32773                                           switch (instr & 0x003f0000) {
   32774                                             case 0x00080000: {
   32775                                               // 0xef880a10
   32776                                               if (((instr & 0x380000) == 0x0) ||
   32777                                                   ((instr & 0x380000) ==
   32778                                                    0x180000) ||
   32779                                                   ((instr & 0x380000) ==
   32780                                                    0x280000) ||
   32781                                                   ((instr & 0x380000) ==
   32782                                                    0x300000) ||
   32783                                                   ((instr & 0x380000) ==
   32784                                                    0x380000)) {
   32785                                                 UnallocatedT32(instr);
   32786                                                 return;
   32787                                               }
   32788                                               DataType dt = Dt_U_imm3H_1_Decode(
   32789                                                   ((instr >> 19) & 0x7) |
   32790                                                   ((instr >> 25) & 0x8));
   32791                                               if (dt.Is(
   32792                                                       kDataTypeValueInvalid)) {
   32793                                                 UnallocatedT32(instr);
   32794                                                 return;
   32795                                               }
   32796                                               if (((instr >> 12) & 1) != 0) {
   32797                                                 UnallocatedT32(instr);
   32798                                                 return;
   32799                                               }
   32800                                               unsigned rd =
   32801                                                   ExtractQRegister(instr,
   32802                                                                    22,
   32803                                                                    12);
   32804                                               unsigned rm =
   32805                                                   ExtractDRegister(instr, 5, 0);
   32806                                               // VMOVL{<c>}{<q>}.<dt> <Qd>, <Dm> ; T1 NOLINT(whitespace/line_length)
   32807                                               vmovl(CurrentCond(),
   32808                                                     dt,
   32809                                                     QRegister(rd),
   32810                                                     DRegister(rm));
   32811                                               break;
   32812                                             }
   32813                                             case 0x00090000: {
   32814                                               // 0xef890a10
   32815                                               if (((instr & 0x380000) == 0x0) ||
   32816                                                   ((instr & 0x3f0000) ==
   32817                                                    0x80000) ||
   32818                                                   ((instr & 0x3f0000) ==
   32819                                                    0x100000) ||
   32820                                                   ((instr & 0x3f0000) ==
   32821                                                    0x200000)) {
   32822                                                 UnallocatedT32(instr);
   32823                                                 return;
   32824                                               }
   32825                                               DataType dt =
   32826                                                   Dt_imm6_4_Decode((instr >>
   32827                                                                     19) &
   32828                                                                        0x7,
   32829                                                                    (instr >>
   32830                                                                     28) &
   32831                                                                        0x1);
   32832                                               if (dt.Is(
   32833                                                       kDataTypeValueInvalid)) {
   32834                                                 UnallocatedT32(instr);
   32835                                                 return;
   32836                                               }
   32837                                               if (((instr >> 12) & 1) != 0) {
   32838                                                 UnallocatedT32(instr);
   32839                                                 return;
   32840                                               }
   32841                                               unsigned rd =
   32842                                                   ExtractQRegister(instr,
   32843                                                                    22,
   32844                                                                    12);
   32845                                               unsigned rm =
   32846                                                   ExtractDRegister(instr, 5, 0);
   32847                                               uint32_t imm6 =
   32848                                                   (instr >> 16) & 0x3f;
   32849                                               uint32_t imm =
   32850                                                   imm6 - dt.GetSize();
   32851                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   32852                                               vshll(CurrentCond(),
   32853                                                     dt,
   32854                                                     QRegister(rd),
   32855                                                     DRegister(rm),
   32856                                                     imm);
   32857                                               break;
   32858                                             }
   32859                                             case 0x000a0000: {
   32860                                               // 0xef8a0a10
   32861                                               if (((instr & 0x380000) == 0x0) ||
   32862                                                   ((instr & 0x3f0000) ==
   32863                                                    0x80000) ||
   32864                                                   ((instr & 0x3f0000) ==
   32865                                                    0x100000) ||
   32866                                                   ((instr & 0x3f0000) ==
   32867                                                    0x200000)) {
   32868                                                 UnallocatedT32(instr);
   32869                                                 return;
   32870                                               }
   32871                                               DataType dt =
   32872                                                   Dt_imm6_4_Decode((instr >>
   32873                                                                     19) &
   32874                                                                        0x7,
   32875                                                                    (instr >>
   32876                                                                     28) &
   32877                                                                        0x1);
   32878                                               if (dt.Is(
   32879                                                       kDataTypeValueInvalid)) {
   32880                                                 UnallocatedT32(instr);
   32881                                                 return;
   32882                                               }
   32883                                               if (((instr >> 12) & 1) != 0) {
   32884                                                 UnallocatedT32(instr);
   32885                                                 return;
   32886                                               }
   32887                                               unsigned rd =
   32888                                                   ExtractQRegister(instr,
   32889                                                                    22,
   32890                                                                    12);
   32891                                               unsigned rm =
   32892                                                   ExtractDRegister(instr, 5, 0);
   32893                                               uint32_t imm6 =
   32894                                                   (instr >> 16) & 0x3f;
   32895                                               uint32_t imm =
   32896                                                   imm6 - dt.GetSize();
   32897                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   32898                                               vshll(CurrentCond(),
   32899                                                     dt,
   32900                                                     QRegister(rd),
   32901                                                     DRegister(rm),
   32902                                                     imm);
   32903                                               break;
   32904                                             }
   32905                                             case 0x000b0000: {
   32906                                               // 0xef8b0a10
   32907                                               if (((instr & 0x380000) == 0x0) ||
   32908                                                   ((instr & 0x3f0000) ==
   32909                                                    0x80000) ||
   32910                                                   ((instr & 0x3f0000) ==
   32911                                                    0x100000) ||
   32912                                                   ((instr & 0x3f0000) ==
   32913                                                    0x200000)) {
   32914                                                 UnallocatedT32(instr);
   32915                                                 return;
   32916                                               }
   32917                                               DataType dt =
   32918                                                   Dt_imm6_4_Decode((instr >>
   32919                                                                     19) &
   32920                                                                        0x7,
   32921                                                                    (instr >>
   32922                                                                     28) &
   32923                                                                        0x1);
   32924                                               if (dt.Is(
   32925                                                       kDataTypeValueInvalid)) {
   32926                                                 UnallocatedT32(instr);
   32927                                                 return;
   32928                                               }
   32929                                               if (((instr >> 12) & 1) != 0) {
   32930                                                 UnallocatedT32(instr);
   32931                                                 return;
   32932                                               }
   32933                                               unsigned rd =
   32934                                                   ExtractQRegister(instr,
   32935                                                                    22,
   32936                                                                    12);
   32937                                               unsigned rm =
   32938                                                   ExtractDRegister(instr, 5, 0);
   32939                                               uint32_t imm6 =
   32940                                                   (instr >> 16) & 0x3f;
   32941                                               uint32_t imm =
   32942                                                   imm6 - dt.GetSize();
   32943                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   32944                                               vshll(CurrentCond(),
   32945                                                     dt,
   32946                                                     QRegister(rd),
   32947                                                     DRegister(rm),
   32948                                                     imm);
   32949                                               break;
   32950                                             }
   32951                                             case 0x000c0000: {
   32952                                               // 0xef8c0a10
   32953                                               if (((instr & 0x380000) == 0x0) ||
   32954                                                   ((instr & 0x3f0000) ==
   32955                                                    0x80000) ||
   32956                                                   ((instr & 0x3f0000) ==
   32957                                                    0x100000) ||
   32958                                                   ((instr & 0x3f0000) ==
   32959                                                    0x200000)) {
   32960                                                 UnallocatedT32(instr);
   32961                                                 return;
   32962                                               }
   32963                                               DataType dt =
   32964                                                   Dt_imm6_4_Decode((instr >>
   32965                                                                     19) &
   32966                                                                        0x7,
   32967                                                                    (instr >>
   32968                                                                     28) &
   32969                                                                        0x1);
   32970                                               if (dt.Is(
   32971                                                       kDataTypeValueInvalid)) {
   32972                                                 UnallocatedT32(instr);
   32973                                                 return;
   32974                                               }
   32975                                               if (((instr >> 12) & 1) != 0) {
   32976                                                 UnallocatedT32(instr);
   32977                                                 return;
   32978                                               }
   32979                                               unsigned rd =
   32980                                                   ExtractQRegister(instr,
   32981                                                                    22,
   32982                                                                    12);
   32983                                               unsigned rm =
   32984                                                   ExtractDRegister(instr, 5, 0);
   32985                                               uint32_t imm6 =
   32986                                                   (instr >> 16) & 0x3f;
   32987                                               uint32_t imm =
   32988                                                   imm6 - dt.GetSize();
   32989                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   32990                                               vshll(CurrentCond(),
   32991                                                     dt,
   32992                                                     QRegister(rd),
   32993                                                     DRegister(rm),
   32994                                                     imm);
   32995                                               break;
   32996                                             }
   32997                                             case 0x000d0000: {
   32998                                               // 0xef8d0a10
   32999                                               if (((instr & 0x380000) == 0x0) ||
   33000                                                   ((instr & 0x3f0000) ==
   33001                                                    0x80000) ||
   33002                                                   ((instr & 0x3f0000) ==
   33003                                                    0x100000) ||
   33004                                                   ((instr & 0x3f0000) ==
   33005                                                    0x200000)) {
   33006                                                 UnallocatedT32(instr);
   33007                                                 return;
   33008                                               }
   33009                                               DataType dt =
   33010                                                   Dt_imm6_4_Decode((instr >>
   33011                                                                     19) &
   33012                                                                        0x7,
   33013                                                                    (instr >>
   33014                                                                     28) &
   33015                                                                        0x1);
   33016                                               if (dt.Is(
   33017                                                       kDataTypeValueInvalid)) {
   33018                                                 UnallocatedT32(instr);
   33019                                                 return;
   33020                                               }
   33021                                               if (((instr >> 12) & 1) != 0) {
   33022                                                 UnallocatedT32(instr);
   33023                                                 return;
   33024                                               }
   33025                                               unsigned rd =
   33026                                                   ExtractQRegister(instr,
   33027                                                                    22,
   33028                                                                    12);
   33029                                               unsigned rm =
   33030                                                   ExtractDRegister(instr, 5, 0);
   33031                                               uint32_t imm6 =
   33032                                                   (instr >> 16) & 0x3f;
   33033                                               uint32_t imm =
   33034                                                   imm6 - dt.GetSize();
   33035                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   33036                                               vshll(CurrentCond(),
   33037                                                     dt,
   33038                                                     QRegister(rd),
   33039                                                     DRegister(rm),
   33040                                                     imm);
   33041                                               break;
   33042                                             }
   33043                                             case 0x000e0000: {
   33044                                               // 0xef8e0a10
   33045                                               if (((instr & 0x380000) == 0x0) ||
   33046                                                   ((instr & 0x3f0000) ==
   33047                                                    0x80000) ||
   33048                                                   ((instr & 0x3f0000) ==
   33049                                                    0x100000) ||
   33050                                                   ((instr & 0x3f0000) ==
   33051                                                    0x200000)) {
   33052                                                 UnallocatedT32(instr);
   33053                                                 return;
   33054                                               }
   33055                                               DataType dt =
   33056                                                   Dt_imm6_4_Decode((instr >>
   33057                                                                     19) &
   33058                                                                        0x7,
   33059                                                                    (instr >>
   33060                                                                     28) &
   33061                                                                        0x1);
   33062                                               if (dt.Is(
   33063                                                       kDataTypeValueInvalid)) {
   33064                                                 UnallocatedT32(instr);
   33065                                                 return;
   33066                                               }
   33067                                               if (((instr >> 12) & 1) != 0) {
   33068                                                 UnallocatedT32(instr);
   33069                                                 return;
   33070                                               }
   33071                                               unsigned rd =
   33072                                                   ExtractQRegister(instr,
   33073                                                                    22,
   33074                                                                    12);
   33075                                               unsigned rm =
   33076                                                   ExtractDRegister(instr, 5, 0);
   33077                                               uint32_t imm6 =
   33078                                                   (instr >> 16) & 0x3f;
   33079                                               uint32_t imm =
   33080                                                   imm6 - dt.GetSize();
   33081                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   33082                                               vshll(CurrentCond(),
   33083                                                     dt,
   33084                                                     QRegister(rd),
   33085                                                     DRegister(rm),
   33086                                                     imm);
   33087                                               break;
   33088                                             }
   33089                                             case 0x000f0000: {
   33090                                               // 0xef8f0a10
   33091                                               if (((instr & 0x380000) == 0x0) ||
   33092                                                   ((instr & 0x3f0000) ==
   33093                                                    0x80000) ||
   33094                                                   ((instr & 0x3f0000) ==
   33095                                                    0x100000) ||
   33096                                                   ((instr & 0x3f0000) ==
   33097                                                    0x200000)) {
   33098                                                 UnallocatedT32(instr);
   33099                                                 return;
   33100                                               }
   33101                                               DataType dt =
   33102                                                   Dt_imm6_4_Decode((instr >>
   33103                                                                     19) &
   33104                                                                        0x7,
   33105                                                                    (instr >>
   33106                                                                     28) &
   33107                                                                        0x1);
   33108                                               if (dt.Is(
   33109                                                       kDataTypeValueInvalid)) {
   33110                                                 UnallocatedT32(instr);
   33111                                                 return;
   33112                                               }
   33113                                               if (((instr >> 12) & 1) != 0) {
   33114                                                 UnallocatedT32(instr);
   33115                                                 return;
   33116                                               }
   33117                                               unsigned rd =
   33118                                                   ExtractQRegister(instr,
   33119                                                                    22,
   33120                                                                    12);
   33121                                               unsigned rm =
   33122                                                   ExtractDRegister(instr, 5, 0);
   33123                                               uint32_t imm6 =
   33124                                                   (instr >> 16) & 0x3f;
   33125                                               uint32_t imm =
   33126                                                   imm6 - dt.GetSize();
   33127                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   33128                                               vshll(CurrentCond(),
   33129                                                     dt,
   33130                                                     QRegister(rd),
   33131                                                     DRegister(rm),
   33132                                                     imm);
   33133                                               break;
   33134                                             }
   33135                                             case 0x00100000: {
   33136                                               // 0xef900a10
   33137                                               if (((instr & 0x380000) == 0x0) ||
   33138                                                   ((instr & 0x380000) ==
   33139                                                    0x180000) ||
   33140                                                   ((instr & 0x380000) ==
   33141                                                    0x280000) ||
   33142                                                   ((instr & 0x380000) ==
   33143                                                    0x300000) ||
   33144                                                   ((instr & 0x380000) ==
   33145                                                    0x380000)) {
   33146                                                 UnallocatedT32(instr);
   33147                                                 return;
   33148                                               }
   33149                                               DataType dt = Dt_U_imm3H_1_Decode(
   33150                                                   ((instr >> 19) & 0x7) |
   33151                                                   ((instr >> 25) & 0x8));
   33152                                               if (dt.Is(
   33153                                                       kDataTypeValueInvalid)) {
   33154                                                 UnallocatedT32(instr);
   33155                                                 return;
   33156                                               }
   33157                                               if (((instr >> 12) & 1) != 0) {
   33158                                                 UnallocatedT32(instr);
   33159                                                 return;
   33160                                               }
   33161                                               unsigned rd =
   33162                                                   ExtractQRegister(instr,
   33163                                                                    22,
   33164                                                                    12);
   33165                                               unsigned rm =
   33166                                                   ExtractDRegister(instr, 5, 0);
   33167                                               // VMOVL{<c>}{<q>}.<dt> <Qd>, <Dm> ; T1 NOLINT(whitespace/line_length)
   33168                                               vmovl(CurrentCond(),
   33169                                                     dt,
   33170                                                     QRegister(rd),
   33171                                                     DRegister(rm));
   33172                                               break;
   33173                                             }
   33174                                             case 0x00110000: {
   33175                                               // 0xef910a10
   33176                                               if (((instr & 0x380000) == 0x0) ||
   33177                                                   ((instr & 0x3f0000) ==
   33178                                                    0x80000) ||
   33179                                                   ((instr & 0x3f0000) ==
   33180                                                    0x100000) ||
   33181                                                   ((instr & 0x3f0000) ==
   33182                                                    0x200000)) {
   33183                                                 UnallocatedT32(instr);
   33184                                                 return;
   33185                                               }
   33186                                               DataType dt =
   33187                                                   Dt_imm6_4_Decode((instr >>
   33188                                                                     19) &
   33189                                                                        0x7,
   33190                                                                    (instr >>
   33191                                                                     28) &
   33192                                                                        0x1);
   33193                                               if (dt.Is(
   33194                                                       kDataTypeValueInvalid)) {
   33195                                                 UnallocatedT32(instr);
   33196                                                 return;
   33197                                               }
   33198                                               if (((instr >> 12) & 1) != 0) {
   33199                                                 UnallocatedT32(instr);
   33200                                                 return;
   33201                                               }
   33202                                               unsigned rd =
   33203                                                   ExtractQRegister(instr,
   33204                                                                    22,
   33205                                                                    12);
   33206                                               unsigned rm =
   33207                                                   ExtractDRegister(instr, 5, 0);
   33208                                               uint32_t imm6 =
   33209                                                   (instr >> 16) & 0x3f;
   33210                                               uint32_t imm =
   33211                                                   imm6 - dt.GetSize();
   33212                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   33213                                               vshll(CurrentCond(),
   33214                                                     dt,
   33215                                                     QRegister(rd),
   33216                                                     DRegister(rm),
   33217                                                     imm);
   33218                                               break;
   33219                                             }
   33220                                             case 0x00120000: {
   33221                                               // 0xef920a10
   33222                                               if (((instr & 0x380000) == 0x0) ||
   33223                                                   ((instr & 0x3f0000) ==
   33224                                                    0x80000) ||
   33225                                                   ((instr & 0x3f0000) ==
   33226                                                    0x100000) ||
   33227                                                   ((instr & 0x3f0000) ==
   33228                                                    0x200000)) {
   33229                                                 UnallocatedT32(instr);
   33230                                                 return;
   33231                                               }
   33232                                               DataType dt =
   33233                                                   Dt_imm6_4_Decode((instr >>
   33234                                                                     19) &
   33235                                                                        0x7,
   33236                                                                    (instr >>
   33237                                                                     28) &
   33238                                                                        0x1);
   33239                                               if (dt.Is(
   33240                                                       kDataTypeValueInvalid)) {
   33241                                                 UnallocatedT32(instr);
   33242                                                 return;
   33243                                               }
   33244                                               if (((instr >> 12) & 1) != 0) {
   33245                                                 UnallocatedT32(instr);
   33246                                                 return;
   33247                                               }
   33248                                               unsigned rd =
   33249                                                   ExtractQRegister(instr,
   33250                                                                    22,
   33251                                                                    12);
   33252                                               unsigned rm =
   33253                                                   ExtractDRegister(instr, 5, 0);
   33254                                               uint32_t imm6 =
   33255                                                   (instr >> 16) & 0x3f;
   33256                                               uint32_t imm =
   33257                                                   imm6 - dt.GetSize();
   33258                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   33259                                               vshll(CurrentCond(),
   33260                                                     dt,
   33261                                                     QRegister(rd),
   33262                                                     DRegister(rm),
   33263                                                     imm);
   33264                                               break;
   33265                                             }
   33266                                             case 0x00130000: {
   33267                                               // 0xef930a10
   33268                                               if (((instr & 0x380000) == 0x0) ||
   33269                                                   ((instr & 0x3f0000) ==
   33270                                                    0x80000) ||
   33271                                                   ((instr & 0x3f0000) ==
   33272                                                    0x100000) ||
   33273                                                   ((instr & 0x3f0000) ==
   33274                                                    0x200000)) {
   33275                                                 UnallocatedT32(instr);
   33276                                                 return;
   33277                                               }
   33278                                               DataType dt =
   33279                                                   Dt_imm6_4_Decode((instr >>
   33280                                                                     19) &
   33281                                                                        0x7,
   33282                                                                    (instr >>
   33283                                                                     28) &
   33284                                                                        0x1);
   33285                                               if (dt.Is(
   33286                                                       kDataTypeValueInvalid)) {
   33287                                                 UnallocatedT32(instr);
   33288                                                 return;
   33289                                               }
   33290                                               if (((instr >> 12) & 1) != 0) {
   33291                                                 UnallocatedT32(instr);
   33292                                                 return;
   33293                                               }
   33294                                               unsigned rd =
   33295                                                   ExtractQRegister(instr,
   33296                                                                    22,
   33297                                                                    12);
   33298                                               unsigned rm =
   33299                                                   ExtractDRegister(instr, 5, 0);
   33300                                               uint32_t imm6 =
   33301                                                   (instr >> 16) & 0x3f;
   33302                                               uint32_t imm =
   33303                                                   imm6 - dt.GetSize();
   33304                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   33305                                               vshll(CurrentCond(),
   33306                                                     dt,
   33307                                                     QRegister(rd),
   33308                                                     DRegister(rm),
   33309                                                     imm);
   33310                                               break;
   33311                                             }
   33312                                             case 0x00140000: {
   33313                                               // 0xef940a10
   33314                                               if (((instr & 0x380000) == 0x0) ||
   33315                                                   ((instr & 0x3f0000) ==
   33316                                                    0x80000) ||
   33317                                                   ((instr & 0x3f0000) ==
   33318                                                    0x100000) ||
   33319                                                   ((instr & 0x3f0000) ==
   33320                                                    0x200000)) {
   33321                                                 UnallocatedT32(instr);
   33322                                                 return;
   33323                                               }
   33324                                               DataType dt =
   33325                                                   Dt_imm6_4_Decode((instr >>
   33326                                                                     19) &
   33327                                                                        0x7,
   33328                                                                    (instr >>
   33329                                                                     28) &
   33330                                                                        0x1);
   33331                                               if (dt.Is(
   33332                                                       kDataTypeValueInvalid)) {
   33333                                                 UnallocatedT32(instr);
   33334                                                 return;
   33335                                               }
   33336                                               if (((instr >> 12) & 1) != 0) {
   33337                                                 UnallocatedT32(instr);
   33338                                                 return;
   33339                                               }
   33340                                               unsigned rd =
   33341                                                   ExtractQRegister(instr,
   33342                                                                    22,
   33343                                                                    12);
   33344                                               unsigned rm =
   33345                                                   ExtractDRegister(instr, 5, 0);
   33346                                               uint32_t imm6 =
   33347                                                   (instr >> 16) & 0x3f;
   33348                                               uint32_t imm =
   33349                                                   imm6 - dt.GetSize();
   33350                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   33351                                               vshll(CurrentCond(),
   33352                                                     dt,
   33353                                                     QRegister(rd),
   33354                                                     DRegister(rm),
   33355                                                     imm);
   33356                                               break;
   33357                                             }
   33358                                             case 0x00150000: {
   33359                                               // 0xef950a10
   33360                                               if (((instr & 0x380000) == 0x0) ||
   33361                                                   ((instr & 0x3f0000) ==
   33362                                                    0x80000) ||
   33363                                                   ((instr & 0x3f0000) ==
   33364                                                    0x100000) ||
   33365                                                   ((instr & 0x3f0000) ==
   33366                                                    0x200000)) {
   33367                                                 UnallocatedT32(instr);
   33368                                                 return;
   33369                                               }
   33370                                               DataType dt =
   33371                                                   Dt_imm6_4_Decode((instr >>
   33372                                                                     19) &
   33373                                                                        0x7,
   33374                                                                    (instr >>
   33375                                                                     28) &
   33376                                                                        0x1);
   33377                                               if (dt.Is(
   33378                                                       kDataTypeValueInvalid)) {
   33379                                                 UnallocatedT32(instr);
   33380                                                 return;
   33381                                               }
   33382                                               if (((instr >> 12) & 1) != 0) {
   33383                                                 UnallocatedT32(instr);
   33384                                                 return;
   33385                                               }
   33386                                               unsigned rd =
   33387                                                   ExtractQRegister(instr,
   33388                                                                    22,
   33389                                                                    12);
   33390                                               unsigned rm =
   33391                                                   ExtractDRegister(instr, 5, 0);
   33392                                               uint32_t imm6 =
   33393                                                   (instr >> 16) & 0x3f;
   33394                                               uint32_t imm =
   33395                                                   imm6 - dt.GetSize();
   33396                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   33397                                               vshll(CurrentCond(),
   33398                                                     dt,
   33399                                                     QRegister(rd),
   33400                                                     DRegister(rm),
   33401                                                     imm);
   33402                                               break;
   33403                                             }
   33404                                             case 0x00160000: {
   33405                                               // 0xef960a10
   33406                                               if (((instr & 0x380000) == 0x0) ||
   33407                                                   ((instr & 0x3f0000) ==
   33408                                                    0x80000) ||
   33409                                                   ((instr & 0x3f0000) ==
   33410                                                    0x100000) ||
   33411                                                   ((instr & 0x3f0000) ==
   33412                                                    0x200000)) {
   33413                                                 UnallocatedT32(instr);
   33414                                                 return;
   33415                                               }
   33416                                               DataType dt =
   33417                                                   Dt_imm6_4_Decode((instr >>
   33418                                                                     19) &
   33419                                                                        0x7,
   33420                                                                    (instr >>
   33421                                                                     28) &
   33422                                                                        0x1);
   33423                                               if (dt.Is(
   33424                                                       kDataTypeValueInvalid)) {
   33425                                                 UnallocatedT32(instr);
   33426                                                 return;
   33427                                               }
   33428                                               if (((instr >> 12) & 1) != 0) {
   33429                                                 UnallocatedT32(instr);
   33430                                                 return;
   33431                                               }
   33432                                               unsigned rd =
   33433                                                   ExtractQRegister(instr,
   33434                                                                    22,
   33435                                                                    12);
   33436                                               unsigned rm =
   33437                                                   ExtractDRegister(instr, 5, 0);
   33438                                               uint32_t imm6 =
   33439                                                   (instr >> 16) & 0x3f;
   33440                                               uint32_t imm =
   33441                                                   imm6 - dt.GetSize();
   33442                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   33443                                               vshll(CurrentCond(),
   33444                                                     dt,
   33445                                                     QRegister(rd),
   33446                                                     DRegister(rm),
   33447                                                     imm);
   33448                                               break;
   33449                                             }
   33450                                             case 0x00170000: {
   33451                                               // 0xef970a10
   33452                                               if (((instr & 0x380000) == 0x0) ||
   33453                                                   ((instr & 0x3f0000) ==
   33454                                                    0x80000) ||
   33455                                                   ((instr & 0x3f0000) ==
   33456                                                    0x100000) ||
   33457                                                   ((instr & 0x3f0000) ==
   33458                                                    0x200000)) {
   33459                                                 UnallocatedT32(instr);
   33460                                                 return;
   33461                                               }
   33462                                               DataType dt =
   33463                                                   Dt_imm6_4_Decode((instr >>
   33464                                                                     19) &
   33465                                                                        0x7,
   33466                                                                    (instr >>
   33467                                                                     28) &
   33468                                                                        0x1);
   33469                                               if (dt.Is(
   33470                                                       kDataTypeValueInvalid)) {
   33471                                                 UnallocatedT32(instr);
   33472                                                 return;
   33473                                               }
   33474                                               if (((instr >> 12) & 1) != 0) {
   33475                                                 UnallocatedT32(instr);
   33476                                                 return;
   33477                                               }
   33478                                               unsigned rd =
   33479                                                   ExtractQRegister(instr,
   33480                                                                    22,
   33481                                                                    12);
   33482                                               unsigned rm =
   33483                                                   ExtractDRegister(instr, 5, 0);
   33484                                               uint32_t imm6 =
   33485                                                   (instr >> 16) & 0x3f;
   33486                                               uint32_t imm =
   33487                                                   imm6 - dt.GetSize();
   33488                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   33489                                               vshll(CurrentCond(),
   33490                                                     dt,
   33491                                                     QRegister(rd),
   33492                                                     DRegister(rm),
   33493                                                     imm);
   33494                                               break;
   33495                                             }
   33496                                             case 0x00180000: {
   33497                                               // 0xef980a10
   33498                                               if (((instr & 0x380000) == 0x0) ||
   33499                                                   ((instr & 0x3f0000) ==
   33500                                                    0x80000) ||
   33501                                                   ((instr & 0x3f0000) ==
   33502                                                    0x100000) ||
   33503                                                   ((instr & 0x3f0000) ==
   33504                                                    0x200000)) {
   33505                                                 UnallocatedT32(instr);
   33506                                                 return;
   33507                                               }
   33508                                               DataType dt =
   33509                                                   Dt_imm6_4_Decode((instr >>
   33510                                                                     19) &
   33511                                                                        0x7,
   33512                                                                    (instr >>
   33513                                                                     28) &
   33514                                                                        0x1);
   33515                                               if (dt.Is(
   33516                                                       kDataTypeValueInvalid)) {
   33517                                                 UnallocatedT32(instr);
   33518                                                 return;
   33519                                               }
   33520                                               if (((instr >> 12) & 1) != 0) {
   33521                                                 UnallocatedT32(instr);
   33522                                                 return;
   33523                                               }
   33524                                               unsigned rd =
   33525                                                   ExtractQRegister(instr,
   33526                                                                    22,
   33527                                                                    12);
   33528                                               unsigned rm =
   33529                                                   ExtractDRegister(instr, 5, 0);
   33530                                               uint32_t imm6 =
   33531                                                   (instr >> 16) & 0x3f;
   33532                                               uint32_t imm =
   33533                                                   imm6 - dt.GetSize();
   33534                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   33535                                               vshll(CurrentCond(),
   33536                                                     dt,
   33537                                                     QRegister(rd),
   33538                                                     DRegister(rm),
   33539                                                     imm);
   33540                                               break;
   33541                                             }
   33542                                             case 0x00190000: {
   33543                                               // 0xef990a10
   33544                                               if (((instr & 0x380000) == 0x0) ||
   33545                                                   ((instr & 0x3f0000) ==
   33546                                                    0x80000) ||
   33547                                                   ((instr & 0x3f0000) ==
   33548                                                    0x100000) ||
   33549                                                   ((instr & 0x3f0000) ==
   33550                                                    0x200000)) {
   33551                                                 UnallocatedT32(instr);
   33552                                                 return;
   33553                                               }
   33554                                               DataType dt =
   33555                                                   Dt_imm6_4_Decode((instr >>
   33556                                                                     19) &
   33557                                                                        0x7,
   33558                                                                    (instr >>
   33559                                                                     28) &
   33560                                                                        0x1);
   33561                                               if (dt.Is(
   33562                                                       kDataTypeValueInvalid)) {
   33563                                                 UnallocatedT32(instr);
   33564                                                 return;
   33565                                               }
   33566                                               if (((instr >> 12) & 1) != 0) {
   33567                                                 UnallocatedT32(instr);
   33568                                                 return;
   33569                                               }
   33570                                               unsigned rd =
   33571                                                   ExtractQRegister(instr,
   33572                                                                    22,
   33573                                                                    12);
   33574                                               unsigned rm =
   33575                                                   ExtractDRegister(instr, 5, 0);
   33576                                               uint32_t imm6 =
   33577                                                   (instr >> 16) & 0x3f;
   33578                                               uint32_t imm =
   33579                                                   imm6 - dt.GetSize();
   33580                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   33581                                               vshll(CurrentCond(),
   33582                                                     dt,
   33583                                                     QRegister(rd),
   33584                                                     DRegister(rm),
   33585                                                     imm);
   33586                                               break;
   33587                                             }
   33588                                             case 0x001a0000: {
   33589                                               // 0xef9a0a10
   33590                                               if (((instr & 0x380000) == 0x0) ||
   33591                                                   ((instr & 0x3f0000) ==
   33592                                                    0x80000) ||
   33593                                                   ((instr & 0x3f0000) ==
   33594                                                    0x100000) ||
   33595                                                   ((instr & 0x3f0000) ==
   33596                                                    0x200000)) {
   33597                                                 UnallocatedT32(instr);
   33598                                                 return;
   33599                                               }
   33600                                               DataType dt =
   33601                                                   Dt_imm6_4_Decode((instr >>
   33602                                                                     19) &
   33603                                                                        0x7,
   33604                                                                    (instr >>
   33605                                                                     28) &
   33606                                                                        0x1);
   33607                                               if (dt.Is(
   33608                                                       kDataTypeValueInvalid)) {
   33609                                                 UnallocatedT32(instr);
   33610                                                 return;
   33611                                               }
   33612                                               if (((instr >> 12) & 1) != 0) {
   33613                                                 UnallocatedT32(instr);
   33614                                                 return;
   33615                                               }
   33616                                               unsigned rd =
   33617                                                   ExtractQRegister(instr,
   33618                                                                    22,
   33619                                                                    12);
   33620                                               unsigned rm =
   33621                                                   ExtractDRegister(instr, 5, 0);
   33622                                               uint32_t imm6 =
   33623                                                   (instr >> 16) & 0x3f;
   33624                                               uint32_t imm =
   33625                                                   imm6 - dt.GetSize();
   33626                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   33627                                               vshll(CurrentCond(),
   33628                                                     dt,
   33629                                                     QRegister(rd),
   33630                                                     DRegister(rm),
   33631                                                     imm);
   33632                                               break;
   33633                                             }
   33634                                             case 0x001b0000: {
   33635                                               // 0xef9b0a10
   33636                                               if (((instr & 0x380000) == 0x0) ||
   33637                                                   ((instr & 0x3f0000) ==
   33638                                                    0x80000) ||
   33639                                                   ((instr & 0x3f0000) ==
   33640                                                    0x100000) ||
   33641                                                   ((instr & 0x3f0000) ==
   33642                                                    0x200000)) {
   33643                                                 UnallocatedT32(instr);
   33644                                                 return;
   33645                                               }
   33646                                               DataType dt =
   33647                                                   Dt_imm6_4_Decode((instr >>
   33648                                                                     19) &
   33649                                                                        0x7,
   33650                                                                    (instr >>
   33651                                                                     28) &
   33652                                                                        0x1);
   33653                                               if (dt.Is(
   33654                                                       kDataTypeValueInvalid)) {
   33655                                                 UnallocatedT32(instr);
   33656                                                 return;
   33657                                               }
   33658                                               if (((instr >> 12) & 1) != 0) {
   33659                                                 UnallocatedT32(instr);
   33660                                                 return;
   33661                                               }
   33662                                               unsigned rd =
   33663                                                   ExtractQRegister(instr,
   33664                                                                    22,
   33665                                                                    12);
   33666                                               unsigned rm =
   33667                                                   ExtractDRegister(instr, 5, 0);
   33668                                               uint32_t imm6 =
   33669                                                   (instr >> 16) & 0x3f;
   33670                                               uint32_t imm =
   33671                                                   imm6 - dt.GetSize();
   33672                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   33673                                               vshll(CurrentCond(),
   33674                                                     dt,
   33675                                                     QRegister(rd),
   33676                                                     DRegister(rm),
   33677                                                     imm);
   33678                                               break;
   33679                                             }
   33680                                             case 0x001c0000: {
   33681                                               // 0xef9c0a10
   33682                                               if (((instr & 0x380000) == 0x0) ||
   33683                                                   ((instr & 0x3f0000) ==
   33684                                                    0x80000) ||
   33685                                                   ((instr & 0x3f0000) ==
   33686                                                    0x100000) ||
   33687                                                   ((instr & 0x3f0000) ==
   33688                                                    0x200000)) {
   33689                                                 UnallocatedT32(instr);
   33690                                                 return;
   33691                                               }
   33692                                               DataType dt =
   33693                                                   Dt_imm6_4_Decode((instr >>
   33694                                                                     19) &
   33695                                                                        0x7,
   33696                                                                    (instr >>
   33697                                                                     28) &
   33698                                                                        0x1);
   33699                                               if (dt.Is(
   33700                                                       kDataTypeValueInvalid)) {
   33701                                                 UnallocatedT32(instr);
   33702                                                 return;
   33703                                               }
   33704                                               if (((instr >> 12) & 1) != 0) {
   33705                                                 UnallocatedT32(instr);
   33706                                                 return;
   33707                                               }
   33708                                               unsigned rd =
   33709                                                   ExtractQRegister(instr,
   33710                                                                    22,
   33711                                                                    12);
   33712                                               unsigned rm =
   33713                                                   ExtractDRegister(instr, 5, 0);
   33714                                               uint32_t imm6 =
   33715                                                   (instr >> 16) & 0x3f;
   33716                                               uint32_t imm =
   33717                                                   imm6 - dt.GetSize();
   33718                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   33719                                               vshll(CurrentCond(),
   33720                                                     dt,
   33721                                                     QRegister(rd),
   33722                                                     DRegister(rm),
   33723                                                     imm);
   33724                                               break;
   33725                                             }
   33726                                             case 0x001d0000: {
   33727                                               // 0xef9d0a10
   33728                                               if (((instr & 0x380000) == 0x0) ||
   33729                                                   ((instr & 0x3f0000) ==
   33730                                                    0x80000) ||
   33731                                                   ((instr & 0x3f0000) ==
   33732                                                    0x100000) ||
   33733                                                   ((instr & 0x3f0000) ==
   33734                                                    0x200000)) {
   33735                                                 UnallocatedT32(instr);
   33736                                                 return;
   33737                                               }
   33738                                               DataType dt =
   33739                                                   Dt_imm6_4_Decode((instr >>
   33740                                                                     19) &
   33741                                                                        0x7,
   33742                                                                    (instr >>
   33743                                                                     28) &
   33744                                                                        0x1);
   33745                                               if (dt.Is(
   33746                                                       kDataTypeValueInvalid)) {
   33747                                                 UnallocatedT32(instr);
   33748                                                 return;
   33749                                               }
   33750                                               if (((instr >> 12) & 1) != 0) {
   33751                                                 UnallocatedT32(instr);
   33752                                                 return;
   33753                                               }
   33754                                               unsigned rd =
   33755                                                   ExtractQRegister(instr,
   33756                                                                    22,
   33757                                                                    12);
   33758                                               unsigned rm =
   33759                                                   ExtractDRegister(instr, 5, 0);
   33760                                               uint32_t imm6 =
   33761                                                   (instr >> 16) & 0x3f;
   33762                                               uint32_t imm =
   33763                                                   imm6 - dt.GetSize();
   33764                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   33765                                               vshll(CurrentCond(),
   33766                                                     dt,
   33767                                                     QRegister(rd),
   33768                                                     DRegister(rm),
   33769                                                     imm);
   33770                                               break;
   33771                                             }
   33772                                             case 0x001e0000: {
   33773                                               // 0xef9e0a10
   33774                                               if (((instr & 0x380000) == 0x0) ||
   33775                                                   ((instr & 0x3f0000) ==
   33776                                                    0x80000) ||
   33777                                                   ((instr & 0x3f0000) ==
   33778                                                    0x100000) ||
   33779                                                   ((instr & 0x3f0000) ==
   33780                                                    0x200000)) {
   33781                                                 UnallocatedT32(instr);
   33782                                                 return;
   33783                                               }
   33784                                               DataType dt =
   33785                                                   Dt_imm6_4_Decode((instr >>
   33786                                                                     19) &
   33787                                                                        0x7,
   33788                                                                    (instr >>
   33789                                                                     28) &
   33790                                                                        0x1);
   33791                                               if (dt.Is(
   33792                                                       kDataTypeValueInvalid)) {
   33793                                                 UnallocatedT32(instr);
   33794                                                 return;
   33795                                               }
   33796                                               if (((instr >> 12) & 1) != 0) {
   33797                                                 UnallocatedT32(instr);
   33798                                                 return;
   33799                                               }
   33800                                               unsigned rd =
   33801                                                   ExtractQRegister(instr,
   33802                                                                    22,
   33803                                                                    12);
   33804                                               unsigned rm =
   33805                                                   ExtractDRegister(instr, 5, 0);
   33806                                               uint32_t imm6 =
   33807                                                   (instr >> 16) & 0x3f;
   33808                                               uint32_t imm =
   33809                                                   imm6 - dt.GetSize();
   33810                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   33811                                               vshll(CurrentCond(),
   33812                                                     dt,
   33813                                                     QRegister(rd),
   33814                                                     DRegister(rm),
   33815                                                     imm);
   33816                                               break;
   33817                                             }
   33818                                             case 0x001f0000: {
   33819                                               // 0xef9f0a10
   33820                                               if (((instr & 0x380000) == 0x0) ||
   33821                                                   ((instr & 0x3f0000) ==
   33822                                                    0x80000) ||
   33823                                                   ((instr & 0x3f0000) ==
   33824                                                    0x100000) ||
   33825                                                   ((instr & 0x3f0000) ==
   33826                                                    0x200000)) {
   33827                                                 UnallocatedT32(instr);
   33828                                                 return;
   33829                                               }
   33830                                               DataType dt =
   33831                                                   Dt_imm6_4_Decode((instr >>
   33832                                                                     19) &
   33833                                                                        0x7,
   33834                                                                    (instr >>
   33835                                                                     28) &
   33836                                                                        0x1);
   33837                                               if (dt.Is(
   33838                                                       kDataTypeValueInvalid)) {
   33839                                                 UnallocatedT32(instr);
   33840                                                 return;
   33841                                               }
   33842                                               if (((instr >> 12) & 1) != 0) {
   33843                                                 UnallocatedT32(instr);
   33844                                                 return;
   33845                                               }
   33846                                               unsigned rd =
   33847                                                   ExtractQRegister(instr,
   33848                                                                    22,
   33849                                                                    12);
   33850                                               unsigned rm =
   33851                                                   ExtractDRegister(instr, 5, 0);
   33852                                               uint32_t imm6 =
   33853                                                   (instr >> 16) & 0x3f;
   33854                                               uint32_t imm =
   33855                                                   imm6 - dt.GetSize();
   33856                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   33857                                               vshll(CurrentCond(),
   33858                                                     dt,
   33859                                                     QRegister(rd),
   33860                                                     DRegister(rm),
   33861                                                     imm);
   33862                                               break;
   33863                                             }
   33864                                             case 0x00200000: {
   33865                                               // 0xefa00a10
   33866                                               if (((instr & 0x380000) == 0x0) ||
   33867                                                   ((instr & 0x380000) ==
   33868                                                    0x180000) ||
   33869                                                   ((instr & 0x380000) ==
   33870                                                    0x280000) ||
   33871                                                   ((instr & 0x380000) ==
   33872                                                    0x300000) ||
   33873                                                   ((instr & 0x380000) ==
   33874                                                    0x380000)) {
   33875                                                 UnallocatedT32(instr);
   33876                                                 return;
   33877                                               }
   33878                                               DataType dt = Dt_U_imm3H_1_Decode(
   33879                                                   ((instr >> 19) & 0x7) |
   33880                                                   ((instr >> 25) & 0x8));
   33881                                               if (dt.Is(
   33882                                                       kDataTypeValueInvalid)) {
   33883                                                 UnallocatedT32(instr);
   33884                                                 return;
   33885                                               }
   33886                                               if (((instr >> 12) & 1) != 0) {
   33887                                                 UnallocatedT32(instr);
   33888                                                 return;
   33889                                               }
   33890                                               unsigned rd =
   33891                                                   ExtractQRegister(instr,
   33892                                                                    22,
   33893                                                                    12);
   33894                                               unsigned rm =
   33895                                                   ExtractDRegister(instr, 5, 0);
   33896                                               // VMOVL{<c>}{<q>}.<dt> <Qd>, <Dm> ; T1 NOLINT(whitespace/line_length)
   33897                                               vmovl(CurrentCond(),
   33898                                                     dt,
   33899                                                     QRegister(rd),
   33900                                                     DRegister(rm));
   33901                                               break;
   33902                                             }
   33903                                             case 0x00210000: {
   33904                                               // 0xefa10a10
   33905                                               if (((instr & 0x380000) == 0x0) ||
   33906                                                   ((instr & 0x3f0000) ==
   33907                                                    0x80000) ||
   33908                                                   ((instr & 0x3f0000) ==
   33909                                                    0x100000) ||
   33910                                                   ((instr & 0x3f0000) ==
   33911                                                    0x200000)) {
   33912                                                 UnallocatedT32(instr);
   33913                                                 return;
   33914                                               }
   33915                                               DataType dt =
   33916                                                   Dt_imm6_4_Decode((instr >>
   33917                                                                     19) &
   33918                                                                        0x7,
   33919                                                                    (instr >>
   33920                                                                     28) &
   33921                                                                        0x1);
   33922                                               if (dt.Is(
   33923                                                       kDataTypeValueInvalid)) {
   33924                                                 UnallocatedT32(instr);
   33925                                                 return;
   33926                                               }
   33927                                               if (((instr >> 12) & 1) != 0) {
   33928                                                 UnallocatedT32(instr);
   33929                                                 return;
   33930                                               }
   33931                                               unsigned rd =
   33932                                                   ExtractQRegister(instr,
   33933                                                                    22,
   33934                                                                    12);
   33935                                               unsigned rm =
   33936                                                   ExtractDRegister(instr, 5, 0);
   33937                                               uint32_t imm6 =
   33938                                                   (instr >> 16) & 0x3f;
   33939                                               uint32_t imm =
   33940                                                   imm6 - dt.GetSize();
   33941                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   33942                                               vshll(CurrentCond(),
   33943                                                     dt,
   33944                                                     QRegister(rd),
   33945                                                     DRegister(rm),
   33946                                                     imm);
   33947                                               break;
   33948                                             }
   33949                                             case 0x00220000: {
   33950                                               // 0xefa20a10
   33951                                               if (((instr & 0x380000) == 0x0) ||
   33952                                                   ((instr & 0x3f0000) ==
   33953                                                    0x80000) ||
   33954                                                   ((instr & 0x3f0000) ==
   33955                                                    0x100000) ||
   33956                                                   ((instr & 0x3f0000) ==
   33957                                                    0x200000)) {
   33958                                                 UnallocatedT32(instr);
   33959                                                 return;
   33960                                               }
   33961                                               DataType dt =
   33962                                                   Dt_imm6_4_Decode((instr >>
   33963                                                                     19) &
   33964                                                                        0x7,
   33965                                                                    (instr >>
   33966                                                                     28) &
   33967                                                                        0x1);
   33968                                               if (dt.Is(
   33969                                                       kDataTypeValueInvalid)) {
   33970                                                 UnallocatedT32(instr);
   33971                                                 return;
   33972                                               }
   33973                                               if (((instr >> 12) & 1) != 0) {
   33974                                                 UnallocatedT32(instr);
   33975                                                 return;
   33976                                               }
   33977                                               unsigned rd =
   33978                                                   ExtractQRegister(instr,
   33979                                                                    22,
   33980                                                                    12);
   33981                                               unsigned rm =
   33982                                                   ExtractDRegister(instr, 5, 0);
   33983                                               uint32_t imm6 =
   33984                                                   (instr >> 16) & 0x3f;
   33985                                               uint32_t imm =
   33986                                                   imm6 - dt.GetSize();
   33987                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   33988                                               vshll(CurrentCond(),
   33989                                                     dt,
   33990                                                     QRegister(rd),
   33991                                                     DRegister(rm),
   33992                                                     imm);
   33993                                               break;
   33994                                             }
   33995                                             case 0x00230000: {
   33996                                               // 0xefa30a10
   33997                                               if (((instr & 0x380000) == 0x0) ||
   33998                                                   ((instr & 0x3f0000) ==
   33999                                                    0x80000) ||
   34000                                                   ((instr & 0x3f0000) ==
   34001                                                    0x100000) ||
   34002                                                   ((instr & 0x3f0000) ==
   34003                                                    0x200000)) {
   34004                                                 UnallocatedT32(instr);
   34005                                                 return;
   34006                                               }
   34007                                               DataType dt =
   34008                                                   Dt_imm6_4_Decode((instr >>
   34009                                                                     19) &
   34010                                                                        0x7,
   34011                                                                    (instr >>
   34012                                                                     28) &
   34013                                                                        0x1);
   34014                                               if (dt.Is(
   34015                                                       kDataTypeValueInvalid)) {
   34016                                                 UnallocatedT32(instr);
   34017                                                 return;
   34018                                               }
   34019                                               if (((instr >> 12) & 1) != 0) {
   34020                                                 UnallocatedT32(instr);
   34021                                                 return;
   34022                                               }
   34023                                               unsigned rd =
   34024                                                   ExtractQRegister(instr,
   34025                                                                    22,
   34026                                                                    12);
   34027                                               unsigned rm =
   34028                                                   ExtractDRegister(instr, 5, 0);
   34029                                               uint32_t imm6 =
   34030                                                   (instr >> 16) & 0x3f;
   34031                                               uint32_t imm =
   34032                                                   imm6 - dt.GetSize();
   34033                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   34034                                               vshll(CurrentCond(),
   34035                                                     dt,
   34036                                                     QRegister(rd),
   34037                                                     DRegister(rm),
   34038                                                     imm);
   34039                                               break;
   34040                                             }
   34041                                             case 0x00240000: {
   34042                                               // 0xefa40a10
   34043                                               if (((instr & 0x380000) == 0x0) ||
   34044                                                   ((instr & 0x3f0000) ==
   34045                                                    0x80000) ||
   34046                                                   ((instr & 0x3f0000) ==
   34047                                                    0x100000) ||
   34048                                                   ((instr & 0x3f0000) ==
   34049                                                    0x200000)) {
   34050                                                 UnallocatedT32(instr);
   34051                                                 return;
   34052                                               }
   34053                                               DataType dt =
   34054                                                   Dt_imm6_4_Decode((instr >>
   34055                                                                     19) &
   34056                                                                        0x7,
   34057                                                                    (instr >>
   34058                                                                     28) &
   34059                                                                        0x1);
   34060                                               if (dt.Is(
   34061                                                       kDataTypeValueInvalid)) {
   34062                                                 UnallocatedT32(instr);
   34063                                                 return;
   34064                                               }
   34065                                               if (((instr >> 12) & 1) != 0) {
   34066                                                 UnallocatedT32(instr);
   34067                                                 return;
   34068                                               }
   34069                                               unsigned rd =
   34070                                                   ExtractQRegister(instr,
   34071                                                                    22,
   34072                                                                    12);
   34073                                               unsigned rm =
   34074                                                   ExtractDRegister(instr, 5, 0);
   34075                                               uint32_t imm6 =
   34076                                                   (instr >> 16) & 0x3f;
   34077                                               uint32_t imm =
   34078                                                   imm6 - dt.GetSize();
   34079                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   34080                                               vshll(CurrentCond(),
   34081                                                     dt,
   34082                                                     QRegister(rd),
   34083                                                     DRegister(rm),
   34084                                                     imm);
   34085                                               break;
   34086                                             }
   34087                                             case 0x00250000: {
   34088                                               // 0xefa50a10
   34089                                               if (((instr & 0x380000) == 0x0) ||
   34090                                                   ((instr & 0x3f0000) ==
   34091                                                    0x80000) ||
   34092                                                   ((instr & 0x3f0000) ==
   34093                                                    0x100000) ||
   34094                                                   ((instr & 0x3f0000) ==
   34095                                                    0x200000)) {
   34096                                                 UnallocatedT32(instr);
   34097                                                 return;
   34098                                               }
   34099                                               DataType dt =
   34100                                                   Dt_imm6_4_Decode((instr >>
   34101                                                                     19) &
   34102                                                                        0x7,
   34103                                                                    (instr >>
   34104                                                                     28) &
   34105                                                                        0x1);
   34106                                               if (dt.Is(
   34107                                                       kDataTypeValueInvalid)) {
   34108                                                 UnallocatedT32(instr);
   34109                                                 return;
   34110                                               }
   34111                                               if (((instr >> 12) & 1) != 0) {
   34112                                                 UnallocatedT32(instr);
   34113                                                 return;
   34114                                               }
   34115                                               unsigned rd =
   34116                                                   ExtractQRegister(instr,
   34117                                                                    22,
   34118                                                                    12);
   34119                                               unsigned rm =
   34120                                                   ExtractDRegister(instr, 5, 0);
   34121                                               uint32_t imm6 =
   34122                                                   (instr >> 16) & 0x3f;
   34123                                               uint32_t imm =
   34124                                                   imm6 - dt.GetSize();
   34125                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   34126                                               vshll(CurrentCond(),
   34127                                                     dt,
   34128                                                     QRegister(rd),
   34129                                                     DRegister(rm),
   34130                                                     imm);
   34131                                               break;
   34132                                             }
   34133                                             case 0x00260000: {
   34134                                               // 0xefa60a10
   34135                                               if (((instr & 0x380000) == 0x0) ||
   34136                                                   ((instr & 0x3f0000) ==
   34137                                                    0x80000) ||
   34138                                                   ((instr & 0x3f0000) ==
   34139                                                    0x100000) ||
   34140                                                   ((instr & 0x3f0000) ==
   34141                                                    0x200000)) {
   34142                                                 UnallocatedT32(instr);
   34143                                                 return;
   34144                                               }
   34145                                               DataType dt =
   34146                                                   Dt_imm6_4_Decode((instr >>
   34147                                                                     19) &
   34148                                                                        0x7,
   34149                                                                    (instr >>
   34150                                                                     28) &
   34151                                                                        0x1);
   34152                                               if (dt.Is(
   34153                                                       kDataTypeValueInvalid)) {
   34154                                                 UnallocatedT32(instr);
   34155                                                 return;
   34156                                               }
   34157                                               if (((instr >> 12) & 1) != 0) {
   34158                                                 UnallocatedT32(instr);
   34159                                                 return;
   34160                                               }
   34161                                               unsigned rd =
   34162                                                   ExtractQRegister(instr,
   34163                                                                    22,
   34164                                                                    12);
   34165                                               unsigned rm =
   34166                                                   ExtractDRegister(instr, 5, 0);
   34167                                               uint32_t imm6 =
   34168                                                   (instr >> 16) & 0x3f;
   34169                                               uint32_t imm =
   34170                                                   imm6 - dt.GetSize();
   34171                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   34172                                               vshll(CurrentCond(),
   34173                                                     dt,
   34174                                                     QRegister(rd),
   34175                                                     DRegister(rm),
   34176                                                     imm);
   34177                                               break;
   34178                                             }
   34179                                             case 0x00270000: {
   34180                                               // 0xefa70a10
   34181                                               if (((instr & 0x380000) == 0x0) ||
   34182                                                   ((instr & 0x3f0000) ==
   34183                                                    0x80000) ||
   34184                                                   ((instr & 0x3f0000) ==
   34185                                                    0x100000) ||
   34186                                                   ((instr & 0x3f0000) ==
   34187                                                    0x200000)) {
   34188                                                 UnallocatedT32(instr);
   34189                                                 return;
   34190                                               }
   34191                                               DataType dt =
   34192                                                   Dt_imm6_4_Decode((instr >>
   34193                                                                     19) &
   34194                                                                        0x7,
   34195                                                                    (instr >>
   34196                                                                     28) &
   34197                                                                        0x1);
   34198                                               if (dt.Is(
   34199                                                       kDataTypeValueInvalid)) {
   34200                                                 UnallocatedT32(instr);
   34201                                                 return;
   34202                                               }
   34203                                               if (((instr >> 12) & 1) != 0) {
   34204                                                 UnallocatedT32(instr);
   34205                                                 return;
   34206                                               }
   34207                                               unsigned rd =
   34208                                                   ExtractQRegister(instr,
   34209                                                                    22,
   34210                                                                    12);
   34211                                               unsigned rm =
   34212                                                   ExtractDRegister(instr, 5, 0);
   34213                                               uint32_t imm6 =
   34214                                                   (instr >> 16) & 0x3f;
   34215                                               uint32_t imm =
   34216                                                   imm6 - dt.GetSize();
   34217                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   34218                                               vshll(CurrentCond(),
   34219                                                     dt,
   34220                                                     QRegister(rd),
   34221                                                     DRegister(rm),
   34222                                                     imm);
   34223                                               break;
   34224                                             }
   34225                                             case 0x00280000: {
   34226                                               // 0xefa80a10
   34227                                               if (((instr & 0x380000) == 0x0) ||
   34228                                                   ((instr & 0x3f0000) ==
   34229                                                    0x80000) ||
   34230                                                   ((instr & 0x3f0000) ==
   34231                                                    0x100000) ||
   34232                                                   ((instr & 0x3f0000) ==
   34233                                                    0x200000)) {
   34234                                                 UnallocatedT32(instr);
   34235                                                 return;
   34236                                               }
   34237                                               DataType dt =
   34238                                                   Dt_imm6_4_Decode((instr >>
   34239                                                                     19) &
   34240                                                                        0x7,
   34241                                                                    (instr >>
   34242                                                                     28) &
   34243                                                                        0x1);
   34244                                               if (dt.Is(
   34245                                                       kDataTypeValueInvalid)) {
   34246                                                 UnallocatedT32(instr);
   34247                                                 return;
   34248                                               }
   34249                                               if (((instr >> 12) & 1) != 0) {
   34250                                                 UnallocatedT32(instr);
   34251                                                 return;
   34252                                               }
   34253                                               unsigned rd =
   34254                                                   ExtractQRegister(instr,
   34255                                                                    22,
   34256                                                                    12);
   34257                                               unsigned rm =
   34258                                                   ExtractDRegister(instr, 5, 0);
   34259                                               uint32_t imm6 =
   34260                                                   (instr >> 16) & 0x3f;
   34261                                               uint32_t imm =
   34262                                                   imm6 - dt.GetSize();
   34263                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   34264                                               vshll(CurrentCond(),
   34265                                                     dt,
   34266                                                     QRegister(rd),
   34267                                                     DRegister(rm),
   34268                                                     imm);
   34269                                               break;
   34270                                             }
   34271                                             case 0x00290000: {
   34272                                               // 0xefa90a10
   34273                                               if (((instr & 0x380000) == 0x0) ||
   34274                                                   ((instr & 0x3f0000) ==
   34275                                                    0x80000) ||
   34276                                                   ((instr & 0x3f0000) ==
   34277                                                    0x100000) ||
   34278                                                   ((instr & 0x3f0000) ==
   34279                                                    0x200000)) {
   34280                                                 UnallocatedT32(instr);
   34281                                                 return;
   34282                                               }
   34283                                               DataType dt =
   34284                                                   Dt_imm6_4_Decode((instr >>
   34285                                                                     19) &
   34286                                                                        0x7,
   34287                                                                    (instr >>
   34288                                                                     28) &
   34289                                                                        0x1);
   34290                                               if (dt.Is(
   34291                                                       kDataTypeValueInvalid)) {
   34292                                                 UnallocatedT32(instr);
   34293                                                 return;
   34294                                               }
   34295                                               if (((instr >> 12) & 1) != 0) {
   34296                                                 UnallocatedT32(instr);
   34297                                                 return;
   34298                                               }
   34299                                               unsigned rd =
   34300                                                   ExtractQRegister(instr,
   34301                                                                    22,
   34302                                                                    12);
   34303                                               unsigned rm =
   34304                                                   ExtractDRegister(instr, 5, 0);
   34305                                               uint32_t imm6 =
   34306                                                   (instr >> 16) & 0x3f;
   34307                                               uint32_t imm =
   34308                                                   imm6 - dt.GetSize();
   34309                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   34310                                               vshll(CurrentCond(),
   34311                                                     dt,
   34312                                                     QRegister(rd),
   34313                                                     DRegister(rm),
   34314                                                     imm);
   34315                                               break;
   34316                                             }
   34317                                             case 0x002a0000: {
   34318                                               // 0xefaa0a10
   34319                                               if (((instr & 0x380000) == 0x0) ||
   34320                                                   ((instr & 0x3f0000) ==
   34321                                                    0x80000) ||
   34322                                                   ((instr & 0x3f0000) ==
   34323                                                    0x100000) ||
   34324                                                   ((instr & 0x3f0000) ==
   34325                                                    0x200000)) {
   34326                                                 UnallocatedT32(instr);
   34327                                                 return;
   34328                                               }
   34329                                               DataType dt =
   34330                                                   Dt_imm6_4_Decode((instr >>
   34331                                                                     19) &
   34332                                                                        0x7,
   34333                                                                    (instr >>
   34334                                                                     28) &
   34335                                                                        0x1);
   34336                                               if (dt.Is(
   34337                                                       kDataTypeValueInvalid)) {
   34338                                                 UnallocatedT32(instr);
   34339                                                 return;
   34340                                               }
   34341                                               if (((instr >> 12) & 1) != 0) {
   34342                                                 UnallocatedT32(instr);
   34343                                                 return;
   34344                                               }
   34345                                               unsigned rd =
   34346                                                   ExtractQRegister(instr,
   34347                                                                    22,
   34348                                                                    12);
   34349                                               unsigned rm =
   34350                                                   ExtractDRegister(instr, 5, 0);
   34351                                               uint32_t imm6 =
   34352                                                   (instr >> 16) & 0x3f;
   34353                                               uint32_t imm =
   34354                                                   imm6 - dt.GetSize();
   34355                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   34356                                               vshll(CurrentCond(),
   34357                                                     dt,
   34358                                                     QRegister(rd),
   34359                                                     DRegister(rm),
   34360                                                     imm);
   34361                                               break;
   34362                                             }
   34363                                             case 0x002b0000: {
   34364                                               // 0xefab0a10
   34365                                               if (((instr & 0x380000) == 0x0) ||
   34366                                                   ((instr & 0x3f0000) ==
   34367                                                    0x80000) ||
   34368                                                   ((instr & 0x3f0000) ==
   34369                                                    0x100000) ||
   34370                                                   ((instr & 0x3f0000) ==
   34371                                                    0x200000)) {
   34372                                                 UnallocatedT32(instr);
   34373                                                 return;
   34374                                               }
   34375                                               DataType dt =
   34376                                                   Dt_imm6_4_Decode((instr >>
   34377                                                                     19) &
   34378                                                                        0x7,
   34379                                                                    (instr >>
   34380                                                                     28) &
   34381                                                                        0x1);
   34382                                               if (dt.Is(
   34383                                                       kDataTypeValueInvalid)) {
   34384                                                 UnallocatedT32(instr);
   34385                                                 return;
   34386                                               }
   34387                                               if (((instr >> 12) & 1) != 0) {
   34388                                                 UnallocatedT32(instr);
   34389                                                 return;
   34390                                               }
   34391                                               unsigned rd =
   34392                                                   ExtractQRegister(instr,
   34393                                                                    22,
   34394                                                                    12);
   34395                                               unsigned rm =
   34396                                                   ExtractDRegister(instr, 5, 0);
   34397                                               uint32_t imm6 =
   34398                                                   (instr >> 16) & 0x3f;
   34399                                               uint32_t imm =
   34400                                                   imm6 - dt.GetSize();
   34401                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   34402                                               vshll(CurrentCond(),
   34403                                                     dt,
   34404                                                     QRegister(rd),
   34405                                                     DRegister(rm),
   34406                                                     imm);
   34407                                               break;
   34408                                             }
   34409                                             case 0x002c0000: {
   34410                                               // 0xefac0a10
   34411                                               if (((instr & 0x380000) == 0x0) ||
   34412                                                   ((instr & 0x3f0000) ==
   34413                                                    0x80000) ||
   34414                                                   ((instr & 0x3f0000) ==
   34415                                                    0x100000) ||
   34416                                                   ((instr & 0x3f0000) ==
   34417                                                    0x200000)) {
   34418                                                 UnallocatedT32(instr);
   34419                                                 return;
   34420                                               }
   34421                                               DataType dt =
   34422                                                   Dt_imm6_4_Decode((instr >>
   34423                                                                     19) &
   34424                                                                        0x7,
   34425                                                                    (instr >>
   34426                                                                     28) &
   34427                                                                        0x1);
   34428                                               if (dt.Is(
   34429                                                       kDataTypeValueInvalid)) {
   34430                                                 UnallocatedT32(instr);
   34431                                                 return;
   34432                                               }
   34433                                               if (((instr >> 12) & 1) != 0) {
   34434                                                 UnallocatedT32(instr);
   34435                                                 return;
   34436                                               }
   34437                                               unsigned rd =
   34438                                                   ExtractQRegister(instr,
   34439                                                                    22,
   34440                                                                    12);
   34441                                               unsigned rm =
   34442                                                   ExtractDRegister(instr, 5, 0);
   34443                                               uint32_t imm6 =
   34444                                                   (instr >> 16) & 0x3f;
   34445                                               uint32_t imm =
   34446                                                   imm6 - dt.GetSize();
   34447                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   34448                                               vshll(CurrentCond(),
   34449                                                     dt,
   34450                                                     QRegister(rd),
   34451                                                     DRegister(rm),
   34452                                                     imm);
   34453                                               break;
   34454                                             }
   34455                                             case 0x002d0000: {
   34456                                               // 0xefad0a10
   34457                                               if (((instr & 0x380000) == 0x0) ||
   34458                                                   ((instr & 0x3f0000) ==
   34459                                                    0x80000) ||
   34460                                                   ((instr & 0x3f0000) ==
   34461                                                    0x100000) ||
   34462                                                   ((instr & 0x3f0000) ==
   34463                                                    0x200000)) {
   34464                                                 UnallocatedT32(instr);
   34465                                                 return;
   34466                                               }
   34467                                               DataType dt =
   34468                                                   Dt_imm6_4_Decode((instr >>
   34469                                                                     19) &
   34470                                                                        0x7,
   34471                                                                    (instr >>
   34472                                                                     28) &
   34473                                                                        0x1);
   34474                                               if (dt.Is(
   34475                                                       kDataTypeValueInvalid)) {
   34476                                                 UnallocatedT32(instr);
   34477                                                 return;
   34478                                               }
   34479                                               if (((instr >> 12) & 1) != 0) {
   34480                                                 UnallocatedT32(instr);
   34481                                                 return;
   34482                                               }
   34483                                               unsigned rd =
   34484                                                   ExtractQRegister(instr,
   34485                                                                    22,
   34486                                                                    12);
   34487                                               unsigned rm =
   34488                                                   ExtractDRegister(instr, 5, 0);
   34489                                               uint32_t imm6 =
   34490                                                   (instr >> 16) & 0x3f;
   34491                                               uint32_t imm =
   34492                                                   imm6 - dt.GetSize();
   34493                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   34494                                               vshll(CurrentCond(),
   34495                                                     dt,
   34496                                                     QRegister(rd),
   34497                                                     DRegister(rm),
   34498                                                     imm);
   34499                                               break;
   34500                                             }
   34501                                             case 0x002e0000: {
   34502                                               // 0xefae0a10
   34503                                               if (((instr & 0x380000) == 0x0) ||
   34504                                                   ((instr & 0x3f0000) ==
   34505                                                    0x80000) ||
   34506                                                   ((instr & 0x3f0000) ==
   34507                                                    0x100000) ||
   34508                                                   ((instr & 0x3f0000) ==
   34509                                                    0x200000)) {
   34510                                                 UnallocatedT32(instr);
   34511                                                 return;
   34512                                               }
   34513                                               DataType dt =
   34514                                                   Dt_imm6_4_Decode((instr >>
   34515                                                                     19) &
   34516                                                                        0x7,
   34517                                                                    (instr >>
   34518                                                                     28) &
   34519                                                                        0x1);
   34520                                               if (dt.Is(
   34521                                                       kDataTypeValueInvalid)) {
   34522                                                 UnallocatedT32(instr);
   34523                                                 return;
   34524                                               }
   34525                                               if (((instr >> 12) & 1) != 0) {
   34526                                                 UnallocatedT32(instr);
   34527                                                 return;
   34528                                               }
   34529                                               unsigned rd =
   34530                                                   ExtractQRegister(instr,
   34531                                                                    22,
   34532                                                                    12);
   34533                                               unsigned rm =
   34534                                                   ExtractDRegister(instr, 5, 0);
   34535                                               uint32_t imm6 =
   34536                                                   (instr >> 16) & 0x3f;
   34537                                               uint32_t imm =
   34538                                                   imm6 - dt.GetSize();
   34539                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   34540                                               vshll(CurrentCond(),
   34541                                                     dt,
   34542                                                     QRegister(rd),
   34543                                                     DRegister(rm),
   34544                                                     imm);
   34545                                               break;
   34546                                             }
   34547                                             case 0x002f0000: {
   34548                                               // 0xefaf0a10
   34549                                               if (((instr & 0x380000) == 0x0) ||
   34550                                                   ((instr & 0x3f0000) ==
   34551                                                    0x80000) ||
   34552                                                   ((instr & 0x3f0000) ==
   34553                                                    0x100000) ||
   34554                                                   ((instr & 0x3f0000) ==
   34555                                                    0x200000)) {
   34556                                                 UnallocatedT32(instr);
   34557                                                 return;
   34558                                               }
   34559                                               DataType dt =
   34560                                                   Dt_imm6_4_Decode((instr >>
   34561                                                                     19) &
   34562                                                                        0x7,
   34563                                                                    (instr >>
   34564                                                                     28) &
   34565                                                                        0x1);
   34566                                               if (dt.Is(
   34567                                                       kDataTypeValueInvalid)) {
   34568                                                 UnallocatedT32(instr);
   34569                                                 return;
   34570                                               }
   34571                                               if (((instr >> 12) & 1) != 0) {
   34572                                                 UnallocatedT32(instr);
   34573                                                 return;
   34574                                               }
   34575                                               unsigned rd =
   34576                                                   ExtractQRegister(instr,
   34577                                                                    22,
   34578                                                                    12);
   34579                                               unsigned rm =
   34580                                                   ExtractDRegister(instr, 5, 0);
   34581                                               uint32_t imm6 =
   34582                                                   (instr >> 16) & 0x3f;
   34583                                               uint32_t imm =
   34584                                                   imm6 - dt.GetSize();
   34585                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   34586                                               vshll(CurrentCond(),
   34587                                                     dt,
   34588                                                     QRegister(rd),
   34589                                                     DRegister(rm),
   34590                                                     imm);
   34591                                               break;
   34592                                             }
   34593                                             case 0x00300000: {
   34594                                               // 0xefb00a10
   34595                                               if (((instr & 0x380000) == 0x0) ||
   34596                                                   ((instr & 0x3f0000) ==
   34597                                                    0x80000) ||
   34598                                                   ((instr & 0x3f0000) ==
   34599                                                    0x100000) ||
   34600                                                   ((instr & 0x3f0000) ==
   34601                                                    0x200000)) {
   34602                                                 UnallocatedT32(instr);
   34603                                                 return;
   34604                                               }
   34605                                               DataType dt =
   34606                                                   Dt_imm6_4_Decode((instr >>
   34607                                                                     19) &
   34608                                                                        0x7,
   34609                                                                    (instr >>
   34610                                                                     28) &
   34611                                                                        0x1);
   34612                                               if (dt.Is(
   34613                                                       kDataTypeValueInvalid)) {
   34614                                                 UnallocatedT32(instr);
   34615                                                 return;
   34616                                               }
   34617                                               if (((instr >> 12) & 1) != 0) {
   34618                                                 UnallocatedT32(instr);
   34619                                                 return;
   34620                                               }
   34621                                               unsigned rd =
   34622                                                   ExtractQRegister(instr,
   34623                                                                    22,
   34624                                                                    12);
   34625                                               unsigned rm =
   34626                                                   ExtractDRegister(instr, 5, 0);
   34627                                               uint32_t imm6 =
   34628                                                   (instr >> 16) & 0x3f;
   34629                                               uint32_t imm =
   34630                                                   imm6 - dt.GetSize();
   34631                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   34632                                               vshll(CurrentCond(),
   34633                                                     dt,
   34634                                                     QRegister(rd),
   34635                                                     DRegister(rm),
   34636                                                     imm);
   34637                                               break;
   34638                                             }
   34639                                             case 0x00310000: {
   34640                                               // 0xefb10a10
   34641                                               if (((instr & 0x380000) == 0x0) ||
   34642                                                   ((instr & 0x3f0000) ==
   34643                                                    0x80000) ||
   34644                                                   ((instr & 0x3f0000) ==
   34645                                                    0x100000) ||
   34646                                                   ((instr & 0x3f0000) ==
   34647                                                    0x200000)) {
   34648                                                 UnallocatedT32(instr);
   34649                                                 return;
   34650                                               }
   34651                                               DataType dt =
   34652                                                   Dt_imm6_4_Decode((instr >>
   34653                                                                     19) &
   34654                                                                        0x7,
   34655                                                                    (instr >>
   34656                                                                     28) &
   34657                                                                        0x1);
   34658                                               if (dt.Is(
   34659                                                       kDataTypeValueInvalid)) {
   34660                                                 UnallocatedT32(instr);
   34661                                                 return;
   34662                                               }
   34663                                               if (((instr >> 12) & 1) != 0) {
   34664                                                 UnallocatedT32(instr);
   34665                                                 return;
   34666                                               }
   34667                                               unsigned rd =
   34668                                                   ExtractQRegister(instr,
   34669                                                                    22,
   34670                                                                    12);
   34671                                               unsigned rm =
   34672                                                   ExtractDRegister(instr, 5, 0);
   34673                                               uint32_t imm6 =
   34674                                                   (instr >> 16) & 0x3f;
   34675                                               uint32_t imm =
   34676                                                   imm6 - dt.GetSize();
   34677                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   34678                                               vshll(CurrentCond(),
   34679                                                     dt,
   34680                                                     QRegister(rd),
   34681                                                     DRegister(rm),
   34682                                                     imm);
   34683                                               break;
   34684                                             }
   34685                                             case 0x00320000: {
   34686                                               // 0xefb20a10
   34687                                               if (((instr & 0x380000) == 0x0) ||
   34688                                                   ((instr & 0x3f0000) ==
   34689                                                    0x80000) ||
   34690                                                   ((instr & 0x3f0000) ==
   34691                                                    0x100000) ||
   34692                                                   ((instr & 0x3f0000) ==
   34693                                                    0x200000)) {
   34694                                                 UnallocatedT32(instr);
   34695                                                 return;
   34696                                               }
   34697                                               DataType dt =
   34698                                                   Dt_imm6_4_Decode((instr >>
   34699                                                                     19) &
   34700                                                                        0x7,
   34701                                                                    (instr >>
   34702                                                                     28) &
   34703                                                                        0x1);
   34704                                               if (dt.Is(
   34705                                                       kDataTypeValueInvalid)) {
   34706                                                 UnallocatedT32(instr);
   34707                                                 return;
   34708                                               }
   34709                                               if (((instr >> 12) & 1) != 0) {
   34710                                                 UnallocatedT32(instr);
   34711                                                 return;
   34712                                               }
   34713                                               unsigned rd =
   34714                                                   ExtractQRegister(instr,
   34715                                                                    22,
   34716                                                                    12);
   34717                                               unsigned rm =
   34718                                                   ExtractDRegister(instr, 5, 0);
   34719                                               uint32_t imm6 =
   34720                                                   (instr >> 16) & 0x3f;
   34721                                               uint32_t imm =
   34722                                                   imm6 - dt.GetSize();
   34723                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   34724                                               vshll(CurrentCond(),
   34725                                                     dt,
   34726                                                     QRegister(rd),
   34727                                                     DRegister(rm),
   34728                                                     imm);
   34729                                               break;
   34730                                             }
   34731                                             case 0x00330000: {
   34732                                               // 0xefb30a10
   34733                                               if (((instr & 0x380000) == 0x0) ||
   34734                                                   ((instr & 0x3f0000) ==
   34735                                                    0x80000) ||
   34736                                                   ((instr & 0x3f0000) ==
   34737                                                    0x100000) ||
   34738                                                   ((instr & 0x3f0000) ==
   34739                                                    0x200000)) {
   34740                                                 UnallocatedT32(instr);
   34741                                                 return;
   34742                                               }
   34743                                               DataType dt =
   34744                                                   Dt_imm6_4_Decode((instr >>
   34745                                                                     19) &
   34746                                                                        0x7,
   34747                                                                    (instr >>
   34748                                                                     28) &
   34749                                                                        0x1);
   34750                                               if (dt.Is(
   34751                                                       kDataTypeValueInvalid)) {
   34752                                                 UnallocatedT32(instr);
   34753                                                 return;
   34754                                               }
   34755                                               if (((instr >> 12) & 1) != 0) {
   34756                                                 UnallocatedT32(instr);
   34757                                                 return;
   34758                                               }
   34759                                               unsigned rd =
   34760                                                   ExtractQRegister(instr,
   34761                                                                    22,
   34762                                                                    12);
   34763                                               unsigned rm =
   34764                                                   ExtractDRegister(instr, 5, 0);
   34765                                               uint32_t imm6 =
   34766                                                   (instr >> 16) & 0x3f;
   34767                                               uint32_t imm =
   34768                                                   imm6 - dt.GetSize();
   34769                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   34770                                               vshll(CurrentCond(),
   34771                                                     dt,
   34772                                                     QRegister(rd),
   34773                                                     DRegister(rm),
   34774                                                     imm);
   34775                                               break;
   34776                                             }
   34777                                             case 0x00340000: {
   34778                                               // 0xefb40a10
   34779                                               if (((instr & 0x380000) == 0x0) ||
   34780                                                   ((instr & 0x3f0000) ==
   34781                                                    0x80000) ||
   34782                                                   ((instr & 0x3f0000) ==
   34783                                                    0x100000) ||
   34784                                                   ((instr & 0x3f0000) ==
   34785                                                    0x200000)) {
   34786                                                 UnallocatedT32(instr);
   34787                                                 return;
   34788                                               }
   34789                                               DataType dt =
   34790                                                   Dt_imm6_4_Decode((instr >>
   34791                                                                     19) &
   34792                                                                        0x7,
   34793                                                                    (instr >>
   34794                                                                     28) &
   34795                                                                        0x1);
   34796                                               if (dt.Is(
   34797                                                       kDataTypeValueInvalid)) {
   34798                                                 UnallocatedT32(instr);
   34799                                                 return;
   34800                                               }
   34801                                               if (((instr >> 12) & 1) != 0) {
   34802                                                 UnallocatedT32(instr);
   34803                                                 return;
   34804                                               }
   34805                                               unsigned rd =
   34806                                                   ExtractQRegister(instr,
   34807                                                                    22,
   34808                                                                    12);
   34809                                               unsigned rm =
   34810                                                   ExtractDRegister(instr, 5, 0);
   34811                                               uint32_t imm6 =
   34812                                                   (instr >> 16) & 0x3f;
   34813                                               uint32_t imm =
   34814                                                   imm6 - dt.GetSize();
   34815                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   34816                                               vshll(CurrentCond(),
   34817                                                     dt,
   34818                                                     QRegister(rd),
   34819                                                     DRegister(rm),
   34820                                                     imm);
   34821                                               break;
   34822                                             }
   34823                                             case 0x00350000: {
   34824                                               // 0xefb50a10
   34825                                               if (((instr & 0x380000) == 0x0) ||
   34826                                                   ((instr & 0x3f0000) ==
   34827                                                    0x80000) ||
   34828                                                   ((instr & 0x3f0000) ==
   34829                                                    0x100000) ||
   34830                                                   ((instr & 0x3f0000) ==
   34831                                                    0x200000)) {
   34832                                                 UnallocatedT32(instr);
   34833                                                 return;
   34834                                               }
   34835                                               DataType dt =
   34836                                                   Dt_imm6_4_Decode((instr >>
   34837                                                                     19) &
   34838                                                                        0x7,
   34839                                                                    (instr >>
   34840                                                                     28) &
   34841                                                                        0x1);
   34842                                               if (dt.Is(
   34843                                                       kDataTypeValueInvalid)) {
   34844                                                 UnallocatedT32(instr);
   34845                                                 return;
   34846                                               }
   34847                                               if (((instr >> 12) & 1) != 0) {
   34848                                                 UnallocatedT32(instr);
   34849                                                 return;
   34850                                               }
   34851                                               unsigned rd =
   34852                                                   ExtractQRegister(instr,
   34853                                                                    22,
   34854                                                                    12);
   34855                                               unsigned rm =
   34856                                                   ExtractDRegister(instr, 5, 0);
   34857                                               uint32_t imm6 =
   34858                                                   (instr >> 16) & 0x3f;
   34859                                               uint32_t imm =
   34860                                                   imm6 - dt.GetSize();
   34861                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   34862                                               vshll(CurrentCond(),
   34863                                                     dt,
   34864                                                     QRegister(rd),
   34865                                                     DRegister(rm),
   34866                                                     imm);
   34867                                               break;
   34868                                             }
   34869                                             case 0x00360000: {
   34870                                               // 0xefb60a10
   34871                                               if (((instr & 0x380000) == 0x0) ||
   34872                                                   ((instr & 0x3f0000) ==
   34873                                                    0x80000) ||
   34874                                                   ((instr & 0x3f0000) ==
   34875                                                    0x100000) ||
   34876                                                   ((instr & 0x3f0000) ==
   34877                                                    0x200000)) {
   34878                                                 UnallocatedT32(instr);
   34879                                                 return;
   34880                                               }
   34881                                               DataType dt =
   34882                                                   Dt_imm6_4_Decode((instr >>
   34883                                                                     19) &
   34884                                                                        0x7,
   34885                                                                    (instr >>
   34886                                                                     28) &
   34887                                                                        0x1);
   34888                                               if (dt.Is(
   34889                                                       kDataTypeValueInvalid)) {
   34890                                                 UnallocatedT32(instr);
   34891                                                 return;
   34892                                               }
   34893                                               if (((instr >> 12) & 1) != 0) {
   34894                                                 UnallocatedT32(instr);
   34895                                                 return;
   34896                                               }
   34897                                               unsigned rd =
   34898                                                   ExtractQRegister(instr,
   34899                                                                    22,
   34900                                                                    12);
   34901                                               unsigned rm =
   34902                                                   ExtractDRegister(instr, 5, 0);
   34903                                               uint32_t imm6 =
   34904                                                   (instr >> 16) & 0x3f;
   34905                                               uint32_t imm =
   34906                                                   imm6 - dt.GetSize();
   34907                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   34908                                               vshll(CurrentCond(),
   34909                                                     dt,
   34910                                                     QRegister(rd),
   34911                                                     DRegister(rm),
   34912                                                     imm);
   34913                                               break;
   34914                                             }
   34915                                             case 0x00370000: {
   34916                                               // 0xefb70a10
   34917                                               if (((instr & 0x380000) == 0x0) ||
   34918                                                   ((instr & 0x3f0000) ==
   34919                                                    0x80000) ||
   34920                                                   ((instr & 0x3f0000) ==
   34921                                                    0x100000) ||
   34922                                                   ((instr & 0x3f0000) ==
   34923                                                    0x200000)) {
   34924                                                 UnallocatedT32(instr);
   34925                                                 return;
   34926                                               }
   34927                                               DataType dt =
   34928                                                   Dt_imm6_4_Decode((instr >>
   34929                                                                     19) &
   34930                                                                        0x7,
   34931                                                                    (instr >>
   34932                                                                     28) &
   34933                                                                        0x1);
   34934                                               if (dt.Is(
   34935                                                       kDataTypeValueInvalid)) {
   34936                                                 UnallocatedT32(instr);
   34937                                                 return;
   34938                                               }
   34939                                               if (((instr >> 12) & 1) != 0) {
   34940                                                 UnallocatedT32(instr);
   34941                                                 return;
   34942                                               }
   34943                                               unsigned rd =
   34944                                                   ExtractQRegister(instr,
   34945                                                                    22,
   34946                                                                    12);
   34947                                               unsigned rm =
   34948                                                   ExtractDRegister(instr, 5, 0);
   34949                                               uint32_t imm6 =
   34950                                                   (instr >> 16) & 0x3f;
   34951                                               uint32_t imm =
   34952                                                   imm6 - dt.GetSize();
   34953                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   34954                                               vshll(CurrentCond(),
   34955                                                     dt,
   34956                                                     QRegister(rd),
   34957                                                     DRegister(rm),
   34958                                                     imm);
   34959                                               break;
   34960                                             }
   34961                                             case 0x00380000: {
   34962                                               // 0xefb80a10
   34963                                               if (((instr & 0x380000) == 0x0) ||
   34964                                                   ((instr & 0x3f0000) ==
   34965                                                    0x80000) ||
   34966                                                   ((instr & 0x3f0000) ==
   34967                                                    0x100000) ||
   34968                                                   ((instr & 0x3f0000) ==
   34969                                                    0x200000)) {
   34970                                                 UnallocatedT32(instr);
   34971                                                 return;
   34972                                               }
   34973                                               DataType dt =
   34974                                                   Dt_imm6_4_Decode((instr >>
   34975                                                                     19) &
   34976                                                                        0x7,
   34977                                                                    (instr >>
   34978                                                                     28) &
   34979                                                                        0x1);
   34980                                               if (dt.Is(
   34981                                                       kDataTypeValueInvalid)) {
   34982                                                 UnallocatedT32(instr);
   34983                                                 return;
   34984                                               }
   34985                                               if (((instr >> 12) & 1) != 0) {
   34986                                                 UnallocatedT32(instr);
   34987                                                 return;
   34988                                               }
   34989                                               unsigned rd =
   34990                                                   ExtractQRegister(instr,
   34991                                                                    22,
   34992                                                                    12);
   34993                                               unsigned rm =
   34994                                                   ExtractDRegister(instr, 5, 0);
   34995                                               uint32_t imm6 =
   34996                                                   (instr >> 16) & 0x3f;
   34997                                               uint32_t imm =
   34998                                                   imm6 - dt.GetSize();
   34999                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   35000                                               vshll(CurrentCond(),
   35001                                                     dt,
   35002                                                     QRegister(rd),
   35003                                                     DRegister(rm),
   35004                                                     imm);
   35005                                               break;
   35006                                             }
   35007                                             case 0x00390000: {
   35008                                               // 0xefb90a10
   35009                                               if (((instr & 0x380000) == 0x0) ||
   35010                                                   ((instr & 0x3f0000) ==
   35011                                                    0x80000) ||
   35012                                                   ((instr & 0x3f0000) ==
   35013                                                    0x100000) ||
   35014                                                   ((instr & 0x3f0000) ==
   35015                                                    0x200000)) {
   35016                                                 UnallocatedT32(instr);
   35017                                                 return;
   35018                                               }
   35019                                               DataType dt =
   35020                                                   Dt_imm6_4_Decode((instr >>
   35021                                                                     19) &
   35022                                                                        0x7,
   35023                                                                    (instr >>
   35024                                                                     28) &
   35025                                                                        0x1);
   35026                                               if (dt.Is(
   35027                                                       kDataTypeValueInvalid)) {
   35028                                                 UnallocatedT32(instr);
   35029                                                 return;
   35030                                               }
   35031                                               if (((instr >> 12) & 1) != 0) {
   35032                                                 UnallocatedT32(instr);
   35033                                                 return;
   35034                                               }
   35035                                               unsigned rd =
   35036                                                   ExtractQRegister(instr,
   35037                                                                    22,
   35038                                                                    12);
   35039                                               unsigned rm =
   35040                                                   ExtractDRegister(instr, 5, 0);
   35041                                               uint32_t imm6 =
   35042                                                   (instr >> 16) & 0x3f;
   35043                                               uint32_t imm =
   35044                                                   imm6 - dt.GetSize();
   35045                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   35046                                               vshll(CurrentCond(),
   35047                                                     dt,
   35048                                                     QRegister(rd),
   35049                                                     DRegister(rm),
   35050                                                     imm);
   35051                                               break;
   35052                                             }
   35053                                             case 0x003a0000: {
   35054                                               // 0xefba0a10
   35055                                               if (((instr & 0x380000) == 0x0) ||
   35056                                                   ((instr & 0x3f0000) ==
   35057                                                    0x80000) ||
   35058                                                   ((instr & 0x3f0000) ==
   35059                                                    0x100000) ||
   35060                                                   ((instr & 0x3f0000) ==
   35061                                                    0x200000)) {
   35062                                                 UnallocatedT32(instr);
   35063                                                 return;
   35064                                               }
   35065                                               DataType dt =
   35066                                                   Dt_imm6_4_Decode((instr >>
   35067                                                                     19) &
   35068                                                                        0x7,
   35069                                                                    (instr >>
   35070                                                                     28) &
   35071                                                                        0x1);
   35072                                               if (dt.Is(
   35073                                                       kDataTypeValueInvalid)) {
   35074                                                 UnallocatedT32(instr);
   35075                                                 return;
   35076                                               }
   35077                                               if (((instr >> 12) & 1) != 0) {
   35078                                                 UnallocatedT32(instr);
   35079                                                 return;
   35080                                               }
   35081                                               unsigned rd =
   35082                                                   ExtractQRegister(instr,
   35083                                                                    22,
   35084                                                                    12);
   35085                                               unsigned rm =
   35086                                                   ExtractDRegister(instr, 5, 0);
   35087                                               uint32_t imm6 =
   35088                                                   (instr >> 16) & 0x3f;
   35089                                               uint32_t imm =
   35090                                                   imm6 - dt.GetSize();
   35091                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   35092                                               vshll(CurrentCond(),
   35093                                                     dt,
   35094                                                     QRegister(rd),
   35095                                                     DRegister(rm),
   35096                                                     imm);
   35097                                               break;
   35098                                             }
   35099                                             case 0x003b0000: {
   35100                                               // 0xefbb0a10
   35101                                               if (((instr & 0x380000) == 0x0) ||
   35102                                                   ((instr & 0x3f0000) ==
   35103                                                    0x80000) ||
   35104                                                   ((instr & 0x3f0000) ==
   35105                                                    0x100000) ||
   35106                                                   ((instr & 0x3f0000) ==
   35107                                                    0x200000)) {
   35108                                                 UnallocatedT32(instr);
   35109                                                 return;
   35110                                               }
   35111                                               DataType dt =
   35112                                                   Dt_imm6_4_Decode((instr >>
   35113                                                                     19) &
   35114                                                                        0x7,
   35115                                                                    (instr >>
   35116                                                                     28) &
   35117                                                                        0x1);
   35118                                               if (dt.Is(
   35119                                                       kDataTypeValueInvalid)) {
   35120                                                 UnallocatedT32(instr);
   35121                                                 return;
   35122                                               }
   35123                                               if (((instr >> 12) & 1) != 0) {
   35124                                                 UnallocatedT32(instr);
   35125                                                 return;
   35126                                               }
   35127                                               unsigned rd =
   35128                                                   ExtractQRegister(instr,
   35129                                                                    22,
   35130                                                                    12);
   35131                                               unsigned rm =
   35132                                                   ExtractDRegister(instr, 5, 0);
   35133                                               uint32_t imm6 =
   35134                                                   (instr >> 16) & 0x3f;
   35135                                               uint32_t imm =
   35136                                                   imm6 - dt.GetSize();
   35137                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   35138                                               vshll(CurrentCond(),
   35139                                                     dt,
   35140                                                     QRegister(rd),
   35141                                                     DRegister(rm),
   35142                                                     imm);
   35143                                               break;
   35144                                             }
   35145                                             case 0x003c0000: {
   35146                                               // 0xefbc0a10
   35147                                               if (((instr & 0x380000) == 0x0) ||
   35148                                                   ((instr & 0x3f0000) ==
   35149                                                    0x80000) ||
   35150                                                   ((instr & 0x3f0000) ==
   35151                                                    0x100000) ||
   35152                                                   ((instr & 0x3f0000) ==
   35153                                                    0x200000)) {
   35154                                                 UnallocatedT32(instr);
   35155                                                 return;
   35156                                               }
   35157                                               DataType dt =
   35158                                                   Dt_imm6_4_Decode((instr >>
   35159                                                                     19) &
   35160                                                                        0x7,
   35161                                                                    (instr >>
   35162                                                                     28) &
   35163                                                                        0x1);
   35164                                               if (dt.Is(
   35165                                                       kDataTypeValueInvalid)) {
   35166                                                 UnallocatedT32(instr);
   35167                                                 return;
   35168                                               }
   35169                                               if (((instr >> 12) & 1) != 0) {
   35170                                                 UnallocatedT32(instr);
   35171                                                 return;
   35172                                               }
   35173                                               unsigned rd =
   35174                                                   ExtractQRegister(instr,
   35175                                                                    22,
   35176                                                                    12);
   35177                                               unsigned rm =
   35178                                                   ExtractDRegister(instr, 5, 0);
   35179                                               uint32_t imm6 =
   35180                                                   (instr >> 16) & 0x3f;
   35181                                               uint32_t imm =
   35182                                                   imm6 - dt.GetSize();
   35183                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   35184                                               vshll(CurrentCond(),
   35185                                                     dt,
   35186                                                     QRegister(rd),
   35187                                                     DRegister(rm),
   35188                                                     imm);
   35189                                               break;
   35190                                             }
   35191                                             case 0x003d0000: {
   35192                                               // 0xefbd0a10
   35193                                               if (((instr & 0x380000) == 0x0) ||
   35194                                                   ((instr & 0x3f0000) ==
   35195                                                    0x80000) ||
   35196                                                   ((instr & 0x3f0000) ==
   35197                                                    0x100000) ||
   35198                                                   ((instr & 0x3f0000) ==
   35199                                                    0x200000)) {
   35200                                                 UnallocatedT32(instr);
   35201                                                 return;
   35202                                               }
   35203                                               DataType dt =
   35204                                                   Dt_imm6_4_Decode((instr >>
   35205                                                                     19) &
   35206                                                                        0x7,
   35207                                                                    (instr >>
   35208                                                                     28) &
   35209                                                                        0x1);
   35210                                               if (dt.Is(
   35211                                                       kDataTypeValueInvalid)) {
   35212                                                 UnallocatedT32(instr);
   35213                                                 return;
   35214                                               }
   35215                                               if (((instr >> 12) & 1) != 0) {
   35216                                                 UnallocatedT32(instr);
   35217                                                 return;
   35218                                               }
   35219                                               unsigned rd =
   35220                                                   ExtractQRegister(instr,
   35221                                                                    22,
   35222                                                                    12);
   35223                                               unsigned rm =
   35224                                                   ExtractDRegister(instr, 5, 0);
   35225                                               uint32_t imm6 =
   35226                                                   (instr >> 16) & 0x3f;
   35227                                               uint32_t imm =
   35228                                                   imm6 - dt.GetSize();
   35229                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   35230                                               vshll(CurrentCond(),
   35231                                                     dt,
   35232                                                     QRegister(rd),
   35233                                                     DRegister(rm),
   35234                                                     imm);
   35235                                               break;
   35236                                             }
   35237                                             case 0x003e0000: {
   35238                                               // 0xefbe0a10
   35239                                               if (((instr & 0x380000) == 0x0) ||
   35240                                                   ((instr & 0x3f0000) ==
   35241                                                    0x80000) ||
   35242                                                   ((instr & 0x3f0000) ==
   35243                                                    0x100000) ||
   35244                                                   ((instr & 0x3f0000) ==
   35245                                                    0x200000)) {
   35246                                                 UnallocatedT32(instr);
   35247                                                 return;
   35248                                               }
   35249                                               DataType dt =
   35250                                                   Dt_imm6_4_Decode((instr >>
   35251                                                                     19) &
   35252                                                                        0x7,
   35253                                                                    (instr >>
   35254                                                                     28) &
   35255                                                                        0x1);
   35256                                               if (dt.Is(
   35257                                                       kDataTypeValueInvalid)) {
   35258                                                 UnallocatedT32(instr);
   35259                                                 return;
   35260                                               }
   35261                                               if (((instr >> 12) & 1) != 0) {
   35262                                                 UnallocatedT32(instr);
   35263                                                 return;
   35264                                               }
   35265                                               unsigned rd =
   35266                                                   ExtractQRegister(instr,
   35267                                                                    22,
   35268                                                                    12);
   35269                                               unsigned rm =
   35270                                                   ExtractDRegister(instr, 5, 0);
   35271                                               uint32_t imm6 =
   35272                                                   (instr >> 16) & 0x3f;
   35273                                               uint32_t imm =
   35274                                                   imm6 - dt.GetSize();
   35275                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   35276                                               vshll(CurrentCond(),
   35277                                                     dt,
   35278                                                     QRegister(rd),
   35279                                                     DRegister(rm),
   35280                                                     imm);
   35281                                               break;
   35282                                             }
   35283                                             case 0x003f0000: {
   35284                                               // 0xefbf0a10
   35285                                               if (((instr & 0x380000) == 0x0) ||
   35286                                                   ((instr & 0x3f0000) ==
   35287                                                    0x80000) ||
   35288                                                   ((instr & 0x3f0000) ==
   35289                                                    0x100000) ||
   35290                                                   ((instr & 0x3f0000) ==
   35291                                                    0x200000)) {
   35292                                                 UnallocatedT32(instr);
   35293                                                 return;
   35294                                               }
   35295                                               DataType dt =
   35296                                                   Dt_imm6_4_Decode((instr >>
   35297                                                                     19) &
   35298                                                                        0x7,
   35299                                                                    (instr >>
   35300                                                                     28) &
   35301                                                                        0x1);
   35302                                               if (dt.Is(
   35303                                                       kDataTypeValueInvalid)) {
   35304                                                 UnallocatedT32(instr);
   35305                                                 return;
   35306                                               }
   35307                                               if (((instr >> 12) & 1) != 0) {
   35308                                                 UnallocatedT32(instr);
   35309                                                 return;
   35310                                               }
   35311                                               unsigned rd =
   35312                                                   ExtractQRegister(instr,
   35313                                                                    22,
   35314                                                                    12);
   35315                                               unsigned rm =
   35316                                                   ExtractDRegister(instr, 5, 0);
   35317                                               uint32_t imm6 =
   35318                                                   (instr >> 16) & 0x3f;
   35319                                               uint32_t imm =
   35320                                                   imm6 - dt.GetSize();
   35321                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   35322                                               vshll(CurrentCond(),
   35323                                                     dt,
   35324                                                     QRegister(rd),
   35325                                                     DRegister(rm),
   35326                                                     imm);
   35327                                               break;
   35328                                             }
   35329                                             default:
   35330                                               UnallocatedT32(instr);
   35331                                               break;
   35332                                           }
   35333                                           break;
   35334                                         }
   35335                                         default: {
   35336                                           if (((instr & 0x380000) == 0x0) ||
   35337                                               ((instr & 0x3f0000) == 0x80000) ||
   35338                                               ((instr & 0x3f0000) ==
   35339                                                0x100000) ||
   35340                                               ((instr & 0x3f0000) ==
   35341                                                0x200000)) {
   35342                                             UnallocatedT32(instr);
   35343                                             return;
   35344                                           }
   35345                                           DataType dt =
   35346                                               Dt_imm6_4_Decode((instr >> 19) &
   35347                                                                    0x7,
   35348                                                                (instr >> 28) &
   35349                                                                    0x1);
   35350                                           if (dt.Is(kDataTypeValueInvalid)) {
   35351                                             UnallocatedT32(instr);
   35352                                             return;
   35353                                           }
   35354                                           if (((instr >> 12) & 1) != 0) {
   35355                                             UnallocatedT32(instr);
   35356                                             return;
   35357                                           }
   35358                                           unsigned rd =
   35359                                               ExtractQRegister(instr, 22, 12);
   35360                                           unsigned rm =
   35361                                               ExtractDRegister(instr, 5, 0);
   35362                                           uint32_t imm6 = (instr >> 16) & 0x3f;
   35363                                           uint32_t imm = imm6 - dt.GetSize();
   35364                                           // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   35365                                           vshll(CurrentCond(),
   35366                                                 dt,
   35367                                                 QRegister(rd),
   35368                                                 DRegister(rm),
   35369                                                 imm);
   35370                                           break;
   35371                                         }
   35372                                       }
   35373                                       break;
   35374                                     }
   35375                                     default:
   35376                                       UnallocatedT32(instr);
   35377                                       break;
   35378                                   }
   35379                                   break;
   35380                                 }
   35381                               }
   35382                               break;
   35383                             }
   35384                             default:
   35385                               UnallocatedT32(instr);
   35386                               break;
   35387                           }
   35388                           break;
   35389                         }
   35390                         case 0x00000c00: {
   35391                           // 0xef800c10
   35392                           switch (instr & 0x00000080) {
   35393                             case 0x00000000: {
   35394                               // 0xef800c10
   35395                               switch (instr & 0x00200000) {
   35396                                 case 0x00000000: {
   35397                                   // 0xef800c10
   35398                                   switch (instr & 0x00180000) {
   35399                                     case 0x00000000: {
   35400                                       // 0xef800c10
   35401                                       switch (instr & 0x00000300) {
   35402                                         case 0x00000200: {
   35403                                           // 0xef800e10
   35404                                           if (((instr & 0x920) == 0x100) ||
   35405                                               ((instr & 0x520) == 0x100) ||
   35406                                               ((instr & 0x820) == 0x20) ||
   35407                                               ((instr & 0x420) == 0x20) ||
   35408                                               ((instr & 0x220) == 0x20) ||
   35409                                               ((instr & 0x120) == 0x120)) {
   35410                                             UnallocatedT32(instr);
   35411                                             return;
   35412                                           }
   35413                                           unsigned cmode =
   35414                                               ((instr >> 8) & 0xf) |
   35415                                               ((instr >> 1) & 0x10);
   35416                                           DataType dt =
   35417                                               ImmediateVmov::DecodeDt(cmode);
   35418                                           if (dt.Is(kDataTypeValueInvalid)) {
   35419                                             UnallocatedT32(instr);
   35420                                             return;
   35421                                           }
   35422                                           unsigned rd =
   35423                                               ExtractDRegister(instr, 22, 12);
   35424                                           DOperand imm =
   35425                                               ImmediateVmov::DecodeImmediate(
   35426                                                   cmode,
   35427                                                   (instr & 0xf) |
   35428                                                       ((instr >> 12) & 0x70) |
   35429                                                       ((instr >> 21) & 0x80));
   35430                                           // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
   35431                                           vmov(CurrentCond(),
   35432                                                dt,
   35433                                                DRegister(rd),
   35434                                                imm);
   35435                                           break;
   35436                                         }
   35437                                         case 0x00000300: {
   35438                                           // 0xef800f10
   35439                                           if (((instr & 0x920) == 0x100) ||
   35440                                               ((instr & 0x520) == 0x100) ||
   35441                                               ((instr & 0x820) == 0x20) ||
   35442                                               ((instr & 0x420) == 0x20) ||
   35443                                               ((instr & 0x220) == 0x20) ||
   35444                                               ((instr & 0x120) == 0x120)) {
   35445                                             UnallocatedT32(instr);
   35446                                             return;
   35447                                           }
   35448                                           unsigned cmode =
   35449                                               ((instr >> 8) & 0xf) |
   35450                                               ((instr >> 1) & 0x10);
   35451                                           DataType dt =
   35452                                               ImmediateVmov::DecodeDt(cmode);
   35453                                           if (dt.Is(kDataTypeValueInvalid)) {
   35454                                             UnallocatedT32(instr);
   35455                                             return;
   35456                                           }
   35457                                           unsigned rd =
   35458                                               ExtractDRegister(instr, 22, 12);
   35459                                           DOperand imm =
   35460                                               ImmediateVmov::DecodeImmediate(
   35461                                                   cmode,
   35462                                                   (instr & 0xf) |
   35463                                                       ((instr >> 12) & 0x70) |
   35464                                                       ((instr >> 21) & 0x80));
   35465                                           // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
   35466                                           vmov(CurrentCond(),
   35467                                                dt,
   35468                                                DRegister(rd),
   35469                                                imm);
   35470                                           break;
   35471                                         }
   35472                                         default: {
   35473                                           switch (instr & 0x00000020) {
   35474                                             case 0x00000020: {
   35475                                               // 0xef800c30
   35476                                               switch (instr & 0x00000f20) {
   35477                                                 case 0x00000000: {
   35478                                                   // 0xef800c10
   35479                                                   if (((instr & 0x920) ==
   35480                                                        0x100) ||
   35481                                                       ((instr & 0x520) ==
   35482                                                        0x100) ||
   35483                                                       ((instr & 0x820) ==
   35484                                                        0x20) ||
   35485                                                       ((instr & 0x420) ==
   35486                                                        0x20) ||
   35487                                                       ((instr & 0x220) ==
   35488                                                        0x20) ||
   35489                                                       ((instr & 0x120) ==
   35490                                                        0x120)) {
   35491                                                     UnallocatedT32(instr);
   35492                                                     return;
   35493                                                   }
   35494                                                   unsigned cmode =
   35495                                                       ((instr >> 8) & 0xf) |
   35496                                                       ((instr >> 1) & 0x10);
   35497                                                   DataType dt =
   35498                                                       ImmediateVmov::DecodeDt(
   35499                                                           cmode);
   35500                                                   if (dt.Is(
   35501                                                           kDataTypeValueInvalid)) {
   35502                                                     UnallocatedT32(instr);
   35503                                                     return;
   35504                                                   }
   35505                                                   unsigned rd =
   35506                                                       ExtractDRegister(instr,
   35507                                                                        22,
   35508                                                                        12);
   35509                                                   DOperand imm = ImmediateVmov::
   35510                                                       DecodeImmediate(
   35511                                                           cmode,
   35512                                                           (instr & 0xf) |
   35513                                                               ((instr >> 12) &
   35514                                                                0x70) |
   35515                                                               ((instr >> 21) &
   35516                                                                0x80));
   35517                                                   // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
   35518                                                   vmov(CurrentCond(),
   35519                                                        dt,
   35520                                                        DRegister(rd),
   35521                                                        imm);
   35522                                                   break;
   35523                                                 }
   35524                                                 case 0x00000020: {
   35525                                                   // 0xef800c30
   35526                                                   if (((instr & 0xd00) ==
   35527                                                        0x100) ||
   35528                                                       ((instr & 0xd00) ==
   35529                                                        0x500) ||
   35530                                                       ((instr & 0xd00) ==
   35531                                                        0x900) ||
   35532                                                       ((instr & 0xe00) ==
   35533                                                        0xe00)) {
   35534                                                     UnallocatedT32(instr);
   35535                                                     return;
   35536                                                   }
   35537                                                   unsigned cmode =
   35538                                                       (instr >> 8) & 0xf;
   35539                                                   DataType dt =
   35540                                                       ImmediateVmvn::DecodeDt(
   35541                                                           cmode);
   35542                                                   if (dt.Is(
   35543                                                           kDataTypeValueInvalid)) {
   35544                                                     UnallocatedT32(instr);
   35545                                                     return;
   35546                                                   }
   35547                                                   unsigned rd =
   35548                                                       ExtractDRegister(instr,
   35549                                                                        22,
   35550                                                                        12);
   35551                                                   DOperand imm = ImmediateVmvn::
   35552                                                       DecodeImmediate(
   35553                                                           cmode,
   35554                                                           (instr & 0xf) |
   35555                                                               ((instr >> 12) &
   35556                                                                0x70) |
   35557                                                               ((instr >> 21) &
   35558                                                                0x80));
   35559                                                   // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
   35560                                                   vmvn(CurrentCond(),
   35561                                                        dt,
   35562                                                        DRegister(rd),
   35563                                                        imm);
   35564                                                   break;
   35565                                                 }
   35566                                                 case 0x00000200: {
   35567                                                   // 0xef800e10
   35568                                                   if (((instr & 0x920) ==
   35569                                                        0x100) ||
   35570                                                       ((instr & 0x520) ==
   35571                                                        0x100) ||
   35572                                                       ((instr & 0x820) ==
   35573                                                        0x20) ||
   35574                                                       ((instr & 0x420) ==
   35575                                                        0x20) ||
   35576                                                       ((instr & 0x220) ==
   35577                                                        0x20) ||
   35578                                                       ((instr & 0x120) ==
   35579                                                        0x120)) {
   35580                                                     UnallocatedT32(instr);
   35581                                                     return;
   35582                                                   }
   35583                                                   unsigned cmode =
   35584                                                       ((instr >> 8) & 0xf) |
   35585                                                       ((instr >> 1) & 0x10);
   35586                                                   DataType dt =
   35587                                                       ImmediateVmov::DecodeDt(
   35588                                                           cmode);
   35589                                                   if (dt.Is(
   35590                                                           kDataTypeValueInvalid)) {
   35591                                                     UnallocatedT32(instr);
   35592                                                     return;
   35593                                                   }
   35594                                                   unsigned rd =
   35595                                                       ExtractDRegister(instr,
   35596                                                                        22,
   35597                                                                        12);
   35598                                                   DOperand imm = ImmediateVmov::
   35599                                                       DecodeImmediate(
   35600                                                           cmode,
   35601                                                           (instr & 0xf) |
   35602                                                               ((instr >> 12) &
   35603                                                                0x70) |
   35604                                                               ((instr >> 21) &
   35605                                                                0x80));
   35606                                                   // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
   35607                                                   vmov(CurrentCond(),
   35608                                                        dt,
   35609                                                        DRegister(rd),
   35610                                                        imm);
   35611                                                   break;
   35612                                                 }
   35613                                                 case 0x00000220: {
   35614                                                   // 0xef800e30
   35615                                                   if (((instr & 0xd00) ==
   35616                                                        0x100) ||
   35617                                                       ((instr & 0xd00) ==
   35618                                                        0x500) ||
   35619                                                       ((instr & 0xd00) ==
   35620                                                        0x900) ||
   35621                                                       ((instr & 0xe00) ==
   35622                                                        0xe00)) {
   35623                                                     UnallocatedT32(instr);
   35624                                                     return;
   35625                                                   }
   35626                                                   unsigned cmode =
   35627                                                       (instr >> 8) & 0xf;
   35628                                                   DataType dt =
   35629                                                       ImmediateVmvn::DecodeDt(
   35630                                                           cmode);
   35631                                                   if (dt.Is(
   35632                                                           kDataTypeValueInvalid)) {
   35633                                                     UnallocatedT32(instr);
   35634                                                     return;
   35635                                                   }
   35636                                                   unsigned rd =
   35637                                                       ExtractDRegister(instr,
   35638                                                                        22,
   35639                                                                        12);
   35640                                                   DOperand imm = ImmediateVmvn::
   35641                                                       DecodeImmediate(
   35642                                                           cmode,
   35643                                                           (instr & 0xf) |
   35644                                                               ((instr >> 12) &
   35645                                                                0x70) |
   35646                                                               ((instr >> 21) &
   35647                                                                0x80));
   35648                                                   // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
   35649                                                   vmvn(CurrentCond(),
   35650                                                        dt,
   35651                                                        DRegister(rd),
   35652                                                        imm);
   35653                                                   break;
   35654                                                 }
   35655                                                 case 0x00000400: {
   35656                                                   // 0xef800c10
   35657                                                   if (((instr & 0x920) ==
   35658                                                        0x100) ||
   35659                                                       ((instr & 0x520) ==
   35660                                                        0x100) ||
   35661                                                       ((instr & 0x820) ==
   35662                                                        0x20) ||
   35663                                                       ((instr & 0x420) ==
   35664                                                        0x20) ||
   35665                                                       ((instr & 0x220) ==
   35666                                                        0x20) ||
   35667                                                       ((instr & 0x120) ==
   35668                                                        0x120)) {
   35669                                                     UnallocatedT32(instr);
   35670                                                     return;
   35671                                                   }
   35672                                                   unsigned cmode =
   35673                                                       ((instr >> 8) & 0xf) |
   35674                                                       ((instr >> 1) & 0x10);
   35675                                                   DataType dt =
   35676                                                       ImmediateVmov::DecodeDt(
   35677                                                           cmode);
   35678                                                   if (dt.Is(
   35679                                                           kDataTypeValueInvalid)) {
   35680                                                     UnallocatedT32(instr);
   35681                                                     return;
   35682                                                   }
   35683                                                   unsigned rd =
   35684                                                       ExtractDRegister(instr,
   35685                                                                        22,
   35686                                                                        12);
   35687                                                   DOperand imm = ImmediateVmov::
   35688                                                       DecodeImmediate(
   35689                                                           cmode,
   35690                                                           (instr & 0xf) |
   35691                                                               ((instr >> 12) &
   35692                                                                0x70) |
   35693                                                               ((instr >> 21) &
   35694                                                                0x80));
   35695                                                   // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
   35696                                                   vmov(CurrentCond(),
   35697                                                        dt,
   35698                                                        DRegister(rd),
   35699                                                        imm);
   35700                                                   break;
   35701                                                 }
   35702                                                 case 0x00000420: {
   35703                                                   // 0xef800c30
   35704                                                   if (((instr & 0xd00) ==
   35705                                                        0x100) ||
   35706                                                       ((instr & 0xd00) ==
   35707                                                        0x500) ||
   35708                                                       ((instr & 0xd00) ==
   35709                                                        0x900) ||
   35710                                                       ((instr & 0xe00) ==
   35711                                                        0xe00)) {
   35712                                                     UnallocatedT32(instr);
   35713                                                     return;
   35714                                                   }
   35715                                                   unsigned cmode =
   35716                                                       (instr >> 8) & 0xf;
   35717                                                   DataType dt =
   35718                                                       ImmediateVmvn::DecodeDt(
   35719                                                           cmode);
   35720                                                   if (dt.Is(
   35721                                                           kDataTypeValueInvalid)) {
   35722                                                     UnallocatedT32(instr);
   35723                                                     return;
   35724                                                   }
   35725                                                   unsigned rd =
   35726                                                       ExtractDRegister(instr,
   35727                                                                        22,
   35728                                                                        12);
   35729                                                   DOperand imm = ImmediateVmvn::
   35730                                                       DecodeImmediate(
   35731                                                           cmode,
   35732                                                           (instr & 0xf) |
   35733                                                               ((instr >> 12) &
   35734                                                                0x70) |
   35735                                                               ((instr >> 21) &
   35736                                                                0x80));
   35737                                                   // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
   35738                                                   vmvn(CurrentCond(),
   35739                                                        dt,
   35740                                                        DRegister(rd),
   35741                                                        imm);
   35742                                                   break;
   35743                                                 }
   35744                                                 case 0x00000600: {
   35745                                                   // 0xef800e10
   35746                                                   if (((instr & 0x920) ==
   35747                                                        0x100) ||
   35748                                                       ((instr & 0x520) ==
   35749                                                        0x100) ||
   35750                                                       ((instr & 0x820) ==
   35751                                                        0x20) ||
   35752                                                       ((instr & 0x420) ==
   35753                                                        0x20) ||
   35754                                                       ((instr & 0x220) ==
   35755                                                        0x20) ||
   35756                                                       ((instr & 0x120) ==
   35757                                                        0x120)) {
   35758                                                     UnallocatedT32(instr);
   35759                                                     return;
   35760                                                   }
   35761                                                   unsigned cmode =
   35762                                                       ((instr >> 8) & 0xf) |
   35763                                                       ((instr >> 1) & 0x10);
   35764                                                   DataType dt =
   35765                                                       ImmediateVmov::DecodeDt(
   35766                                                           cmode);
   35767                                                   if (dt.Is(
   35768                                                           kDataTypeValueInvalid)) {
   35769                                                     UnallocatedT32(instr);
   35770                                                     return;
   35771                                                   }
   35772                                                   unsigned rd =
   35773                                                       ExtractDRegister(instr,
   35774                                                                        22,
   35775                                                                        12);
   35776                                                   DOperand imm = ImmediateVmov::
   35777                                                       DecodeImmediate(
   35778                                                           cmode,
   35779                                                           (instr & 0xf) |
   35780                                                               ((instr >> 12) &
   35781                                                                0x70) |
   35782                                                               ((instr >> 21) &
   35783                                                                0x80));
   35784                                                   // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
   35785                                                   vmov(CurrentCond(),
   35786                                                        dt,
   35787                                                        DRegister(rd),
   35788                                                        imm);
   35789                                                   break;
   35790                                                 }
   35791                                                 case 0x00000620: {
   35792                                                   // 0xef800e30
   35793                                                   if (((instr & 0xd00) ==
   35794                                                        0x100) ||
   35795                                                       ((instr & 0xd00) ==
   35796                                                        0x500) ||
   35797                                                       ((instr & 0xd00) ==
   35798                                                        0x900) ||
   35799                                                       ((instr & 0xe00) ==
   35800                                                        0xe00)) {
   35801                                                     UnallocatedT32(instr);
   35802                                                     return;
   35803                                                   }
   35804                                                   unsigned cmode =
   35805                                                       (instr >> 8) & 0xf;
   35806                                                   DataType dt =
   35807                                                       ImmediateVmvn::DecodeDt(
   35808                                                           cmode);
   35809                                                   if (dt.Is(
   35810                                                           kDataTypeValueInvalid)) {
   35811                                                     UnallocatedT32(instr);
   35812                                                     return;
   35813                                                   }
   35814                                                   unsigned rd =
   35815                                                       ExtractDRegister(instr,
   35816                                                                        22,
   35817                                                                        12);
   35818                                                   DOperand imm = ImmediateVmvn::
   35819                                                       DecodeImmediate(
   35820                                                           cmode,
   35821                                                           (instr & 0xf) |
   35822                                                               ((instr >> 12) &
   35823                                                                0x70) |
   35824                                                               ((instr >> 21) &
   35825                                                                0x80));
   35826                                                   // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
   35827                                                   vmvn(CurrentCond(),
   35828                                                        dt,
   35829                                                        DRegister(rd),
   35830                                                        imm);
   35831                                                   break;
   35832                                                 }
   35833                                                 case 0x00000800: {
   35834                                                   // 0xef800c10
   35835                                                   if (((instr & 0x920) ==
   35836                                                        0x100) ||
   35837                                                       ((instr & 0x520) ==
   35838                                                        0x100) ||
   35839                                                       ((instr & 0x820) ==
   35840                                                        0x20) ||
   35841                                                       ((instr & 0x420) ==
   35842                                                        0x20) ||
   35843                                                       ((instr & 0x220) ==
   35844                                                        0x20) ||
   35845                                                       ((instr & 0x120) ==
   35846                                                        0x120)) {
   35847                                                     UnallocatedT32(instr);
   35848                                                     return;
   35849                                                   }
   35850                                                   unsigned cmode =
   35851                                                       ((instr >> 8) & 0xf) |
   35852                                                       ((instr >> 1) & 0x10);
   35853                                                   DataType dt =
   35854                                                       ImmediateVmov::DecodeDt(
   35855                                                           cmode);
   35856                                                   if (dt.Is(
   35857                                                           kDataTypeValueInvalid)) {
   35858                                                     UnallocatedT32(instr);
   35859                                                     return;
   35860                                                   }
   35861                                                   unsigned rd =
   35862                                                       ExtractDRegister(instr,
   35863                                                                        22,
   35864                                                                        12);
   35865                                                   DOperand imm = ImmediateVmov::
   35866                                                       DecodeImmediate(
   35867                                                           cmode,
   35868                                                           (instr & 0xf) |
   35869                                                               ((instr >> 12) &
   35870                                                                0x70) |
   35871                                                               ((instr >> 21) &
   35872                                                                0x80));
   35873                                                   // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
   35874                                                   vmov(CurrentCond(),
   35875                                                        dt,
   35876                                                        DRegister(rd),
   35877                                                        imm);
   35878                                                   break;
   35879                                                 }
   35880                                                 case 0x00000820: {
   35881                                                   // 0xef800c30
   35882                                                   if (((instr & 0xd00) ==
   35883                                                        0x100) ||
   35884                                                       ((instr & 0xd00) ==
   35885                                                        0x500) ||
   35886                                                       ((instr & 0xd00) ==
   35887                                                        0x900) ||
   35888                                                       ((instr & 0xe00) ==
   35889                                                        0xe00)) {
   35890                                                     UnallocatedT32(instr);
   35891                                                     return;
   35892                                                   }
   35893                                                   unsigned cmode =
   35894                                                       (instr >> 8) & 0xf;
   35895                                                   DataType dt =
   35896                                                       ImmediateVmvn::DecodeDt(
   35897                                                           cmode);
   35898                                                   if (dt.Is(
   35899                                                           kDataTypeValueInvalid)) {
   35900                                                     UnallocatedT32(instr);
   35901                                                     return;
   35902                                                   }
   35903                                                   unsigned rd =
   35904                                                       ExtractDRegister(instr,
   35905                                                                        22,
   35906                                                                        12);
   35907                                                   DOperand imm = ImmediateVmvn::
   35908                                                       DecodeImmediate(
   35909                                                           cmode,
   35910                                                           (instr & 0xf) |
   35911                                                               ((instr >> 12) &
   35912                                                                0x70) |
   35913                                                               ((instr >> 21) &
   35914                                                                0x80));
   35915                                                   // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
   35916                                                   vmvn(CurrentCond(),
   35917                                                        dt,
   35918                                                        DRegister(rd),
   35919                                                        imm);
   35920                                                   break;
   35921                                                 }
   35922                                                 case 0x00000a00: {
   35923                                                   // 0xef800e10
   35924                                                   if (((instr & 0x920) ==
   35925                                                        0x100) ||
   35926                                                       ((instr & 0x520) ==
   35927                                                        0x100) ||
   35928                                                       ((instr & 0x820) ==
   35929                                                        0x20) ||
   35930                                                       ((instr & 0x420) ==
   35931                                                        0x20) ||
   35932                                                       ((instr & 0x220) ==
   35933                                                        0x20) ||
   35934                                                       ((instr & 0x120) ==
   35935                                                        0x120)) {
   35936                                                     UnallocatedT32(instr);
   35937                                                     return;
   35938                                                   }
   35939                                                   unsigned cmode =
   35940                                                       ((instr >> 8) & 0xf) |
   35941                                                       ((instr >> 1) & 0x10);
   35942                                                   DataType dt =
   35943                                                       ImmediateVmov::DecodeDt(
   35944                                                           cmode);
   35945                                                   if (dt.Is(
   35946                                                           kDataTypeValueInvalid)) {
   35947                                                     UnallocatedT32(instr);
   35948                                                     return;
   35949                                                   }
   35950                                                   unsigned rd =
   35951                                                       ExtractDRegister(instr,
   35952                                                                        22,
   35953                                                                        12);
   35954                                                   DOperand imm = ImmediateVmov::
   35955                                                       DecodeImmediate(
   35956                                                           cmode,
   35957                                                           (instr & 0xf) |
   35958                                                               ((instr >> 12) &
   35959                                                                0x70) |
   35960                                                               ((instr >> 21) &
   35961                                                                0x80));
   35962                                                   // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
   35963                                                   vmov(CurrentCond(),
   35964                                                        dt,
   35965                                                        DRegister(rd),
   35966                                                        imm);
   35967                                                   break;
   35968                                                 }
   35969                                                 case 0x00000a20: {
   35970                                                   // 0xef800e30
   35971                                                   if (((instr & 0xd00) ==
   35972                                                        0x100) ||
   35973                                                       ((instr & 0xd00) ==
   35974                                                        0x500) ||
   35975                                                       ((instr & 0xd00) ==
   35976                                                        0x900) ||
   35977                                                       ((instr & 0xe00) ==
   35978                                                        0xe00)) {
   35979                                                     UnallocatedT32(instr);
   35980                                                     return;
   35981                                                   }
   35982                                                   unsigned cmode =
   35983                                                       (instr >> 8) & 0xf;
   35984                                                   DataType dt =
   35985                                                       ImmediateVmvn::DecodeDt(
   35986                                                           cmode);
   35987                                                   if (dt.Is(
   35988                                                           kDataTypeValueInvalid)) {
   35989                                                     UnallocatedT32(instr);
   35990                                                     return;
   35991                                                   }
   35992                                                   unsigned rd =
   35993                                                       ExtractDRegister(instr,
   35994                                                                        22,
   35995                                                                        12);
   35996                                                   DOperand imm = ImmediateVmvn::
   35997                                                       DecodeImmediate(
   35998                                                           cmode,
   35999                                                           (instr & 0xf) |
   36000                                                               ((instr >> 12) &
   36001                                                                0x70) |
   36002                                                               ((instr >> 21) &
   36003                                                                0x80));
   36004                                                   // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
   36005                                                   vmvn(CurrentCond(),
   36006                                                        dt,
   36007                                                        DRegister(rd),
   36008                                                        imm);
   36009                                                   break;
   36010                                                 }
   36011                                                 case 0x00000c00: {
   36012                                                   // 0xef800c10
   36013                                                   if (((instr & 0x920) ==
   36014                                                        0x100) ||
   36015                                                       ((instr & 0x520) ==
   36016                                                        0x100) ||
   36017                                                       ((instr & 0x820) ==
   36018                                                        0x20) ||
   36019                                                       ((instr & 0x420) ==
   36020                                                        0x20) ||
   36021                                                       ((instr & 0x220) ==
   36022                                                        0x20) ||
   36023                                                       ((instr & 0x120) ==
   36024                                                        0x120)) {
   36025                                                     UnallocatedT32(instr);
   36026                                                     return;
   36027                                                   }
   36028                                                   unsigned cmode =
   36029                                                       ((instr >> 8) & 0xf) |
   36030                                                       ((instr >> 1) & 0x10);
   36031                                                   DataType dt =
   36032                                                       ImmediateVmov::DecodeDt(
   36033                                                           cmode);
   36034                                                   if (dt.Is(
   36035                                                           kDataTypeValueInvalid)) {
   36036                                                     UnallocatedT32(instr);
   36037                                                     return;
   36038                                                   }
   36039                                                   unsigned rd =
   36040                                                       ExtractDRegister(instr,
   36041                                                                        22,
   36042                                                                        12);
   36043                                                   DOperand imm = ImmediateVmov::
   36044                                                       DecodeImmediate(
   36045                                                           cmode,
   36046                                                           (instr & 0xf) |
   36047                                                               ((instr >> 12) &
   36048                                                                0x70) |
   36049                                                               ((instr >> 21) &
   36050                                                                0x80));
   36051                                                   // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
   36052                                                   vmov(CurrentCond(),
   36053                                                        dt,
   36054                                                        DRegister(rd),
   36055                                                        imm);
   36056                                                   break;
   36057                                                 }
   36058                                                 case 0x00000c20: {
   36059                                                   // 0xef800c30
   36060                                                   if (((instr & 0xd00) ==
   36061                                                        0x100) ||
   36062                                                       ((instr & 0xd00) ==
   36063                                                        0x500) ||
   36064                                                       ((instr & 0xd00) ==
   36065                                                        0x900) ||
   36066                                                       ((instr & 0xe00) ==
   36067                                                        0xe00)) {
   36068                                                     UnallocatedT32(instr);
   36069                                                     return;
   36070                                                   }
   36071                                                   unsigned cmode =
   36072                                                       (instr >> 8) & 0xf;
   36073                                                   DataType dt =
   36074                                                       ImmediateVmvn::DecodeDt(
   36075                                                           cmode);
   36076                                                   if (dt.Is(
   36077                                                           kDataTypeValueInvalid)) {
   36078                                                     UnallocatedT32(instr);
   36079                                                     return;
   36080                                                   }
   36081                                                   unsigned rd =
   36082                                                       ExtractDRegister(instr,
   36083                                                                        22,
   36084                                                                        12);
   36085                                                   DOperand imm = ImmediateVmvn::
   36086                                                       DecodeImmediate(
   36087                                                           cmode,
   36088                                                           (instr & 0xf) |
   36089                                                               ((instr >> 12) &
   36090                                                                0x70) |
   36091                                                               ((instr >> 21) &
   36092                                                                0x80));
   36093                                                   // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
   36094                                                   vmvn(CurrentCond(),
   36095                                                        dt,
   36096                                                        DRegister(rd),
   36097                                                        imm);
   36098                                                   break;
   36099                                                 }
   36100                                                 case 0x00000d00: {
   36101                                                   // 0xef800d10
   36102                                                   if (((instr & 0x920) ==
   36103                                                        0x100) ||
   36104                                                       ((instr & 0x520) ==
   36105                                                        0x100) ||
   36106                                                       ((instr & 0x820) ==
   36107                                                        0x20) ||
   36108                                                       ((instr & 0x420) ==
   36109                                                        0x20) ||
   36110                                                       ((instr & 0x220) ==
   36111                                                        0x20) ||
   36112                                                       ((instr & 0x120) ==
   36113                                                        0x120)) {
   36114                                                     UnallocatedT32(instr);
   36115                                                     return;
   36116                                                   }
   36117                                                   unsigned cmode =
   36118                                                       ((instr >> 8) & 0xf) |
   36119                                                       ((instr >> 1) & 0x10);
   36120                                                   DataType dt =
   36121                                                       ImmediateVmov::DecodeDt(
   36122                                                           cmode);
   36123                                                   if (dt.Is(
   36124                                                           kDataTypeValueInvalid)) {
   36125                                                     UnallocatedT32(instr);
   36126                                                     return;
   36127                                                   }
   36128                                                   unsigned rd =
   36129                                                       ExtractDRegister(instr,
   36130                                                                        22,
   36131                                                                        12);
   36132                                                   DOperand imm = ImmediateVmov::
   36133                                                       DecodeImmediate(
   36134                                                           cmode,
   36135                                                           (instr & 0xf) |
   36136                                                               ((instr >> 12) &
   36137                                                                0x70) |
   36138                                                               ((instr >> 21) &
   36139                                                                0x80));
   36140                                                   // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
   36141                                                   vmov(CurrentCond(),
   36142                                                        dt,
   36143                                                        DRegister(rd),
   36144                                                        imm);
   36145                                                   break;
   36146                                                 }
   36147                                                 case 0x00000d20: {
   36148                                                   // 0xef800d30
   36149                                                   if (((instr & 0xd00) ==
   36150                                                        0x100) ||
   36151                                                       ((instr & 0xd00) ==
   36152                                                        0x500) ||
   36153                                                       ((instr & 0xd00) ==
   36154                                                        0x900) ||
   36155                                                       ((instr & 0xe00) ==
   36156                                                        0xe00)) {
   36157                                                     UnallocatedT32(instr);
   36158                                                     return;
   36159                                                   }
   36160                                                   unsigned cmode =
   36161                                                       (instr >> 8) & 0xf;
   36162                                                   DataType dt =
   36163                                                       ImmediateVmvn::DecodeDt(
   36164                                                           cmode);
   36165                                                   if (dt.Is(
   36166                                                           kDataTypeValueInvalid)) {
   36167                                                     UnallocatedT32(instr);
   36168                                                     return;
   36169                                                   }
   36170                                                   unsigned rd =
   36171                                                       ExtractDRegister(instr,
   36172                                                                        22,
   36173                                                                        12);
   36174                                                   DOperand imm = ImmediateVmvn::
   36175                                                       DecodeImmediate(
   36176                                                           cmode,
   36177                                                           (instr & 0xf) |
   36178                                                               ((instr >> 12) &
   36179                                                                0x70) |
   36180                                                               ((instr >> 21) &
   36181                                                                0x80));
   36182                                                   // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
   36183                                                   vmvn(CurrentCond(),
   36184                                                        dt,
   36185                                                        DRegister(rd),
   36186                                                        imm);
   36187                                                   break;
   36188                                                 }
   36189                                                 case 0x00000e00: {
   36190                                                   // 0xef800e10
   36191                                                   if (((instr & 0x920) ==
   36192                                                        0x100) ||
   36193                                                       ((instr & 0x520) ==
   36194                                                        0x100) ||
   36195                                                       ((instr & 0x820) ==
   36196                                                        0x20) ||
   36197                                                       ((instr & 0x420) ==
   36198                                                        0x20) ||
   36199                                                       ((instr & 0x220) ==
   36200                                                        0x20) ||
   36201                                                       ((instr & 0x120) ==
   36202                                                        0x120)) {
   36203                                                     UnallocatedT32(instr);
   36204                                                     return;
   36205                                                   }
   36206                                                   unsigned cmode =
   36207                                                       ((instr >> 8) & 0xf) |
   36208                                                       ((instr >> 1) & 0x10);
   36209                                                   DataType dt =
   36210                                                       ImmediateVmov::DecodeDt(
   36211                                                           cmode);
   36212                                                   if (dt.Is(
   36213                                                           kDataTypeValueInvalid)) {
   36214                                                     UnallocatedT32(instr);
   36215                                                     return;
   36216                                                   }
   36217                                                   unsigned rd =
   36218                                                       ExtractDRegister(instr,
   36219                                                                        22,
   36220                                                                        12);
   36221                                                   DOperand imm = ImmediateVmov::
   36222                                                       DecodeImmediate(
   36223                                                           cmode,
   36224                                                           (instr & 0xf) |
   36225                                                               ((instr >> 12) &
   36226                                                                0x70) |
   36227                                                               ((instr >> 21) &
   36228                                                                0x80));
   36229                                                   // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
   36230                                                   vmov(CurrentCond(),
   36231                                                        dt,
   36232                                                        DRegister(rd),
   36233                                                        imm);
   36234                                                   break;
   36235                                                 }
   36236                                                 case 0x00000e20: {
   36237                                                   // 0xef800e30
   36238                                                   if (((instr & 0x920) ==
   36239                                                        0x100) ||
   36240                                                       ((instr & 0x520) ==
   36241                                                        0x100) ||
   36242                                                       ((instr & 0x820) ==
   36243                                                        0x20) ||
   36244                                                       ((instr & 0x420) ==
   36245                                                        0x20) ||
   36246                                                       ((instr & 0x220) ==
   36247                                                        0x20) ||
   36248                                                       ((instr & 0x120) ==
   36249                                                        0x120)) {
   36250                                                     UnallocatedT32(instr);
   36251                                                     return;
   36252                                                   }
   36253                                                   unsigned cmode =
   36254                                                       ((instr >> 8) & 0xf) |
   36255                                                       ((instr >> 1) & 0x10);
   36256                                                   DataType dt =
   36257                                                       ImmediateVmov::DecodeDt(
   36258                                                           cmode);
   36259                                                   if (dt.Is(
   36260                                                           kDataTypeValueInvalid)) {
   36261                                                     UnallocatedT32(instr);
   36262                                                     return;
   36263                                                   }
   36264                                                   unsigned rd =
   36265                                                       ExtractDRegister(instr,
   36266                                                                        22,
   36267                                                                        12);
   36268                                                   DOperand imm = ImmediateVmov::
   36269                                                       DecodeImmediate(
   36270                                                           cmode,
   36271                                                           (instr & 0xf) |
   36272                                                               ((instr >> 12) &
   36273                                                                0x70) |
   36274                                                               ((instr >> 21) &
   36275                                                                0x80));
   36276                                                   // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
   36277                                                   vmov(CurrentCond(),
   36278                                                        dt,
   36279                                                        DRegister(rd),
   36280                                                        imm);
   36281                                                   break;
   36282                                                 }
   36283                                                 case 0x00000f00: {
   36284                                                   // 0xef800f10
   36285                                                   if (((instr & 0x920) ==
   36286                                                        0x100) ||
   36287                                                       ((instr & 0x520) ==
   36288                                                        0x100) ||
   36289                                                       ((instr & 0x820) ==
   36290                                                        0x20) ||
   36291                                                       ((instr & 0x420) ==
   36292                                                        0x20) ||
   36293                                                       ((instr & 0x220) ==
   36294                                                        0x20) ||
   36295                                                       ((instr & 0x120) ==
   36296                                                        0x120)) {
   36297                                                     UnallocatedT32(instr);
   36298                                                     return;
   36299                                                   }
   36300                                                   unsigned cmode =
   36301                                                       ((instr >> 8) & 0xf) |
   36302                                                       ((instr >> 1) & 0x10);
   36303                                                   DataType dt =
   36304                                                       ImmediateVmov::DecodeDt(
   36305                                                           cmode);
   36306                                                   if (dt.Is(
   36307                                                           kDataTypeValueInvalid)) {
   36308                                                     UnallocatedT32(instr);
   36309                                                     return;
   36310                                                   }
   36311                                                   unsigned rd =
   36312                                                       ExtractDRegister(instr,
   36313                                                                        22,
   36314                                                                        12);
   36315                                                   DOperand imm = ImmediateVmov::
   36316                                                       DecodeImmediate(
   36317                                                           cmode,
   36318                                                           (instr & 0xf) |
   36319                                                               ((instr >> 12) &
   36320                                                                0x70) |
   36321                                                               ((instr >> 21) &
   36322                                                                0x80));
   36323                                                   // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
   36324                                                   vmov(CurrentCond(),
   36325                                                        dt,
   36326                                                        DRegister(rd),
   36327                                                        imm);
   36328                                                   break;
   36329                                                 }
   36330                                                 default:
   36331                                                   UnallocatedT32(instr);
   36332                                                   break;
   36333                                               }
   36334                                               break;
   36335                                             }
   36336                                             default: {
   36337                                               if (((instr & 0x920) == 0x100) ||
   36338                                                   ((instr & 0x520) == 0x100) ||
   36339                                                   ((instr & 0x820) == 0x20) ||
   36340                                                   ((instr & 0x420) == 0x20) ||
   36341                                                   ((instr & 0x220) == 0x20) ||
   36342                                                   ((instr & 0x120) == 0x120)) {
   36343                                                 UnallocatedT32(instr);
   36344                                                 return;
   36345                                               }
   36346                                               unsigned cmode =
   36347                                                   ((instr >> 8) & 0xf) |
   36348                                                   ((instr >> 1) & 0x10);
   36349                                               DataType dt =
   36350                                                   ImmediateVmov::DecodeDt(
   36351                                                       cmode);
   36352                                               if (dt.Is(
   36353                                                       kDataTypeValueInvalid)) {
   36354                                                 UnallocatedT32(instr);
   36355                                                 return;
   36356                                               }
   36357                                               unsigned rd =
   36358                                                   ExtractDRegister(instr,
   36359                                                                    22,
   36360                                                                    12);
   36361                                               DOperand imm = ImmediateVmov::
   36362                                                   DecodeImmediate(cmode,
   36363                                                                   (instr &
   36364                                                                    0xf) |
   36365                                                                       ((instr >>
   36366                                                                         12) &
   36367                                                                        0x70) |
   36368                                                                       ((instr >>
   36369                                                                         21) &
   36370                                                                        0x80));
   36371                                               // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
   36372                                               vmov(CurrentCond(),
   36373                                                    dt,
   36374                                                    DRegister(rd),
   36375                                                    imm);
   36376                                               break;
   36377                                             }
   36378                                           }
   36379                                           break;
   36380                                         }
   36381                                       }
   36382                                       break;
   36383                                     }
   36384                                     default:
   36385                                       UnallocatedT32(instr);
   36386                                       break;
   36387                                   }
   36388                                   break;
   36389                                 }
   36390                                 default: {
   36391                                   if ((instr & 0x00000200) == 0x00000200) {
   36392                                     if (((instr & 0x200000) == 0x0)) {
   36393                                       UnallocatedT32(instr);
   36394                                       return;
   36395                                     }
   36396                                     DataType dt1 = Dt_op_U_1_Decode1(
   36397                                         ((instr >> 28) & 0x1) |
   36398                                         ((instr >> 7) & 0x2));
   36399                                     if (dt1.Is(kDataTypeValueInvalid)) {
   36400                                       UnallocatedT32(instr);
   36401                                       return;
   36402                                     }
   36403                                     DataType dt2 = Dt_op_U_1_Decode2(
   36404                                         ((instr >> 28) & 0x1) |
   36405                                         ((instr >> 7) & 0x2));
   36406                                     if (dt2.Is(kDataTypeValueInvalid)) {
   36407                                       UnallocatedT32(instr);
   36408                                       return;
   36409                                     }
   36410                                     unsigned rd =
   36411                                         ExtractDRegister(instr, 22, 12);
   36412                                     unsigned rm = ExtractDRegister(instr, 5, 0);
   36413                                     uint32_t fbits =
   36414                                         64 - ((instr >> 16) & 0x3f);
   36415                                     // VCVT{<c>}{<q>}.<dt>.<dt> <Dd>, <Dm>, #<fbits> ; T1 NOLINT(whitespace/line_length)
   36416                                     vcvt(CurrentCond(),
   36417                                          dt1,
   36418                                          dt2,
   36419                                          DRegister(rd),
   36420                                          DRegister(rm),
   36421                                          fbits);
   36422                                   } else {
   36423                                     UnallocatedT32(instr);
   36424                                   }
   36425                                   break;
   36426                                 }
   36427                               }
   36428                               break;
   36429                             }
   36430                             default:
   36431                               UnallocatedT32(instr);
   36432                               break;
   36433                           }
   36434                           break;
   36435                         }
   36436                       }
   36437                       break;
   36438                     }
   36439                     case 0x00800040: {
   36440                       // 0xef800050
   36441                       switch (instr & 0x00000c00) {
   36442                         case 0x00000000: {
   36443                           // 0xef800050
   36444                           switch (instr & 0x00380080) {
   36445                             case 0x00000000: {
   36446                               // 0xef800050
   36447                               switch (instr & 0x00000100) {
   36448                                 case 0x00000000: {
   36449                                   // 0xef800050
   36450                                   switch (instr & 0x00000200) {
   36451                                     default: {
   36452                                       switch (instr & 0x00000020) {
   36453                                         case 0x00000020: {
   36454                                           // 0xef800070
   36455                                           if (((instr & 0xd00) == 0x100) ||
   36456                                               ((instr & 0xd00) == 0x500) ||
   36457                                               ((instr & 0xd00) == 0x900) ||
   36458                                               ((instr & 0xe00) == 0xe00)) {
   36459                                             UnallocatedT32(instr);
   36460                                             return;
   36461                                           }
   36462                                           unsigned cmode = (instr >> 8) & 0xf;
   36463                                           DataType dt =
   36464                                               ImmediateVmvn::DecodeDt(cmode);
   36465                                           if (dt.Is(kDataTypeValueInvalid)) {
   36466                                             UnallocatedT32(instr);
   36467                                             return;
   36468                                           }
   36469                                           if (((instr >> 12) & 1) != 0) {
   36470                                             UnallocatedT32(instr);
   36471                                             return;
   36472                                           }
   36473                                           unsigned rd =
   36474                                               ExtractQRegister(instr, 22, 12);
   36475                                           QOperand imm =
   36476                                               ImmediateVmvn::DecodeImmediate(
   36477                                                   cmode,
   36478                                                   (instr & 0xf) |
   36479                                                       ((instr >> 12) & 0x70) |
   36480                                                       ((instr >> 21) & 0x80));
   36481                                           // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
   36482                                           vmvn(CurrentCond(),
   36483                                                dt,
   36484                                                QRegister(rd),
   36485                                                imm);
   36486                                           break;
   36487                                         }
   36488                                         default: {
   36489                                           if (((instr & 0x920) == 0x100) ||
   36490                                               ((instr & 0x520) == 0x100) ||
   36491                                               ((instr & 0x820) == 0x20) ||
   36492                                               ((instr & 0x420) == 0x20) ||
   36493                                               ((instr & 0x220) == 0x20) ||
   36494                                               ((instr & 0x120) == 0x120)) {
   36495                                             UnallocatedT32(instr);
   36496                                             return;
   36497                                           }
   36498                                           unsigned cmode =
   36499                                               ((instr >> 8) & 0xf) |
   36500                                               ((instr >> 1) & 0x10);
   36501                                           DataType dt =
   36502                                               ImmediateVmov::DecodeDt(cmode);
   36503                                           if (dt.Is(kDataTypeValueInvalid)) {
   36504                                             UnallocatedT32(instr);
   36505                                             return;
   36506                                           }
   36507                                           if (((instr >> 12) & 1) != 0) {
   36508                                             UnallocatedT32(instr);
   36509                                             return;
   36510                                           }
   36511                                           unsigned rd =
   36512                                               ExtractQRegister(instr, 22, 12);
   36513                                           QOperand imm =
   36514                                               ImmediateVmov::DecodeImmediate(
   36515                                                   cmode,
   36516                                                   (instr & 0xf) |
   36517                                                       ((instr >> 12) & 0x70) |
   36518                                                       ((instr >> 21) & 0x80));
   36519                                           // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
   36520                                           vmov(CurrentCond(),
   36521                                                dt,
   36522                                                QRegister(rd),
   36523                                                imm);
   36524                                           break;
   36525                                         }
   36526                                       }
   36527                                       break;
   36528                                     }
   36529                                   }
   36530                                   break;
   36531                                 }
   36532                                 case 0x00000100: {
   36533                                   // 0xef800150
   36534                                   switch (instr & 0x00000020) {
   36535                                     case 0x00000000: {
   36536                                       // 0xef800150
   36537                                       if (((instr & 0x100) == 0x0) ||
   36538                                           ((instr & 0xc00) == 0xc00)) {
   36539                                         UnallocatedT32(instr);
   36540                                         return;
   36541                                       }
   36542                                       unsigned cmode = (instr >> 8) & 0xf;
   36543                                       DataType dt =
   36544                                           ImmediateVorr::DecodeDt(cmode);
   36545                                       if (dt.Is(kDataTypeValueInvalid)) {
   36546                                         UnallocatedT32(instr);
   36547                                         return;
   36548                                       }
   36549                                       if (((instr >> 12) & 1) != 0) {
   36550                                         UnallocatedT32(instr);
   36551                                         return;
   36552                                       }
   36553                                       unsigned rd =
   36554                                           ExtractQRegister(instr, 22, 12);
   36555                                       QOperand imm =
   36556                                           ImmediateVorr::DecodeImmediate(
   36557                                               cmode,
   36558                                               (instr & 0xf) |
   36559                                                   ((instr >> 12) & 0x70) |
   36560                                                   ((instr >> 21) & 0x80));
   36561                                       // VORR{<c>}{<q>}.<dt> {<Qdn>}, <Qdn>, #<imm> ; T1 NOLINT(whitespace/line_length)
   36562                                       vorr(CurrentCond(),
   36563                                            dt,
   36564                                            QRegister(rd),
   36565                                            QRegister(rd),
   36566                                            imm);
   36567                                       break;
   36568                                     }
   36569                                     case 0x00000020: {
   36570                                       // 0xef800170
   36571                                       if (((instr & 0x100) == 0x0) ||
   36572                                           ((instr & 0xc00) == 0xc00)) {
   36573                                         UnallocatedT32(instr);
   36574                                         return;
   36575                                       }
   36576                                       unsigned cmode = (instr >> 8) & 0xf;
   36577                                       DataType dt =
   36578                                           ImmediateVbic::DecodeDt(cmode);
   36579                                       if (dt.Is(kDataTypeValueInvalid)) {
   36580                                         UnallocatedT32(instr);
   36581                                         return;
   36582                                       }
   36583                                       if (((instr >> 12) & 1) != 0) {
   36584                                         UnallocatedT32(instr);
   36585                                         return;
   36586                                       }
   36587                                       unsigned rd =
   36588                                           ExtractQRegister(instr, 22, 12);
   36589                                       QOperand imm =
   36590                                           ImmediateVbic::DecodeImmediate(
   36591                                               cmode,
   36592                                               (instr & 0xf) |
   36593                                                   ((instr >> 12) & 0x70) |
   36594                                                   ((instr >> 21) & 0x80));
   36595                                       // VBIC{<c>}{<q>}.<dt> {<Qdn>}, <Qdn>, #<imm> ; T1 NOLINT(whitespace/line_length)
   36596                                       vbic(CurrentCond(),
   36597                                            dt,
   36598                                            QRegister(rd),
   36599                                            QRegister(rd),
   36600                                            imm);
   36601                                       break;
   36602                                     }
   36603                                   }
   36604                                   break;
   36605                                 }
   36606                               }
   36607                               break;
   36608                             }
   36609                             default: {
   36610                               switch (instr & 0x00000300) {
   36611                                 case 0x00000000: {
   36612                                   // 0xef800050
   36613                                   if (((instr & 0x380080) == 0x0)) {
   36614                                     UnallocatedT32(instr);
   36615                                     return;
   36616                                   }
   36617                                   DataType dt =
   36618                                       Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
   36619                                                              ((instr >> 4) &
   36620                                                               0x8),
   36621                                                          (instr >> 28) & 0x1);
   36622                                   if (dt.Is(kDataTypeValueInvalid)) {
   36623                                     UnallocatedT32(instr);
   36624                                     return;
   36625                                   }
   36626                                   if (((instr >> 12) & 1) != 0) {
   36627                                     UnallocatedT32(instr);
   36628                                     return;
   36629                                   }
   36630                                   unsigned rd = ExtractQRegister(instr, 22, 12);
   36631                                   if ((instr & 1) != 0) {
   36632                                     UnallocatedT32(instr);
   36633                                     return;
   36634                                   }
   36635                                   unsigned rm = ExtractQRegister(instr, 5, 0);
   36636                                   uint32_t imm6 = (instr >> 16) & 0x3f;
   36637                                   uint32_t imm =
   36638                                       (dt.IsSize(64) ? 64
   36639                                                      : (dt.GetSize() * 2)) -
   36640                                       imm6;
   36641                                   // VSHR{<c>}{<q>}.<type><size> {<Qd>}, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   36642                                   vshr(CurrentCond(),
   36643                                        dt,
   36644                                        QRegister(rd),
   36645                                        QRegister(rm),
   36646                                        imm);
   36647                                   break;
   36648                                 }
   36649                                 case 0x00000100: {
   36650                                   // 0xef800150
   36651                                   if (((instr & 0x380080) == 0x0)) {
   36652                                     UnallocatedT32(instr);
   36653                                     return;
   36654                                   }
   36655                                   DataType dt =
   36656                                       Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
   36657                                                              ((instr >> 4) &
   36658                                                               0x8),
   36659                                                          (instr >> 28) & 0x1);
   36660                                   if (dt.Is(kDataTypeValueInvalid)) {
   36661                                     UnallocatedT32(instr);
   36662                                     return;
   36663                                   }
   36664                                   if (((instr >> 12) & 1) != 0) {
   36665                                     UnallocatedT32(instr);
   36666                                     return;
   36667                                   }
   36668                                   unsigned rd = ExtractQRegister(instr, 22, 12);
   36669                                   if ((instr & 1) != 0) {
   36670                                     UnallocatedT32(instr);
   36671                                     return;
   36672                                   }
   36673                                   unsigned rm = ExtractQRegister(instr, 5, 0);
   36674                                   uint32_t imm6 = (instr >> 16) & 0x3f;
   36675                                   uint32_t imm =
   36676                                       (dt.IsSize(64) ? 64
   36677                                                      : (dt.GetSize() * 2)) -
   36678                                       imm6;
   36679                                   // VSRA{<c>}{<q>}.<type><size> {<Qd>}, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   36680                                   vsra(CurrentCond(),
   36681                                        dt,
   36682                                        QRegister(rd),
   36683                                        QRegister(rm),
   36684                                        imm);
   36685                                   break;
   36686                                 }
   36687                                 case 0x00000200: {
   36688                                   // 0xef800250
   36689                                   if (((instr & 0x380080) == 0x0)) {
   36690                                     UnallocatedT32(instr);
   36691                                     return;
   36692                                   }
   36693                                   DataType dt =
   36694                                       Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
   36695                                                              ((instr >> 4) &
   36696                                                               0x8),
   36697                                                          (instr >> 28) & 0x1);
   36698                                   if (dt.Is(kDataTypeValueInvalid)) {
   36699                                     UnallocatedT32(instr);
   36700                                     return;
   36701                                   }
   36702                                   if (((instr >> 12) & 1) != 0) {
   36703                                     UnallocatedT32(instr);
   36704                                     return;
   36705                                   }
   36706                                   unsigned rd = ExtractQRegister(instr, 22, 12);
   36707                                   if ((instr & 1) != 0) {
   36708                                     UnallocatedT32(instr);
   36709                                     return;
   36710                                   }
   36711                                   unsigned rm = ExtractQRegister(instr, 5, 0);
   36712                                   uint32_t imm6 = (instr >> 16) & 0x3f;
   36713                                   uint32_t imm =
   36714                                       (dt.IsSize(64) ? 64
   36715                                                      : (dt.GetSize() * 2)) -
   36716                                       imm6;
   36717                                   // VRSHR{<c>}{<q>}.<type><size> {<Qd>}, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   36718                                   vrshr(CurrentCond(),
   36719                                         dt,
   36720                                         QRegister(rd),
   36721                                         QRegister(rm),
   36722                                         imm);
   36723                                   break;
   36724                                 }
   36725                                 case 0x00000300: {
   36726                                   // 0xef800350
   36727                                   if (((instr & 0x380080) == 0x0)) {
   36728                                     UnallocatedT32(instr);
   36729                                     return;
   36730                                   }
   36731                                   DataType dt =
   36732                                       Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
   36733                                                              ((instr >> 4) &
   36734                                                               0x8),
   36735                                                          (instr >> 28) & 0x1);
   36736                                   if (dt.Is(kDataTypeValueInvalid)) {
   36737                                     UnallocatedT32(instr);
   36738                                     return;
   36739                                   }
   36740                                   if (((instr >> 12) & 1) != 0) {
   36741                                     UnallocatedT32(instr);
   36742                                     return;
   36743                                   }
   36744                                   unsigned rd = ExtractQRegister(instr, 22, 12);
   36745                                   if ((instr & 1) != 0) {
   36746                                     UnallocatedT32(instr);
   36747                                     return;
   36748                                   }
   36749                                   unsigned rm = ExtractQRegister(instr, 5, 0);
   36750                                   uint32_t imm6 = (instr >> 16) & 0x3f;
   36751                                   uint32_t imm =
   36752                                       (dt.IsSize(64) ? 64
   36753                                                      : (dt.GetSize() * 2)) -
   36754                                       imm6;
   36755                                   // VRSRA{<c>}{<q>}.<type><size> {<Qd>}, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   36756                                   vrsra(CurrentCond(),
   36757                                         dt,
   36758                                         QRegister(rd),
   36759                                         QRegister(rm),
   36760                                         imm);
   36761                                   break;
   36762                                 }
   36763                               }
   36764                               break;
   36765                             }
   36766                           }
   36767                           break;
   36768                         }
   36769                         case 0x00000400: {
   36770                           // 0xef800450
   36771                           switch (instr & 0x00380080) {
   36772                             case 0x00000000: {
   36773                               // 0xef800450
   36774                               switch (instr & 0x00000100) {
   36775                                 case 0x00000000: {
   36776                                   // 0xef800450
   36777                                   switch (instr & 0x00000200) {
   36778                                     default: {
   36779                                       switch (instr & 0x00000020) {
   36780                                         case 0x00000020: {
   36781                                           // 0xef800470
   36782                                           if (((instr & 0xd00) == 0x100) ||
   36783                                               ((instr & 0xd00) == 0x500) ||
   36784                                               ((instr & 0xd00) == 0x900) ||
   36785                                               ((instr & 0xe00) == 0xe00)) {
   36786                                             UnallocatedT32(instr);
   36787                                             return;
   36788                                           }
   36789                                           unsigned cmode = (instr >> 8) & 0xf;
   36790                                           DataType dt =
   36791                                               ImmediateVmvn::DecodeDt(cmode);
   36792                                           if (dt.Is(kDataTypeValueInvalid)) {
   36793                                             UnallocatedT32(instr);
   36794                                             return;
   36795                                           }
   36796                                           if (((instr >> 12) & 1) != 0) {
   36797                                             UnallocatedT32(instr);
   36798                                             return;
   36799                                           }
   36800                                           unsigned rd =
   36801                                               ExtractQRegister(instr, 22, 12);
   36802                                           QOperand imm =
   36803                                               ImmediateVmvn::DecodeImmediate(
   36804                                                   cmode,
   36805                                                   (instr & 0xf) |
   36806                                                       ((instr >> 12) & 0x70) |
   36807                                                       ((instr >> 21) & 0x80));
   36808                                           // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
   36809                                           vmvn(CurrentCond(),
   36810                                                dt,
   36811                                                QRegister(rd),
   36812                                                imm);
   36813                                           break;
   36814                                         }
   36815                                         default: {
   36816                                           if (((instr & 0x920) == 0x100) ||
   36817                                               ((instr & 0x520) == 0x100) ||
   36818                                               ((instr & 0x820) == 0x20) ||
   36819                                               ((instr & 0x420) == 0x20) ||
   36820                                               ((instr & 0x220) == 0x20) ||
   36821                                               ((instr & 0x120) == 0x120)) {
   36822                                             UnallocatedT32(instr);
   36823                                             return;
   36824                                           }
   36825                                           unsigned cmode =
   36826                                               ((instr >> 8) & 0xf) |
   36827                                               ((instr >> 1) & 0x10);
   36828                                           DataType dt =
   36829                                               ImmediateVmov::DecodeDt(cmode);
   36830                                           if (dt.Is(kDataTypeValueInvalid)) {
   36831                                             UnallocatedT32(instr);
   36832                                             return;
   36833                                           }
   36834                                           if (((instr >> 12) & 1) != 0) {
   36835                                             UnallocatedT32(instr);
   36836                                             return;
   36837                                           }
   36838                                           unsigned rd =
   36839                                               ExtractQRegister(instr, 22, 12);
   36840                                           QOperand imm =
   36841                                               ImmediateVmov::DecodeImmediate(
   36842                                                   cmode,
   36843                                                   (instr & 0xf) |
   36844                                                       ((instr >> 12) & 0x70) |
   36845                                                       ((instr >> 21) & 0x80));
   36846                                           // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
   36847                                           vmov(CurrentCond(),
   36848                                                dt,
   36849                                                QRegister(rd),
   36850                                                imm);
   36851                                           break;
   36852                                         }
   36853                                       }
   36854                                       break;
   36855                                     }
   36856                                   }
   36857                                   break;
   36858                                 }
   36859                                 case 0x00000100: {
   36860                                   // 0xef800550
   36861                                   switch (instr & 0x00000020) {
   36862                                     case 0x00000000: {
   36863                                       // 0xef800550
   36864                                       if (((instr & 0x100) == 0x0) ||
   36865                                           ((instr & 0xc00) == 0xc00)) {
   36866                                         UnallocatedT32(instr);
   36867                                         return;
   36868                                       }
   36869                                       unsigned cmode = (instr >> 8) & 0xf;
   36870                                       DataType dt =
   36871                                           ImmediateVorr::DecodeDt(cmode);
   36872                                       if (dt.Is(kDataTypeValueInvalid)) {
   36873                                         UnallocatedT32(instr);
   36874                                         return;
   36875                                       }
   36876                                       if (((instr >> 12) & 1) != 0) {
   36877                                         UnallocatedT32(instr);
   36878                                         return;
   36879                                       }
   36880                                       unsigned rd =
   36881                                           ExtractQRegister(instr, 22, 12);
   36882                                       QOperand imm =
   36883                                           ImmediateVorr::DecodeImmediate(
   36884                                               cmode,
   36885                                               (instr & 0xf) |
   36886                                                   ((instr >> 12) & 0x70) |
   36887                                                   ((instr >> 21) & 0x80));
   36888                                       // VORR{<c>}{<q>}.<dt> {<Qdn>}, <Qdn>, #<imm> ; T1 NOLINT(whitespace/line_length)
   36889                                       vorr(CurrentCond(),
   36890                                            dt,
   36891                                            QRegister(rd),
   36892                                            QRegister(rd),
   36893                                            imm);
   36894                                       break;
   36895                                     }
   36896                                     case 0x00000020: {
   36897                                       // 0xef800570
   36898                                       if (((instr & 0x100) == 0x0) ||
   36899                                           ((instr & 0xc00) == 0xc00)) {
   36900                                         UnallocatedT32(instr);
   36901                                         return;
   36902                                       }
   36903                                       unsigned cmode = (instr >> 8) & 0xf;
   36904                                       DataType dt =
   36905                                           ImmediateVbic::DecodeDt(cmode);
   36906                                       if (dt.Is(kDataTypeValueInvalid)) {
   36907                                         UnallocatedT32(instr);
   36908                                         return;
   36909                                       }
   36910                                       if (((instr >> 12) & 1) != 0) {
   36911                                         UnallocatedT32(instr);
   36912                                         return;
   36913                                       }
   36914                                       unsigned rd =
   36915                                           ExtractQRegister(instr, 22, 12);
   36916                                       QOperand imm =
   36917                                           ImmediateVbic::DecodeImmediate(
   36918                                               cmode,
   36919                                               (instr & 0xf) |
   36920                                                   ((instr >> 12) & 0x70) |
   36921                                                   ((instr >> 21) & 0x80));
   36922                                       // VBIC{<c>}{<q>}.<dt> {<Qdn>}, <Qdn>, #<imm> ; T1 NOLINT(whitespace/line_length)
   36923                                       vbic(CurrentCond(),
   36924                                            dt,
   36925                                            QRegister(rd),
   36926                                            QRegister(rd),
   36927                                            imm);
   36928                                       break;
   36929                                     }
   36930                                   }
   36931                                   break;
   36932                                 }
   36933                               }
   36934                               break;
   36935                             }
   36936                             default: {
   36937                               switch (instr & 0x00000300) {
   36938                                 case 0x00000000: {
   36939                                   // 0xef800450
   36940                                   if ((instr & 0x10000000) == 0x10000000) {
   36941                                     if (((instr & 0x380080) == 0x0)) {
   36942                                       UnallocatedT32(instr);
   36943                                       return;
   36944                                     }
   36945                                     DataType dt = Dt_L_imm6_4_Decode(
   36946                                         ((instr >> 19) & 0x7) |
   36947                                         ((instr >> 4) & 0x8));
   36948                                     if (dt.Is(kDataTypeValueInvalid)) {
   36949                                       UnallocatedT32(instr);
   36950                                       return;
   36951                                     }
   36952                                     if (((instr >> 12) & 1) != 0) {
   36953                                       UnallocatedT32(instr);
   36954                                       return;
   36955                                     }
   36956                                     unsigned rd =
   36957                                         ExtractQRegister(instr, 22, 12);
   36958                                     if ((instr & 1) != 0) {
   36959                                       UnallocatedT32(instr);
   36960                                       return;
   36961                                     }
   36962                                     unsigned rm = ExtractQRegister(instr, 5, 0);
   36963                                     uint32_t imm6 = (instr >> 16) & 0x3f;
   36964                                     uint32_t imm =
   36965                                         (dt.IsSize(64) ? 64
   36966                                                        : (dt.GetSize() * 2)) -
   36967                                         imm6;
   36968                                     // VSRI{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   36969                                     vsri(CurrentCond(),
   36970                                          dt,
   36971                                          QRegister(rd),
   36972                                          QRegister(rm),
   36973                                          imm);
   36974                                   } else {
   36975                                     UnallocatedT32(instr);
   36976                                   }
   36977                                   break;
   36978                                 }
   36979                                 case 0x00000100: {
   36980                                   // 0xef800550
   36981                                   switch (instr & 0x10000000) {
   36982                                     case 0x00000000: {
   36983                                       // 0xef800550
   36984                                       if (((instr & 0x380080) == 0x0)) {
   36985                                         UnallocatedT32(instr);
   36986                                         return;
   36987                                       }
   36988                                       DataType dt = Dt_L_imm6_3_Decode(
   36989                                           ((instr >> 19) & 0x7) |
   36990                                           ((instr >> 4) & 0x8));
   36991                                       if (dt.Is(kDataTypeValueInvalid)) {
   36992                                         UnallocatedT32(instr);
   36993                                         return;
   36994                                       }
   36995                                       if (((instr >> 12) & 1) != 0) {
   36996                                         UnallocatedT32(instr);
   36997                                         return;
   36998                                       }
   36999                                       unsigned rd =
   37000                                           ExtractQRegister(instr, 22, 12);
   37001                                       if ((instr & 1) != 0) {
   37002                                         UnallocatedT32(instr);
   37003                                         return;
   37004                                       }
   37005                                       unsigned rm =
   37006                                           ExtractQRegister(instr, 5, 0);
   37007                                       uint32_t imm6 = (instr >> 16) & 0x3f;
   37008                                       uint32_t imm =
   37009                                           imm6 -
   37010                                           (dt.IsSize(64) ? 0 : dt.GetSize());
   37011                                       // VSHL{<c>}{<q>}.I<size> {<Qd>}, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   37012                                       vshl(CurrentCond(),
   37013                                            dt,
   37014                                            QRegister(rd),
   37015                                            QRegister(rm),
   37016                                            imm);
   37017                                       break;
   37018                                     }
   37019                                     case 0x10000000: {
   37020                                       // 0xff800550
   37021                                       if (((instr & 0x380080) == 0x0)) {
   37022                                         UnallocatedT32(instr);
   37023                                         return;
   37024                                       }
   37025                                       DataType dt = Dt_L_imm6_4_Decode(
   37026                                           ((instr >> 19) & 0x7) |
   37027                                           ((instr >> 4) & 0x8));
   37028                                       if (dt.Is(kDataTypeValueInvalid)) {
   37029                                         UnallocatedT32(instr);
   37030                                         return;
   37031                                       }
   37032                                       if (((instr >> 12) & 1) != 0) {
   37033                                         UnallocatedT32(instr);
   37034                                         return;
   37035                                       }
   37036                                       unsigned rd =
   37037                                           ExtractQRegister(instr, 22, 12);
   37038                                       if ((instr & 1) != 0) {
   37039                                         UnallocatedT32(instr);
   37040                                         return;
   37041                                       }
   37042                                       unsigned rm =
   37043                                           ExtractQRegister(instr, 5, 0);
   37044                                       uint32_t imm6 = (instr >> 16) & 0x3f;
   37045                                       uint32_t imm =
   37046                                           imm6 -
   37047                                           (dt.IsSize(64) ? 0 : dt.GetSize());
   37048                                       // VSLI{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   37049                                       vsli(CurrentCond(),
   37050                                            dt,
   37051                                            QRegister(rd),
   37052                                            QRegister(rm),
   37053                                            imm);
   37054                                       break;
   37055                                     }
   37056                                   }
   37057                                   break;
   37058                                 }
   37059                                 case 0x00000200: {
   37060                                   // 0xef800650
   37061                                   if (((instr & 0x380080) == 0x0)) {
   37062                                     UnallocatedT32(instr);
   37063                                     return;
   37064                                   }
   37065                                   DataType dt =
   37066                                       Dt_L_imm6_2_Decode(((instr >> 19) & 0x7) |
   37067                                                              ((instr >> 4) &
   37068                                                               0x8),
   37069                                                          (instr >> 28) & 0x1);
   37070                                   if (dt.Is(kDataTypeValueInvalid)) {
   37071                                     UnallocatedT32(instr);
   37072                                     return;
   37073                                   }
   37074                                   if (((instr >> 12) & 1) != 0) {
   37075                                     UnallocatedT32(instr);
   37076                                     return;
   37077                                   }
   37078                                   unsigned rd = ExtractQRegister(instr, 22, 12);
   37079                                   if ((instr & 1) != 0) {
   37080                                     UnallocatedT32(instr);
   37081                                     return;
   37082                                   }
   37083                                   unsigned rm = ExtractQRegister(instr, 5, 0);
   37084                                   uint32_t imm6 = (instr >> 16) & 0x3f;
   37085                                   uint32_t imm =
   37086                                       imm6 - (dt.IsSize(64) ? 0 : dt.GetSize());
   37087                                   // VQSHLU{<c>}{<q>}.<type><size> {<Qd>}, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   37088                                   vqshlu(CurrentCond(),
   37089                                          dt,
   37090                                          QRegister(rd),
   37091                                          QRegister(rm),
   37092                                          imm);
   37093                                   break;
   37094                                 }
   37095                                 case 0x00000300: {
   37096                                   // 0xef800750
   37097                                   if (((instr & 0x380080) == 0x0)) {
   37098                                     UnallocatedT32(instr);
   37099                                     return;
   37100                                   }
   37101                                   DataType dt =
   37102                                       Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
   37103                                                              ((instr >> 4) &
   37104                                                               0x8),
   37105                                                          (instr >> 28) & 0x1);
   37106                                   if (dt.Is(kDataTypeValueInvalid)) {
   37107                                     UnallocatedT32(instr);
   37108                                     return;
   37109                                   }
   37110                                   if (((instr >> 12) & 1) != 0) {
   37111                                     UnallocatedT32(instr);
   37112                                     return;
   37113                                   }
   37114                                   unsigned rd = ExtractQRegister(instr, 22, 12);
   37115                                   if ((instr & 1) != 0) {
   37116                                     UnallocatedT32(instr);
   37117                                     return;
   37118                                   }
   37119                                   unsigned rm = ExtractQRegister(instr, 5, 0);
   37120                                   uint32_t imm6 = (instr >> 16) & 0x3f;
   37121                                   uint32_t imm =
   37122                                       imm6 - (dt.IsSize(64) ? 0 : dt.GetSize());
   37123                                   // VQSHL{<c>}{<q>}.<type><size> {<Qd>}, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   37124                                   vqshl(CurrentCond(),
   37125                                         dt,
   37126                                         QRegister(rd),
   37127                                         QRegister(rm),
   37128                                         imm);
   37129                                   break;
   37130                                 }
   37131                               }
   37132                               break;
   37133                             }
   37134                           }
   37135                           break;
   37136                         }
   37137                         case 0x00000800: {
   37138                           // 0xef800850
   37139                           switch (instr & 0x00000080) {
   37140                             case 0x00000000: {
   37141                               // 0xef800850
   37142                               switch (instr & 0x00380000) {
   37143                                 case 0x00000000: {
   37144                                   // 0xef800850
   37145                                   switch (instr & 0x00000100) {
   37146                                     case 0x00000000: {
   37147                                       // 0xef800850
   37148                                       switch (instr & 0x00000200) {
   37149                                         default: {
   37150                                           switch (instr & 0x00000020) {
   37151                                             case 0x00000020: {
   37152                                               // 0xef800870
   37153                                               if (((instr & 0xd00) == 0x100) ||
   37154                                                   ((instr & 0xd00) == 0x500) ||
   37155                                                   ((instr & 0xd00) == 0x900) ||
   37156                                                   ((instr & 0xe00) == 0xe00)) {
   37157                                                 UnallocatedT32(instr);
   37158                                                 return;
   37159                                               }
   37160                                               unsigned cmode =
   37161                                                   (instr >> 8) & 0xf;
   37162                                               DataType dt =
   37163                                                   ImmediateVmvn::DecodeDt(
   37164                                                       cmode);
   37165                                               if (dt.Is(
   37166                                                       kDataTypeValueInvalid)) {
   37167                                                 UnallocatedT32(instr);
   37168                                                 return;
   37169                                               }
   37170                                               if (((instr >> 12) & 1) != 0) {
   37171                                                 UnallocatedT32(instr);
   37172                                                 return;
   37173                                               }
   37174                                               unsigned rd =
   37175                                                   ExtractQRegister(instr,
   37176                                                                    22,
   37177                                                                    12);
   37178                                               QOperand imm = ImmediateVmvn::
   37179                                                   DecodeImmediate(cmode,
   37180                                                                   (instr &
   37181                                                                    0xf) |
   37182                                                                       ((instr >>
   37183                                                                         12) &
   37184                                                                        0x70) |
   37185                                                                       ((instr >>
   37186                                                                         21) &
   37187                                                                        0x80));
   37188                                               // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
   37189                                               vmvn(CurrentCond(),
   37190                                                    dt,
   37191                                                    QRegister(rd),
   37192                                                    imm);
   37193                                               break;
   37194                                             }
   37195                                             default: {
   37196                                               if (((instr & 0x920) == 0x100) ||
   37197                                                   ((instr & 0x520) == 0x100) ||
   37198                                                   ((instr & 0x820) == 0x20) ||
   37199                                                   ((instr & 0x420) == 0x20) ||
   37200                                                   ((instr & 0x220) == 0x20) ||
   37201                                                   ((instr & 0x120) == 0x120)) {
   37202                                                 UnallocatedT32(instr);
   37203                                                 return;
   37204                                               }
   37205                                               unsigned cmode =
   37206                                                   ((instr >> 8) & 0xf) |
   37207                                                   ((instr >> 1) & 0x10);
   37208                                               DataType dt =
   37209                                                   ImmediateVmov::DecodeDt(
   37210                                                       cmode);
   37211                                               if (dt.Is(
   37212                                                       kDataTypeValueInvalid)) {
   37213                                                 UnallocatedT32(instr);
   37214                                                 return;
   37215                                               }
   37216                                               if (((instr >> 12) & 1) != 0) {
   37217                                                 UnallocatedT32(instr);
   37218                                                 return;
   37219                                               }
   37220                                               unsigned rd =
   37221                                                   ExtractQRegister(instr,
   37222                                                                    22,
   37223                                                                    12);
   37224                                               QOperand imm = ImmediateVmov::
   37225                                                   DecodeImmediate(cmode,
   37226                                                                   (instr &
   37227                                                                    0xf) |
   37228                                                                       ((instr >>
   37229                                                                         12) &
   37230                                                                        0x70) |
   37231                                                                       ((instr >>
   37232                                                                         21) &
   37233                                                                        0x80));
   37234                                               // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
   37235                                               vmov(CurrentCond(),
   37236                                                    dt,
   37237                                                    QRegister(rd),
   37238                                                    imm);
   37239                                               break;
   37240                                             }
   37241                                           }
   37242                                           break;
   37243                                         }
   37244                                       }
   37245                                       break;
   37246                                     }
   37247                                     case 0x00000100: {
   37248                                       // 0xef800950
   37249                                       switch (instr & 0x00000020) {
   37250                                         case 0x00000000: {
   37251                                           // 0xef800950
   37252                                           if (((instr & 0x100) == 0x0) ||
   37253                                               ((instr & 0xc00) == 0xc00)) {
   37254                                             UnallocatedT32(instr);
   37255                                             return;
   37256                                           }
   37257                                           unsigned cmode = (instr >> 8) & 0xf;
   37258                                           DataType dt =
   37259                                               ImmediateVorr::DecodeDt(cmode);
   37260                                           if (dt.Is(kDataTypeValueInvalid)) {
   37261                                             UnallocatedT32(instr);
   37262                                             return;
   37263                                           }
   37264                                           if (((instr >> 12) & 1) != 0) {
   37265                                             UnallocatedT32(instr);
   37266                                             return;
   37267                                           }
   37268                                           unsigned rd =
   37269                                               ExtractQRegister(instr, 22, 12);
   37270                                           QOperand imm =
   37271                                               ImmediateVorr::DecodeImmediate(
   37272                                                   cmode,
   37273                                                   (instr & 0xf) |
   37274                                                       ((instr >> 12) & 0x70) |
   37275                                                       ((instr >> 21) & 0x80));
   37276                                           // VORR{<c>}{<q>}.<dt> {<Qdn>}, <Qdn>, #<imm> ; T1 NOLINT(whitespace/line_length)
   37277                                           vorr(CurrentCond(),
   37278                                                dt,
   37279                                                QRegister(rd),
   37280                                                QRegister(rd),
   37281                                                imm);
   37282                                           break;
   37283                                         }
   37284                                         case 0x00000020: {
   37285                                           // 0xef800970
   37286                                           if (((instr & 0x100) == 0x0) ||
   37287                                               ((instr & 0xc00) == 0xc00)) {
   37288                                             UnallocatedT32(instr);
   37289                                             return;
   37290                                           }
   37291                                           unsigned cmode = (instr >> 8) & 0xf;
   37292                                           DataType dt =
   37293                                               ImmediateVbic::DecodeDt(cmode);
   37294                                           if (dt.Is(kDataTypeValueInvalid)) {
   37295                                             UnallocatedT32(instr);
   37296                                             return;
   37297                                           }
   37298                                           if (((instr >> 12) & 1) != 0) {
   37299                                             UnallocatedT32(instr);
   37300                                             return;
   37301                                           }
   37302                                           unsigned rd =
   37303                                               ExtractQRegister(instr, 22, 12);
   37304                                           QOperand imm =
   37305                                               ImmediateVbic::DecodeImmediate(
   37306                                                   cmode,
   37307                                                   (instr & 0xf) |
   37308                                                       ((instr >> 12) & 0x70) |
   37309                                                       ((instr >> 21) & 0x80));
   37310                                           // VBIC{<c>}{<q>}.<dt> {<Qdn>}, <Qdn>, #<imm> ; T1 NOLINT(whitespace/line_length)
   37311                                           vbic(CurrentCond(),
   37312                                                dt,
   37313                                                QRegister(rd),
   37314                                                QRegister(rd),
   37315                                                imm);
   37316                                           break;
   37317                                         }
   37318                                       }
   37319                                       break;
   37320                                     }
   37321                                   }
   37322                                   break;
   37323                                 }
   37324                                 default: {
   37325                                   switch (instr & 0x00000300) {
   37326                                     case 0x00000000: {
   37327                                       // 0xef800850
   37328                                       switch (instr & 0x10000000) {
   37329                                         case 0x00000000: {
   37330                                           // 0xef800850
   37331                                           if (((instr & 0x380000) == 0x0)) {
   37332                                             UnallocatedT32(instr);
   37333                                             return;
   37334                                           }
   37335                                           DataType dt = Dt_imm6_3_Decode(
   37336                                               (instr >> 19) & 0x7);
   37337                                           if (dt.Is(kDataTypeValueInvalid)) {
   37338                                             UnallocatedT32(instr);
   37339                                             return;
   37340                                           }
   37341                                           unsigned rd =
   37342                                               ExtractDRegister(instr, 22, 12);
   37343                                           if ((instr & 1) != 0) {
   37344                                             UnallocatedT32(instr);
   37345                                             return;
   37346                                           }
   37347                                           unsigned rm =
   37348                                               ExtractQRegister(instr, 5, 0);
   37349                                           uint32_t imm6 = (instr >> 16) & 0x3f;
   37350                                           uint32_t imm = dt.GetSize() - imm6;
   37351                                           // VRSHRN{<c>}{<q>}.I<size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   37352                                           vrshrn(CurrentCond(),
   37353                                                  dt,
   37354                                                  DRegister(rd),
   37355                                                  QRegister(rm),
   37356                                                  imm);
   37357                                           break;
   37358                                         }
   37359                                         case 0x10000000: {
   37360                                           // 0xff800850
   37361                                           if (((instr & 0x380000) == 0x0)) {
   37362                                             UnallocatedT32(instr);
   37363                                             return;
   37364                                           }
   37365                                           DataType dt =
   37366                                               Dt_imm6_2_Decode((instr >> 19) &
   37367                                                                    0x7,
   37368                                                                (instr >> 28) &
   37369                                                                    0x1);
   37370                                           if (dt.Is(kDataTypeValueInvalid)) {
   37371                                             UnallocatedT32(instr);
   37372                                             return;
   37373                                           }
   37374                                           unsigned rd =
   37375                                               ExtractDRegister(instr, 22, 12);
   37376                                           if ((instr & 1) != 0) {
   37377                                             UnallocatedT32(instr);
   37378                                             return;
   37379                                           }
   37380                                           unsigned rm =
   37381                                               ExtractQRegister(instr, 5, 0);
   37382                                           uint32_t imm6 = (instr >> 16) & 0x3f;
   37383                                           uint32_t imm = dt.GetSize() - imm6;
   37384                                           // VQRSHRUN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   37385                                           vqrshrun(CurrentCond(),
   37386                                                    dt,
   37387                                                    DRegister(rd),
   37388                                                    QRegister(rm),
   37389                                                    imm);
   37390                                           break;
   37391                                         }
   37392                                       }
   37393                                       break;
   37394                                     }
   37395                                     case 0x00000100: {
   37396                                       // 0xef800950
   37397                                       if (((instr & 0x380000) == 0x0)) {
   37398                                         UnallocatedT32(instr);
   37399                                         return;
   37400                                       }
   37401                                       DataType dt =
   37402                                           Dt_imm6_1_Decode((instr >> 19) & 0x7,
   37403                                                            (instr >> 28) & 0x1);
   37404                                       if (dt.Is(kDataTypeValueInvalid)) {
   37405                                         UnallocatedT32(instr);
   37406                                         return;
   37407                                       }
   37408                                       unsigned rd =
   37409                                           ExtractDRegister(instr, 22, 12);
   37410                                       if ((instr & 1) != 0) {
   37411                                         UnallocatedT32(instr);
   37412                                         return;
   37413                                       }
   37414                                       unsigned rm =
   37415                                           ExtractQRegister(instr, 5, 0);
   37416                                       uint32_t imm6 = (instr >> 16) & 0x3f;
   37417                                       uint32_t imm = dt.GetSize() - imm6;
   37418                                       // VQRSHRN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
   37419                                       vqrshrn(CurrentCond(),
   37420                                               dt,
   37421                                               DRegister(rd),
   37422                                               QRegister(rm),
   37423                                               imm);
   37424                                       break;
   37425                                     }
   37426                                     default:
   37427                                       UnallocatedT32(instr);
   37428                                       break;
   37429                                   }
   37430                                   break;
   37431                                 }
   37432                               }
   37433                               break;
   37434                             }
   37435                             default:
   37436                               UnallocatedT32(instr);
   37437                               break;
   37438                           }
   37439                           break;
   37440                         }
   37441                         case 0x00000c00: {
   37442                           // 0xef800c50
   37443                           switch (instr & 0x00000080) {
   37444                             case 0x00000000: {
   37445                               // 0xef800c50
   37446                               switch (instr & 0x00200000) {
   37447                                 case 0x00000000: {
   37448                                   // 0xef800c50
   37449                                   switch (instr & 0x00180000) {
   37450                                     case 0x00000000: {
   37451                                       // 0xef800c50
   37452                                       switch (instr & 0x00000300) {
   37453                                         case 0x00000200: {
   37454                                           // 0xef800e50
   37455                                           if (((instr & 0x920) == 0x100) ||
   37456                                               ((instr & 0x520) == 0x100) ||
   37457                                               ((instr & 0x820) == 0x20) ||
   37458                                               ((instr & 0x420) == 0x20) ||
   37459                                               ((instr & 0x220) == 0x20) ||
   37460                                               ((instr & 0x120) == 0x120)) {
   37461                                             UnallocatedT32(instr);
   37462                                             return;
   37463                                           }
   37464                                           unsigned cmode =
   37465                                               ((instr >> 8) & 0xf) |
   37466                                               ((instr >> 1) & 0x10);
   37467                                           DataType dt =
   37468                                               ImmediateVmov::DecodeDt(cmode);
   37469                                           if (dt.Is(kDataTypeValueInvalid)) {
   37470                                             UnallocatedT32(instr);
   37471                                             return;
   37472                                           }
   37473                                           if (((instr >> 12) & 1) != 0) {
   37474                                             UnallocatedT32(instr);
   37475                                             return;
   37476                                           }
   37477                                           unsigned rd =
   37478                                               ExtractQRegister(instr, 22, 12);
   37479                                           QOperand imm =
   37480                                               ImmediateVmov::DecodeImmediate(
   37481                                                   cmode,
   37482                                                   (instr & 0xf) |
   37483                                                       ((instr >> 12) & 0x70) |
   37484                                                       ((instr >> 21) & 0x80));
   37485                                           // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
   37486                                           vmov(CurrentCond(),
   37487                                                dt,
   37488                                                QRegister(rd),
   37489                                                imm);
   37490                                           break;
   37491                                         }
   37492                                         case 0x00000300: {
   37493                                           // 0xef800f50
   37494                                           if (((instr & 0x920) == 0x100) ||
   37495                                               ((instr & 0x520) == 0x100) ||
   37496                                               ((instr & 0x820) == 0x20) ||
   37497                                               ((instr & 0x420) == 0x20) ||
   37498                                               ((instr & 0x220) == 0x20) ||
   37499                                               ((instr & 0x120) == 0x120)) {
   37500                                             UnallocatedT32(instr);
   37501                                             return;
   37502                                           }
   37503                                           unsigned cmode =
   37504                                               ((instr >> 8) & 0xf) |
   37505                                               ((instr >> 1) & 0x10);
   37506                                           DataType dt =
   37507                                               ImmediateVmov::DecodeDt(cmode);
   37508                                           if (dt.Is(kDataTypeValueInvalid)) {
   37509                                             UnallocatedT32(instr);
   37510                                             return;
   37511                                           }
   37512                                           if (((instr >> 12) & 1) != 0) {
   37513                                             UnallocatedT32(instr);
   37514                                             return;
   37515                                           }
   37516                                           unsigned rd =
   37517                                               ExtractQRegister(instr, 22, 12);
   37518                                           QOperand imm =
   37519                                               ImmediateVmov::DecodeImmediate(
   37520                                                   cmode,
   37521                                                   (instr & 0xf) |
   37522                                                       ((instr >> 12) & 0x70) |
   37523                                                       ((instr >> 21) & 0x80));
   37524                                           // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
   37525                                           vmov(CurrentCond(),
   37526                                                dt,
   37527                                                QRegister(rd),
   37528                                                imm);
   37529                                           break;
   37530                                         }
   37531                                         default: {
   37532                                           switch (instr & 0x00000020) {
   37533                                             case 0x00000020: {
   37534                                               // 0xef800c70
   37535                                               switch (instr & 0x00000f20) {
   37536                                                 case 0x00000000: {
   37537                                                   // 0xef800c50
   37538                                                   if (((instr & 0x920) ==
   37539                                                        0x100) ||
   37540                                                       ((instr & 0x520) ==
   37541                                                        0x100) ||
   37542                                                       ((instr & 0x820) ==
   37543                                                        0x20) ||
   37544                                                       ((instr & 0x420) ==
   37545                                                        0x20) ||
   37546                                                       ((instr & 0x220) ==
   37547                                                        0x20) ||
   37548                                                       ((instr & 0x120) ==
   37549                                                        0x120)) {
   37550                                                     UnallocatedT32(instr);
   37551                                                     return;
   37552                                                   }
   37553                                                   unsigned cmode =
   37554                                                       ((instr >> 8) & 0xf) |
   37555                                                       ((instr >> 1) & 0x10);
   37556                                                   DataType dt =
   37557                                                       ImmediateVmov::DecodeDt(
   37558                                                           cmode);
   37559                                                   if (dt.Is(
   37560                                                           kDataTypeValueInvalid)) {
   37561                                                     UnallocatedT32(instr);
   37562                                                     return;
   37563                                                   }
   37564                                                   if (((instr >> 12) & 1) !=
   37565                                                       0) {
   37566                                                     UnallocatedT32(instr);
   37567                                                     return;
   37568                                                   }
   37569                                                   unsigned rd =
   37570                                                       ExtractQRegister(instr,
   37571                                                                        22,
   37572                                                                        12);
   37573                                                   QOperand imm = ImmediateVmov::
   37574                                                       DecodeImmediate(
   37575                                                           cmode,
   37576                                                           (instr & 0xf) |
   37577                                                               ((instr >> 12) &
   37578                                                                0x70) |
   37579                                                               ((instr >> 21) &
   37580                                                                0x80));
   37581                                                   // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
   37582                                                   vmov(CurrentCond(),
   37583                                                        dt,
   37584                                                        QRegister(rd),
   37585                                                        imm);
   37586                                                   break;
   37587                                                 }
   37588                                                 case 0x00000020: {
   37589                                                   // 0xef800c70
   37590                                                   if (((instr & 0xd00) ==
   37591                                                        0x100) ||
   37592                                                       ((instr & 0xd00) ==
   37593                                                        0x500) ||
   37594                                                       ((instr & 0xd00) ==
   37595                                                        0x900) ||
   37596                                                       ((instr & 0xe00) ==
   37597                                                        0xe00)) {
   37598                                                     UnallocatedT32(instr);
   37599                                                     return;
   37600                                                   }
   37601                                                   unsigned cmode =
   37602                                                       (instr >> 8) & 0xf;
   37603                                                   DataType dt =
   37604                                                       ImmediateVmvn::DecodeDt(
   37605                                                           cmode);
   37606                                                   if (dt.Is(
   37607                                                           kDataTypeValueInvalid)) {
   37608                                                     UnallocatedT32(instr);
   37609                                                     return;
   37610                                                   }
   37611                                                   if (((instr >> 12) & 1) !=
   37612                                                       0) {
   37613                                                     UnallocatedT32(instr);
   37614                                                     return;
   37615                                                   }
   37616                                                   unsigned rd =
   37617                                                       ExtractQRegister(instr,
   37618                                                                        22,
   37619                                                                        12);
   37620                                                   QOperand imm = ImmediateVmvn::
   37621                                                       DecodeImmediate(
   37622                                                           cmode,
   37623                                                           (instr & 0xf) |
   37624                                                               ((instr >> 12) &
   37625                                                                0x70) |
   37626                                                               ((instr >> 21) &
   37627                                                                0x80));
   37628                                                   // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
   37629                                                   vmvn(CurrentCond(),
   37630                                                        dt,
   37631                                                        QRegister(rd),
   37632                                                        imm);
   37633                                                   break;
   37634                                                 }
   37635                                                 case 0x00000200: {
   37636                                                   // 0xef800e50
   37637                                                   if (((instr & 0x920) ==
   37638                                                        0x100) ||
   37639                                                       ((instr & 0x520) ==
   37640                                                        0x100) ||
   37641                                                       ((instr & 0x820) ==
   37642                                                        0x20) ||
   37643                                                       ((instr & 0x420) ==
   37644                                                        0x20) ||
   37645                                                       ((instr & 0x220) ==
   37646                                                        0x20) ||
   37647                                                       ((instr & 0x120) ==
   37648                                                        0x120)) {
   37649                                                     UnallocatedT32(instr);
   37650                                                     return;
   37651                                                   }
   37652                                                   unsigned cmode =
   37653                                                       ((instr >> 8) & 0xf) |
   37654                                                       ((instr >> 1) & 0x10);
   37655                                                   DataType dt =
   37656                                                       ImmediateVmov::DecodeDt(
   37657                                                           cmode);
   37658                                                   if (dt.Is(
   37659                                                           kDataTypeValueInvalid)) {
   37660                                                     UnallocatedT32(instr);
   37661                                                     return;
   37662                                                   }
   37663                                                   if (((instr >> 12) & 1) !=
   37664                                                       0) {
   37665                                                     UnallocatedT32(instr);
   37666                                                     return;
   37667                                                   }
   37668                                                   unsigned rd =
   37669                                                       ExtractQRegister(instr,
   37670                                                                        22,
   37671                                                                        12);
   37672                                                   QOperand imm = ImmediateVmov::
   37673                                                       DecodeImmediate(
   37674                                                           cmode,
   37675                                                           (instr & 0xf) |
   37676                                                               ((instr >> 12) &
   37677                                                                0x70) |
   37678                                                               ((instr >> 21) &
   37679                                                                0x80));
   37680                                                   // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
   37681                                                   vmov(CurrentCond(),
   37682                                                        dt,
   37683                                                        QRegister(rd),
   37684                                                        imm);
   37685                                                   break;
   37686                                                 }
   37687                                                 case 0x00000220: {
   37688                                                   // 0xef800e70
   37689                                                   if (((instr & 0xd00) ==
   37690                                                        0x100) ||
   37691                                                       ((instr & 0xd00) ==
   37692                                                        0x500) ||
   37693                                                       ((instr & 0xd00) ==
   37694                                                        0x900) ||
   37695                                                       ((instr & 0xe00) ==
   37696                                                        0xe00)) {
   37697                                                     UnallocatedT32(instr);
   37698                                                     return;
   37699                                                   }
   37700                                                   unsigned cmode =
   37701                                                       (instr >> 8) & 0xf;
   37702                                                   DataType dt =
   37703                                                       ImmediateVmvn::DecodeDt(
   37704                                                           cmode);
   37705                                                   if (dt.Is(
   37706                                                           kDataTypeValueInvalid)) {
   37707                                                     UnallocatedT32(instr);
   37708                                                     return;
   37709                                                   }
   37710                                                   if (((instr >> 12) & 1) !=
   37711                                                       0) {
   37712                                                     UnallocatedT32(instr);
   37713                                                     return;
   37714                                                   }
   37715                                                   unsigned rd =
   37716                                                       ExtractQRegister(instr,
   37717                                                                        22,
   37718                                                                        12);
   37719                                                   QOperand imm = ImmediateVmvn::
   37720                                                       DecodeImmediate(
   37721                                                           cmode,
   37722                                                           (instr & 0xf) |
   37723                                                               ((instr >> 12) &
   37724                                                                0x70) |
   37725                                                               ((instr >> 21) &
   37726                                                                0x80));
   37727                                                   // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
   37728                                                   vmvn(CurrentCond(),
   37729                                                        dt,
   37730                                                        QRegister(rd),
   37731                                                        imm);
   37732                                                   break;
   37733                                                 }
   37734                                                 case 0x00000400: {
   37735                                                   // 0xef800c50
   37736                                                   if (((instr & 0x920) ==
   37737                                                        0x100) ||
   37738                                                       ((instr & 0x520) ==
   37739                                                        0x100) ||
   37740                                                       ((instr & 0x820) ==
   37741                                                        0x20) ||
   37742                                                       ((instr & 0x420) ==
   37743                                                        0x20) ||
   37744                                                       ((instr & 0x220) ==
   37745                                                        0x20) ||
   37746                                                       ((instr & 0x120) ==
   37747                                                        0x120)) {
   37748                                                     UnallocatedT32(instr);
   37749                                                     return;
   37750                                                   }
   37751                                                   unsigned cmode =
   37752                                                       ((instr >> 8) & 0xf) |
   37753                                                       ((instr >> 1) & 0x10);
   37754                                                   DataType dt =
   37755                                                       ImmediateVmov::DecodeDt(
   37756                                                           cmode);
   37757                                                   if (dt.Is(
   37758                                                           kDataTypeValueInvalid)) {
   37759                                                     UnallocatedT32(instr);
   37760                                                     return;
   37761                                                   }
   37762                                                   if (((instr >> 12) & 1) !=
   37763                                                       0) {
   37764                                                     UnallocatedT32(instr);
   37765                                                     return;
   37766                                                   }
   37767                                                   unsigned rd =
   37768                                                       ExtractQRegister(instr,
   37769                                                                        22,
   37770                                                                        12);
   37771                                                   QOperand imm = ImmediateVmov::
   37772                                                       DecodeImmediate(
   37773                                                           cmode,
   37774                                                           (instr & 0xf) |
   37775                                                               ((instr >> 12) &
   37776                                                                0x70) |
   37777                                                               ((instr >> 21) &
   37778                                                                0x80));
   37779                                                   // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
   37780                                                   vmov(CurrentCond(),
   37781                                                        dt,
   37782                                                        QRegister(rd),
   37783                                                        imm);
   37784                                                   break;
   37785                                                 }
   37786                                                 case 0x00000420: {
   37787                                                   // 0xef800c70
   37788                                                   if (((instr & 0xd00) ==
   37789                                                        0x100) ||
   37790                                                       ((instr & 0xd00) ==
   37791                                                        0x500) ||
   37792                                                       ((instr & 0xd00) ==
   37793                                                        0x900) ||
   37794                                                       ((instr & 0xe00) ==
   37795                                                        0xe00)) {
   37796                                                     UnallocatedT32(instr);
   37797                                                     return;
   37798                                                   }
   37799                                                   unsigned cmode =
   37800                                                       (instr >> 8) & 0xf;
   37801                                                   DataType dt =
   37802                                                       ImmediateVmvn::DecodeDt(
   37803                                                           cmode);
   37804                                                   if (dt.Is(
   37805                                                           kDataTypeValueInvalid)) {
   37806                                                     UnallocatedT32(instr);
   37807                                                     return;
   37808                                                   }
   37809                                                   if (((instr >> 12) & 1) !=
   37810                                                       0) {
   37811                                                     UnallocatedT32(instr);
   37812                                                     return;
   37813                                                   }
   37814                                                   unsigned rd =
   37815                                                       ExtractQRegister(instr,
   37816                                                                        22,
   37817                                                                        12);
   37818                                                   QOperand imm = ImmediateVmvn::
   37819                                                       DecodeImmediate(
   37820                                                           cmode,
   37821                                                           (instr & 0xf) |
   37822                                                               ((instr >> 12) &
   37823                                                                0x70) |
   37824                                                               ((instr >> 21) &
   37825                                                                0x80));
   37826                                                   // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
   37827                                                   vmvn(CurrentCond(),
   37828                                                        dt,
   37829                                                        QRegister(rd),
   37830                                                        imm);
   37831                                                   break;
   37832                                                 }
   37833                                                 case 0x00000600: {
   37834                                                   // 0xef800e50
   37835                                                   if (((instr & 0x920) ==
   37836                                                        0x100) ||
   37837                                                       ((instr & 0x520) ==
   37838                                                        0x100) ||
   37839                                                       ((instr & 0x820) ==
   37840                                                        0x20) ||
   37841                                                       ((instr & 0x420) ==
   37842                                                        0x20) ||
   37843                                                       ((instr & 0x220) ==
   37844                                                        0x20) ||
   37845                                                       ((instr & 0x120) ==
   37846                                                        0x120)) {
   37847                                                     UnallocatedT32(instr);
   37848                                                     return;
   37849                                                   }
   37850                                                   unsigned cmode =
   37851                                                       ((instr >> 8) & 0xf) |
   37852                                                       ((instr >> 1) & 0x10);
   37853                                                   DataType dt =
   37854                                                       ImmediateVmov::DecodeDt(
   37855                                                           cmode);
   37856                                                   if (dt.Is(
   37857                                                           kDataTypeValueInvalid)) {
   37858                                                     UnallocatedT32(instr);
   37859                                                     return;
   37860                                                   }
   37861                                                   if (((instr >> 12) & 1) !=
   37862                                                       0) {
   37863                                                     UnallocatedT32(instr);
   37864                                                     return;
   37865                                                   }
   37866                                                   unsigned rd =
   37867                                                       ExtractQRegister(instr,
   37868                                                                        22,
   37869                                                                        12);
   37870                                                   QOperand imm = ImmediateVmov::
   37871                                                       DecodeImmediate(
   37872                                                           cmode,
   37873                                                           (instr & 0xf) |
   37874                                                               ((instr >> 12) &
   37875                                                                0x70) |
   37876                                                               ((instr >> 21) &
   37877                                                                0x80));
   37878                                                   // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
   37879                                                   vmov(CurrentCond(),
   37880                                                        dt,
   37881                                                        QRegister(rd),
   37882                                                        imm);
   37883                                                   break;
   37884                                                 }
   37885                                                 case 0x00000620: {
   37886                                                   // 0xef800e70
   37887                                                   if (((instr & 0xd00) ==
   37888                                                        0x100) ||
   37889                                                       ((instr & 0xd00) ==
   37890                                                        0x500) ||
   37891                                                       ((instr & 0xd00) ==
   37892                                                        0x900) ||
   37893                                                       ((instr & 0xe00) ==
   37894                                                        0xe00)) {
   37895                                                     UnallocatedT32(instr);
   37896                                                     return;
   37897                                                   }
   37898                                                   unsigned cmode =
   37899                                                       (instr >> 8) & 0xf;
   37900                                                   DataType dt =
   37901                                                       ImmediateVmvn::DecodeDt(
   37902                                                           cmode);
   37903                                                   if (dt.Is(
   37904                                                           kDataTypeValueInvalid)) {
   37905                                                     UnallocatedT32(instr);
   37906                                                     return;
   37907                                                   }
   37908                                                   if (((instr >> 12) & 1) !=
   37909                                                       0) {
   37910                                                     UnallocatedT32(instr);
   37911                                                     return;
   37912                                                   }
   37913                                                   unsigned rd =
   37914                                                       ExtractQRegister(instr,
   37915                                                                        22,
   37916                                                                        12);
   37917                                                   QOperand imm = ImmediateVmvn::
   37918                                                       DecodeImmediate(
   37919                                                           cmode,
   37920                                                           (instr & 0xf) |
   37921                                                               ((instr >> 12) &
   37922                                                                0x70) |
   37923                                                               ((instr >> 21) &
   37924                                                                0x80));
   37925                                                   // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
   37926                                                   vmvn(CurrentCond(),
   37927                                                        dt,
   37928                                                        QRegister(rd),
   37929                                                        imm);
   37930                                                   break;
   37931                                                 }
   37932                                                 case 0x00000800: {
   37933                                                   // 0xef800c50
   37934                                                   if (((instr & 0x920) ==
   37935                                                        0x100) ||
   37936                                                       ((instr & 0x520) ==
   37937                                                        0x100) ||
   37938                                                       ((instr & 0x820) ==
   37939                                                        0x20) ||
   37940                                                       ((instr & 0x420) ==
   37941                                                        0x20) ||
   37942                                                       ((instr & 0x220) ==
   37943                                                        0x20) ||
   37944                                                       ((instr & 0x120) ==
   37945                                                        0x120)) {
   37946                                                     UnallocatedT32(instr);
   37947                                                     return;
   37948                                                   }
   37949                                                   unsigned cmode =
   37950                                                       ((instr >> 8) & 0xf) |
   37951                                                       ((instr >> 1) & 0x10);
   37952                                                   DataType dt =
   37953                                                       ImmediateVmov::DecodeDt(
   37954                                                           cmode);
   37955                                                   if (dt.Is(
   37956                                                           kDataTypeValueInvalid)) {
   37957                                                     UnallocatedT32(instr);
   37958                                                     return;
   37959                                                   }
   37960                                                   if (((instr >> 12) & 1) !=
   37961                                                       0) {
   37962                                                     UnallocatedT32(instr);
   37963                                                     return;
   37964                                                   }
   37965                                                   unsigned rd =
   37966                                                       ExtractQRegister(instr,
   37967                                                                        22,
   37968                                                                        12);
   37969                                                   QOperand imm = ImmediateVmov::
   37970                                                       DecodeImmediate(
   37971                                                           cmode,
   37972                                                           (instr & 0xf) |
   37973                                                               ((instr >> 12) &
   37974                                                                0x70) |
   37975                                                               ((instr >> 21) &
   37976                                                                0x80));
   37977                                                   // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
   37978                                                   vmov(CurrentCond(),
   37979                                                        dt,
   37980                                                        QRegister(rd),
   37981                                                        imm);
   37982                                                   break;
   37983                                                 }
   37984                                                 case 0x00000820: {
   37985                                                   // 0xef800c70
   37986                                                   if (((instr & 0xd00) ==
   37987                                                        0x100) ||
   37988                                                       ((instr & 0xd00) ==
   37989                                                        0x500) ||
   37990                                                       ((instr & 0xd00) ==
   37991                                                        0x900) ||
   37992                                                       ((instr & 0xe00) ==
   37993                                                        0xe00)) {
   37994                                                     UnallocatedT32(instr);
   37995                                                     return;
   37996                                                   }
   37997                                                   unsigned cmode =
   37998                                                       (instr >> 8) & 0xf;
   37999                                                   DataType dt =
   38000                                                       ImmediateVmvn::DecodeDt(
   38001                                                           cmode);
   38002                                                   if (dt.Is(
   38003                                                           kDataTypeValueInvalid)) {
   38004                                                     UnallocatedT32(instr);
   38005                                                     return;
   38006                                                   }
   38007                                                   if (((instr >> 12) & 1) !=
   38008                                                       0) {
   38009                                                     UnallocatedT32(instr);
   38010                                                     return;
   38011                                                   }
   38012                                                   unsigned rd =
   38013                                                       ExtractQRegister(instr,
   38014                                                                        22,
   38015                                                                        12);
   38016                                                   QOperand imm = ImmediateVmvn::
   38017                                                       DecodeImmediate(
   38018                                                           cmode,
   38019                                                           (instr & 0xf) |
   38020                                                               ((instr >> 12) &
   38021                                                                0x70) |
   38022                                                               ((instr >> 21) &
   38023                                                                0x80));
   38024                                                   // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
   38025                                                   vmvn(CurrentCond(),
   38026                                                        dt,
   38027                                                        QRegister(rd),
   38028                                                        imm);
   38029                                                   break;
   38030                                                 }
   38031                                                 case 0x00000a00: {
   38032                                                   // 0xef800e50
   38033                                                   if (((instr & 0x920) ==
   38034                                                        0x100) ||
   38035                                                       ((instr & 0x520) ==
   38036                                                        0x100) ||
   38037                                                       ((instr & 0x820) ==
   38038                                                        0x20) ||
   38039                                                       ((instr & 0x420) ==
   38040                                                        0x20) ||
   38041                                                       ((instr & 0x220) ==
   38042                                                        0x20) ||
   38043                                                       ((instr & 0x120) ==
   38044                                                        0x120)) {
   38045                                                     UnallocatedT32(instr);
   38046                                                     return;
   38047                                                   }
   38048                                                   unsigned cmode =
   38049                                                       ((instr >> 8) & 0xf) |
   38050                                                       ((instr >> 1) & 0x10);
   38051                                                   DataType dt =
   38052                                                       ImmediateVmov::DecodeDt(
   38053                                                           cmode);
   38054                                                   if (dt.Is(
   38055                                                           kDataTypeValueInvalid)) {
   38056                                                     UnallocatedT32(instr);
   38057                                                     return;
   38058                                                   }
   38059                                                   if (((instr >> 12) & 1) !=
   38060                                                       0) {
   38061                                                     UnallocatedT32(instr);
   38062                                                     return;
   38063                                                   }
   38064                                                   unsigned rd =
   38065                                                       ExtractQRegister(instr,
   38066                                                                        22,
   38067                                                                        12);
   38068                                                   QOperand imm = ImmediateVmov::
   38069                                                       DecodeImmediate(
   38070                                                           cmode,
   38071                                                           (instr & 0xf) |
   38072                                                               ((instr >> 12) &
   38073                                                                0x70) |
   38074                                                               ((instr >> 21) &
   38075                                                                0x80));
   38076                                                   // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
   38077                                                   vmov(CurrentCond(),
   38078                                                        dt,
   38079                                                        QRegister(rd),
   38080                                                        imm);
   38081                                                   break;
   38082                                                 }
   38083                                                 case 0x00000a20: {
   38084                                                   // 0xef800e70
   38085                                                   if (((instr & 0xd00) ==
   38086                                                        0x100) ||
   38087                                                       ((instr & 0xd00) ==
   38088                                                        0x500) ||
   38089                                                       ((instr & 0xd00) ==
   38090                                                        0x900) ||
   38091                                                       ((instr & 0xe00) ==
   38092                                                        0xe00)) {
   38093                                                     UnallocatedT32(instr);
   38094                                                     return;
   38095                                                   }
   38096                                                   unsigned cmode =
   38097                                                       (instr >> 8) & 0xf;
   38098                                                   DataType dt =
   38099                                                       ImmediateVmvn::DecodeDt(
   38100                                                           cmode);
   38101                                                   if (dt.Is(
   38102                                                           kDataTypeValueInvalid)) {
   38103                                                     UnallocatedT32(instr);
   38104                                                     return;
   38105                                                   }
   38106                                                   if (((instr >> 12) & 1) !=
   38107                                                       0) {
   38108                                                     UnallocatedT32(instr);
   38109                                                     return;
   38110                                                   }
   38111                                                   unsigned rd =
   38112                                                       ExtractQRegister(instr,
   38113                                                                        22,
   38114                                                                        12);
   38115                                                   QOperand imm = ImmediateVmvn::
   38116                                                       DecodeImmediate(
   38117                                                           cmode,
   38118                                                           (instr & 0xf) |
   38119                                                               ((instr >> 12) &
   38120                                                                0x70) |
   38121                                                               ((instr >> 21) &
   38122                                                                0x80));
   38123                                                   // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
   38124                                                   vmvn(CurrentCond(),
   38125                                                        dt,
   38126                                                        QRegister(rd),
   38127                                                        imm);
   38128                                                   break;
   38129                                                 }
   38130                                                 case 0x00000c00: {
   38131                                                   // 0xef800c50
   38132                                                   if (((instr & 0x920) ==
   38133                                                        0x100) ||
   38134                                                       ((instr & 0x520) ==
   38135                                                        0x100) ||
   38136                                                       ((instr & 0x820) ==
   38137                                                        0x20) ||
   38138                                                       ((instr & 0x420) ==
   38139                                                        0x20) ||
   38140                                                       ((instr & 0x220) ==
   38141                                                        0x20) ||
   38142                                                       ((instr & 0x120) ==
   38143                                                        0x120)) {
   38144                                                     UnallocatedT32(instr);
   38145                                                     return;
   38146                                                   }
   38147                                                   unsigned cmode =
   38148                                                       ((instr >> 8) & 0xf) |
   38149                                                       ((instr >> 1) & 0x10);
   38150                                                   DataType dt =
   38151                                                       ImmediateVmov::DecodeDt(
   38152                                                           cmode);
   38153                                                   if (dt.Is(
   38154                                                           kDataTypeValueInvalid)) {
   38155                                                     UnallocatedT32(instr);
   38156                                                     return;
   38157                                                   }
   38158                                                   if (((instr >> 12) & 1) !=
   38159                                                       0) {
   38160                                                     UnallocatedT32(instr);
   38161                                                     return;
   38162                                                   }
   38163                                                   unsigned rd =
   38164                                                       ExtractQRegister(instr,
   38165                                                                        22,
   38166                                                                        12);
   38167                                                   QOperand imm = ImmediateVmov::
   38168                                                       DecodeImmediate(
   38169                                                           cmode,
   38170                                                           (instr & 0xf) |
   38171                                                               ((instr >> 12) &
   38172                                                                0x70) |
   38173                                                               ((instr >> 21) &
   38174                                                                0x80));
   38175                                                   // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
   38176                                                   vmov(CurrentCond(),
   38177                                                        dt,
   38178                                                        QRegister(rd),
   38179                                                        imm);
   38180                                                   break;
   38181                                                 }
   38182                                                 case 0x00000c20: {
   38183                                                   // 0xef800c70
   38184                                                   if (((instr & 0xd00) ==
   38185                                                        0x100) ||
   38186                                                       ((instr & 0xd00) ==
   38187                                                        0x500) ||
   38188                                                       ((instr & 0xd00) ==
   38189                                                        0x900) ||
   38190                                                       ((instr & 0xe00) ==
   38191                                                        0xe00)) {
   38192                                                     UnallocatedT32(instr);
   38193                                                     return;
   38194                                                   }
   38195                                                   unsigned cmode =
   38196                                                       (instr >> 8) & 0xf;
   38197                                                   DataType dt =
   38198                                                       ImmediateVmvn::DecodeDt(
   38199                                                           cmode);
   38200                                                   if (dt.Is(
   38201                                                           kDataTypeValueInvalid)) {
   38202                                                     UnallocatedT32(instr);
   38203                                                     return;
   38204                                                   }
   38205                                                   if (((instr >> 12) & 1) !=
   38206                                                       0) {
   38207                                                     UnallocatedT32(instr);
   38208                                                     return;
   38209                                                   }
   38210                                                   unsigned rd =
   38211                                                       ExtractQRegister(instr,
   38212                                                                        22,
   38213                                                                        12);
   38214                                                   QOperand imm = ImmediateVmvn::
   38215                                                       DecodeImmediate(
   38216                                                           cmode,
   38217                                                           (instr & 0xf) |
   38218                                                               ((instr >> 12) &
   38219                                                                0x70) |
   38220                                                               ((instr >> 21) &
   38221                                                                0x80));
   38222                                                   // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
   38223                                                   vmvn(CurrentCond(),
   38224                                                        dt,
   38225                                                        QRegister(rd),
   38226                                                        imm);
   38227                                                   break;
   38228                                                 }
   38229                                                 case 0x00000d00: {
   38230                                                   // 0xef800d50
   38231                                                   if (((instr & 0x920) ==
   38232                                                        0x100) ||
   38233                                                       ((instr & 0x520) ==
   38234                                                        0x100) ||
   38235                                                       ((instr & 0x820) ==
   38236                                                        0x20) ||
   38237                                                       ((instr & 0x420) ==
   38238                                                        0x20) ||
   38239                                                       ((instr & 0x220) ==
   38240                                                        0x20) ||
   38241                                                       ((instr & 0x120) ==
   38242                                                        0x120)) {
   38243                                                     UnallocatedT32(instr);
   38244                                                     return;
   38245                                                   }
   38246                                                   unsigned cmode =
   38247                                                       ((instr >> 8) & 0xf) |
   38248                                                       ((instr >> 1) & 0x10);
   38249                                                   DataType dt =
   38250                                                       ImmediateVmov::DecodeDt(
   38251                                                           cmode);
   38252                                                   if (dt.Is(
   38253                                                           kDataTypeValueInvalid)) {
   38254                                                     UnallocatedT32(instr);
   38255                                                     return;
   38256                                                   }
   38257                                                   if (((instr >> 12) & 1) !=
   38258                                                       0) {
   38259                                                     UnallocatedT32(instr);
   38260                                                     return;
   38261                                                   }
   38262                                                   unsigned rd =
   38263                                                       ExtractQRegister(instr,
   38264                                                                        22,
   38265                                                                        12);
   38266                                                   QOperand imm = ImmediateVmov::
   38267                                                       DecodeImmediate(
   38268                                                           cmode,
   38269                                                           (instr & 0xf) |
   38270                                                               ((instr >> 12) &
   38271                                                                0x70) |
   38272                                                               ((instr >> 21) &
   38273                                                                0x80));
   38274                                                   // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
   38275                                                   vmov(CurrentCond(),
   38276                                                        dt,
   38277                                                        QRegister(rd),
   38278                                                        imm);
   38279                                                   break;
   38280                                                 }
   38281                                                 case 0x00000d20: {
   38282                                                   // 0xef800d70
   38283                                                   if (((instr & 0xd00) ==
   38284                                                        0x100) ||
   38285                                                       ((instr & 0xd00) ==
   38286                                                        0x500) ||
   38287                                                       ((instr & 0xd00) ==
   38288                                                        0x900) ||
   38289                                                       ((instr & 0xe00) ==
   38290                                                        0xe00)) {
   38291                                                     UnallocatedT32(instr);
   38292                                                     return;
   38293                                                   }
   38294                                                   unsigned cmode =
   38295                                                       (instr >> 8) & 0xf;
   38296                                                   DataType dt =
   38297                                                       ImmediateVmvn::DecodeDt(
   38298                                                           cmode);
   38299                                                   if (dt.Is(
   38300                                                           kDataTypeValueInvalid)) {
   38301                                                     UnallocatedT32(instr);
   38302                                                     return;
   38303                                                   }
   38304                                                   if (((instr >> 12) & 1) !=
   38305                                                       0) {
   38306                                                     UnallocatedT32(instr);
   38307                                                     return;
   38308                                                   }
   38309                                                   unsigned rd =
   38310                                                       ExtractQRegister(instr,
   38311                                                                        22,
   38312                                                                        12);
   38313                                                   QOperand imm = ImmediateVmvn::
   38314                                                       DecodeImmediate(
   38315                                                           cmode,
   38316                                                           (instr & 0xf) |
   38317                                                               ((instr >> 12) &
   38318                                                                0x70) |
   38319                                                               ((instr >> 21) &
   38320                                                                0x80));
   38321                                                   // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
   38322                                                   vmvn(CurrentCond(),
   38323                                                        dt,
   38324                                                        QRegister(rd),
   38325                                                        imm);
   38326                                                   break;
   38327                                                 }
   38328                                                 case 0x00000e00: {
   38329                                                   // 0xef800e50
   38330                                                   if (((instr & 0x920) ==
   38331                                                        0x100) ||
   38332                                                       ((instr & 0x520) ==
   38333                                                        0x100) ||
   38334                                                       ((instr & 0x820) ==
   38335                                                        0x20) ||
   38336                                                       ((instr & 0x420) ==
   38337                                                        0x20) ||
   38338                                                       ((instr & 0x220) ==
   38339                                                        0x20) ||
   38340                                                       ((instr & 0x120) ==
   38341                                                        0x120)) {
   38342                                                     UnallocatedT32(instr);
   38343                                                     return;
   38344                                                   }
   38345                                                   unsigned cmode =
   38346                                                       ((instr >> 8) & 0xf) |
   38347                                                       ((instr >> 1) & 0x10);
   38348                                                   DataType dt =
   38349                                                       ImmediateVmov::DecodeDt(
   38350                                                           cmode);
   38351                                                   if (dt.Is(
   38352                                                           kDataTypeValueInvalid)) {
   38353                                                     UnallocatedT32(instr);
   38354                                                     return;
   38355                                                   }
   38356                                                   if (((instr >> 12) & 1) !=
   38357                                                       0) {
   38358                                                     UnallocatedT32(instr);
   38359                                                     return;
   38360                                                   }
   38361                                                   unsigned rd =
   38362                                                       ExtractQRegister(instr,
   38363                                                                        22,
   38364                                                                        12);
   38365                                                   QOperand imm = ImmediateVmov::
   38366                                                       DecodeImmediate(
   38367                                                           cmode,
   38368                                                           (instr & 0xf) |
   38369                                                               ((instr >> 12) &
   38370                                                                0x70) |
   38371                                                               ((instr >> 21) &
   38372                                                                0x80));
   38373                                                   // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
   38374                                                   vmov(CurrentCond(),
   38375                                                        dt,
   38376                                                        QRegister(rd),
   38377                                                        imm);
   38378                                                   break;
   38379                                                 }
   38380                                                 case 0x00000e20: {
   38381                                                   // 0xef800e70
   38382                                                   if (((instr & 0x920) ==
   38383                                                        0x100) ||
   38384                                                       ((instr & 0x520) ==
   38385                                                        0x100) ||
   38386                                                       ((instr & 0x820) ==
   38387                                                        0x20) ||
   38388                                                       ((instr & 0x420) ==
   38389                                                        0x20) ||
   38390                                                       ((instr & 0x220) ==
   38391                                                        0x20) ||
   38392                                                       ((instr & 0x120) ==
   38393                                                        0x120)) {
   38394                                                     UnallocatedT32(instr);
   38395                                                     return;
   38396                                                   }
   38397                                                   unsigned cmode =
   38398                                                       ((instr >> 8) & 0xf) |
   38399                                                       ((instr >> 1) & 0x10);
   38400                                                   DataType dt =
   38401                                                       ImmediateVmov::DecodeDt(
   38402                                                           cmode);
   38403                                                   if (dt.Is(
   38404                                                           kDataTypeValueInvalid)) {
   38405                                                     UnallocatedT32(instr);
   38406                                                     return;
   38407                                                   }
   38408                                                   if (((instr >> 12) & 1) !=
   38409                                                       0) {
   38410                                                     UnallocatedT32(instr);
   38411                                                     return;
   38412                                                   }
   38413                                                   unsigned rd =
   38414                                                       ExtractQRegister(instr,
   38415                                                                        22,
   38416                                                                        12);
   38417                                                   QOperand imm = ImmediateVmov::
   38418                                                       DecodeImmediate(
   38419                                                           cmode,
   38420                                                           (instr & 0xf) |
   38421                                                               ((instr >> 12) &
   38422                                                                0x70) |
   38423                                                               ((instr >> 21) &
   38424                                                                0x80));
   38425                                                   // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
   38426                                                   vmov(CurrentCond(),
   38427                                                        dt,
   38428                                                        QRegister(rd),
   38429                                                        imm);
   38430                                                   break;
   38431                                                 }
   38432                                                 case 0x00000f00: {
   38433                                                   // 0xef800f50
   38434                                                   if (((instr & 0x920) ==
   38435                                                        0x100) ||
   38436                                                       ((instr & 0x520) ==
   38437                                                        0x100) ||
   38438                                                       ((instr & 0x820) ==
   38439                                                        0x20) ||
   38440                                                       ((instr & 0x420) ==
   38441                                                        0x20) ||
   38442                                                       ((instr & 0x220) ==
   38443                                                        0x20) ||
   38444                                                       ((instr & 0x120) ==
   38445                                                        0x120)) {
   38446                                                     UnallocatedT32(instr);
   38447                                                     return;
   38448                                                   }
   38449                                                   unsigned cmode =
   38450                                                       ((instr >> 8) & 0xf) |
   38451                                                       ((instr >> 1) & 0x10);
   38452                                                   DataType dt =
   38453                                                       ImmediateVmov::DecodeDt(
   38454                                                           cmode);
   38455                                                   if (dt.Is(
   38456                                                           kDataTypeValueInvalid)) {
   38457                                                     UnallocatedT32(instr);
   38458                                                     return;
   38459                                                   }
   38460                                                   if (((instr >> 12) & 1) !=
   38461                                                       0) {
   38462                                                     UnallocatedT32(instr);
   38463                                                     return;
   38464                                                   }
   38465                                                   unsigned rd =
   38466                                                       ExtractQRegister(instr,
   38467                                                                        22,
   38468                                                                        12);
   38469                                                   QOperand imm = ImmediateVmov::
   38470                                                       DecodeImmediate(
   38471                                                           cmode,
   38472                                                           (instr & 0xf) |
   38473                                                               ((instr >> 12) &
   38474                                                                0x70) |
   38475                                                               ((instr >> 21) &
   38476                                                                0x80));
   38477                                                   // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
   38478                                                   vmov(CurrentCond(),
   38479                                                        dt,
   38480                                                        QRegister(rd),
   38481                                                        imm);
   38482                                                   break;
   38483                                                 }
   38484                                                 default:
   38485                                                   UnallocatedT32(instr);
   38486                                                   break;
   38487                                               }
   38488                                               break;
   38489                                             }
   38490                                             default: {
   38491                                               if (((instr & 0x920) == 0x100) ||
   38492                                                   ((instr & 0x520) == 0x100) ||
   38493                                                   ((instr & 0x820) == 0x20) ||
   38494                                                   ((instr & 0x420) == 0x20) ||
   38495                                                   ((instr & 0x220) == 0x20) ||
   38496                                                   ((instr & 0x120) == 0x120)) {
   38497                                                 UnallocatedT32(instr);
   38498                                                 return;
   38499                                               }
   38500                                               unsigned cmode =
   38501                                                   ((instr >> 8) & 0xf) |
   38502                                                   ((instr >> 1) & 0x10);
   38503                                               DataType dt =
   38504                                                   ImmediateVmov::DecodeDt(
   38505                                                       cmode);
   38506                                               if (dt.Is(
   38507                                                       kDataTypeValueInvalid)) {
   38508                                                 UnallocatedT32(instr);
   38509                                                 return;
   38510                                               }
   38511                                               if (((instr >> 12) & 1) != 0) {
   38512                                                 UnallocatedT32(instr);
   38513                                                 return;
   38514                                               }
   38515                                               unsigned rd =
   38516                                                   ExtractQRegister(instr,
   38517                                                                    22,
   38518                                                                    12);
   38519                                               QOperand imm = ImmediateVmov::
   38520                                                   DecodeImmediate(cmode,
   38521                                                                   (instr &
   38522                                                                    0xf) |
   38523                                                                       ((instr >>
   38524                                                                         12) &
   38525                                                                        0x70) |
   38526                                                                       ((instr >>
   38527                                                                         21) &
   38528                                                                        0x80));
   38529                                               // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
   38530                                               vmov(CurrentCond(),
   38531                                                    dt,
   38532                                                    QRegister(rd),
   38533                                                    imm);
   38534                                               break;
   38535                                             }
   38536                                           }
   38537                                           break;
   38538                                         }
   38539                                       }
   38540                                       break;
   38541                                     }
   38542                                     default:
   38543                                       UnallocatedT32(instr);
   38544                                       break;
   38545                                   }
   38546                                   break;
   38547                                 }
   38548                                 default: {
   38549                                   if ((instr & 0x00000200) == 0x00000200) {
   38550                                     if (((instr & 0x200000) == 0x0)) {
   38551                                       UnallocatedT32(instr);
   38552                                       return;
   38553                                     }
   38554                                     DataType dt1 = Dt_op_U_1_Decode1(
   38555                                         ((instr >> 28) & 0x1) |
   38556                                         ((instr >> 7) & 0x2));
   38557                                     if (dt1.Is(kDataTypeValueInvalid)) {
   38558                                       UnallocatedT32(instr);
   38559                                       return;
   38560                                     }
   38561                                     DataType dt2 = Dt_op_U_1_Decode2(
   38562                                         ((instr >> 28) & 0x1) |
   38563                                         ((instr >> 7) & 0x2));
   38564                                     if (dt2.Is(kDataTypeValueInvalid)) {
   38565                                       UnallocatedT32(instr);
   38566                                       return;
   38567                                     }
   38568                                     if (((instr >> 12) & 1) != 0) {
   38569                                       UnallocatedT32(instr);
   38570                                       return;
   38571                                     }
   38572                                     unsigned rd =
   38573                                         ExtractQRegister(instr, 22, 12);
   38574                                     if ((instr & 1) != 0) {
   38575                                       UnallocatedT32(instr);
   38576                                       return;
   38577                                     }
   38578                                     unsigned rm = ExtractQRegister(instr, 5, 0);
   38579                                     uint32_t fbits =
   38580                                         64 - ((instr >> 16) & 0x3f);
   38581                                     // VCVT{<c>}{<q>}.<dt>.<dt> <Qd>, <Qm>, #<fbits> ; T1 NOLINT(whitespace/line_length)
   38582                                     vcvt(CurrentCond(),
   38583                                          dt1,
   38584                                          dt2,
   38585                                          QRegister(rd),
   38586                                          QRegister(rm),
   38587                                          fbits);
   38588                                   } else {
   38589                                     UnallocatedT32(instr);
   38590                                   }
   38591                                   break;
   38592                                 }
   38593                               }
   38594                               break;
   38595                             }
   38596                             default:
   38597                               UnallocatedT32(instr);
   38598                               break;
   38599                           }
   38600                           break;
   38601                         }
   38602                       }
   38603                       break;
   38604                     }
   38605                   }
   38606                   break;
   38607                 }
   38608               }
   38609               break;
   38610             }
   38611           }
   38612           break;
   38613         }
   38614       }
   38615       break;
   38616     }
   38617   }
   38618 }  // NOLINT(readability/fn_size)
   38619 
   38620 void Disassembler::DecodeA32(uint32_t instr) {
   38621   A32CodeAddressIncrementer incrementer(&code_address_);
   38622   if ((instr & 0xf0000000) == 0xf0000000) {
   38623     switch (instr & 0x0e000000) {
   38624       case 0x00000000: {
   38625         // 0xf0000000
   38626         switch (instr & 0x01f10020) {
   38627           case 0x01000000: {
   38628             // 0xf1000000
   38629             switch (instr & 0x000e0000) {
   38630               case 0x00020000: {
   38631                 // 0xf1020000
   38632                 if ((instr & 0x000001c0) == 0x00000000) {
   38633                   UnimplementedA32("CPS", instr);
   38634                 } else {
   38635                   UnallocatedA32(instr);
   38636                 }
   38637                 break;
   38638               }
   38639               case 0x00080000: {
   38640                 // 0xf1080000
   38641                 if ((instr & 0x0000001f) == 0x00000000) {
   38642                   UnimplementedA32("CPSIE", instr);
   38643                 } else {
   38644                   UnallocatedA32(instr);
   38645                 }
   38646                 break;
   38647               }
   38648               case 0x000a0000: {
   38649                 // 0xf10a0000
   38650                 UnimplementedA32("CPSIE", instr);
   38651                 break;
   38652               }
   38653               case 0x000c0000: {
   38654                 // 0xf10c0000
   38655                 if ((instr & 0x0000001f) == 0x00000000) {
   38656                   UnimplementedA32("CPSID", instr);
   38657                 } else {
   38658                   UnallocatedA32(instr);
   38659                 }
   38660                 break;
   38661               }
   38662               case 0x000e0000: {
   38663                 // 0xf10e0000
   38664                 UnimplementedA32("CPSID", instr);
   38665                 break;
   38666               }
   38667               default:
   38668                 UnallocatedA32(instr);
   38669                 break;
   38670             }
   38671             break;
   38672           }
   38673           case 0x01010000: {
   38674             // 0xf1010000
   38675             if ((instr & 0x000000d0) == 0x00000000) {
   38676               UnimplementedA32("SETEND", instr);
   38677             } else {
   38678               UnallocatedA32(instr);
   38679             }
   38680             break;
   38681           }
   38682           default:
   38683             UnallocatedA32(instr);
   38684             break;
   38685         }
   38686         break;
   38687       }
   38688       case 0x02000000: {
   38689         // 0xf2000000
   38690         switch (instr & 0x00800010) {
   38691           case 0x00000000: {
   38692             // 0xf2000000
   38693             switch (instr & 0x00000f40) {
   38694               case 0x00000000: {
   38695                 // 0xf2000000
   38696                 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
   38697                                                  ((instr >> 22) & 0x4));
   38698                 if (dt.Is(kDataTypeValueInvalid)) {
   38699                   UnallocatedA32(instr);
   38700                   return;
   38701                 }
   38702                 unsigned rd = ExtractDRegister(instr, 22, 12);
   38703                 unsigned rn = ExtractDRegister(instr, 7, 16);
   38704                 unsigned rm = ExtractDRegister(instr, 5, 0);
   38705                 // VHADD{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
   38706                 vhadd(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
   38707                 break;
   38708               }
   38709               case 0x00000040: {
   38710                 // 0xf2000040
   38711                 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
   38712                                                  ((instr >> 22) & 0x4));
   38713                 if (dt.Is(kDataTypeValueInvalid)) {
   38714                   UnallocatedA32(instr);
   38715                   return;
   38716                 }
   38717                 if (((instr >> 12) & 1) != 0) {
   38718                   UnallocatedA32(instr);
   38719                   return;
   38720                 }
   38721                 unsigned rd = ExtractQRegister(instr, 22, 12);
   38722                 if (((instr >> 16) & 1) != 0) {
   38723                   UnallocatedA32(instr);
   38724                   return;
   38725                 }
   38726                 unsigned rn = ExtractQRegister(instr, 7, 16);
   38727                 if ((instr & 1) != 0) {
   38728                   UnallocatedA32(instr);
   38729                   return;
   38730                 }
   38731                 unsigned rm = ExtractQRegister(instr, 5, 0);
   38732                 // VHADD{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
   38733                 vhadd(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
   38734                 break;
   38735               }
   38736               case 0x00000100: {
   38737                 // 0xf2000100
   38738                 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
   38739                                                  ((instr >> 22) & 0x4));
   38740                 if (dt.Is(kDataTypeValueInvalid)) {
   38741                   UnallocatedA32(instr);
   38742                   return;
   38743                 }
   38744                 unsigned rd = ExtractDRegister(instr, 22, 12);
   38745                 unsigned rn = ExtractDRegister(instr, 7, 16);
   38746                 unsigned rm = ExtractDRegister(instr, 5, 0);
   38747                 // VRHADD{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
   38748                 vrhadd(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
   38749                 break;
   38750               }
   38751               case 0x00000140: {
   38752                 // 0xf2000140
   38753                 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
   38754                                                  ((instr >> 22) & 0x4));
   38755                 if (dt.Is(kDataTypeValueInvalid)) {
   38756                   UnallocatedA32(instr);
   38757                   return;
   38758                 }
   38759                 if (((instr >> 12) & 1) != 0) {
   38760                   UnallocatedA32(instr);
   38761                   return;
   38762                 }
   38763                 unsigned rd = ExtractQRegister(instr, 22, 12);
   38764                 if (((instr >> 16) & 1) != 0) {
   38765                   UnallocatedA32(instr);
   38766                   return;
   38767                 }
   38768                 unsigned rn = ExtractQRegister(instr, 7, 16);
   38769                 if ((instr & 1) != 0) {
   38770                   UnallocatedA32(instr);
   38771                   return;
   38772                 }
   38773                 unsigned rm = ExtractQRegister(instr, 5, 0);
   38774                 // VRHADD{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
   38775                 vrhadd(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
   38776                 break;
   38777               }
   38778               case 0x00000200: {
   38779                 // 0xf2000200
   38780                 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
   38781                                                  ((instr >> 22) & 0x4));
   38782                 if (dt.Is(kDataTypeValueInvalid)) {
   38783                   UnallocatedA32(instr);
   38784                   return;
   38785                 }
   38786                 unsigned rd = ExtractDRegister(instr, 22, 12);
   38787                 unsigned rn = ExtractDRegister(instr, 7, 16);
   38788                 unsigned rm = ExtractDRegister(instr, 5, 0);
   38789                 // VHSUB{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
   38790                 vhsub(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
   38791                 break;
   38792               }
   38793               case 0x00000240: {
   38794                 // 0xf2000240
   38795                 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
   38796                                                  ((instr >> 22) & 0x4));
   38797                 if (dt.Is(kDataTypeValueInvalid)) {
   38798                   UnallocatedA32(instr);
   38799                   return;
   38800                 }
   38801                 if (((instr >> 12) & 1) != 0) {
   38802                   UnallocatedA32(instr);
   38803                   return;
   38804                 }
   38805                 unsigned rd = ExtractQRegister(instr, 22, 12);
   38806                 if (((instr >> 16) & 1) != 0) {
   38807                   UnallocatedA32(instr);
   38808                   return;
   38809                 }
   38810                 unsigned rn = ExtractQRegister(instr, 7, 16);
   38811                 if ((instr & 1) != 0) {
   38812                   UnallocatedA32(instr);
   38813                   return;
   38814                 }
   38815                 unsigned rm = ExtractQRegister(instr, 5, 0);
   38816                 // VHSUB{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
   38817                 vhsub(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
   38818                 break;
   38819               }
   38820               case 0x00000300: {
   38821                 // 0xf2000300
   38822                 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
   38823                                                  ((instr >> 22) & 0x4));
   38824                 if (dt.Is(kDataTypeValueInvalid)) {
   38825                   UnallocatedA32(instr);
   38826                   return;
   38827                 }
   38828                 unsigned rd = ExtractDRegister(instr, 22, 12);
   38829                 unsigned rn = ExtractDRegister(instr, 7, 16);
   38830                 unsigned rm = ExtractDRegister(instr, 5, 0);
   38831                 // VCGT{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
   38832                 vcgt(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
   38833                 break;
   38834               }
   38835               case 0x00000340: {
   38836                 // 0xf2000340
   38837                 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
   38838                                                  ((instr >> 22) & 0x4));
   38839                 if (dt.Is(kDataTypeValueInvalid)) {
   38840                   UnallocatedA32(instr);
   38841                   return;
   38842                 }
   38843                 if (((instr >> 12) & 1) != 0) {
   38844                   UnallocatedA32(instr);
   38845                   return;
   38846                 }
   38847                 unsigned rd = ExtractQRegister(instr, 22, 12);
   38848                 if (((instr >> 16) & 1) != 0) {
   38849                   UnallocatedA32(instr);
   38850                   return;
   38851                 }
   38852                 unsigned rn = ExtractQRegister(instr, 7, 16);
   38853                 if ((instr & 1) != 0) {
   38854                   UnallocatedA32(instr);
   38855                   return;
   38856                 }
   38857                 unsigned rm = ExtractQRegister(instr, 5, 0);
   38858                 // VCGT{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
   38859                 vcgt(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
   38860                 break;
   38861               }
   38862               case 0x00000400: {
   38863                 // 0xf2000400
   38864                 DataType dt = Dt_U_size_3_Decode(((instr >> 20) & 0x3) |
   38865                                                  ((instr >> 22) & 0x4));
   38866                 if (dt.Is(kDataTypeValueInvalid)) {
   38867                   UnallocatedA32(instr);
   38868                   return;
   38869                 }
   38870                 unsigned rd = ExtractDRegister(instr, 22, 12);
   38871                 unsigned rm = ExtractDRegister(instr, 5, 0);
   38872                 unsigned rn = ExtractDRegister(instr, 7, 16);
   38873                 // VSHL{<c>}{<q>}.<dt> {<Dd>}, <Dm>, <Dn> ; A1
   38874                 vshl(al, dt, DRegister(rd), DRegister(rm), DRegister(rn));
   38875                 break;
   38876               }
   38877               case 0x00000440: {
   38878                 // 0xf2000440
   38879                 DataType dt = Dt_U_size_3_Decode(((instr >> 20) & 0x3) |
   38880                                                  ((instr >> 22) & 0x4));
   38881                 if (dt.Is(kDataTypeValueInvalid)) {
   38882                   UnallocatedA32(instr);
   38883                   return;
   38884                 }
   38885                 if (((instr >> 12) & 1) != 0) {
   38886                   UnallocatedA32(instr);
   38887                   return;
   38888                 }
   38889                 unsigned rd = ExtractQRegister(instr, 22, 12);
   38890                 if ((instr & 1) != 0) {
   38891                   UnallocatedA32(instr);
   38892                   return;
   38893                 }
   38894                 unsigned rm = ExtractQRegister(instr, 5, 0);
   38895                 if (((instr >> 16) & 1) != 0) {
   38896                   UnallocatedA32(instr);
   38897                   return;
   38898                 }
   38899                 unsigned rn = ExtractQRegister(instr, 7, 16);
   38900                 // VSHL{<c>}{<q>}.<dt> {<Qd>}, <Qm>, <Qn> ; A1
   38901                 vshl(al, dt, QRegister(rd), QRegister(rm), QRegister(rn));
   38902                 break;
   38903               }
   38904               case 0x00000500: {
   38905                 // 0xf2000500
   38906                 DataType dt = Dt_U_size_3_Decode(((instr >> 20) & 0x3) |
   38907                                                  ((instr >> 22) & 0x4));
   38908                 if (dt.Is(kDataTypeValueInvalid)) {
   38909                   UnallocatedA32(instr);
   38910                   return;
   38911                 }
   38912                 unsigned rd = ExtractDRegister(instr, 22, 12);
   38913                 unsigned rm = ExtractDRegister(instr, 5, 0);
   38914                 unsigned rn = ExtractDRegister(instr, 7, 16);
   38915                 // VRSHL{<c>}{<q>}.<dt> {<Dd>}, <Dm>, <Dn> ; A1
   38916                 vrshl(al, dt, DRegister(rd), DRegister(rm), DRegister(rn));
   38917                 break;
   38918               }
   38919               case 0x00000540: {
   38920                 // 0xf2000540
   38921                 DataType dt = Dt_U_size_3_Decode(((instr >> 20) & 0x3) |
   38922                                                  ((instr >> 22) & 0x4));
   38923                 if (dt.Is(kDataTypeValueInvalid)) {
   38924                   UnallocatedA32(instr);
   38925                   return;
   38926                 }
   38927                 if (((instr >> 12) & 1) != 0) {
   38928                   UnallocatedA32(instr);
   38929                   return;
   38930                 }
   38931                 unsigned rd = ExtractQRegister(instr, 22, 12);
   38932                 if ((instr & 1) != 0) {
   38933                   UnallocatedA32(instr);
   38934                   return;
   38935                 }
   38936                 unsigned rm = ExtractQRegister(instr, 5, 0);
   38937                 if (((instr >> 16) & 1) != 0) {
   38938                   UnallocatedA32(instr);
   38939                   return;
   38940                 }
   38941                 unsigned rn = ExtractQRegister(instr, 7, 16);
   38942                 // VRSHL{<c>}{<q>}.<dt> {<Qd>}, <Qm>, <Qn> ; A1
   38943                 vrshl(al, dt, QRegister(rd), QRegister(rm), QRegister(rn));
   38944                 break;
   38945               }
   38946               case 0x00000600: {
   38947                 // 0xf2000600
   38948                 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
   38949                                                  ((instr >> 22) & 0x4));
   38950                 if (dt.Is(kDataTypeValueInvalid)) {
   38951                   UnallocatedA32(instr);
   38952                   return;
   38953                 }
   38954                 unsigned rd = ExtractDRegister(instr, 22, 12);
   38955                 unsigned rn = ExtractDRegister(instr, 7, 16);
   38956                 unsigned rm = ExtractDRegister(instr, 5, 0);
   38957                 // VMAX{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
   38958                 vmax(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
   38959                 break;
   38960               }
   38961               case 0x00000640: {
   38962                 // 0xf2000640
   38963                 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
   38964                                                  ((instr >> 22) & 0x4));
   38965                 if (dt.Is(kDataTypeValueInvalid)) {
   38966                   UnallocatedA32(instr);
   38967                   return;
   38968                 }
   38969                 if (((instr >> 12) & 1) != 0) {
   38970                   UnallocatedA32(instr);
   38971                   return;
   38972                 }
   38973                 unsigned rd = ExtractQRegister(instr, 22, 12);
   38974                 if (((instr >> 16) & 1) != 0) {
   38975                   UnallocatedA32(instr);
   38976                   return;
   38977                 }
   38978                 unsigned rn = ExtractQRegister(instr, 7, 16);
   38979                 if ((instr & 1) != 0) {
   38980                   UnallocatedA32(instr);
   38981                   return;
   38982                 }
   38983                 unsigned rm = ExtractQRegister(instr, 5, 0);
   38984                 // VMAX{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
   38985                 vmax(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
   38986                 break;
   38987               }
   38988               case 0x00000700: {
   38989                 // 0xf2000700
   38990                 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
   38991                                                  ((instr >> 22) & 0x4));
   38992                 if (dt.Is(kDataTypeValueInvalid)) {
   38993                   UnallocatedA32(instr);
   38994                   return;
   38995                 }
   38996                 unsigned rd = ExtractDRegister(instr, 22, 12);
   38997                 unsigned rn = ExtractDRegister(instr, 7, 16);
   38998                 unsigned rm = ExtractDRegister(instr, 5, 0);
   38999                 // VABD{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
   39000                 vabd(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
   39001                 break;
   39002               }
   39003               case 0x00000740: {
   39004                 // 0xf2000740
   39005                 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
   39006                                                  ((instr >> 22) & 0x4));
   39007                 if (dt.Is(kDataTypeValueInvalid)) {
   39008                   UnallocatedA32(instr);
   39009                   return;
   39010                 }
   39011                 if (((instr >> 12) & 1) != 0) {
   39012                   UnallocatedA32(instr);
   39013                   return;
   39014                 }
   39015                 unsigned rd = ExtractQRegister(instr, 22, 12);
   39016                 if (((instr >> 16) & 1) != 0) {
   39017                   UnallocatedA32(instr);
   39018                   return;
   39019                 }
   39020                 unsigned rn = ExtractQRegister(instr, 7, 16);
   39021                 if ((instr & 1) != 0) {
   39022                   UnallocatedA32(instr);
   39023                   return;
   39024                 }
   39025                 unsigned rm = ExtractQRegister(instr, 5, 0);
   39026                 // VABD{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
   39027                 vabd(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
   39028                 break;
   39029               }
   39030               case 0x00000800: {
   39031                 // 0xf2000800
   39032                 switch (instr & 0x01000000) {
   39033                   case 0x00000000: {
   39034                     // 0xf2000800
   39035                     DataType dt = Dt_size_2_Decode((instr >> 20) & 0x3);
   39036                     if (dt.Is(kDataTypeValueInvalid)) {
   39037                       UnallocatedA32(instr);
   39038                       return;
   39039                     }
   39040                     unsigned rd = ExtractDRegister(instr, 22, 12);
   39041                     unsigned rn = ExtractDRegister(instr, 7, 16);
   39042                     unsigned rm = ExtractDRegister(instr, 5, 0);
   39043                     // VADD{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
   39044                     vadd(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
   39045                     break;
   39046                   }
   39047                   case 0x01000000: {
   39048                     // 0xf3000800
   39049                     DataType dt = Dt_size_2_Decode((instr >> 20) & 0x3);
   39050                     if (dt.Is(kDataTypeValueInvalid)) {
   39051                       UnallocatedA32(instr);
   39052                       return;
   39053                     }
   39054                     unsigned rd = ExtractDRegister(instr, 22, 12);
   39055                     unsigned rn = ExtractDRegister(instr, 7, 16);
   39056                     unsigned rm = ExtractDRegister(instr, 5, 0);
   39057                     // VSUB{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
   39058                     vsub(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
   39059                     break;
   39060                   }
   39061                 }
   39062                 break;
   39063               }
   39064               case 0x00000840: {
   39065                 // 0xf2000840
   39066                 switch (instr & 0x01000000) {
   39067                   case 0x00000000: {
   39068                     // 0xf2000840
   39069                     DataType dt = Dt_size_2_Decode((instr >> 20) & 0x3);
   39070                     if (dt.Is(kDataTypeValueInvalid)) {
   39071                       UnallocatedA32(instr);
   39072                       return;
   39073                     }
   39074                     if (((instr >> 12) & 1) != 0) {
   39075                       UnallocatedA32(instr);
   39076                       return;
   39077                     }
   39078                     unsigned rd = ExtractQRegister(instr, 22, 12);
   39079                     if (((instr >> 16) & 1) != 0) {
   39080                       UnallocatedA32(instr);
   39081                       return;
   39082                     }
   39083                     unsigned rn = ExtractQRegister(instr, 7, 16);
   39084                     if ((instr & 1) != 0) {
   39085                       UnallocatedA32(instr);
   39086                       return;
   39087                     }
   39088                     unsigned rm = ExtractQRegister(instr, 5, 0);
   39089                     // VADD{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
   39090                     vadd(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
   39091                     break;
   39092                   }
   39093                   case 0x01000000: {
   39094                     // 0xf3000840
   39095                     DataType dt = Dt_size_2_Decode((instr >> 20) & 0x3);
   39096                     if (dt.Is(kDataTypeValueInvalid)) {
   39097                       UnallocatedA32(instr);
   39098                       return;
   39099                     }
   39100                     if (((instr >> 12) & 1) != 0) {
   39101                       UnallocatedA32(instr);
   39102                       return;
   39103                     }
   39104                     unsigned rd = ExtractQRegister(instr, 22, 12);
   39105                     if (((instr >> 16) & 1) != 0) {
   39106                       UnallocatedA32(instr);
   39107                       return;
   39108                     }
   39109                     unsigned rn = ExtractQRegister(instr, 7, 16);
   39110                     if ((instr & 1) != 0) {
   39111                       UnallocatedA32(instr);
   39112                       return;
   39113                     }
   39114                     unsigned rm = ExtractQRegister(instr, 5, 0);
   39115                     // VSUB{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
   39116                     vsub(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
   39117                     break;
   39118                   }
   39119                 }
   39120                 break;
   39121               }
   39122               case 0x00000900: {
   39123                 // 0xf2000900
   39124                 switch (instr & 0x01000000) {
   39125                   case 0x00000000: {
   39126                     // 0xf2000900
   39127                     DataType dt = Dt_size_10_Decode((instr >> 20) & 0x3);
   39128                     if (dt.Is(kDataTypeValueInvalid)) {
   39129                       UnallocatedA32(instr);
   39130                       return;
   39131                     }
   39132                     unsigned rd = ExtractDRegister(instr, 22, 12);
   39133                     unsigned rn = ExtractDRegister(instr, 7, 16);
   39134                     unsigned rm = ExtractDRegister(instr, 5, 0);
   39135                     // VMLA{<c>}{<q>}.<type><size> <Dd>, <Dn>, <Dm> ; A1
   39136                     vmla(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
   39137                     break;
   39138                   }
   39139                   case 0x01000000: {
   39140                     // 0xf3000900
   39141                     DataType dt = Dt_size_10_Decode((instr >> 20) & 0x3);
   39142                     if (dt.Is(kDataTypeValueInvalid)) {
   39143                       UnallocatedA32(instr);
   39144                       return;
   39145                     }
   39146                     unsigned rd = ExtractDRegister(instr, 22, 12);
   39147                     unsigned rn = ExtractDRegister(instr, 7, 16);
   39148                     unsigned rm = ExtractDRegister(instr, 5, 0);
   39149                     // VMLS{<c>}{<q>}.<type><size> <Dd>, <Dn>, <Dm> ; A1
   39150                     vmls(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
   39151                     break;
   39152                   }
   39153                 }
   39154                 break;
   39155               }
   39156               case 0x00000940: {
   39157                 // 0xf2000940
   39158                 switch (instr & 0x01000000) {
   39159                   case 0x00000000: {
   39160                     // 0xf2000940
   39161                     DataType dt = Dt_size_10_Decode((instr >> 20) & 0x3);
   39162                     if (dt.Is(kDataTypeValueInvalid)) {
   39163                       UnallocatedA32(instr);
   39164                       return;
   39165                     }
   39166                     if (((instr >> 12) & 1) != 0) {
   39167                       UnallocatedA32(instr);
   39168                       return;
   39169                     }
   39170                     unsigned rd = ExtractQRegister(instr, 22, 12);
   39171                     if (((instr >> 16) & 1) != 0) {
   39172                       UnallocatedA32(instr);
   39173                       return;
   39174                     }
   39175                     unsigned rn = ExtractQRegister(instr, 7, 16);
   39176                     if ((instr & 1) != 0) {
   39177                       UnallocatedA32(instr);
   39178                       return;
   39179                     }
   39180                     unsigned rm = ExtractQRegister(instr, 5, 0);
   39181                     // VMLA{<c>}{<q>}.<type><size> <Qd>, <Qn>, <Qm> ; A1
   39182                     vmla(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
   39183                     break;
   39184                   }
   39185                   case 0x01000000: {
   39186                     // 0xf3000940
   39187                     DataType dt = Dt_size_10_Decode((instr >> 20) & 0x3);
   39188                     if (dt.Is(kDataTypeValueInvalid)) {
   39189                       UnallocatedA32(instr);
   39190                       return;
   39191                     }
   39192                     if (((instr >> 12) & 1) != 0) {
   39193                       UnallocatedA32(instr);
   39194                       return;
   39195                     }
   39196                     unsigned rd = ExtractQRegister(instr, 22, 12);
   39197                     if (((instr >> 16) & 1) != 0) {
   39198                       UnallocatedA32(instr);
   39199                       return;
   39200                     }
   39201                     unsigned rn = ExtractQRegister(instr, 7, 16);
   39202                     if ((instr & 1) != 0) {
   39203                       UnallocatedA32(instr);
   39204                       return;
   39205                     }
   39206                     unsigned rm = ExtractQRegister(instr, 5, 0);
   39207                     // VMLS{<c>}{<q>}.<type><size> <Qd>, <Qn>, <Qm> ; A1
   39208                     vmls(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
   39209                     break;
   39210                   }
   39211                 }
   39212                 break;
   39213               }
   39214               case 0x00000a00: {
   39215                 // 0xf2000a00
   39216                 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
   39217                                                  ((instr >> 22) & 0x4));
   39218                 if (dt.Is(kDataTypeValueInvalid)) {
   39219                   UnallocatedA32(instr);
   39220                   return;
   39221                 }
   39222                 unsigned rd = ExtractDRegister(instr, 22, 12);
   39223                 unsigned rn = ExtractDRegister(instr, 7, 16);
   39224                 unsigned rm = ExtractDRegister(instr, 5, 0);
   39225                 // VPMAX{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
   39226                 vpmax(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
   39227                 break;
   39228               }
   39229               case 0x00000b00: {
   39230                 // 0xf2000b00
   39231                 switch (instr & 0x01000000) {
   39232                   case 0x00000000: {
   39233                     // 0xf2000b00
   39234                     DataType dt = Dt_size_13_Decode((instr >> 20) & 0x3);
   39235                     if (dt.Is(kDataTypeValueInvalid)) {
   39236                       UnallocatedA32(instr);
   39237                       return;
   39238                     }
   39239                     unsigned rd = ExtractDRegister(instr, 22, 12);
   39240                     unsigned rn = ExtractDRegister(instr, 7, 16);
   39241                     unsigned rm = ExtractDRegister(instr, 5, 0);
   39242                     // VQDMULH{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
   39243                     vqdmulh(al,
   39244                             dt,
   39245                             DRegister(rd),
   39246                             DRegister(rn),
   39247                             DRegister(rm));
   39248                     break;
   39249                   }
   39250                   case 0x01000000: {
   39251                     // 0xf3000b00
   39252                     DataType dt = Dt_size_13_Decode((instr >> 20) & 0x3);
   39253                     if (dt.Is(kDataTypeValueInvalid)) {
   39254                       UnallocatedA32(instr);
   39255                       return;
   39256                     }
   39257                     unsigned rd = ExtractDRegister(instr, 22, 12);
   39258                     unsigned rn = ExtractDRegister(instr, 7, 16);
   39259                     unsigned rm = ExtractDRegister(instr, 5, 0);
   39260                     // VQRDMULH{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
   39261                     vqrdmulh(al,
   39262                              dt,
   39263                              DRegister(rd),
   39264                              DRegister(rn),
   39265                              DRegister(rm));
   39266                     break;
   39267                   }
   39268                 }
   39269                 break;
   39270               }
   39271               case 0x00000b40: {
   39272                 // 0xf2000b40
   39273                 switch (instr & 0x01000000) {
   39274                   case 0x00000000: {
   39275                     // 0xf2000b40
   39276                     DataType dt = Dt_size_13_Decode((instr >> 20) & 0x3);
   39277                     if (dt.Is(kDataTypeValueInvalid)) {
   39278                       UnallocatedA32(instr);
   39279                       return;
   39280                     }
   39281                     if (((instr >> 12) & 1) != 0) {
   39282                       UnallocatedA32(instr);
   39283                       return;
   39284                     }
   39285                     unsigned rd = ExtractQRegister(instr, 22, 12);
   39286                     if (((instr >> 16) & 1) != 0) {
   39287                       UnallocatedA32(instr);
   39288                       return;
   39289                     }
   39290                     unsigned rn = ExtractQRegister(instr, 7, 16);
   39291                     if ((instr & 1) != 0) {
   39292                       UnallocatedA32(instr);
   39293                       return;
   39294                     }
   39295                     unsigned rm = ExtractQRegister(instr, 5, 0);
   39296                     // VQDMULH{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
   39297                     vqdmulh(al,
   39298                             dt,
   39299                             QRegister(rd),
   39300                             QRegister(rn),
   39301                             QRegister(rm));
   39302                     break;
   39303                   }
   39304                   case 0x01000000: {
   39305                     // 0xf3000b40
   39306                     DataType dt = Dt_size_13_Decode((instr >> 20) & 0x3);
   39307                     if (dt.Is(kDataTypeValueInvalid)) {
   39308                       UnallocatedA32(instr);
   39309                       return;
   39310                     }
   39311                     if (((instr >> 12) & 1) != 0) {
   39312                       UnallocatedA32(instr);
   39313                       return;
   39314                     }
   39315                     unsigned rd = ExtractQRegister(instr, 22, 12);
   39316                     if (((instr >> 16) & 1) != 0) {
   39317                       UnallocatedA32(instr);
   39318                       return;
   39319                     }
   39320                     unsigned rn = ExtractQRegister(instr, 7, 16);
   39321                     if ((instr & 1) != 0) {
   39322                       UnallocatedA32(instr);
   39323                       return;
   39324                     }
   39325                     unsigned rm = ExtractQRegister(instr, 5, 0);
   39326                     // VQRDMULH{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
   39327                     vqrdmulh(al,
   39328                              dt,
   39329                              QRegister(rd),
   39330                              QRegister(rn),
   39331                              QRegister(rm));
   39332                     break;
   39333                   }
   39334                 }
   39335                 break;
   39336               }
   39337               case 0x00000c40: {
   39338                 // 0xf2000c40
   39339                 switch (instr & 0x01300000) {
   39340                   case 0x00000000: {
   39341                     // 0xf2000c40
   39342                     UnimplementedA32("SHA1C", instr);
   39343                     break;
   39344                   }
   39345                   case 0x00100000: {
   39346                     // 0xf2100c40
   39347                     UnimplementedA32("SHA1P", instr);
   39348                     break;
   39349                   }
   39350                   case 0x00200000: {
   39351                     // 0xf2200c40
   39352                     UnimplementedA32("SHA1M", instr);
   39353                     break;
   39354                   }
   39355                   case 0x00300000: {
   39356                     // 0xf2300c40
   39357                     UnimplementedA32("SHA1SU0", instr);
   39358                     break;
   39359                   }
   39360                   case 0x01000000: {
   39361                     // 0xf3000c40
   39362                     UnimplementedA32("SHA256H", instr);
   39363                     break;
   39364                   }
   39365                   case 0x01100000: {
   39366                     // 0xf3100c40
   39367                     UnimplementedA32("SHA256H2", instr);
   39368                     break;
   39369                   }
   39370                   case 0x01200000: {
   39371                     // 0xf3200c40
   39372                     UnimplementedA32("SHA256SU1", instr);
   39373                     break;
   39374                   }
   39375                   default:
   39376                     UnallocatedA32(instr);
   39377                     break;
   39378                 }
   39379                 break;
   39380               }
   39381               case 0x00000d00: {
   39382                 // 0xf2000d00
   39383                 switch (instr & 0x01300000) {
   39384                   case 0x00000000: {
   39385                     // 0xf2000d00
   39386                     unsigned rd = ExtractDRegister(instr, 22, 12);
   39387                     unsigned rn = ExtractDRegister(instr, 7, 16);
   39388                     unsigned rm = ExtractDRegister(instr, 5, 0);
   39389                     // VADD{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A1
   39390                     vadd(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
   39391                     break;
   39392                   }
   39393                   case 0x00200000: {
   39394                     // 0xf2200d00
   39395                     unsigned rd = ExtractDRegister(instr, 22, 12);
   39396                     unsigned rn = ExtractDRegister(instr, 7, 16);
   39397                     unsigned rm = ExtractDRegister(instr, 5, 0);
   39398                     // VSUB{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A1
   39399                     vsub(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
   39400                     break;
   39401                   }
   39402                   case 0x01000000: {
   39403                     // 0xf3000d00
   39404                     unsigned rd = ExtractDRegister(instr, 22, 12);
   39405                     unsigned rn = ExtractDRegister(instr, 7, 16);
   39406                     unsigned rm = ExtractDRegister(instr, 5, 0);
   39407                     // VPADD{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A1
   39408                     vpadd(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
   39409                     break;
   39410                   }
   39411                   case 0x01200000: {
   39412                     // 0xf3200d00
   39413                     unsigned rd = ExtractDRegister(instr, 22, 12);
   39414                     unsigned rn = ExtractDRegister(instr, 7, 16);
   39415                     unsigned rm = ExtractDRegister(instr, 5, 0);
   39416                     // VABD{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A1
   39417                     vabd(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
   39418                     break;
   39419                   }
   39420                   default:
   39421                     UnallocatedA32(instr);
   39422                     break;
   39423                 }
   39424                 break;
   39425               }
   39426               case 0x00000d40: {
   39427                 // 0xf2000d40
   39428                 switch (instr & 0x01300000) {
   39429                   case 0x00000000: {
   39430                     // 0xf2000d40
   39431                     if (((instr >> 12) & 1) != 0) {
   39432                       UnallocatedA32(instr);
   39433                       return;
   39434                     }
   39435                     unsigned rd = ExtractQRegister(instr, 22, 12);
   39436                     if (((instr >> 16) & 1) != 0) {
   39437                       UnallocatedA32(instr);
   39438                       return;
   39439                     }
   39440                     unsigned rn = ExtractQRegister(instr, 7, 16);
   39441                     if ((instr & 1) != 0) {
   39442                       UnallocatedA32(instr);
   39443                       return;
   39444                     }
   39445                     unsigned rm = ExtractQRegister(instr, 5, 0);
   39446                     // VADD{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; A1
   39447                     vadd(al, F32, QRegister(rd), QRegister(rn), QRegister(rm));
   39448                     break;
   39449                   }
   39450                   case 0x00200000: {
   39451                     // 0xf2200d40
   39452                     if (((instr >> 12) & 1) != 0) {
   39453                       UnallocatedA32(instr);
   39454                       return;
   39455                     }
   39456                     unsigned rd = ExtractQRegister(instr, 22, 12);
   39457                     if (((instr >> 16) & 1) != 0) {
   39458                       UnallocatedA32(instr);
   39459                       return;
   39460                     }
   39461                     unsigned rn = ExtractQRegister(instr, 7, 16);
   39462                     if ((instr & 1) != 0) {
   39463                       UnallocatedA32(instr);
   39464                       return;
   39465                     }
   39466                     unsigned rm = ExtractQRegister(instr, 5, 0);
   39467                     // VSUB{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; A1
   39468                     vsub(al, F32, QRegister(rd), QRegister(rn), QRegister(rm));
   39469                     break;
   39470                   }
   39471                   case 0x01200000: {
   39472                     // 0xf3200d40
   39473                     if (((instr >> 12) & 1) != 0) {
   39474                       UnallocatedA32(instr);
   39475                       return;
   39476                     }
   39477                     unsigned rd = ExtractQRegister(instr, 22, 12);
   39478                     if (((instr >> 16) & 1) != 0) {
   39479                       UnallocatedA32(instr);
   39480                       return;
   39481                     }
   39482                     unsigned rn = ExtractQRegister(instr, 7, 16);
   39483                     if ((instr & 1) != 0) {
   39484                       UnallocatedA32(instr);
   39485                       return;
   39486                     }
   39487                     unsigned rm = ExtractQRegister(instr, 5, 0);
   39488                     // VABD{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; A1
   39489                     vabd(al, F32, QRegister(rd), QRegister(rn), QRegister(rm));
   39490                     break;
   39491                   }
   39492                   default:
   39493                     UnallocatedA32(instr);
   39494                     break;
   39495                 }
   39496                 break;
   39497               }
   39498               case 0x00000e00: {
   39499                 // 0xf2000e00
   39500                 switch (instr & 0x01200000) {
   39501                   case 0x00000000: {
   39502                     // 0xf2000e00
   39503                     DataType dt = Dt_sz_1_Decode((instr >> 20) & 0x1);
   39504                     if (dt.Is(kDataTypeValueInvalid)) {
   39505                       UnallocatedA32(instr);
   39506                       return;
   39507                     }
   39508                     unsigned rd = ExtractDRegister(instr, 22, 12);
   39509                     unsigned rn = ExtractDRegister(instr, 7, 16);
   39510                     unsigned rm = ExtractDRegister(instr, 5, 0);
   39511                     // VCEQ{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A2
   39512                     vceq(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
   39513                     break;
   39514                   }
   39515                   case 0x01000000: {
   39516                     // 0xf3000e00
   39517                     if ((instr & 0x00100000) == 0x00000000) {
   39518                       unsigned rd = ExtractDRegister(instr, 22, 12);
   39519                       unsigned rn = ExtractDRegister(instr, 7, 16);
   39520                       unsigned rm = ExtractDRegister(instr, 5, 0);
   39521                       // VCGE{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A2
   39522                       vcge(al,
   39523                            F32,
   39524                            DRegister(rd),
   39525                            DRegister(rn),
   39526                            DRegister(rm));
   39527                     } else {
   39528                       UnallocatedA32(instr);
   39529                     }
   39530                     break;
   39531                   }
   39532                   case 0x01200000: {
   39533                     // 0xf3200e00
   39534                     if ((instr & 0x00100000) == 0x00000000) {
   39535                       unsigned rd = ExtractDRegister(instr, 22, 12);
   39536                       unsigned rn = ExtractDRegister(instr, 7, 16);
   39537                       unsigned rm = ExtractDRegister(instr, 5, 0);
   39538                       // VCGT{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A2
   39539                       vcgt(al,
   39540                            F32,
   39541                            DRegister(rd),
   39542                            DRegister(rn),
   39543                            DRegister(rm));
   39544                     } else {
   39545                       UnallocatedA32(instr);
   39546                     }
   39547                     break;
   39548                   }
   39549                   default:
   39550                     UnallocatedA32(instr);
   39551                     break;
   39552                 }
   39553                 break;
   39554               }
   39555               case 0x00000e40: {
   39556                 // 0xf2000e40
   39557                 switch (instr & 0x01200000) {
   39558                   case 0x00000000: {
   39559                     // 0xf2000e40
   39560                     DataType dt = Dt_sz_1_Decode((instr >> 20) & 0x1);
   39561                     if (dt.Is(kDataTypeValueInvalid)) {
   39562                       UnallocatedA32(instr);
   39563                       return;
   39564                     }
   39565                     if (((instr >> 12) & 1) != 0) {
   39566                       UnallocatedA32(instr);
   39567                       return;
   39568                     }
   39569                     unsigned rd = ExtractQRegister(instr, 22, 12);
   39570                     if (((instr >> 16) & 1) != 0) {
   39571                       UnallocatedA32(instr);
   39572                       return;
   39573                     }
   39574                     unsigned rn = ExtractQRegister(instr, 7, 16);
   39575                     if ((instr & 1) != 0) {
   39576                       UnallocatedA32(instr);
   39577                       return;
   39578                     }
   39579                     unsigned rm = ExtractQRegister(instr, 5, 0);
   39580                     // VCEQ{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A2
   39581                     vceq(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
   39582                     break;
   39583                   }
   39584                   case 0x01000000: {
   39585                     // 0xf3000e40
   39586                     if ((instr & 0x00100000) == 0x00000000) {
   39587                       if (((instr >> 12) & 1) != 0) {
   39588                         UnallocatedA32(instr);
   39589                         return;
   39590                       }
   39591                       unsigned rd = ExtractQRegister(instr, 22, 12);
   39592                       if (((instr >> 16) & 1) != 0) {
   39593                         UnallocatedA32(instr);
   39594                         return;
   39595                       }
   39596                       unsigned rn = ExtractQRegister(instr, 7, 16);
   39597                       if ((instr & 1) != 0) {
   39598                         UnallocatedA32(instr);
   39599                         return;
   39600                       }
   39601                       unsigned rm = ExtractQRegister(instr, 5, 0);
   39602                       // VCGE{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; A2
   39603                       vcge(al,
   39604                            F32,
   39605                            QRegister(rd),
   39606                            QRegister(rn),
   39607                            QRegister(rm));
   39608                     } else {
   39609                       UnallocatedA32(instr);
   39610                     }
   39611                     break;
   39612                   }
   39613                   case 0x01200000: {
   39614                     // 0xf3200e40
   39615                     if ((instr & 0x00100000) == 0x00000000) {
   39616                       if (((instr >> 12) & 1) != 0) {
   39617                         UnallocatedA32(instr);
   39618                         return;
   39619                       }
   39620                       unsigned rd = ExtractQRegister(instr, 22, 12);
   39621                       if (((instr >> 16) & 1) != 0) {
   39622                         UnallocatedA32(instr);
   39623                         return;
   39624                       }
   39625                       unsigned rn = ExtractQRegister(instr, 7, 16);
   39626                       if ((instr & 1) != 0) {
   39627                         UnallocatedA32(instr);
   39628                         return;
   39629                       }
   39630                       unsigned rm = ExtractQRegister(instr, 5, 0);
   39631                       // VCGT{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; A2
   39632                       vcgt(al,
   39633                            F32,
   39634                            QRegister(rd),
   39635                            QRegister(rn),
   39636                            QRegister(rm));
   39637                     } else {
   39638                       UnallocatedA32(instr);
   39639                     }
   39640                     break;
   39641                   }
   39642                   default:
   39643                     UnallocatedA32(instr);
   39644                     break;
   39645                 }
   39646                 break;
   39647               }
   39648               case 0x00000f00: {
   39649                 // 0xf2000f00
   39650                 switch (instr & 0x01300000) {
   39651                   case 0x00000000: {
   39652                     // 0xf2000f00
   39653                     unsigned rd = ExtractDRegister(instr, 22, 12);
   39654                     unsigned rn = ExtractDRegister(instr, 7, 16);
   39655                     unsigned rm = ExtractDRegister(instr, 5, 0);
   39656                     // VMAX{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A1
   39657                     vmax(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
   39658                     break;
   39659                   }
   39660                   case 0x00200000: {
   39661                     // 0xf2200f00
   39662                     unsigned rd = ExtractDRegister(instr, 22, 12);
   39663                     unsigned rn = ExtractDRegister(instr, 7, 16);
   39664                     unsigned rm = ExtractDRegister(instr, 5, 0);
   39665                     // VMIN{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A1
   39666                     vmin(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
   39667                     break;
   39668                   }
   39669                   case 0x01000000: {
   39670                     // 0xf3000f00
   39671                     unsigned rd = ExtractDRegister(instr, 22, 12);
   39672                     unsigned rn = ExtractDRegister(instr, 7, 16);
   39673                     unsigned rm = ExtractDRegister(instr, 5, 0);
   39674                     // VPMAX{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A1
   39675                     vpmax(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
   39676                     break;
   39677                   }
   39678                   case 0x01200000: {
   39679                     // 0xf3200f00
   39680                     unsigned rd = ExtractDRegister(instr, 22, 12);
   39681                     unsigned rn = ExtractDRegister(instr, 7, 16);
   39682                     unsigned rm = ExtractDRegister(instr, 5, 0);
   39683                     // VPMIN{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A1
   39684                     vpmin(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
   39685                     break;
   39686                   }
   39687                   default:
   39688                     UnallocatedA32(instr);
   39689                     break;
   39690                 }
   39691                 break;
   39692               }
   39693               case 0x00000f40: {
   39694                 // 0xf2000f40
   39695                 switch (instr & 0x01300000) {
   39696                   case 0x00000000: {
   39697                     // 0xf2000f40
   39698                     if (((instr >> 12) & 1) != 0) {
   39699                       UnallocatedA32(instr);
   39700                       return;
   39701                     }
   39702                     unsigned rd = ExtractQRegister(instr, 22, 12);
   39703                     if (((instr >> 16) & 1) != 0) {
   39704                       UnallocatedA32(instr);
   39705                       return;
   39706                     }
   39707                     unsigned rn = ExtractQRegister(instr, 7, 16);
   39708                     if ((instr & 1) != 0) {
   39709                       UnallocatedA32(instr);
   39710                       return;
   39711                     }
   39712                     unsigned rm = ExtractQRegister(instr, 5, 0);
   39713                     // VMAX{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; A1
   39714                     vmax(al, F32, QRegister(rd), QRegister(rn), QRegister(rm));
   39715                     break;
   39716                   }
   39717                   case 0x00200000: {
   39718                     // 0xf2200f40
   39719                     if (((instr >> 12) & 1) != 0) {
   39720                       UnallocatedA32(instr);
   39721                       return;
   39722                     }
   39723                     unsigned rd = ExtractQRegister(instr, 22, 12);
   39724                     if (((instr >> 16) & 1) != 0) {
   39725                       UnallocatedA32(instr);
   39726                       return;
   39727                     }
   39728                     unsigned rn = ExtractQRegister(instr, 7, 16);
   39729                     if ((instr & 1) != 0) {
   39730                       UnallocatedA32(instr);
   39731                       return;
   39732                     }
   39733                     unsigned rm = ExtractQRegister(instr, 5, 0);
   39734                     // VMIN{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; A1
   39735                     vmin(al, F32, QRegister(rd), QRegister(rn), QRegister(rm));
   39736                     break;
   39737                   }
   39738                   default:
   39739                     UnallocatedA32(instr);
   39740                     break;
   39741                 }
   39742                 break;
   39743               }
   39744               default:
   39745                 UnallocatedA32(instr);
   39746                 break;
   39747             }
   39748             break;
   39749           }
   39750           case 0x00000010: {
   39751             // 0xf2000010
   39752             switch (instr & 0x00000f40) {
   39753               case 0x00000000: {
   39754                 // 0xf2000010
   39755                 DataType dt = Dt_U_size_3_Decode(((instr >> 20) & 0x3) |
   39756                                                  ((instr >> 22) & 0x4));
   39757                 if (dt.Is(kDataTypeValueInvalid)) {
   39758                   UnallocatedA32(instr);
   39759                   return;
   39760                 }
   39761                 unsigned rd = ExtractDRegister(instr, 22, 12);
   39762                 unsigned rn = ExtractDRegister(instr, 7, 16);
   39763                 unsigned rm = ExtractDRegister(instr, 5, 0);
   39764                 // VQADD{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
   39765                 vqadd(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
   39766                 break;
   39767               }
   39768               case 0x00000040: {
   39769                 // 0xf2000050
   39770                 DataType dt = Dt_U_size_3_Decode(((instr >> 20) & 0x3) |
   39771                                                  ((instr >> 22) & 0x4));
   39772                 if (dt.Is(kDataTypeValueInvalid)) {
   39773                   UnallocatedA32(instr);
   39774                   return;
   39775                 }
   39776                 if (((instr >> 12) & 1) != 0) {
   39777                   UnallocatedA32(instr);
   39778                   return;
   39779                 }
   39780                 unsigned rd = ExtractQRegister(instr, 22, 12);
   39781                 if (((instr >> 16) & 1) != 0) {
   39782                   UnallocatedA32(instr);
   39783                   return;
   39784                 }
   39785                 unsigned rn = ExtractQRegister(instr, 7, 16);
   39786                 if ((instr & 1) != 0) {
   39787                   UnallocatedA32(instr);
   39788                   return;
   39789                 }
   39790                 unsigned rm = ExtractQRegister(instr, 5, 0);
   39791                 // VQADD{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
   39792                 vqadd(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
   39793                 break;
   39794               }
   39795               case 0x00000100: {
   39796                 // 0xf2000110
   39797                 switch (instr & 0x01300000) {
   39798                   case 0x00000000: {
   39799                     // 0xf2000110
   39800                     unsigned rd = ExtractDRegister(instr, 22, 12);
   39801                     unsigned rn = ExtractDRegister(instr, 7, 16);
   39802                     unsigned rm = ExtractDRegister(instr, 5, 0);
   39803                     // VAND{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; A1
   39804                     vand(al,
   39805                          kDataTypeValueNone,
   39806                          DRegister(rd),
   39807                          DRegister(rn),
   39808                          DRegister(rm));
   39809                     break;
   39810                   }
   39811                   case 0x00100000: {
   39812                     // 0xf2100110
   39813                     unsigned rd = ExtractDRegister(instr, 22, 12);
   39814                     unsigned rn = ExtractDRegister(instr, 7, 16);
   39815                     unsigned rm = ExtractDRegister(instr, 5, 0);
   39816                     // VBIC{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; A1
   39817                     vbic(al,
   39818                          kDataTypeValueNone,
   39819                          DRegister(rd),
   39820                          DRegister(rn),
   39821                          DRegister(rm));
   39822                     break;
   39823                   }
   39824                   case 0x00200000: {
   39825                     // 0xf2200110
   39826                     if (((instr & 0x00000040) == 0x00000000) &&
   39827                         ((((Uint32((instr >> 7)) & Uint32(0x1)) << 4) |
   39828                           (Uint32((instr >> 16)) & Uint32(0xf))) ==
   39829                          (((Uint32((instr >> 5)) & Uint32(0x1)) << 4) |
   39830                           (Uint32(instr) & Uint32(0xf))))) {
   39831                       unsigned rd = ExtractDRegister(instr, 22, 12);
   39832                       unsigned rm = ExtractDRegister(instr, 7, 16);
   39833                       // VMOV{<c>}{<q>}{.<dt>} <Dd>, <Dm> ; A1
   39834                       vmov(al,
   39835                            kDataTypeValueNone,
   39836                            DRegister(rd),
   39837                            DRegister(rm));
   39838                       return;
   39839                     }
   39840                     unsigned rd = ExtractDRegister(instr, 22, 12);
   39841                     unsigned rn = ExtractDRegister(instr, 7, 16);
   39842                     unsigned rm = ExtractDRegister(instr, 5, 0);
   39843                     // VORR{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; A1
   39844                     vorr(al,
   39845                          kDataTypeValueNone,
   39846                          DRegister(rd),
   39847                          DRegister(rn),
   39848                          DRegister(rm));
   39849                     break;
   39850                   }
   39851                   case 0x00300000: {
   39852                     // 0xf2300110
   39853                     unsigned rd = ExtractDRegister(instr, 22, 12);
   39854                     unsigned rn = ExtractDRegister(instr, 7, 16);
   39855                     unsigned rm = ExtractDRegister(instr, 5, 0);
   39856                     // VORN{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; A1
   39857                     vorn(al,
   39858                          kDataTypeValueNone,
   39859                          DRegister(rd),
   39860                          DRegister(rn),
   39861                          DRegister(rm));
   39862                     break;
   39863                   }
   39864                   case 0x01000000: {
   39865                     // 0xf3000110
   39866                     unsigned rd = ExtractDRegister(instr, 22, 12);
   39867                     unsigned rn = ExtractDRegister(instr, 7, 16);
   39868                     unsigned rm = ExtractDRegister(instr, 5, 0);
   39869                     // VEOR{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; A1
   39870                     veor(al,
   39871                          kDataTypeValueNone,
   39872                          DRegister(rd),
   39873                          DRegister(rn),
   39874                          DRegister(rm));
   39875                     break;
   39876                   }
   39877                   case 0x01100000: {
   39878                     // 0xf3100110
   39879                     unsigned rd = ExtractDRegister(instr, 22, 12);
   39880                     unsigned rn = ExtractDRegister(instr, 7, 16);
   39881                     unsigned rm = ExtractDRegister(instr, 5, 0);
   39882                     // VBSL{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; A1
   39883                     vbsl(al,
   39884                          kDataTypeValueNone,
   39885                          DRegister(rd),
   39886                          DRegister(rn),
   39887                          DRegister(rm));
   39888                     break;
   39889                   }
   39890                   case 0x01200000: {
   39891                     // 0xf3200110
   39892                     unsigned rd = ExtractDRegister(instr, 22, 12);
   39893                     unsigned rn = ExtractDRegister(instr, 7, 16);
   39894                     unsigned rm = ExtractDRegister(instr, 5, 0);
   39895                     // VBIT{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; A1
   39896                     vbit(al,
   39897                          kDataTypeValueNone,
   39898                          DRegister(rd),
   39899                          DRegister(rn),
   39900                          DRegister(rm));
   39901                     break;
   39902                   }
   39903                   case 0x01300000: {
   39904                     // 0xf3300110
   39905                     unsigned rd = ExtractDRegister(instr, 22, 12);
   39906                     unsigned rn = ExtractDRegister(instr, 7, 16);
   39907                     unsigned rm = ExtractDRegister(instr, 5, 0);
   39908                     // VBIF{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; A1
   39909                     vbif(al,
   39910                          kDataTypeValueNone,
   39911                          DRegister(rd),
   39912                          DRegister(rn),
   39913                          DRegister(rm));
   39914                     break;
   39915                   }
   39916                 }
   39917                 break;
   39918               }
   39919               case 0x00000140: {
   39920                 // 0xf2000150
   39921                 switch (instr & 0x01300000) {
   39922                   case 0x00000000: {
   39923                     // 0xf2000150
   39924                     if (((instr >> 12) & 1) != 0) {
   39925                       UnallocatedA32(instr);
   39926                       return;
   39927                     }
   39928                     unsigned rd = ExtractQRegister(instr, 22, 12);
   39929                     if (((instr >> 16) & 1) != 0) {
   39930                       UnallocatedA32(instr);
   39931                       return;
   39932                     }
   39933                     unsigned rn = ExtractQRegister(instr, 7, 16);
   39934                     if ((instr & 1) != 0) {
   39935                       UnallocatedA32(instr);
   39936                       return;
   39937                     }
   39938                     unsigned rm = ExtractQRegister(instr, 5, 0);
   39939                     // VAND{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; A1
   39940                     vand(al,
   39941                          kDataTypeValueNone,
   39942                          QRegister(rd),
   39943                          QRegister(rn),
   39944                          QRegister(rm));
   39945                     break;
   39946                   }
   39947                   case 0x00100000: {
   39948                     // 0xf2100150
   39949                     if (((instr >> 12) & 1) != 0) {
   39950                       UnallocatedA32(instr);
   39951                       return;
   39952                     }
   39953                     unsigned rd = ExtractQRegister(instr, 22, 12);
   39954                     if (((instr >> 16) & 1) != 0) {
   39955                       UnallocatedA32(instr);
   39956                       return;
   39957                     }
   39958                     unsigned rn = ExtractQRegister(instr, 7, 16);
   39959                     if ((instr & 1) != 0) {
   39960                       UnallocatedA32(instr);
   39961                       return;
   39962                     }
   39963                     unsigned rm = ExtractQRegister(instr, 5, 0);
   39964                     // VBIC{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; A1
   39965                     vbic(al,
   39966                          kDataTypeValueNone,
   39967                          QRegister(rd),
   39968                          QRegister(rn),
   39969                          QRegister(rm));
   39970                     break;
   39971                   }
   39972                   case 0x00200000: {
   39973                     // 0xf2200150
   39974                     if (((instr & 0x00000040) == 0x00000040) &&
   39975                         ((((Uint32((instr >> 7)) & Uint32(0x1)) << 4) |
   39976                           (Uint32((instr >> 16)) & Uint32(0xf))) ==
   39977                          (((Uint32((instr >> 5)) & Uint32(0x1)) << 4) |
   39978                           (Uint32(instr) & Uint32(0xf))))) {
   39979                       if (((instr >> 12) & 1) != 0) {
   39980                         UnallocatedA32(instr);
   39981                         return;
   39982                       }
   39983                       unsigned rd = ExtractQRegister(instr, 22, 12);
   39984                       if (((instr >> 16) & 1) != 0) {
   39985                         UnallocatedA32(instr);
   39986                         return;
   39987                       }
   39988                       unsigned rm = ExtractQRegister(instr, 7, 16);
   39989                       // VMOV{<c>}{<q>}{.<dt>} <Qd>, <Qm> ; A1
   39990                       vmov(al,
   39991                            kDataTypeValueNone,
   39992                            QRegister(rd),
   39993                            QRegister(rm));
   39994                       return;
   39995                     }
   39996                     if (((instr >> 12) & 1) != 0) {
   39997                       UnallocatedA32(instr);
   39998                       return;
   39999                     }
   40000                     unsigned rd = ExtractQRegister(instr, 22, 12);
   40001                     if (((instr >> 16) & 1) != 0) {
   40002                       UnallocatedA32(instr);
   40003                       return;
   40004                     }
   40005                     unsigned rn = ExtractQRegister(instr, 7, 16);
   40006                     if ((instr & 1) != 0) {
   40007                       UnallocatedA32(instr);
   40008                       return;
   40009                     }
   40010                     unsigned rm = ExtractQRegister(instr, 5, 0);
   40011                     // VORR{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; A1
   40012                     vorr(al,
   40013                          kDataTypeValueNone,
   40014                          QRegister(rd),
   40015                          QRegister(rn),
   40016                          QRegister(rm));
   40017                     break;
   40018                   }
   40019                   case 0x00300000: {
   40020                     // 0xf2300150
   40021                     if (((instr >> 12) & 1) != 0) {
   40022                       UnallocatedA32(instr);
   40023                       return;
   40024                     }
   40025                     unsigned rd = ExtractQRegister(instr, 22, 12);
   40026                     if (((instr >> 16) & 1) != 0) {
   40027                       UnallocatedA32(instr);
   40028                       return;
   40029                     }
   40030                     unsigned rn = ExtractQRegister(instr, 7, 16);
   40031                     if ((instr & 1) != 0) {
   40032                       UnallocatedA32(instr);
   40033                       return;
   40034                     }
   40035                     unsigned rm = ExtractQRegister(instr, 5, 0);
   40036                     // VORN{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; A1
   40037                     vorn(al,
   40038                          kDataTypeValueNone,
   40039                          QRegister(rd),
   40040                          QRegister(rn),
   40041                          QRegister(rm));
   40042                     break;
   40043                   }
   40044                   case 0x01000000: {
   40045                     // 0xf3000150
   40046                     if (((instr >> 12) & 1) != 0) {
   40047                       UnallocatedA32(instr);
   40048                       return;
   40049                     }
   40050                     unsigned rd = ExtractQRegister(instr, 22, 12);
   40051                     if (((instr >> 16) & 1) != 0) {
   40052                       UnallocatedA32(instr);
   40053                       return;
   40054                     }
   40055                     unsigned rn = ExtractQRegister(instr, 7, 16);
   40056                     if ((instr & 1) != 0) {
   40057                       UnallocatedA32(instr);
   40058                       return;
   40059                     }
   40060                     unsigned rm = ExtractQRegister(instr, 5, 0);
   40061                     // VEOR{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; A1
   40062                     veor(al,
   40063                          kDataTypeValueNone,
   40064                          QRegister(rd),
   40065                          QRegister(rn),
   40066                          QRegister(rm));
   40067                     break;
   40068                   }
   40069                   case 0x01100000: {
   40070                     // 0xf3100150
   40071                     if (((instr >> 12) & 1) != 0) {
   40072                       UnallocatedA32(instr);
   40073                       return;
   40074                     }
   40075                     unsigned rd = ExtractQRegister(instr, 22, 12);
   40076                     if (((instr >> 16) & 1) != 0) {
   40077                       UnallocatedA32(instr);
   40078                       return;
   40079                     }
   40080                     unsigned rn = ExtractQRegister(instr, 7, 16);
   40081                     if ((instr & 1) != 0) {
   40082                       UnallocatedA32(instr);
   40083                       return;
   40084                     }
   40085                     unsigned rm = ExtractQRegister(instr, 5, 0);
   40086                     // VBSL{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; A1
   40087                     vbsl(al,
   40088                          kDataTypeValueNone,
   40089                          QRegister(rd),
   40090                          QRegister(rn),
   40091                          QRegister(rm));
   40092                     break;
   40093                   }
   40094                   case 0x01200000: {
   40095                     // 0xf3200150
   40096                     if (((instr >> 12) & 1) != 0) {
   40097                       UnallocatedA32(instr);
   40098                       return;
   40099                     }
   40100                     unsigned rd = ExtractQRegister(instr, 22, 12);
   40101                     if (((instr >> 16) & 1) != 0) {
   40102                       UnallocatedA32(instr);
   40103                       return;
   40104                     }
   40105                     unsigned rn = ExtractQRegister(instr, 7, 16);
   40106                     if ((instr & 1) != 0) {
   40107                       UnallocatedA32(instr);
   40108                       return;
   40109                     }
   40110                     unsigned rm = ExtractQRegister(instr, 5, 0);
   40111                     // VBIT{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; A1
   40112                     vbit(al,
   40113                          kDataTypeValueNone,
   40114                          QRegister(rd),
   40115                          QRegister(rn),
   40116                          QRegister(rm));
   40117                     break;
   40118                   }
   40119                   case 0x01300000: {
   40120                     // 0xf3300150
   40121                     if (((instr >> 12) & 1) != 0) {
   40122                       UnallocatedA32(instr);
   40123                       return;
   40124                     }
   40125                     unsigned rd = ExtractQRegister(instr, 22, 12);
   40126                     if (((instr >> 16) & 1) != 0) {
   40127                       UnallocatedA32(instr);
   40128                       return;
   40129                     }
   40130                     unsigned rn = ExtractQRegister(instr, 7, 16);
   40131                     if ((instr & 1) != 0) {
   40132                       UnallocatedA32(instr);
   40133                       return;
   40134                     }
   40135                     unsigned rm = ExtractQRegister(instr, 5, 0);
   40136                     // VBIF{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; A1
   40137                     vbif(al,
   40138                          kDataTypeValueNone,
   40139                          QRegister(rd),
   40140                          QRegister(rn),
   40141                          QRegister(rm));
   40142                     break;
   40143                   }
   40144                 }
   40145                 break;
   40146               }
   40147               case 0x00000200: {
   40148                 // 0xf2000210
   40149                 DataType dt = Dt_U_size_3_Decode(((instr >> 20) & 0x3) |
   40150                                                  ((instr >> 22) & 0x4));
   40151                 if (dt.Is(kDataTypeValueInvalid)) {
   40152                   UnallocatedA32(instr);
   40153                   return;
   40154                 }
   40155                 unsigned rd = ExtractDRegister(instr, 22, 12);
   40156                 unsigned rn = ExtractDRegister(instr, 7, 16);
   40157                 unsigned rm = ExtractDRegister(instr, 5, 0);
   40158                 // VQSUB{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
   40159                 vqsub(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
   40160                 break;
   40161               }
   40162               case 0x00000240: {
   40163                 // 0xf2000250
   40164                 DataType dt = Dt_U_size_3_Decode(((instr >> 20) & 0x3) |
   40165                                                  ((instr >> 22) & 0x4));
   40166                 if (dt.Is(kDataTypeValueInvalid)) {
   40167                   UnallocatedA32(instr);
   40168                   return;
   40169                 }
   40170                 if (((instr >> 12) & 1) != 0) {
   40171                   UnallocatedA32(instr);
   40172                   return;
   40173                 }
   40174                 unsigned rd = ExtractQRegister(instr, 22, 12);
   40175                 if (((instr >> 16) & 1) != 0) {
   40176                   UnallocatedA32(instr);
   40177                   return;
   40178                 }
   40179                 unsigned rn = ExtractQRegister(instr, 7, 16);
   40180                 if ((instr & 1) != 0) {
   40181                   UnallocatedA32(instr);
   40182                   return;
   40183                 }
   40184                 unsigned rm = ExtractQRegister(instr, 5, 0);
   40185                 // VQSUB{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
   40186                 vqsub(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
   40187                 break;
   40188               }
   40189               case 0x00000300: {
   40190                 // 0xf2000310
   40191                 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
   40192                                                  ((instr >> 22) & 0x4));
   40193                 if (dt.Is(kDataTypeValueInvalid)) {
   40194                   UnallocatedA32(instr);
   40195                   return;
   40196                 }
   40197                 unsigned rd = ExtractDRegister(instr, 22, 12);
   40198                 unsigned rn = ExtractDRegister(instr, 7, 16);
   40199                 unsigned rm = ExtractDRegister(instr, 5, 0);
   40200                 // VCGE{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
   40201                 vcge(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
   40202                 break;
   40203               }
   40204               case 0x00000340: {
   40205                 // 0xf2000350
   40206                 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
   40207                                                  ((instr >> 22) & 0x4));
   40208                 if (dt.Is(kDataTypeValueInvalid)) {
   40209                   UnallocatedA32(instr);
   40210                   return;
   40211                 }
   40212                 if (((instr >> 12) & 1) != 0) {
   40213                   UnallocatedA32(instr);
   40214                   return;
   40215                 }
   40216                 unsigned rd = ExtractQRegister(instr, 22, 12);
   40217                 if (((instr >> 16) & 1) != 0) {
   40218                   UnallocatedA32(instr);
   40219                   return;
   40220                 }
   40221                 unsigned rn = ExtractQRegister(instr, 7, 16);
   40222                 if ((instr & 1) != 0) {
   40223                   UnallocatedA32(instr);
   40224                   return;
   40225                 }
   40226                 unsigned rm = ExtractQRegister(instr, 5, 0);
   40227                 // VCGE{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
   40228                 vcge(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
   40229                 break;
   40230               }
   40231               case 0x00000400: {
   40232                 // 0xf2000410
   40233                 DataType dt = Dt_U_size_3_Decode(((instr >> 20) & 0x3) |
   40234                                                  ((instr >> 22) & 0x4));
   40235                 if (dt.Is(kDataTypeValueInvalid)) {
   40236                   UnallocatedA32(instr);
   40237                   return;
   40238                 }
   40239                 unsigned rd = ExtractDRegister(instr, 22, 12);
   40240                 unsigned rm = ExtractDRegister(instr, 5, 0);
   40241                 unsigned rn = ExtractDRegister(instr, 7, 16);
   40242                 // VQSHL{<c>}{<q>}.<dt> {<Dd>}, <Dm>, <Dn> ; A1
   40243                 vqshl(al, dt, DRegister(rd), DRegister(rm), DRegister(rn));
   40244                 break;
   40245               }
   40246               case 0x00000440: {
   40247                 // 0xf2000450
   40248                 DataType dt = Dt_U_size_3_Decode(((instr >> 20) & 0x3) |
   40249                                                  ((instr >> 22) & 0x4));
   40250                 if (dt.Is(kDataTypeValueInvalid)) {
   40251                   UnallocatedA32(instr);
   40252                   return;
   40253                 }
   40254                 if (((instr >> 12) & 1) != 0) {
   40255                   UnallocatedA32(instr);
   40256                   return;
   40257                 }
   40258                 unsigned rd = ExtractQRegister(instr, 22, 12);
   40259                 if ((instr & 1) != 0) {
   40260                   UnallocatedA32(instr);
   40261                   return;
   40262                 }
   40263                 unsigned rm = ExtractQRegister(instr, 5, 0);
   40264                 if (((instr >> 16) & 1) != 0) {
   40265                   UnallocatedA32(instr);
   40266                   return;
   40267                 }
   40268                 unsigned rn = ExtractQRegister(instr, 7, 16);
   40269                 // VQSHL{<c>}{<q>}.<dt> {<Qd>}, <Qm>, <Qn> ; A1
   40270                 vqshl(al, dt, QRegister(rd), QRegister(rm), QRegister(rn));
   40271                 break;
   40272               }
   40273               case 0x00000500: {
   40274                 // 0xf2000510
   40275                 DataType dt = Dt_U_size_3_Decode(((instr >> 20) & 0x3) |
   40276                                                  ((instr >> 22) & 0x4));
   40277                 if (dt.Is(kDataTypeValueInvalid)) {
   40278                   UnallocatedA32(instr);
   40279                   return;
   40280                 }
   40281                 unsigned rd = ExtractDRegister(instr, 22, 12);
   40282                 unsigned rm = ExtractDRegister(instr, 5, 0);
   40283                 unsigned rn = ExtractDRegister(instr, 7, 16);
   40284                 // VQRSHL{<c>}{<q>}.<dt> {<Dd>}, <Dm>, <Dn> ; A1
   40285                 vqrshl(al, dt, DRegister(rd), DRegister(rm), DRegister(rn));
   40286                 break;
   40287               }
   40288               case 0x00000540: {
   40289                 // 0xf2000550
   40290                 DataType dt = Dt_U_size_3_Decode(((instr >> 20) & 0x3) |
   40291                                                  ((instr >> 22) & 0x4));
   40292                 if (dt.Is(kDataTypeValueInvalid)) {
   40293                   UnallocatedA32(instr);
   40294                   return;
   40295                 }
   40296                 if (((instr >> 12) & 1) != 0) {
   40297                   UnallocatedA32(instr);
   40298                   return;
   40299                 }
   40300                 unsigned rd = ExtractQRegister(instr, 22, 12);
   40301                 if ((instr & 1) != 0) {
   40302                   UnallocatedA32(instr);
   40303                   return;
   40304                 }
   40305                 unsigned rm = ExtractQRegister(instr, 5, 0);
   40306                 if (((instr >> 16) & 1) != 0) {
   40307                   UnallocatedA32(instr);
   40308                   return;
   40309                 }
   40310                 unsigned rn = ExtractQRegister(instr, 7, 16);
   40311                 // VQRSHL{<c>}{<q>}.<dt> {<Qd>}, <Qm>, <Qn> ; A1
   40312                 vqrshl(al, dt, QRegister(rd), QRegister(rm), QRegister(rn));
   40313                 break;
   40314               }
   40315               case 0x00000600: {
   40316                 // 0xf2000610
   40317                 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
   40318                                                  ((instr >> 22) & 0x4));
   40319                 if (dt.Is(kDataTypeValueInvalid)) {
   40320                   UnallocatedA32(instr);
   40321                   return;
   40322                 }
   40323                 unsigned rd = ExtractDRegister(instr, 22, 12);
   40324                 unsigned rn = ExtractDRegister(instr, 7, 16);
   40325                 unsigned rm = ExtractDRegister(instr, 5, 0);
   40326                 // VMIN{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
   40327                 vmin(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
   40328                 break;
   40329               }
   40330               case 0x00000640: {
   40331                 // 0xf2000650
   40332                 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
   40333                                                  ((instr >> 22) & 0x4));
   40334                 if (dt.Is(kDataTypeValueInvalid)) {
   40335                   UnallocatedA32(instr);
   40336                   return;
   40337                 }
   40338                 if (((instr >> 12) & 1) != 0) {
   40339                   UnallocatedA32(instr);
   40340                   return;
   40341                 }
   40342                 unsigned rd = ExtractQRegister(instr, 22, 12);
   40343                 if (((instr >> 16) & 1) != 0) {
   40344                   UnallocatedA32(instr);
   40345                   return;
   40346                 }
   40347                 unsigned rn = ExtractQRegister(instr, 7, 16);
   40348                 if ((instr & 1) != 0) {
   40349                   UnallocatedA32(instr);
   40350                   return;
   40351                 }
   40352                 unsigned rm = ExtractQRegister(instr, 5, 0);
   40353                 // VMIN{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
   40354                 vmin(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
   40355                 break;
   40356               }
   40357               case 0x00000700: {
   40358                 // 0xf2000710
   40359                 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
   40360                                                  ((instr >> 22) & 0x4));
   40361                 if (dt.Is(kDataTypeValueInvalid)) {
   40362                   UnallocatedA32(instr);
   40363                   return;
   40364                 }
   40365                 unsigned rd = ExtractDRegister(instr, 22, 12);
   40366                 unsigned rn = ExtractDRegister(instr, 7, 16);
   40367                 unsigned rm = ExtractDRegister(instr, 5, 0);
   40368                 // VABA{<c>}{<q>}.<dt> <Dd>, <Dn>, <Dm> ; A1
   40369                 vaba(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
   40370                 break;
   40371               }
   40372               case 0x00000740: {
   40373                 // 0xf2000750
   40374                 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
   40375                                                  ((instr >> 22) & 0x4));
   40376                 if (dt.Is(kDataTypeValueInvalid)) {
   40377                   UnallocatedA32(instr);
   40378                   return;
   40379                 }
   40380                 if (((instr >> 12) & 1) != 0) {
   40381                   UnallocatedA32(instr);
   40382                   return;
   40383                 }
   40384                 unsigned rd = ExtractQRegister(instr, 22, 12);
   40385                 if (((instr >> 16) & 1) != 0) {
   40386                   UnallocatedA32(instr);
   40387                   return;
   40388                 }
   40389                 unsigned rn = ExtractQRegister(instr, 7, 16);
   40390                 if ((instr & 1) != 0) {
   40391                   UnallocatedA32(instr);
   40392                   return;
   40393                 }
   40394                 unsigned rm = ExtractQRegister(instr, 5, 0);
   40395                 // VABA{<c>}{<q>}.<dt> <Qd>, <Qn>, <Qm> ; A1
   40396                 vaba(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
   40397                 break;
   40398               }
   40399               case 0x00000800: {
   40400                 // 0xf2000810
   40401                 switch (instr & 0x01000000) {
   40402                   case 0x00000000: {
   40403                     // 0xf2000810
   40404                     DataType dt = Dt_size_7_Decode((instr >> 20) & 0x3);
   40405                     if (dt.Is(kDataTypeValueInvalid)) {
   40406                       UnallocatedA32(instr);
   40407                       return;
   40408                     }
   40409                     unsigned rd = ExtractDRegister(instr, 22, 12);
   40410                     unsigned rn = ExtractDRegister(instr, 7, 16);
   40411                     unsigned rm = ExtractDRegister(instr, 5, 0);
   40412                     // VTST{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
   40413                     vtst(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
   40414                     break;
   40415                   }
   40416                   case 0x01000000: {
   40417                     // 0xf3000810
   40418                     DataType dt = Dt_size_4_Decode((instr >> 20) & 0x3);
   40419                     if (dt.Is(kDataTypeValueInvalid)) {
   40420                       UnallocatedA32(instr);
   40421                       return;
   40422                     }
   40423                     unsigned rd = ExtractDRegister(instr, 22, 12);
   40424                     unsigned rn = ExtractDRegister(instr, 7, 16);
   40425                     unsigned rm = ExtractDRegister(instr, 5, 0);
   40426                     // VCEQ{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
   40427                     vceq(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
   40428                     break;
   40429                   }
   40430                 }
   40431                 break;
   40432               }
   40433               case 0x00000840: {
   40434                 // 0xf2000850
   40435                 switch (instr & 0x01000000) {
   40436                   case 0x00000000: {
   40437                     // 0xf2000850
   40438                     DataType dt = Dt_size_7_Decode((instr >> 20) & 0x3);
   40439                     if (dt.Is(kDataTypeValueInvalid)) {
   40440                       UnallocatedA32(instr);
   40441                       return;
   40442                     }
   40443                     if (((instr >> 12) & 1) != 0) {
   40444                       UnallocatedA32(instr);
   40445                       return;
   40446                     }
   40447                     unsigned rd = ExtractQRegister(instr, 22, 12);
   40448                     if (((instr >> 16) & 1) != 0) {
   40449                       UnallocatedA32(instr);
   40450                       return;
   40451                     }
   40452                     unsigned rn = ExtractQRegister(instr, 7, 16);
   40453                     if ((instr & 1) != 0) {
   40454                       UnallocatedA32(instr);
   40455                       return;
   40456                     }
   40457                     unsigned rm = ExtractQRegister(instr, 5, 0);
   40458                     // VTST{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
   40459                     vtst(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
   40460                     break;
   40461                   }
   40462                   case 0x01000000: {
   40463                     // 0xf3000850
   40464                     DataType dt = Dt_size_4_Decode((instr >> 20) & 0x3);
   40465                     if (dt.Is(kDataTypeValueInvalid)) {
   40466                       UnallocatedA32(instr);
   40467                       return;
   40468                     }
   40469                     if (((instr >> 12) & 1) != 0) {
   40470                       UnallocatedA32(instr);
   40471                       return;
   40472                     }
   40473                     unsigned rd = ExtractQRegister(instr, 22, 12);
   40474                     if (((instr >> 16) & 1) != 0) {
   40475                       UnallocatedA32(instr);
   40476                       return;
   40477                     }
   40478                     unsigned rn = ExtractQRegister(instr, 7, 16);
   40479                     if ((instr & 1) != 0) {
   40480                       UnallocatedA32(instr);
   40481                       return;
   40482                     }
   40483                     unsigned rm = ExtractQRegister(instr, 5, 0);
   40484                     // VCEQ{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
   40485                     vceq(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
   40486                     break;
   40487                   }
   40488                 }
   40489                 break;
   40490               }
   40491               case 0x00000900: {
   40492                 // 0xf2000910
   40493                 DataType dt = Dt_op_size_1_Decode(((instr >> 20) & 0x3) |
   40494                                                   ((instr >> 22) & 0x4));
   40495                 if (dt.Is(kDataTypeValueInvalid)) {
   40496                   UnallocatedA32(instr);
   40497                   return;
   40498                 }
   40499                 unsigned rd = ExtractDRegister(instr, 22, 12);
   40500                 unsigned rn = ExtractDRegister(instr, 7, 16);
   40501                 unsigned rm = ExtractDRegister(instr, 5, 0);
   40502                 // VMUL{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
   40503                 vmul(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
   40504                 break;
   40505               }
   40506               case 0x00000940: {
   40507                 // 0xf2000950
   40508                 DataType dt = Dt_op_size_1_Decode(((instr >> 20) & 0x3) |
   40509                                                   ((instr >> 22) & 0x4));
   40510                 if (dt.Is(kDataTypeValueInvalid)) {
   40511                   UnallocatedA32(instr);
   40512                   return;
   40513                 }
   40514                 if (((instr >> 12) & 1) != 0) {
   40515                   UnallocatedA32(instr);
   40516                   return;
   40517                 }
   40518                 unsigned rd = ExtractQRegister(instr, 22, 12);
   40519                 if (((instr >> 16) & 1) != 0) {
   40520                   UnallocatedA32(instr);
   40521                   return;
   40522                 }
   40523                 unsigned rn = ExtractQRegister(instr, 7, 16);
   40524                 if ((instr & 1) != 0) {
   40525                   UnallocatedA32(instr);
   40526                   return;
   40527                 }
   40528                 unsigned rm = ExtractQRegister(instr, 5, 0);
   40529                 // VMUL{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
   40530                 vmul(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
   40531                 break;
   40532               }
   40533               case 0x00000a00: {
   40534                 // 0xf2000a10
   40535                 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
   40536                                                  ((instr >> 22) & 0x4));
   40537                 if (dt.Is(kDataTypeValueInvalid)) {
   40538                   UnallocatedA32(instr);
   40539                   return;
   40540                 }
   40541                 unsigned rd = ExtractDRegister(instr, 22, 12);
   40542                 unsigned rn = ExtractDRegister(instr, 7, 16);
   40543                 unsigned rm = ExtractDRegister(instr, 5, 0);
   40544                 // VPMIN{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
   40545                 vpmin(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
   40546                 break;
   40547               }
   40548               case 0x00000b00: {
   40549                 // 0xf2000b10
   40550                 if ((instr & 0x01000000) == 0x00000000) {
   40551                   DataType dt = Dt_size_4_Decode((instr >> 20) & 0x3);
   40552                   if (dt.Is(kDataTypeValueInvalid)) {
   40553                     UnallocatedA32(instr);
   40554                     return;
   40555                   }
   40556                   unsigned rd = ExtractDRegister(instr, 22, 12);
   40557                   unsigned rn = ExtractDRegister(instr, 7, 16);
   40558                   unsigned rm = ExtractDRegister(instr, 5, 0);
   40559                   // VPADD{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
   40560                   vpadd(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
   40561                 } else {
   40562                   UnallocatedA32(instr);
   40563                 }
   40564                 break;
   40565               }
   40566               case 0x00000c00: {
   40567                 // 0xf2000c10
   40568                 switch (instr & 0x01300000) {
   40569                   case 0x00000000: {
   40570                     // 0xf2000c10
   40571                     unsigned rd = ExtractDRegister(instr, 22, 12);
   40572                     unsigned rn = ExtractDRegister(instr, 7, 16);
   40573                     unsigned rm = ExtractDRegister(instr, 5, 0);
   40574                     // VFMA{<c>}{<q>}.F32 <Dd>, <Dn>, <Dm> ; A1
   40575                     vfma(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
   40576                     break;
   40577                   }
   40578                   case 0x00200000: {
   40579                     // 0xf2200c10
   40580                     unsigned rd = ExtractDRegister(instr, 22, 12);
   40581                     unsigned rn = ExtractDRegister(instr, 7, 16);
   40582                     unsigned rm = ExtractDRegister(instr, 5, 0);
   40583                     // VFMS{<c>}{<q>}.F32 <Dd>, <Dn>, <Dm> ; A1
   40584                     vfms(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
   40585                     break;
   40586                   }
   40587                   default:
   40588                     UnallocatedA32(instr);
   40589                     break;
   40590                 }
   40591                 break;
   40592               }
   40593               case 0x00000c40: {
   40594                 // 0xf2000c50
   40595                 switch (instr & 0x01300000) {
   40596                   case 0x00000000: {
   40597                     // 0xf2000c50
   40598                     if (((instr >> 12) & 1) != 0) {
   40599                       UnallocatedA32(instr);
   40600                       return;
   40601                     }
   40602                     unsigned rd = ExtractQRegister(instr, 22, 12);
   40603                     if (((instr >> 16) & 1) != 0) {
   40604                       UnallocatedA32(instr);
   40605                       return;
   40606                     }
   40607                     unsigned rn = ExtractQRegister(instr, 7, 16);
   40608                     if ((instr & 1) != 0) {
   40609                       UnallocatedA32(instr);
   40610                       return;
   40611                     }
   40612                     unsigned rm = ExtractQRegister(instr, 5, 0);
   40613                     // VFMA{<c>}{<q>}.F32 <Qd>, <Qn>, <Qm> ; A1
   40614                     vfma(al, F32, QRegister(rd), QRegister(rn), QRegister(rm));
   40615                     break;
   40616                   }
   40617                   case 0x00200000: {
   40618                     // 0xf2200c50
   40619                     if (((instr >> 12) & 1) != 0) {
   40620                       UnallocatedA32(instr);
   40621                       return;
   40622                     }
   40623                     unsigned rd = ExtractQRegister(instr, 22, 12);
   40624                     if (((instr >> 16) & 1) != 0) {
   40625                       UnallocatedA32(instr);
   40626                       return;
   40627                     }
   40628                     unsigned rn = ExtractQRegister(instr, 7, 16);
   40629                     if ((instr & 1) != 0) {
   40630                       UnallocatedA32(instr);
   40631                       return;
   40632                     }
   40633                     unsigned rm = ExtractQRegister(instr, 5, 0);
   40634                     // VFMS{<c>}{<q>}.F32 <Qd>, <Qn>, <Qm> ; A1
   40635                     vfms(al, F32, QRegister(rd), QRegister(rn), QRegister(rm));
   40636                     break;
   40637                   }
   40638                   default:
   40639                     UnallocatedA32(instr);
   40640                     break;
   40641                 }
   40642                 break;
   40643               }
   40644               case 0x00000d00: {
   40645                 // 0xf2000d10
   40646                 switch (instr & 0x01300000) {
   40647                   case 0x00000000: {
   40648                     // 0xf2000d10
   40649                     unsigned rd = ExtractDRegister(instr, 22, 12);
   40650                     unsigned rn = ExtractDRegister(instr, 7, 16);
   40651                     unsigned rm = ExtractDRegister(instr, 5, 0);
   40652                     // VMLA{<c>}{<q>}.F32 <Dd>, <Dn>, <Dm> ; A1
   40653                     vmla(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
   40654                     break;
   40655                   }
   40656                   case 0x00200000: {
   40657                     // 0xf2200d10
   40658                     unsigned rd = ExtractDRegister(instr, 22, 12);
   40659                     unsigned rn = ExtractDRegister(instr, 7, 16);
   40660                     unsigned rm = ExtractDRegister(instr, 5, 0);
   40661                     // VMLS{<c>}{<q>}.F32 <Dd>, <Dn>, <Dm> ; A1
   40662                     vmls(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
   40663                     break;
   40664                   }
   40665                   case 0x01000000: {
   40666                     // 0xf3000d10
   40667                     unsigned rd = ExtractDRegister(instr, 22, 12);
   40668                     unsigned rn = ExtractDRegister(instr, 7, 16);
   40669                     unsigned rm = ExtractDRegister(instr, 5, 0);
   40670                     // VMUL{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A1
   40671                     vmul(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
   40672                     break;
   40673                   }
   40674                   default:
   40675                     UnallocatedA32(instr);
   40676                     break;
   40677                 }
   40678                 break;
   40679               }
   40680               case 0x00000d40: {
   40681                 // 0xf2000d50
   40682                 switch (instr & 0x01300000) {
   40683                   case 0x00000000: {
   40684                     // 0xf2000d50
   40685                     if (((instr >> 12) & 1) != 0) {
   40686                       UnallocatedA32(instr);
   40687                       return;
   40688                     }
   40689                     unsigned rd = ExtractQRegister(instr, 22, 12);
   40690                     if (((instr >> 16) & 1) != 0) {
   40691                       UnallocatedA32(instr);
   40692                       return;
   40693                     }
   40694                     unsigned rn = ExtractQRegister(instr, 7, 16);
   40695                     if ((instr & 1) != 0) {
   40696                       UnallocatedA32(instr);
   40697                       return;
   40698                     }
   40699                     unsigned rm = ExtractQRegister(instr, 5, 0);
   40700                     // VMLA{<c>}{<q>}.F32 <Qd>, <Qn>, <Qm> ; A1
   40701                     vmla(al, F32, QRegister(rd), QRegister(rn), QRegister(rm));
   40702                     break;
   40703                   }
   40704                   case 0x00200000: {
   40705                     // 0xf2200d50
   40706                     if (((instr >> 12) & 1) != 0) {
   40707                       UnallocatedA32(instr);
   40708                       return;
   40709                     }
   40710                     unsigned rd = ExtractQRegister(instr, 22, 12);
   40711                     if (((instr >> 16) & 1) != 0) {
   40712                       UnallocatedA32(instr);
   40713                       return;
   40714                     }
   40715                     unsigned rn = ExtractQRegister(instr, 7, 16);
   40716                     if ((instr & 1) != 0) {
   40717                       UnallocatedA32(instr);
   40718                       return;
   40719                     }
   40720                     unsigned rm = ExtractQRegister(instr, 5, 0);
   40721                     // VMLS{<c>}{<q>}.F32 <Qd>, <Qn>, <Qm> ; A1
   40722                     vmls(al, F32, QRegister(rd), QRegister(rn), QRegister(rm));
   40723                     break;
   40724                   }
   40725                   case 0x01000000: {
   40726                     // 0xf3000d50
   40727                     if (((instr >> 12) & 1) != 0) {
   40728                       UnallocatedA32(instr);
   40729                       return;
   40730                     }
   40731                     unsigned rd = ExtractQRegister(instr, 22, 12);
   40732                     if (((instr >> 16) & 1) != 0) {
   40733                       UnallocatedA32(instr);
   40734                       return;
   40735                     }
   40736                     unsigned rn = ExtractQRegister(instr, 7, 16);
   40737                     if ((instr & 1) != 0) {
   40738                       UnallocatedA32(instr);
   40739                       return;
   40740                     }
   40741                     unsigned rm = ExtractQRegister(instr, 5, 0);
   40742                     // VMUL{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; A1
   40743                     vmul(al, F32, QRegister(rd), QRegister(rn), QRegister(rm));
   40744                     break;
   40745                   }
   40746                   default:
   40747                     UnallocatedA32(instr);
   40748                     break;
   40749                 }
   40750                 break;
   40751               }
   40752               case 0x00000e00: {
   40753                 // 0xf2000e10
   40754                 switch (instr & 0x01300000) {
   40755                   case 0x01000000: {
   40756                     // 0xf3000e10
   40757                     unsigned rd = ExtractDRegister(instr, 22, 12);
   40758                     unsigned rn = ExtractDRegister(instr, 7, 16);
   40759                     unsigned rm = ExtractDRegister(instr, 5, 0);
   40760                     // VACGE{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A1
   40761                     vacge(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
   40762                     break;
   40763                   }
   40764                   case 0x01200000: {
   40765                     // 0xf3200e10
   40766                     unsigned rd = ExtractDRegister(instr, 22, 12);
   40767                     unsigned rn = ExtractDRegister(instr, 7, 16);
   40768                     unsigned rm = ExtractDRegister(instr, 5, 0);
   40769                     // VACGT{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A1
   40770                     vacgt(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
   40771                     break;
   40772                   }
   40773                   default:
   40774                     UnallocatedA32(instr);
   40775                     break;
   40776                 }
   40777                 break;
   40778               }
   40779               case 0x00000e40: {
   40780                 // 0xf2000e50
   40781                 switch (instr & 0x01300000) {
   40782                   case 0x01000000: {
   40783                     // 0xf3000e50
   40784                     if (((instr >> 12) & 1) != 0) {
   40785                       UnallocatedA32(instr);
   40786                       return;
   40787                     }
   40788                     unsigned rd = ExtractQRegister(instr, 22, 12);
   40789                     if (((instr >> 16) & 1) != 0) {
   40790                       UnallocatedA32(instr);
   40791                       return;
   40792                     }
   40793                     unsigned rn = ExtractQRegister(instr, 7, 16);
   40794                     if ((instr & 1) != 0) {
   40795                       UnallocatedA32(instr);
   40796                       return;
   40797                     }
   40798                     unsigned rm = ExtractQRegister(instr, 5, 0);
   40799                     // VACGE{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; A1
   40800                     vacge(al, F32, QRegister(rd), QRegister(rn), QRegister(rm));
   40801                     break;
   40802                   }
   40803                   case 0x01200000: {
   40804                     // 0xf3200e50
   40805                     if (((instr >> 12) & 1) != 0) {
   40806                       UnallocatedA32(instr);
   40807                       return;
   40808                     }
   40809                     unsigned rd = ExtractQRegister(instr, 22, 12);
   40810                     if (((instr >> 16) & 1) != 0) {
   40811                       UnallocatedA32(instr);
   40812                       return;
   40813                     }
   40814                     unsigned rn = ExtractQRegister(instr, 7, 16);
   40815                     if ((instr & 1) != 0) {
   40816                       UnallocatedA32(instr);
   40817                       return;
   40818                     }
   40819                     unsigned rm = ExtractQRegister(instr, 5, 0);
   40820                     // VACGT{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; A1
   40821                     vacgt(al, F32, QRegister(rd), QRegister(rn), QRegister(rm));
   40822                     break;
   40823                   }
   40824                   default:
   40825                     UnallocatedA32(instr);
   40826                     break;
   40827                 }
   40828                 break;
   40829               }
   40830               case 0x00000f00: {
   40831                 // 0xf2000f10
   40832                 switch (instr & 0x01300000) {
   40833                   case 0x00000000: {
   40834                     // 0xf2000f10
   40835                     unsigned rd = ExtractDRegister(instr, 22, 12);
   40836                     unsigned rn = ExtractDRegister(instr, 7, 16);
   40837                     unsigned rm = ExtractDRegister(instr, 5, 0);
   40838                     // VRECPS{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A1
   40839                     vrecps(al,
   40840                            F32,
   40841                            DRegister(rd),
   40842                            DRegister(rn),
   40843                            DRegister(rm));
   40844                     break;
   40845                   }
   40846                   case 0x00200000: {
   40847                     // 0xf2200f10
   40848                     unsigned rd = ExtractDRegister(instr, 22, 12);
   40849                     unsigned rn = ExtractDRegister(instr, 7, 16);
   40850                     unsigned rm = ExtractDRegister(instr, 5, 0);
   40851                     // VRSQRTS{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A1
   40852                     vrsqrts(al,
   40853                             F32,
   40854                             DRegister(rd),
   40855                             DRegister(rn),
   40856                             DRegister(rm));
   40857                     break;
   40858                   }
   40859                   case 0x01000000: {
   40860                     // 0xf3000f10
   40861                     unsigned rd = ExtractDRegister(instr, 22, 12);
   40862                     unsigned rn = ExtractDRegister(instr, 7, 16);
   40863                     unsigned rm = ExtractDRegister(instr, 5, 0);
   40864                     // VMAXNM{<q>}.F32 <Dd>, <Dn>, <Dm> ; A1
   40865                     vmaxnm(F32, DRegister(rd), DRegister(rn), DRegister(rm));
   40866                     break;
   40867                   }
   40868                   case 0x01200000: {
   40869                     // 0xf3200f10
   40870                     unsigned rd = ExtractDRegister(instr, 22, 12);
   40871                     unsigned rn = ExtractDRegister(instr, 7, 16);
   40872                     unsigned rm = ExtractDRegister(instr, 5, 0);
   40873                     // VMINNM{<q>}.F32 <Dd>, <Dn>, <Dm> ; A1
   40874                     vminnm(F32, DRegister(rd), DRegister(rn), DRegister(rm));
   40875                     break;
   40876                   }
   40877                   default:
   40878                     UnallocatedA32(instr);
   40879                     break;
   40880                 }
   40881                 break;
   40882               }
   40883               case 0x00000f40: {
   40884                 // 0xf2000f50
   40885                 switch (instr & 0x01300000) {
   40886                   case 0x00000000: {
   40887                     // 0xf2000f50
   40888                     if (((instr >> 12) & 1) != 0) {
   40889                       UnallocatedA32(instr);
   40890                       return;
   40891                     }
   40892                     unsigned rd = ExtractQRegister(instr, 22, 12);
   40893                     if (((instr >> 16) & 1) != 0) {
   40894                       UnallocatedA32(instr);
   40895                       return;
   40896                     }
   40897                     unsigned rn = ExtractQRegister(instr, 7, 16);
   40898                     if ((instr & 1) != 0) {
   40899                       UnallocatedA32(instr);
   40900                       return;
   40901                     }
   40902                     unsigned rm = ExtractQRegister(instr, 5, 0);
   40903                     // VRECPS{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; A1
   40904                     vrecps(al,
   40905                            F32,
   40906                            QRegister(rd),
   40907                            QRegister(rn),
   40908                            QRegister(rm));
   40909                     break;
   40910                   }
   40911                   case 0x00200000: {
   40912                     // 0xf2200f50
   40913                     if (((instr >> 12) & 1) != 0) {
   40914                       UnallocatedA32(instr);
   40915                       return;
   40916                     }
   40917                     unsigned rd = ExtractQRegister(instr, 22, 12);
   40918                     if (((instr >> 16) & 1) != 0) {
   40919                       UnallocatedA32(instr);
   40920                       return;
   40921                     }
   40922                     unsigned rn = ExtractQRegister(instr, 7, 16);
   40923                     if ((instr & 1) != 0) {
   40924                       UnallocatedA32(instr);
   40925                       return;
   40926                     }
   40927                     unsigned rm = ExtractQRegister(instr, 5, 0);
   40928                     // VRSQRTS{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; A1
   40929                     vrsqrts(al,
   40930                             F32,
   40931                             QRegister(rd),
   40932                             QRegister(rn),
   40933                             QRegister(rm));
   40934                     break;
   40935                   }
   40936                   case 0x01000000: {
   40937                     // 0xf3000f50
   40938                     if (((instr >> 12) & 1) != 0) {
   40939                       UnallocatedA32(instr);
   40940                       return;
   40941                     }
   40942                     unsigned rd = ExtractQRegister(instr, 22, 12);
   40943                     if (((instr >> 16) & 1) != 0) {
   40944                       UnallocatedA32(instr);
   40945                       return;
   40946                     }
   40947                     unsigned rn = ExtractQRegister(instr, 7, 16);
   40948                     if ((instr & 1) != 0) {
   40949                       UnallocatedA32(instr);
   40950                       return;
   40951                     }
   40952                     unsigned rm = ExtractQRegister(instr, 5, 0);
   40953                     // VMAXNM{<q>}.F32 <Qd>, <Qn>, <Qm> ; A1
   40954                     vmaxnm(F32, QRegister(rd), QRegister(rn), QRegister(rm));
   40955                     break;
   40956                   }
   40957                   case 0x01200000: {
   40958                     // 0xf3200f50
   40959                     if (((instr >> 12) & 1) != 0) {
   40960                       UnallocatedA32(instr);
   40961                       return;
   40962                     }
   40963                     unsigned rd = ExtractQRegister(instr, 22, 12);
   40964                     if (((instr >> 16) & 1) != 0) {
   40965                       UnallocatedA32(instr);
   40966                       return;
   40967                     }
   40968                     unsigned rn = ExtractQRegister(instr, 7, 16);
   40969                     if ((instr & 1) != 0) {
   40970                       UnallocatedA32(instr);
   40971                       return;
   40972                     }
   40973                     unsigned rm = ExtractQRegister(instr, 5, 0);
   40974                     // VMINNM{<q>}.F32 <Qd>, <Qn>, <Qm> ; A1
   40975                     vminnm(F32, QRegister(rd), QRegister(rn), QRegister(rm));
   40976                     break;
   40977                   }
   40978                   default:
   40979                     UnallocatedA32(instr);
   40980                     break;
   40981                 }
   40982                 break;
   40983               }
   40984               default:
   40985                 UnallocatedA32(instr);
   40986                 break;
   40987             }
   40988             break;
   40989           }
   40990           case 0x00800000: {
   40991             // 0xf2800000
   40992             switch (instr & 0x00300000) {
   40993               case 0x00300000: {
   40994                 // 0xf2b00000
   40995                 switch (instr & 0x01000000) {
   40996                   case 0x00000000: {
   40997                     // 0xf2b00000
   40998                     switch (instr & 0x00000040) {
   40999                       case 0x00000000: {
   41000                         // 0xf2b00000
   41001                         if (((instr & 0x800) == 0x800)) {
   41002                           UnallocatedA32(instr);
   41003                           return;
   41004                         }
   41005                         unsigned rd = ExtractDRegister(instr, 22, 12);
   41006                         unsigned rn = ExtractDRegister(instr, 7, 16);
   41007                         unsigned rm = ExtractDRegister(instr, 5, 0);
   41008                         uint32_t imm = (instr >> 8) & 0xf;
   41009                         // VEXT{<c>}{<q>}.8 {<Dd>}, <Dn>, <Dm>, #<imm> ; A1
   41010                         vext(al,
   41011                              Untyped8,
   41012                              DRegister(rd),
   41013                              DRegister(rn),
   41014                              DRegister(rm),
   41015                              imm);
   41016                         break;
   41017                       }
   41018                       case 0x00000040: {
   41019                         // 0xf2b00040
   41020                         if (((instr >> 12) & 1) != 0) {
   41021                           UnallocatedA32(instr);
   41022                           return;
   41023                         }
   41024                         unsigned rd = ExtractQRegister(instr, 22, 12);
   41025                         if (((instr >> 16) & 1) != 0) {
   41026                           UnallocatedA32(instr);
   41027                           return;
   41028                         }
   41029                         unsigned rn = ExtractQRegister(instr, 7, 16);
   41030                         if ((instr & 1) != 0) {
   41031                           UnallocatedA32(instr);
   41032                           return;
   41033                         }
   41034                         unsigned rm = ExtractQRegister(instr, 5, 0);
   41035                         uint32_t imm = (instr >> 8) & 0xf;
   41036                         // VEXT{<c>}{<q>}.8 {<Qd>}, <Qn>, <Qm>, #<imm> ; A1
   41037                         vext(al,
   41038                              Untyped8,
   41039                              QRegister(rd),
   41040                              QRegister(rn),
   41041                              QRegister(rm),
   41042                              imm);
   41043                         break;
   41044                       }
   41045                     }
   41046                     break;
   41047                   }
   41048                   case 0x01000000: {
   41049                     // 0xf3b00000
   41050                     switch (instr & 0x00000800) {
   41051                       case 0x00000000: {
   41052                         // 0xf3b00000
   41053                         switch (instr & 0x00030200) {
   41054                           case 0x00000000: {
   41055                             // 0xf3b00000
   41056                             switch (instr & 0x000005c0) {
   41057                               case 0x00000000: {
   41058                                 // 0xf3b00000
   41059                                 DataType dt =
   41060                                     Dt_size_7_Decode((instr >> 18) & 0x3);
   41061                                 if (dt.Is(kDataTypeValueInvalid)) {
   41062                                   UnallocatedA32(instr);
   41063                                   return;
   41064                                 }
   41065                                 unsigned rd = ExtractDRegister(instr, 22, 12);
   41066                                 unsigned rm = ExtractDRegister(instr, 5, 0);
   41067                                 // VREV64{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
   41068                                 vrev64(al, dt, DRegister(rd), DRegister(rm));
   41069                                 break;
   41070                               }
   41071                               case 0x00000040: {
   41072                                 // 0xf3b00040
   41073                                 DataType dt =
   41074                                     Dt_size_7_Decode((instr >> 18) & 0x3);
   41075                                 if (dt.Is(kDataTypeValueInvalid)) {
   41076                                   UnallocatedA32(instr);
   41077                                   return;
   41078                                 }
   41079                                 if (((instr >> 12) & 1) != 0) {
   41080                                   UnallocatedA32(instr);
   41081                                   return;
   41082                                 }
   41083                                 unsigned rd = ExtractQRegister(instr, 22, 12);
   41084                                 if ((instr & 1) != 0) {
   41085                                   UnallocatedA32(instr);
   41086                                   return;
   41087                                 }
   41088                                 unsigned rm = ExtractQRegister(instr, 5, 0);
   41089                                 // VREV64{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
   41090                                 vrev64(al, dt, QRegister(rd), QRegister(rm));
   41091                                 break;
   41092                               }
   41093                               case 0x00000080: {
   41094                                 // 0xf3b00080
   41095                                 DataType dt =
   41096                                     Dt_size_15_Decode((instr >> 18) & 0x3);
   41097                                 if (dt.Is(kDataTypeValueInvalid)) {
   41098                                   UnallocatedA32(instr);
   41099                                   return;
   41100                                 }
   41101                                 unsigned rd = ExtractDRegister(instr, 22, 12);
   41102                                 unsigned rm = ExtractDRegister(instr, 5, 0);
   41103                                 // VREV32{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
   41104                                 vrev32(al, dt, DRegister(rd), DRegister(rm));
   41105                                 break;
   41106                               }
   41107                               case 0x000000c0: {
   41108                                 // 0xf3b000c0
   41109                                 DataType dt =
   41110                                     Dt_size_15_Decode((instr >> 18) & 0x3);
   41111                                 if (dt.Is(kDataTypeValueInvalid)) {
   41112                                   UnallocatedA32(instr);
   41113                                   return;
   41114                                 }
   41115                                 if (((instr >> 12) & 1) != 0) {
   41116                                   UnallocatedA32(instr);
   41117                                   return;
   41118                                 }
   41119                                 unsigned rd = ExtractQRegister(instr, 22, 12);
   41120                                 if ((instr & 1) != 0) {
   41121                                   UnallocatedA32(instr);
   41122                                   return;
   41123                                 }
   41124                                 unsigned rm = ExtractQRegister(instr, 5, 0);
   41125                                 // VREV32{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
   41126                                 vrev32(al, dt, QRegister(rd), QRegister(rm));
   41127                                 break;
   41128                               }
   41129                               case 0x00000100: {
   41130                                 // 0xf3b00100
   41131                                 DataType dt =
   41132                                     Dt_size_1_Decode((instr >> 18) & 0x3);
   41133                                 if (dt.Is(kDataTypeValueInvalid)) {
   41134                                   UnallocatedA32(instr);
   41135                                   return;
   41136                                 }
   41137                                 unsigned rd = ExtractDRegister(instr, 22, 12);
   41138                                 unsigned rm = ExtractDRegister(instr, 5, 0);
   41139                                 // VREV16{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
   41140                                 vrev16(al, dt, DRegister(rd), DRegister(rm));
   41141                                 break;
   41142                               }
   41143                               case 0x00000140: {
   41144                                 // 0xf3b00140
   41145                                 DataType dt =
   41146                                     Dt_size_1_Decode((instr >> 18) & 0x3);
   41147                                 if (dt.Is(kDataTypeValueInvalid)) {
   41148                                   UnallocatedA32(instr);
   41149                                   return;
   41150                                 }
   41151                                 if (((instr >> 12) & 1) != 0) {
   41152                                   UnallocatedA32(instr);
   41153                                   return;
   41154                                 }
   41155                                 unsigned rd = ExtractQRegister(instr, 22, 12);
   41156                                 if ((instr & 1) != 0) {
   41157                                   UnallocatedA32(instr);
   41158                                   return;
   41159                                 }
   41160                                 unsigned rm = ExtractQRegister(instr, 5, 0);
   41161                                 // VREV16{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
   41162                                 vrev16(al, dt, QRegister(rd), QRegister(rm));
   41163                                 break;
   41164                               }
   41165                               case 0x00000400: {
   41166                                 // 0xf3b00400
   41167                                 DataType dt =
   41168                                     Dt_size_5_Decode((instr >> 18) & 0x3);
   41169                                 if (dt.Is(kDataTypeValueInvalid)) {
   41170                                   UnallocatedA32(instr);
   41171                                   return;
   41172                                 }
   41173                                 unsigned rd = ExtractDRegister(instr, 22, 12);
   41174                                 unsigned rm = ExtractDRegister(instr, 5, 0);
   41175                                 // VCLS{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
   41176                                 vcls(al, dt, DRegister(rd), DRegister(rm));
   41177                                 break;
   41178                               }
   41179                               case 0x00000440: {
   41180                                 // 0xf3b00440
   41181                                 DataType dt =
   41182                                     Dt_size_5_Decode((instr >> 18) & 0x3);
   41183                                 if (dt.Is(kDataTypeValueInvalid)) {
   41184                                   UnallocatedA32(instr);
   41185                                   return;
   41186                                 }
   41187                                 if (((instr >> 12) & 1) != 0) {
   41188                                   UnallocatedA32(instr);
   41189                                   return;
   41190                                 }
   41191                                 unsigned rd = ExtractQRegister(instr, 22, 12);
   41192                                 if ((instr & 1) != 0) {
   41193                                   UnallocatedA32(instr);
   41194                                   return;
   41195                                 }
   41196                                 unsigned rm = ExtractQRegister(instr, 5, 0);
   41197                                 // VCLS{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
   41198                                 vcls(al, dt, QRegister(rd), QRegister(rm));
   41199                                 break;
   41200                               }
   41201                               case 0x00000480: {
   41202                                 // 0xf3b00480
   41203                                 DataType dt =
   41204                                     Dt_size_4_Decode((instr >> 18) & 0x3);
   41205                                 if (dt.Is(kDataTypeValueInvalid)) {
   41206                                   UnallocatedA32(instr);
   41207                                   return;
   41208                                 }
   41209                                 unsigned rd = ExtractDRegister(instr, 22, 12);
   41210                                 unsigned rm = ExtractDRegister(instr, 5, 0);
   41211                                 // VCLZ{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
   41212                                 vclz(al, dt, DRegister(rd), DRegister(rm));
   41213                                 break;
   41214                               }
   41215                               case 0x000004c0: {
   41216                                 // 0xf3b004c0
   41217                                 DataType dt =
   41218                                     Dt_size_4_Decode((instr >> 18) & 0x3);
   41219                                 if (dt.Is(kDataTypeValueInvalid)) {
   41220                                   UnallocatedA32(instr);
   41221                                   return;
   41222                                 }
   41223                                 if (((instr >> 12) & 1) != 0) {
   41224                                   UnallocatedA32(instr);
   41225                                   return;
   41226                                 }
   41227                                 unsigned rd = ExtractQRegister(instr, 22, 12);
   41228                                 if ((instr & 1) != 0) {
   41229                                   UnallocatedA32(instr);
   41230                                   return;
   41231                                 }
   41232                                 unsigned rm = ExtractQRegister(instr, 5, 0);
   41233                                 // VCLZ{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
   41234                                 vclz(al, dt, QRegister(rd), QRegister(rm));
   41235                                 break;
   41236                               }
   41237                               case 0x00000500: {
   41238                                 // 0xf3b00500
   41239                                 if ((instr & 0x000c0000) == 0x00000000) {
   41240                                   unsigned rd = ExtractDRegister(instr, 22, 12);
   41241                                   unsigned rm = ExtractDRegister(instr, 5, 0);
   41242                                   // VCNT{<c>}{<q>}.8 <Dd>, <Dm> ; A1
   41243                                   vcnt(al,
   41244                                        Untyped8,
   41245                                        DRegister(rd),
   41246                                        DRegister(rm));
   41247                                 } else {
   41248                                   UnallocatedA32(instr);
   41249                                 }
   41250                                 break;
   41251                               }
   41252                               case 0x00000540: {
   41253                                 // 0xf3b00540
   41254                                 if ((instr & 0x000c0000) == 0x00000000) {
   41255                                   if (((instr >> 12) & 1) != 0) {
   41256                                     UnallocatedA32(instr);
   41257                                     return;
   41258                                   }
   41259                                   unsigned rd = ExtractQRegister(instr, 22, 12);
   41260                                   if ((instr & 1) != 0) {
   41261                                     UnallocatedA32(instr);
   41262                                     return;
   41263                                   }
   41264                                   unsigned rm = ExtractQRegister(instr, 5, 0);
   41265                                   // VCNT{<c>}{<q>}.8 <Qd>, <Qm> ; A1
   41266                                   vcnt(al,
   41267                                        Untyped8,
   41268                                        QRegister(rd),
   41269                                        QRegister(rm));
   41270                                 } else {
   41271                                   UnallocatedA32(instr);
   41272                                 }
   41273                                 break;
   41274                               }
   41275                               case 0x00000580: {
   41276                                 // 0xf3b00580
   41277                                 if ((instr & 0x000c0000) == 0x00000000) {
   41278                                   unsigned rd = ExtractDRegister(instr, 22, 12);
   41279                                   unsigned rm = ExtractDRegister(instr, 5, 0);
   41280                                   // VMVN{<c>}{<q>}{.<dt>} <Dd>, <Dm> ; A1
   41281                                   vmvn(al,
   41282                                        kDataTypeValueNone,
   41283                                        DRegister(rd),
   41284                                        DRegister(rm));
   41285                                 } else {
   41286                                   UnallocatedA32(instr);
   41287                                 }
   41288                                 break;
   41289                               }
   41290                               case 0x000005c0: {
   41291                                 // 0xf3b005c0
   41292                                 if ((instr & 0x000c0000) == 0x00000000) {
   41293                                   if (((instr >> 12) & 1) != 0) {
   41294                                     UnallocatedA32(instr);
   41295                                     return;
   41296                                   }
   41297                                   unsigned rd = ExtractQRegister(instr, 22, 12);
   41298                                   if ((instr & 1) != 0) {
   41299                                     UnallocatedA32(instr);
   41300                                     return;
   41301                                   }
   41302                                   unsigned rm = ExtractQRegister(instr, 5, 0);
   41303                                   // VMVN{<c>}{<q>}{.<dt>} <Qd>, <Qm> ; A1
   41304                                   vmvn(al,
   41305                                        kDataTypeValueNone,
   41306                                        QRegister(rd),
   41307                                        QRegister(rm));
   41308                                 } else {
   41309                                   UnallocatedA32(instr);
   41310                                 }
   41311                                 break;
   41312                               }
   41313                               default:
   41314                                 UnallocatedA32(instr);
   41315                                 break;
   41316                             }
   41317                             break;
   41318                           }
   41319                           case 0x00000200: {
   41320                             // 0xf3b00200
   41321                             switch (instr & 0x00000540) {
   41322                               case 0x00000000: {
   41323                                 // 0xf3b00200
   41324                                 DataType dt =
   41325                                     Dt_op_size_2_Decode(((instr >> 18) & 0x3) |
   41326                                                         ((instr >> 5) & 0x4));
   41327                                 if (dt.Is(kDataTypeValueInvalid)) {
   41328                                   UnallocatedA32(instr);
   41329                                   return;
   41330                                 }
   41331                                 unsigned rd = ExtractDRegister(instr, 22, 12);
   41332                                 unsigned rm = ExtractDRegister(instr, 5, 0);
   41333                                 // VPADDL{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
   41334                                 vpaddl(al, dt, DRegister(rd), DRegister(rm));
   41335                                 break;
   41336                               }
   41337                               case 0x00000040: {
   41338                                 // 0xf3b00240
   41339                                 DataType dt =
   41340                                     Dt_op_size_2_Decode(((instr >> 18) & 0x3) |
   41341                                                         ((instr >> 5) & 0x4));
   41342                                 if (dt.Is(kDataTypeValueInvalid)) {
   41343                                   UnallocatedA32(instr);
   41344                                   return;
   41345                                 }
   41346                                 if (((instr >> 12) & 1) != 0) {
   41347                                   UnallocatedA32(instr);
   41348                                   return;
   41349                                 }
   41350                                 unsigned rd = ExtractQRegister(instr, 22, 12);
   41351                                 if ((instr & 1) != 0) {
   41352                                   UnallocatedA32(instr);
   41353                                   return;
   41354                                 }
   41355                                 unsigned rm = ExtractQRegister(instr, 5, 0);
   41356                                 // VPADDL{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
   41357                                 vpaddl(al, dt, QRegister(rd), QRegister(rm));
   41358                                 break;
   41359                               }
   41360                               case 0x00000100: {
   41361                                 // 0xf3b00300
   41362                                 switch (instr & 0x00000080) {
   41363                                   case 0x00000000: {
   41364                                     // 0xf3b00300
   41365                                     UnimplementedA32("AESE", instr);
   41366                                     break;
   41367                                   }
   41368                                   case 0x00000080: {
   41369                                     // 0xf3b00380
   41370                                     UnimplementedA32("AESMC", instr);
   41371                                     break;
   41372                                   }
   41373                                 }
   41374                                 break;
   41375                               }
   41376                               case 0x00000140: {
   41377                                 // 0xf3b00340
   41378                                 switch (instr & 0x00000080) {
   41379                                   case 0x00000000: {
   41380                                     // 0xf3b00340
   41381                                     UnimplementedA32("AESD", instr);
   41382                                     break;
   41383                                   }
   41384                                   case 0x00000080: {
   41385                                     // 0xf3b003c0
   41386                                     UnimplementedA32("AESIMC", instr);
   41387                                     break;
   41388                                   }
   41389                                 }
   41390                                 break;
   41391                               }
   41392                               case 0x00000400: {
   41393                                 // 0xf3b00600
   41394                                 DataType dt =
   41395                                     Dt_op_size_2_Decode(((instr >> 18) & 0x3) |
   41396                                                         ((instr >> 5) & 0x4));
   41397                                 if (dt.Is(kDataTypeValueInvalid)) {
   41398                                   UnallocatedA32(instr);
   41399                                   return;
   41400                                 }
   41401                                 unsigned rd = ExtractDRegister(instr, 22, 12);
   41402                                 unsigned rm = ExtractDRegister(instr, 5, 0);
   41403                                 // VPADAL{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
   41404                                 vpadal(al, dt, DRegister(rd), DRegister(rm));
   41405                                 break;
   41406                               }
   41407                               case 0x00000440: {
   41408                                 // 0xf3b00640
   41409                                 DataType dt =
   41410                                     Dt_op_size_2_Decode(((instr >> 18) & 0x3) |
   41411                                                         ((instr >> 5) & 0x4));
   41412                                 if (dt.Is(kDataTypeValueInvalid)) {
   41413                                   UnallocatedA32(instr);
   41414                                   return;
   41415                                 }
   41416                                 if (((instr >> 12) & 1) != 0) {
   41417                                   UnallocatedA32(instr);
   41418                                   return;
   41419                                 }
   41420                                 unsigned rd = ExtractQRegister(instr, 22, 12);
   41421                                 if ((instr & 1) != 0) {
   41422                                   UnallocatedA32(instr);
   41423                                   return;
   41424                                 }
   41425                                 unsigned rm = ExtractQRegister(instr, 5, 0);
   41426                                 // VPADAL{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
   41427                                 vpadal(al, dt, QRegister(rd), QRegister(rm));
   41428                                 break;
   41429                               }
   41430                               case 0x00000500: {
   41431                                 // 0xf3b00700
   41432                                 switch (instr & 0x00000080) {
   41433                                   case 0x00000000: {
   41434                                     // 0xf3b00700
   41435                                     DataType dt =
   41436                                         Dt_size_5_Decode((instr >> 18) & 0x3);
   41437                                     if (dt.Is(kDataTypeValueInvalid)) {
   41438                                       UnallocatedA32(instr);
   41439                                       return;
   41440                                     }
   41441                                     unsigned rd =
   41442                                         ExtractDRegister(instr, 22, 12);
   41443                                     unsigned rm = ExtractDRegister(instr, 5, 0);
   41444                                     // VQABS{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
   41445                                     vqabs(al, dt, DRegister(rd), DRegister(rm));
   41446                                     break;
   41447                                   }
   41448                                   case 0x00000080: {
   41449                                     // 0xf3b00780
   41450                                     DataType dt =
   41451                                         Dt_size_5_Decode((instr >> 18) & 0x3);
   41452                                     if (dt.Is(kDataTypeValueInvalid)) {
   41453                                       UnallocatedA32(instr);
   41454                                       return;
   41455                                     }
   41456                                     unsigned rd =
   41457                                         ExtractDRegister(instr, 22, 12);
   41458                                     unsigned rm = ExtractDRegister(instr, 5, 0);
   41459                                     // VQNEG{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
   41460                                     vqneg(al, dt, DRegister(rd), DRegister(rm));
   41461                                     break;
   41462                                   }
   41463                                 }
   41464                                 break;
   41465                               }
   41466                               case 0x00000540: {
   41467                                 // 0xf3b00740
   41468                                 switch (instr & 0x00000080) {
   41469                                   case 0x00000000: {
   41470                                     // 0xf3b00740
   41471                                     DataType dt =
   41472                                         Dt_size_5_Decode((instr >> 18) & 0x3);
   41473                                     if (dt.Is(kDataTypeValueInvalid)) {
   41474                                       UnallocatedA32(instr);
   41475                                       return;
   41476                                     }
   41477                                     if (((instr >> 12) & 1) != 0) {
   41478                                       UnallocatedA32(instr);
   41479                                       return;
   41480                                     }
   41481                                     unsigned rd =
   41482                                         ExtractQRegister(instr, 22, 12);
   41483                                     if ((instr & 1) != 0) {
   41484                                       UnallocatedA32(instr);
   41485                                       return;
   41486                                     }
   41487                                     unsigned rm = ExtractQRegister(instr, 5, 0);
   41488                                     // VQABS{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
   41489                                     vqabs(al, dt, QRegister(rd), QRegister(rm));
   41490                                     break;
   41491                                   }
   41492                                   case 0x00000080: {
   41493                                     // 0xf3b007c0
   41494                                     DataType dt =
   41495                                         Dt_size_5_Decode((instr >> 18) & 0x3);
   41496                                     if (dt.Is(kDataTypeValueInvalid)) {
   41497                                       UnallocatedA32(instr);
   41498                                       return;
   41499                                     }
   41500                                     if (((instr >> 12) & 1) != 0) {
   41501                                       UnallocatedA32(instr);
   41502                                       return;
   41503                                     }
   41504                                     unsigned rd =
   41505                                         ExtractQRegister(instr, 22, 12);
   41506                                     if ((instr & 1) != 0) {
   41507                                       UnallocatedA32(instr);
   41508                                       return;
   41509                                     }
   41510                                     unsigned rm = ExtractQRegister(instr, 5, 0);
   41511                                     // VQNEG{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
   41512                                     vqneg(al, dt, QRegister(rd), QRegister(rm));
   41513                                     break;
   41514                                   }
   41515                                 }
   41516                                 break;
   41517                               }
   41518                             }
   41519                             break;
   41520                           }
   41521                           case 0x00010000: {
   41522                             // 0xf3b10000
   41523                             switch (instr & 0x000001c0) {
   41524                               case 0x00000000: {
   41525                                 // 0xf3b10000
   41526                                 DataType dt =
   41527                                     Dt_F_size_1_Decode(((instr >> 18) & 0x3) |
   41528                                                        ((instr >> 8) & 0x4));
   41529                                 if (dt.Is(kDataTypeValueInvalid)) {
   41530                                   UnallocatedA32(instr);
   41531                                   return;
   41532                                 }
   41533                                 unsigned rd = ExtractDRegister(instr, 22, 12);
   41534                                 unsigned rm = ExtractDRegister(instr, 5, 0);
   41535                                 // VCGT{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #0 ; A1
   41536                                 vcgt(al,
   41537                                      dt,
   41538                                      DRegister(rd),
   41539                                      DRegister(rm),
   41540                                      UINT32_C(0));
   41541                                 break;
   41542                               }
   41543                               case 0x00000040: {
   41544                                 // 0xf3b10040
   41545                                 DataType dt =
   41546                                     Dt_F_size_1_Decode(((instr >> 18) & 0x3) |
   41547                                                        ((instr >> 8) & 0x4));
   41548                                 if (dt.Is(kDataTypeValueInvalid)) {
   41549                                   UnallocatedA32(instr);
   41550                                   return;
   41551                                 }
   41552                                 if (((instr >> 12) & 1) != 0) {
   41553                                   UnallocatedA32(instr);
   41554                                   return;
   41555                                 }
   41556                                 unsigned rd = ExtractQRegister(instr, 22, 12);
   41557                                 if ((instr & 1) != 0) {
   41558                                   UnallocatedA32(instr);
   41559                                   return;
   41560                                 }
   41561                                 unsigned rm = ExtractQRegister(instr, 5, 0);
   41562                                 // VCGT{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #0 ; A1
   41563                                 vcgt(al,
   41564                                      dt,
   41565                                      QRegister(rd),
   41566                                      QRegister(rm),
   41567                                      UINT32_C(0));
   41568                                 break;
   41569                               }
   41570                               case 0x00000080: {
   41571                                 // 0xf3b10080
   41572                                 DataType dt =
   41573                                     Dt_F_size_1_Decode(((instr >> 18) & 0x3) |
   41574                                                        ((instr >> 8) & 0x4));
   41575                                 if (dt.Is(kDataTypeValueInvalid)) {
   41576                                   UnallocatedA32(instr);
   41577                                   return;
   41578                                 }
   41579                                 unsigned rd = ExtractDRegister(instr, 22, 12);
   41580                                 unsigned rm = ExtractDRegister(instr, 5, 0);
   41581                                 // VCGE{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #0 ; A1
   41582                                 vcge(al,
   41583                                      dt,
   41584                                      DRegister(rd),
   41585                                      DRegister(rm),
   41586                                      UINT32_C(0));
   41587                                 break;
   41588                               }
   41589                               case 0x000000c0: {
   41590                                 // 0xf3b100c0
   41591                                 DataType dt =
   41592                                     Dt_F_size_1_Decode(((instr >> 18) & 0x3) |
   41593                                                        ((instr >> 8) & 0x4));
   41594                                 if (dt.Is(kDataTypeValueInvalid)) {
   41595                                   UnallocatedA32(instr);
   41596                                   return;
   41597                                 }
   41598                                 if (((instr >> 12) & 1) != 0) {
   41599                                   UnallocatedA32(instr);
   41600                                   return;
   41601                                 }
   41602                                 unsigned rd = ExtractQRegister(instr, 22, 12);
   41603                                 if ((instr & 1) != 0) {
   41604                                   UnallocatedA32(instr);
   41605                                   return;
   41606                                 }
   41607                                 unsigned rm = ExtractQRegister(instr, 5, 0);
   41608                                 // VCGE{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #0 ; A1
   41609                                 vcge(al,
   41610                                      dt,
   41611                                      QRegister(rd),
   41612                                      QRegister(rm),
   41613                                      UINT32_C(0));
   41614                                 break;
   41615                               }
   41616                               case 0x00000100: {
   41617                                 // 0xf3b10100
   41618                                 DataType dt =
   41619                                     Dt_F_size_2_Decode(((instr >> 18) & 0x3) |
   41620                                                        ((instr >> 8) & 0x4));
   41621                                 if (dt.Is(kDataTypeValueInvalid)) {
   41622                                   UnallocatedA32(instr);
   41623                                   return;
   41624                                 }
   41625                                 unsigned rd = ExtractDRegister(instr, 22, 12);
   41626                                 unsigned rm = ExtractDRegister(instr, 5, 0);
   41627                                 // VCEQ{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #0 ; A1
   41628                                 vceq(al,
   41629                                      dt,
   41630                                      DRegister(rd),
   41631                                      DRegister(rm),
   41632                                      UINT32_C(0));
   41633                                 break;
   41634                               }
   41635                               case 0x00000140: {
   41636                                 // 0xf3b10140
   41637                                 DataType dt =
   41638                                     Dt_F_size_2_Decode(((instr >> 18) & 0x3) |
   41639                                                        ((instr >> 8) & 0x4));
   41640                                 if (dt.Is(kDataTypeValueInvalid)) {
   41641                                   UnallocatedA32(instr);
   41642                                   return;
   41643                                 }
   41644                                 if (((instr >> 12) & 1) != 0) {
   41645                                   UnallocatedA32(instr);
   41646                                   return;
   41647                                 }
   41648                                 unsigned rd = ExtractQRegister(instr, 22, 12);
   41649                                 if ((instr & 1) != 0) {
   41650                                   UnallocatedA32(instr);
   41651                                   return;
   41652                                 }
   41653                                 unsigned rm = ExtractQRegister(instr, 5, 0);
   41654                                 // VCEQ{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #0 ; A1
   41655                                 vceq(al,
   41656                                      dt,
   41657                                      QRegister(rd),
   41658                                      QRegister(rm),
   41659                                      UINT32_C(0));
   41660                                 break;
   41661                               }
   41662                               case 0x00000180: {
   41663                                 // 0xf3b10180
   41664                                 DataType dt =
   41665                                     Dt_F_size_1_Decode(((instr >> 18) & 0x3) |
   41666                                                        ((instr >> 8) & 0x4));
   41667                                 if (dt.Is(kDataTypeValueInvalid)) {
   41668                                   UnallocatedA32(instr);
   41669                                   return;
   41670                                 }
   41671                                 unsigned rd = ExtractDRegister(instr, 22, 12);
   41672                                 unsigned rm = ExtractDRegister(instr, 5, 0);
   41673                                 // VCLE{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #0 ; A1
   41674                                 vcle(al,
   41675                                      dt,
   41676                                      DRegister(rd),
   41677                                      DRegister(rm),
   41678                                      UINT32_C(0));
   41679                                 break;
   41680                               }
   41681                               case 0x000001c0: {
   41682                                 // 0xf3b101c0
   41683                                 DataType dt =
   41684                                     Dt_F_size_1_Decode(((instr >> 18) & 0x3) |
   41685                                                        ((instr >> 8) & 0x4));
   41686                                 if (dt.Is(kDataTypeValueInvalid)) {
   41687                                   UnallocatedA32(instr);
   41688                                   return;
   41689                                 }
   41690                                 if (((instr >> 12) & 1) != 0) {
   41691                                   UnallocatedA32(instr);
   41692                                   return;
   41693                                 }
   41694                                 unsigned rd = ExtractQRegister(instr, 22, 12);
   41695                                 if ((instr & 1) != 0) {
   41696                                   UnallocatedA32(instr);
   41697                                   return;
   41698                                 }
   41699                                 unsigned rm = ExtractQRegister(instr, 5, 0);
   41700                                 // VCLE{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #0 ; A1
   41701                                 vcle(al,
   41702                                      dt,
   41703                                      QRegister(rd),
   41704                                      QRegister(rm),
   41705                                      UINT32_C(0));
   41706                                 break;
   41707                               }
   41708                             }
   41709                             break;
   41710                           }
   41711                           case 0x00010200: {
   41712                             // 0xf3b10200
   41713                             switch (instr & 0x000001c0) {
   41714                               case 0x00000000: {
   41715                                 // 0xf3b10200
   41716                                 DataType dt =
   41717                                     Dt_F_size_1_Decode(((instr >> 18) & 0x3) |
   41718                                                        ((instr >> 8) & 0x4));
   41719                                 if (dt.Is(kDataTypeValueInvalid)) {
   41720                                   UnallocatedA32(instr);
   41721                                   return;
   41722                                 }
   41723                                 unsigned rd = ExtractDRegister(instr, 22, 12);
   41724                                 unsigned rm = ExtractDRegister(instr, 5, 0);
   41725                                 // VCLT{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #0 ; A1
   41726                                 vclt(al,
   41727                                      dt,
   41728                                      DRegister(rd),
   41729                                      DRegister(rm),
   41730                                      UINT32_C(0));
   41731                                 break;
   41732                               }
   41733                               case 0x00000040: {
   41734                                 // 0xf3b10240
   41735                                 DataType dt =
   41736                                     Dt_F_size_1_Decode(((instr >> 18) & 0x3) |
   41737                                                        ((instr >> 8) & 0x4));
   41738                                 if (dt.Is(kDataTypeValueInvalid)) {
   41739                                   UnallocatedA32(instr);
   41740                                   return;
   41741                                 }
   41742                                 if (((instr >> 12) & 1) != 0) {
   41743                                   UnallocatedA32(instr);
   41744                                   return;
   41745                                 }
   41746                                 unsigned rd = ExtractQRegister(instr, 22, 12);
   41747                                 if ((instr & 1) != 0) {
   41748                                   UnallocatedA32(instr);
   41749                                   return;
   41750                                 }
   41751                                 unsigned rm = ExtractQRegister(instr, 5, 0);
   41752                                 // VCLT{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #0 ; A1
   41753                                 vclt(al,
   41754                                      dt,
   41755                                      QRegister(rd),
   41756                                      QRegister(rm),
   41757                                      UINT32_C(0));
   41758                                 break;
   41759                               }
   41760                               case 0x000000c0: {
   41761                                 // 0xf3b102c0
   41762                                 if ((instr & 0x000c0400) == 0x00080000) {
   41763                                   UnimplementedA32("SHA1H", instr);
   41764                                 } else {
   41765                                   UnallocatedA32(instr);
   41766                                 }
   41767                                 break;
   41768                               }
   41769                               case 0x00000100: {
   41770                                 // 0xf3b10300
   41771                                 DataType dt =
   41772                                     Dt_F_size_1_Decode(((instr >> 18) & 0x3) |
   41773                                                        ((instr >> 8) & 0x4));
   41774                                 if (dt.Is(kDataTypeValueInvalid)) {
   41775                                   UnallocatedA32(instr);
   41776                                   return;
   41777                                 }
   41778                                 unsigned rd = ExtractDRegister(instr, 22, 12);
   41779                                 unsigned rm = ExtractDRegister(instr, 5, 0);
   41780                                 // VABS{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
   41781                                 vabs(al, dt, DRegister(rd), DRegister(rm));
   41782                                 break;
   41783                               }
   41784                               case 0x00000140: {
   41785                                 // 0xf3b10340
   41786                                 DataType dt =
   41787                                     Dt_F_size_1_Decode(((instr >> 18) & 0x3) |
   41788                                                        ((instr >> 8) & 0x4));
   41789                                 if (dt.Is(kDataTypeValueInvalid)) {
   41790                                   UnallocatedA32(instr);
   41791                                   return;
   41792                                 }
   41793                                 if (((instr >> 12) & 1) != 0) {
   41794                                   UnallocatedA32(instr);
   41795                                   return;
   41796                                 }
   41797                                 unsigned rd = ExtractQRegister(instr, 22, 12);
   41798                                 if ((instr & 1) != 0) {
   41799                                   UnallocatedA32(instr);
   41800                                   return;
   41801                                 }
   41802                                 unsigned rm = ExtractQRegister(instr, 5, 0);
   41803                                 // VABS{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
   41804                                 vabs(al, dt, QRegister(rd), QRegister(rm));
   41805                                 break;
   41806                               }
   41807                               case 0x00000180: {
   41808                                 // 0xf3b10380
   41809                                 DataType dt =
   41810                                     Dt_F_size_1_Decode(((instr >> 18) & 0x3) |
   41811                                                        ((instr >> 8) & 0x4));
   41812                                 if (dt.Is(kDataTypeValueInvalid)) {
   41813                                   UnallocatedA32(instr);
   41814                                   return;
   41815                                 }
   41816                                 unsigned rd = ExtractDRegister(instr, 22, 12);
   41817                                 unsigned rm = ExtractDRegister(instr, 5, 0);
   41818                                 // VNEG{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
   41819                                 vneg(al, dt, DRegister(rd), DRegister(rm));
   41820                                 break;
   41821                               }
   41822                               case 0x000001c0: {
   41823                                 // 0xf3b103c0
   41824                                 DataType dt =
   41825                                     Dt_F_size_1_Decode(((instr >> 18) & 0x3) |
   41826                                                        ((instr >> 8) & 0x4));
   41827                                 if (dt.Is(kDataTypeValueInvalid)) {
   41828                                   UnallocatedA32(instr);
   41829                                   return;
   41830                                 }
   41831                                 if (((instr >> 12) & 1) != 0) {
   41832                                   UnallocatedA32(instr);
   41833                                   return;
   41834                                 }
   41835                                 unsigned rd = ExtractQRegister(instr, 22, 12);
   41836                                 if ((instr & 1) != 0) {
   41837                                   UnallocatedA32(instr);
   41838                                   return;
   41839                                 }
   41840                                 unsigned rm = ExtractQRegister(instr, 5, 0);
   41841                                 // VNEG{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
   41842                                 vneg(al, dt, QRegister(rd), QRegister(rm));
   41843                                 break;
   41844                               }
   41845                               default:
   41846                                 UnallocatedA32(instr);
   41847                                 break;
   41848                             }
   41849                             break;
   41850                           }
   41851                           case 0x00020000: {
   41852                             // 0xf3b20000
   41853                             switch (instr & 0x000005c0) {
   41854                               case 0x00000000: {
   41855                                 // 0xf3b20000
   41856                                 if ((instr & 0x000c0000) == 0x00000000) {
   41857                                   unsigned rd = ExtractDRegister(instr, 22, 12);
   41858                                   unsigned rm = ExtractDRegister(instr, 5, 0);
   41859                                   // VSWP{<c>}{<q>}{.<dt>} <Dd>, <Dm> ; A1
   41860                                   vswp(al,
   41861                                        kDataTypeValueNone,
   41862                                        DRegister(rd),
   41863                                        DRegister(rm));
   41864                                 } else {
   41865                                   UnallocatedA32(instr);
   41866                                 }
   41867                                 break;
   41868                               }
   41869                               case 0x00000040: {
   41870                                 // 0xf3b20040
   41871                                 if ((instr & 0x000c0000) == 0x00000000) {
   41872                                   if (((instr >> 12) & 1) != 0) {
   41873                                     UnallocatedA32(instr);
   41874                                     return;
   41875                                   }
   41876                                   unsigned rd = ExtractQRegister(instr, 22, 12);
   41877                                   if ((instr & 1) != 0) {
   41878                                     UnallocatedA32(instr);
   41879                                     return;
   41880                                   }
   41881                                   unsigned rm = ExtractQRegister(instr, 5, 0);
   41882                                   // VSWP{<c>}{<q>}{.<dt>} <Qd>, <Qm> ; A1
   41883                                   vswp(al,
   41884                                        kDataTypeValueNone,
   41885                                        QRegister(rd),
   41886                                        QRegister(rm));
   41887                                 } else {
   41888                                   UnallocatedA32(instr);
   41889                                 }
   41890                                 break;
   41891                               }
   41892                               case 0x00000080: {
   41893                                 // 0xf3b20080
   41894                                 DataType dt =
   41895                                     Dt_size_7_Decode((instr >> 18) & 0x3);
   41896                                 if (dt.Is(kDataTypeValueInvalid)) {
   41897                                   UnallocatedA32(instr);
   41898                                   return;
   41899                                 }
   41900                                 unsigned rd = ExtractDRegister(instr, 22, 12);
   41901                                 unsigned rm = ExtractDRegister(instr, 5, 0);
   41902                                 // VTRN{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
   41903                                 vtrn(al, dt, DRegister(rd), DRegister(rm));
   41904                                 break;
   41905                               }
   41906                               case 0x000000c0: {
   41907                                 // 0xf3b200c0
   41908                                 DataType dt =
   41909                                     Dt_size_7_Decode((instr >> 18) & 0x3);
   41910                                 if (dt.Is(kDataTypeValueInvalid)) {
   41911                                   UnallocatedA32(instr);
   41912                                   return;
   41913                                 }
   41914                                 if (((instr >> 12) & 1) != 0) {
   41915                                   UnallocatedA32(instr);
   41916                                   return;
   41917                                 }
   41918                                 unsigned rd = ExtractQRegister(instr, 22, 12);
   41919                                 if ((instr & 1) != 0) {
   41920                                   UnallocatedA32(instr);
   41921                                   return;
   41922                                 }
   41923                                 unsigned rm = ExtractQRegister(instr, 5, 0);
   41924                                 // VTRN{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
   41925                                 vtrn(al, dt, QRegister(rd), QRegister(rm));
   41926                                 break;
   41927                               }
   41928                               case 0x00000100: {
   41929                                 // 0xf3b20100
   41930                                 DataType dt =
   41931                                     Dt_size_15_Decode((instr >> 18) & 0x3);
   41932                                 if (dt.Is(kDataTypeValueInvalid)) {
   41933                                   UnallocatedA32(instr);
   41934                                   return;
   41935                                 }
   41936                                 unsigned rd = ExtractDRegister(instr, 22, 12);
   41937                                 unsigned rm = ExtractDRegister(instr, 5, 0);
   41938                                 // VUZP{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
   41939                                 vuzp(al, dt, DRegister(rd), DRegister(rm));
   41940                                 break;
   41941                               }
   41942                               case 0x00000140: {
   41943                                 // 0xf3b20140
   41944                                 DataType dt =
   41945                                     Dt_size_7_Decode((instr >> 18) & 0x3);
   41946                                 if (dt.Is(kDataTypeValueInvalid)) {
   41947                                   UnallocatedA32(instr);
   41948                                   return;
   41949                                 }
   41950                                 if (((instr >> 12) & 1) != 0) {
   41951                                   UnallocatedA32(instr);
   41952                                   return;
   41953                                 }
   41954                                 unsigned rd = ExtractQRegister(instr, 22, 12);
   41955                                 if ((instr & 1) != 0) {
   41956                                   UnallocatedA32(instr);
   41957                                   return;
   41958                                 }
   41959                                 unsigned rm = ExtractQRegister(instr, 5, 0);
   41960                                 // VUZP{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
   41961                                 vuzp(al, dt, QRegister(rd), QRegister(rm));
   41962                                 break;
   41963                               }
   41964                               case 0x00000180: {
   41965                                 // 0xf3b20180
   41966                                 DataType dt =
   41967                                     Dt_size_15_Decode((instr >> 18) & 0x3);
   41968                                 if (dt.Is(kDataTypeValueInvalid)) {
   41969                                   UnallocatedA32(instr);
   41970                                   return;
   41971                                 }
   41972                                 unsigned rd = ExtractDRegister(instr, 22, 12);
   41973                                 unsigned rm = ExtractDRegister(instr, 5, 0);
   41974                                 // VZIP{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
   41975                                 vzip(al, dt, DRegister(rd), DRegister(rm));
   41976                                 break;
   41977                               }
   41978                               case 0x000001c0: {
   41979                                 // 0xf3b201c0
   41980                                 DataType dt =
   41981                                     Dt_size_7_Decode((instr >> 18) & 0x3);
   41982                                 if (dt.Is(kDataTypeValueInvalid)) {
   41983                                   UnallocatedA32(instr);
   41984                                   return;
   41985                                 }
   41986                                 if (((instr >> 12) & 1) != 0) {
   41987                                   UnallocatedA32(instr);
   41988                                   return;
   41989                                 }
   41990                                 unsigned rd = ExtractQRegister(instr, 22, 12);
   41991                                 if ((instr & 1) != 0) {
   41992                                   UnallocatedA32(instr);
   41993                                   return;
   41994                                 }
   41995                                 unsigned rm = ExtractQRegister(instr, 5, 0);
   41996                                 // VZIP{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
   41997                                 vzip(al, dt, QRegister(rd), QRegister(rm));
   41998                                 break;
   41999                               }
   42000                               case 0x00000400: {
   42001                                 // 0xf3b20400
   42002                                 if ((instr & 0x000c0000) == 0x00080000) {
   42003                                   unsigned rd = ExtractDRegister(instr, 22, 12);
   42004                                   unsigned rm = ExtractDRegister(instr, 5, 0);
   42005                                   // VRINTN{<q>}.F32.F32 <Dd>, <Dm> ; A1
   42006                                   vrintn(F32,
   42007                                          F32,
   42008                                          DRegister(rd),
   42009                                          DRegister(rm));
   42010                                 } else {
   42011                                   UnallocatedA32(instr);
   42012                                 }
   42013                                 break;
   42014                               }
   42015                               case 0x00000440: {
   42016                                 // 0xf3b20440
   42017                                 if ((instr & 0x000c0000) == 0x00080000) {
   42018                                   if (((instr >> 12) & 1) != 0) {
   42019                                     UnallocatedA32(instr);
   42020                                     return;
   42021                                   }
   42022                                   unsigned rd = ExtractQRegister(instr, 22, 12);
   42023                                   if ((instr & 1) != 0) {
   42024                                     UnallocatedA32(instr);
   42025                                     return;
   42026                                   }
   42027                                   unsigned rm = ExtractQRegister(instr, 5, 0);
   42028                                   // VRINTN{<q>}.F32.F32 <Qd>, <Qm> ; A1
   42029                                   vrintn(F32,
   42030                                          F32,
   42031                                          QRegister(rd),
   42032                                          QRegister(rm));
   42033                                 } else {
   42034                                   UnallocatedA32(instr);
   42035                                 }
   42036                                 break;
   42037                               }
   42038                               case 0x00000480: {
   42039                                 // 0xf3b20480
   42040                                 if ((instr & 0x000c0000) == 0x00080000) {
   42041                                   unsigned rd = ExtractDRegister(instr, 22, 12);
   42042                                   unsigned rm = ExtractDRegister(instr, 5, 0);
   42043                                   // VRINTX{<q>}.F32.F32 <Dd>, <Dm> ; A1
   42044                                   vrintx(al,
   42045                                          F32,
   42046                                          F32,
   42047                                          DRegister(rd),
   42048                                          DRegister(rm));
   42049                                 } else {
   42050                                   UnallocatedA32(instr);
   42051                                 }
   42052                                 break;
   42053                               }
   42054                               case 0x000004c0: {
   42055                                 // 0xf3b204c0
   42056                                 if ((instr & 0x000c0000) == 0x00080000) {
   42057                                   if (((instr >> 12) & 1) != 0) {
   42058                                     UnallocatedA32(instr);
   42059                                     return;
   42060                                   }
   42061                                   unsigned rd = ExtractQRegister(instr, 22, 12);
   42062                                   if ((instr & 1) != 0) {
   42063                                     UnallocatedA32(instr);
   42064                                     return;
   42065                                   }
   42066                                   unsigned rm = ExtractQRegister(instr, 5, 0);
   42067                                   // VRINTX{<q>}.F32.F32 <Qd>, <Qm> ; A1
   42068                                   vrintx(F32,
   42069                                          F32,
   42070                                          QRegister(rd),
   42071                                          QRegister(rm));
   42072                                 } else {
   42073                                   UnallocatedA32(instr);
   42074                                 }
   42075                                 break;
   42076                               }
   42077                               case 0x00000500: {
   42078                                 // 0xf3b20500
   42079                                 if ((instr & 0x000c0000) == 0x00080000) {
   42080                                   unsigned rd = ExtractDRegister(instr, 22, 12);
   42081                                   unsigned rm = ExtractDRegister(instr, 5, 0);
   42082                                   // VRINTA{<q>}.F32.F32 <Dd>, <Dm> ; A1
   42083                                   vrinta(F32,
   42084                                          F32,
   42085                                          DRegister(rd),
   42086                                          DRegister(rm));
   42087                                 } else {
   42088                                   UnallocatedA32(instr);
   42089                                 }
   42090                                 break;
   42091                               }
   42092                               case 0x00000540: {
   42093                                 // 0xf3b20540
   42094                                 if ((instr & 0x000c0000) == 0x00080000) {
   42095                                   if (((instr >> 12) & 1) != 0) {
   42096                                     UnallocatedA32(instr);
   42097                                     return;
   42098                                   }
   42099                                   unsigned rd = ExtractQRegister(instr, 22, 12);
   42100                                   if ((instr & 1) != 0) {
   42101                                     UnallocatedA32(instr);
   42102                                     return;
   42103                                   }
   42104                                   unsigned rm = ExtractQRegister(instr, 5, 0);
   42105                                   // VRINTA{<q>}.F32.F32 <Qd>, <Qm> ; A1
   42106                                   vrinta(F32,
   42107                                          F32,
   42108                                          QRegister(rd),
   42109                                          QRegister(rm));
   42110                                 } else {
   42111                                   UnallocatedA32(instr);
   42112                                 }
   42113                                 break;
   42114                               }
   42115                               case 0x00000580: {
   42116                                 // 0xf3b20580
   42117                                 if ((instr & 0x000c0000) == 0x00080000) {
   42118                                   unsigned rd = ExtractDRegister(instr, 22, 12);
   42119                                   unsigned rm = ExtractDRegister(instr, 5, 0);
   42120                                   // VRINTZ{<q>}.F32.F32 <Dd>, <Dm> ; A1
   42121                                   vrintz(al,
   42122                                          F32,
   42123                                          F32,
   42124                                          DRegister(rd),
   42125                                          DRegister(rm));
   42126                                 } else {
   42127                                   UnallocatedA32(instr);
   42128                                 }
   42129                                 break;
   42130                               }
   42131                               case 0x000005c0: {
   42132                                 // 0xf3b205c0
   42133                                 if ((instr & 0x000c0000) == 0x00080000) {
   42134                                   if (((instr >> 12) & 1) != 0) {
   42135                                     UnallocatedA32(instr);
   42136                                     return;
   42137                                   }
   42138                                   unsigned rd = ExtractQRegister(instr, 22, 12);
   42139                                   if ((instr & 1) != 0) {
   42140                                     UnallocatedA32(instr);
   42141                                     return;
   42142                                   }
   42143                                   unsigned rm = ExtractQRegister(instr, 5, 0);
   42144                                   // VRINTZ{<q>}.F32.F32 <Qd>, <Qm> ; A1
   42145                                   vrintz(F32,
   42146                                          F32,
   42147                                          QRegister(rd),
   42148                                          QRegister(rm));
   42149                                 } else {
   42150                                   UnallocatedA32(instr);
   42151                                 }
   42152                                 break;
   42153                               }
   42154                             }
   42155                             break;
   42156                           }
   42157                           case 0x00020200: {
   42158                             // 0xf3b20200
   42159                             switch (instr & 0x00000580) {
   42160                               case 0x00000000: {
   42161                                 // 0xf3b20200
   42162                                 switch (instr & 0x00000040) {
   42163                                   case 0x00000000: {
   42164                                     // 0xf3b20200
   42165                                     DataType dt =
   42166                                         Dt_size_3_Decode((instr >> 18) & 0x3);
   42167                                     if (dt.Is(kDataTypeValueInvalid)) {
   42168                                       UnallocatedA32(instr);
   42169                                       return;
   42170                                     }
   42171                                     unsigned rd =
   42172                                         ExtractDRegister(instr, 22, 12);
   42173                                     if ((instr & 1) != 0) {
   42174                                       UnallocatedA32(instr);
   42175                                       return;
   42176                                     }
   42177                                     unsigned rm = ExtractQRegister(instr, 5, 0);
   42178                                     // VMOVN{<c>}{<q>}.<dt> <Dd>, <Qm> ; A1
   42179                                     vmovn(al, dt, DRegister(rd), QRegister(rm));
   42180                                     break;
   42181                                   }
   42182                                   case 0x00000040: {
   42183                                     // 0xf3b20240
   42184                                     DataType dt =
   42185                                         Dt_size_14_Decode((instr >> 18) & 0x3);
   42186                                     if (dt.Is(kDataTypeValueInvalid)) {
   42187                                       UnallocatedA32(instr);
   42188                                       return;
   42189                                     }
   42190                                     unsigned rd =
   42191                                         ExtractDRegister(instr, 22, 12);
   42192                                     if ((instr & 1) != 0) {
   42193                                       UnallocatedA32(instr);
   42194                                       return;
   42195                                     }
   42196                                     unsigned rm = ExtractQRegister(instr, 5, 0);
   42197                                     // VQMOVUN{<c>}{<q>}.<dt> <Dd>, <Qm> ; A1
   42198                                     vqmovun(al,
   42199                                             dt,
   42200                                             DRegister(rd),
   42201                                             QRegister(rm));
   42202                                     break;
   42203                                   }
   42204                                 }
   42205                                 break;
   42206                               }
   42207                               case 0x00000080: {
   42208                                 // 0xf3b20280
   42209                                 DataType dt =
   42210                                     Dt_op_size_3_Decode(((instr >> 18) & 0x3) |
   42211                                                         ((instr >> 4) & 0x4));
   42212                                 if (dt.Is(kDataTypeValueInvalid)) {
   42213                                   UnallocatedA32(instr);
   42214                                   return;
   42215                                 }
   42216                                 unsigned rd = ExtractDRegister(instr, 22, 12);
   42217                                 if ((instr & 1) != 0) {
   42218                                   UnallocatedA32(instr);
   42219                                   return;
   42220                                 }
   42221                                 unsigned rm = ExtractQRegister(instr, 5, 0);
   42222                                 // VQMOVN{<c>}{<q>}.<dt> <Dd>, <Qm> ; A1
   42223                                 vqmovn(al, dt, DRegister(rd), QRegister(rm));
   42224                                 break;
   42225                               }
   42226                               case 0x00000100: {
   42227                                 // 0xf3b20300
   42228                                 if ((instr & 0x00000040) == 0x00000000) {
   42229                                   DataType dt =
   42230                                       Dt_size_16_Decode((instr >> 18) & 0x3);
   42231                                   if (dt.Is(kDataTypeValueInvalid)) {
   42232                                     UnallocatedA32(instr);
   42233                                     return;
   42234                                   }
   42235                                   if (((instr >> 12) & 1) != 0) {
   42236                                     UnallocatedA32(instr);
   42237                                     return;
   42238                                   }
   42239                                   unsigned rd = ExtractQRegister(instr, 22, 12);
   42240                                   unsigned rm = ExtractDRegister(instr, 5, 0);
   42241                                   uint32_t imm = dt.GetSize();
   42242                                   // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A2 NOLINT(whitespace/line_length)
   42243                                   vshll(al,
   42244                                         dt,
   42245                                         QRegister(rd),
   42246                                         DRegister(rm),
   42247                                         imm);
   42248                                 } else {
   42249                                   UnallocatedA32(instr);
   42250                                 }
   42251                                 break;
   42252                               }
   42253                               case 0x00000180: {
   42254                                 // 0xf3b20380
   42255                                 switch (instr & 0x000c0040) {
   42256                                   case 0x00080000: {
   42257                                     // 0xf3ba0380
   42258                                     UnimplementedA32("SHA1SU1", instr);
   42259                                     break;
   42260                                   }
   42261                                   case 0x00080040: {
   42262                                     // 0xf3ba03c0
   42263                                     UnimplementedA32("SHA256SU0", instr);
   42264                                     break;
   42265                                   }
   42266                                   default:
   42267                                     UnallocatedA32(instr);
   42268                                     break;
   42269                                 }
   42270                                 break;
   42271                               }
   42272                               case 0x00000400: {
   42273                                 // 0xf3b20600
   42274                                 if ((instr & 0x000c0040) == 0x00040000) {
   42275                                   unsigned rd = ExtractDRegister(instr, 22, 12);
   42276                                   if ((instr & 1) != 0) {
   42277                                     UnallocatedA32(instr);
   42278                                     return;
   42279                                   }
   42280                                   unsigned rm = ExtractQRegister(instr, 5, 0);
   42281                                   // VCVT{<c>}{<q>}.F16.F32 <Dd>, <Qm> ; A1
   42282                                   vcvt(al,
   42283                                        F16,
   42284                                        F32,
   42285                                        DRegister(rd),
   42286                                        QRegister(rm));
   42287                                 } else {
   42288                                   UnallocatedA32(instr);
   42289                                 }
   42290                                 break;
   42291                               }
   42292                               case 0x00000480: {
   42293                                 // 0xf3b20680
   42294                                 switch (instr & 0x000c0040) {
   42295                                   case 0x00080000: {
   42296                                     // 0xf3ba0680
   42297                                     unsigned rd =
   42298                                         ExtractDRegister(instr, 22, 12);
   42299                                     unsigned rm = ExtractDRegister(instr, 5, 0);
   42300                                     // VRINTM{<q>}.F32.F32 <Dd>, <Dm> ; A1
   42301                                     vrintm(F32,
   42302                                            F32,
   42303                                            DRegister(rd),
   42304                                            DRegister(rm));
   42305                                     break;
   42306                                   }
   42307                                   case 0x00080040: {
   42308                                     // 0xf3ba06c0
   42309                                     if (((instr >> 12) & 1) != 0) {
   42310                                       UnallocatedA32(instr);
   42311                                       return;
   42312                                     }
   42313                                     unsigned rd =
   42314                                         ExtractQRegister(instr, 22, 12);
   42315                                     if ((instr & 1) != 0) {
   42316                                       UnallocatedA32(instr);
   42317                                       return;
   42318                                     }
   42319                                     unsigned rm = ExtractQRegister(instr, 5, 0);
   42320                                     // VRINTM{<q>}.F32.F32 <Qd>, <Qm> ; A1
   42321                                     vrintm(F32,
   42322                                            F32,
   42323                                            QRegister(rd),
   42324                                            QRegister(rm));
   42325                                     break;
   42326                                   }
   42327                                   default:
   42328                                     UnallocatedA32(instr);
   42329                                     break;
   42330                                 }
   42331                                 break;
   42332                               }
   42333                               case 0x00000500: {
   42334                                 // 0xf3b20700
   42335                                 if ((instr & 0x000c0040) == 0x00040000) {
   42336                                   if (((instr >> 12) & 1) != 0) {
   42337                                     UnallocatedA32(instr);
   42338                                     return;
   42339                                   }
   42340                                   unsigned rd = ExtractQRegister(instr, 22, 12);
   42341                                   unsigned rm = ExtractDRegister(instr, 5, 0);
   42342                                   // VCVT{<c>}{<q>}.F32.F16 <Qd>, <Dm> ; A1
   42343                                   vcvt(al,
   42344                                        F32,
   42345                                        F16,
   42346                                        QRegister(rd),
   42347                                        DRegister(rm));
   42348                                 } else {
   42349                                   UnallocatedA32(instr);
   42350                                 }
   42351                                 break;
   42352                               }
   42353                               case 0x00000580: {
   42354                                 // 0xf3b20780
   42355                                 switch (instr & 0x000c0040) {
   42356                                   case 0x00080000: {
   42357                                     // 0xf3ba0780
   42358                                     unsigned rd =
   42359                                         ExtractDRegister(instr, 22, 12);
   42360                                     unsigned rm = ExtractDRegister(instr, 5, 0);
   42361                                     // VRINTP{<q>}.F32.F32 <Dd>, <Dm> ; A1
   42362                                     vrintp(F32,
   42363                                            F32,
   42364                                            DRegister(rd),
   42365                                            DRegister(rm));
   42366                                     break;
   42367                                   }
   42368                                   case 0x00080040: {
   42369                                     // 0xf3ba07c0
   42370                                     if (((instr >> 12) & 1) != 0) {
   42371                                       UnallocatedA32(instr);
   42372                                       return;
   42373                                     }
   42374                                     unsigned rd =
   42375                                         ExtractQRegister(instr, 22, 12);
   42376                                     if ((instr & 1) != 0) {
   42377                                       UnallocatedA32(instr);
   42378                                       return;
   42379                                     }
   42380                                     unsigned rm = ExtractQRegister(instr, 5, 0);
   42381                                     // VRINTP{<q>}.F32.F32 <Qd>, <Qm> ; A1
   42382                                     vrintp(F32,
   42383                                            F32,
   42384                                            QRegister(rd),
   42385                                            QRegister(rm));
   42386                                     break;
   42387                                   }
   42388                                   default:
   42389                                     UnallocatedA32(instr);
   42390                                     break;
   42391                                 }
   42392                                 break;
   42393                               }
   42394                             }
   42395                             break;
   42396                           }
   42397                           case 0x00030000: {
   42398                             // 0xf3b30000
   42399                             switch (instr & 0x00000440) {
   42400                               case 0x00000000: {
   42401                                 // 0xf3b30000
   42402                                 switch (instr & 0x000c0100) {
   42403                                   case 0x00080000: {
   42404                                     // 0xf3bb0000
   42405                                     DataType dt =
   42406                                         Dt_op_3_Decode((instr >> 7) & 0x1);
   42407                                     if (dt.Is(kDataTypeValueInvalid)) {
   42408                                       UnallocatedA32(instr);
   42409                                       return;
   42410                                     }
   42411                                     unsigned rd =
   42412                                         ExtractDRegister(instr, 22, 12);
   42413                                     unsigned rm = ExtractDRegister(instr, 5, 0);
   42414                                     // VCVTA{<q>}.<dt>.F32 <Dd>, <Dm> ; A1
   42415                                     vcvta(dt,
   42416                                           F32,
   42417                                           DRegister(rd),
   42418                                           DRegister(rm));
   42419                                     break;
   42420                                   }
   42421                                   case 0x00080100: {
   42422                                     // 0xf3bb0100
   42423                                     DataType dt =
   42424                                         Dt_op_3_Decode((instr >> 7) & 0x1);
   42425                                     if (dt.Is(kDataTypeValueInvalid)) {
   42426                                       UnallocatedA32(instr);
   42427                                       return;
   42428                                     }
   42429                                     unsigned rd =
   42430                                         ExtractDRegister(instr, 22, 12);
   42431                                     unsigned rm = ExtractDRegister(instr, 5, 0);
   42432                                     // VCVTN{<q>}.<dt>.F32 <Dd>, <Dm> ; A1
   42433                                     vcvtn(dt,
   42434                                           F32,
   42435                                           DRegister(rd),
   42436                                           DRegister(rm));
   42437                                     break;
   42438                                   }
   42439                                   default:
   42440                                     UnallocatedA32(instr);
   42441                                     break;
   42442                                 }
   42443                                 break;
   42444                               }
   42445                               case 0x00000040: {
   42446                                 // 0xf3b30040
   42447                                 switch (instr & 0x000c0100) {
   42448                                   case 0x00080000: {
   42449                                     // 0xf3bb0040
   42450                                     DataType dt =
   42451                                         Dt_op_3_Decode((instr >> 7) & 0x1);
   42452                                     if (dt.Is(kDataTypeValueInvalid)) {
   42453                                       UnallocatedA32(instr);
   42454                                       return;
   42455                                     }
   42456                                     if (((instr >> 12) & 1) != 0) {
   42457                                       UnallocatedA32(instr);
   42458                                       return;
   42459                                     }
   42460                                     unsigned rd =
   42461                                         ExtractQRegister(instr, 22, 12);
   42462                                     if ((instr & 1) != 0) {
   42463                                       UnallocatedA32(instr);
   42464                                       return;
   42465                                     }
   42466                                     unsigned rm = ExtractQRegister(instr, 5, 0);
   42467                                     // VCVTA{<q>}.<dt>.F32 <Qd>, <Qm> ; A1
   42468                                     vcvta(dt,
   42469                                           F32,
   42470                                           QRegister(rd),
   42471                                           QRegister(rm));
   42472                                     break;
   42473                                   }
   42474                                   case 0x00080100: {
   42475                                     // 0xf3bb0140
   42476                                     DataType dt =
   42477                                         Dt_op_3_Decode((instr >> 7) & 0x1);
   42478                                     if (dt.Is(kDataTypeValueInvalid)) {
   42479                                       UnallocatedA32(instr);
   42480                                       return;
   42481                                     }
   42482                                     if (((instr >> 12) & 1) != 0) {
   42483                                       UnallocatedA32(instr);
   42484                                       return;
   42485                                     }
   42486                                     unsigned rd =
   42487                                         ExtractQRegister(instr, 22, 12);
   42488                                     if ((instr & 1) != 0) {
   42489                                       UnallocatedA32(instr);
   42490                                       return;
   42491                                     }
   42492                                     unsigned rm = ExtractQRegister(instr, 5, 0);
   42493                                     // VCVTN{<q>}.<dt>.F32 <Qd>, <Qm> ; A1
   42494                                     vcvtn(dt,
   42495                                           F32,
   42496                                           QRegister(rd),
   42497                                           QRegister(rm));
   42498                                     break;
   42499                                   }
   42500                                   default:
   42501                                     UnallocatedA32(instr);
   42502                                     break;
   42503                                 }
   42504                                 break;
   42505                               }
   42506                               case 0x00000400: {
   42507                                 // 0xf3b30400
   42508                                 switch (instr & 0x00000080) {
   42509                                   case 0x00000000: {
   42510                                     // 0xf3b30400
   42511                                     DataType dt = Dt_F_size_4_Decode(
   42512                                         ((instr >> 18) & 0x3) |
   42513                                         ((instr >> 6) & 0x4));
   42514                                     if (dt.Is(kDataTypeValueInvalid)) {
   42515                                       UnallocatedA32(instr);
   42516                                       return;
   42517                                     }
   42518                                     unsigned rd =
   42519                                         ExtractDRegister(instr, 22, 12);
   42520                                     unsigned rm = ExtractDRegister(instr, 5, 0);
   42521                                     // VRECPE{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
   42522                                     vrecpe(al,
   42523                                            dt,
   42524                                            DRegister(rd),
   42525                                            DRegister(rm));
   42526                                     break;
   42527                                   }
   42528                                   case 0x00000080: {
   42529                                     // 0xf3b30480
   42530                                     DataType dt = Dt_F_size_4_Decode(
   42531                                         ((instr >> 18) & 0x3) |
   42532                                         ((instr >> 6) & 0x4));
   42533                                     if (dt.Is(kDataTypeValueInvalid)) {
   42534                                       UnallocatedA32(instr);
   42535                                       return;
   42536                                     }
   42537                                     unsigned rd =
   42538                                         ExtractDRegister(instr, 22, 12);
   42539                                     unsigned rm = ExtractDRegister(instr, 5, 0);
   42540                                     // VRSQRTE{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
   42541                                     vrsqrte(al,
   42542                                             dt,
   42543                                             DRegister(rd),
   42544                                             DRegister(rm));
   42545                                     break;
   42546                                   }
   42547                                 }
   42548                                 break;
   42549                               }
   42550                               case 0x00000440: {
   42551                                 // 0xf3b30440
   42552                                 switch (instr & 0x00000080) {
   42553                                   case 0x00000000: {
   42554                                     // 0xf3b30440
   42555                                     DataType dt = Dt_F_size_4_Decode(
   42556                                         ((instr >> 18) & 0x3) |
   42557                                         ((instr >> 6) & 0x4));
   42558                                     if (dt.Is(kDataTypeValueInvalid)) {
   42559                                       UnallocatedA32(instr);
   42560                                       return;
   42561                                     }
   42562                                     if (((instr >> 12) & 1) != 0) {
   42563                                       UnallocatedA32(instr);
   42564                                       return;
   42565                                     }
   42566                                     unsigned rd =
   42567                                         ExtractQRegister(instr, 22, 12);
   42568                                     if ((instr & 1) != 0) {
   42569                                       UnallocatedA32(instr);
   42570                                       return;
   42571                                     }
   42572                                     unsigned rm = ExtractQRegister(instr, 5, 0);
   42573                                     // VRECPE{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
   42574                                     vrecpe(al,
   42575                                            dt,
   42576                                            QRegister(rd),
   42577                                            QRegister(rm));
   42578                                     break;
   42579                                   }
   42580                                   case 0x00000080: {
   42581                                     // 0xf3b304c0
   42582                                     DataType dt = Dt_F_size_4_Decode(
   42583                                         ((instr >> 18) & 0x3) |
   42584                                         ((instr >> 6) & 0x4));
   42585                                     if (dt.Is(kDataTypeValueInvalid)) {
   42586                                       UnallocatedA32(instr);
   42587                                       return;
   42588                                     }
   42589                                     if (((instr >> 12) & 1) != 0) {
   42590                                       UnallocatedA32(instr);
   42591                                       return;
   42592                                     }
   42593                                     unsigned rd =
   42594                                         ExtractQRegister(instr, 22, 12);
   42595                                     if ((instr & 1) != 0) {
   42596                                       UnallocatedA32(instr);
   42597                                       return;
   42598                                     }
   42599                                     unsigned rm = ExtractQRegister(instr, 5, 0);
   42600                                     // VRSQRTE{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
   42601                                     vrsqrte(al,
   42602                                             dt,
   42603                                             QRegister(rd),
   42604                                             QRegister(rm));
   42605                                     break;
   42606                                   }
   42607                                 }
   42608                                 break;
   42609                               }
   42610                             }
   42611                             break;
   42612                           }
   42613                           case 0x00030200: {
   42614                             // 0xf3b30200
   42615                             switch (instr & 0x000c0440) {
   42616                               case 0x00080000: {
   42617                                 // 0xf3bb0200
   42618                                 switch (instr & 0x00000100) {
   42619                                   case 0x00000000: {
   42620                                     // 0xf3bb0200
   42621                                     DataType dt =
   42622                                         Dt_op_3_Decode((instr >> 7) & 0x1);
   42623                                     if (dt.Is(kDataTypeValueInvalid)) {
   42624                                       UnallocatedA32(instr);
   42625                                       return;
   42626                                     }
   42627                                     unsigned rd =
   42628                                         ExtractDRegister(instr, 22, 12);
   42629                                     unsigned rm = ExtractDRegister(instr, 5, 0);
   42630                                     // VCVTP{<q>}.<dt>.F32 <Dd>, <Dm> ; A1
   42631                                     vcvtp(dt,
   42632                                           F32,
   42633                                           DRegister(rd),
   42634                                           DRegister(rm));
   42635                                     break;
   42636                                   }
   42637                                   case 0x00000100: {
   42638                                     // 0xf3bb0300
   42639                                     DataType dt =
   42640                                         Dt_op_3_Decode((instr >> 7) & 0x1);
   42641                                     if (dt.Is(kDataTypeValueInvalid)) {
   42642                                       UnallocatedA32(instr);
   42643                                       return;
   42644                                     }
   42645                                     unsigned rd =
   42646                                         ExtractDRegister(instr, 22, 12);
   42647                                     unsigned rm = ExtractDRegister(instr, 5, 0);
   42648                                     // VCVTM{<q>}.<dt>.F32 <Dd>, <Dm> ; A1
   42649                                     vcvtm(dt,
   42650                                           F32,
   42651                                           DRegister(rd),
   42652                                           DRegister(rm));
   42653                                     break;
   42654                                   }
   42655                                 }
   42656                                 break;
   42657                               }
   42658                               case 0x00080040: {
   42659                                 // 0xf3bb0240
   42660                                 switch (instr & 0x00000100) {
   42661                                   case 0x00000000: {
   42662                                     // 0xf3bb0240
   42663                                     DataType dt =
   42664                                         Dt_op_3_Decode((instr >> 7) & 0x1);
   42665                                     if (dt.Is(kDataTypeValueInvalid)) {
   42666                                       UnallocatedA32(instr);
   42667                                       return;
   42668                                     }
   42669                                     if (((instr >> 12) & 1) != 0) {
   42670                                       UnallocatedA32(instr);
   42671                                       return;
   42672                                     }
   42673                                     unsigned rd =
   42674                                         ExtractQRegister(instr, 22, 12);
   42675                                     if ((instr & 1) != 0) {
   42676                                       UnallocatedA32(instr);
   42677                                       return;
   42678                                     }
   42679                                     unsigned rm = ExtractQRegister(instr, 5, 0);
   42680                                     // VCVTP{<q>}.<dt>.F32 <Qd>, <Qm> ; A1
   42681                                     vcvtp(dt,
   42682                                           F32,
   42683                                           QRegister(rd),
   42684                                           QRegister(rm));
   42685                                     break;
   42686                                   }
   42687                                   case 0x00000100: {
   42688                                     // 0xf3bb0340
   42689                                     DataType dt =
   42690                                         Dt_op_3_Decode((instr >> 7) & 0x1);
   42691                                     if (dt.Is(kDataTypeValueInvalid)) {
   42692                                       UnallocatedA32(instr);
   42693                                       return;
   42694                                     }
   42695                                     if (((instr >> 12) & 1) != 0) {
   42696                                       UnallocatedA32(instr);
   42697                                       return;
   42698                                     }
   42699                                     unsigned rd =
   42700                                         ExtractQRegister(instr, 22, 12);
   42701                                     if ((instr & 1) != 0) {
   42702                                       UnallocatedA32(instr);
   42703                                       return;
   42704                                     }
   42705                                     unsigned rm = ExtractQRegister(instr, 5, 0);
   42706                                     // VCVTM{<q>}.<dt>.F32 <Qd>, <Qm> ; A1
   42707                                     vcvtm(dt,
   42708                                           F32,
   42709                                           QRegister(rd),
   42710                                           QRegister(rm));
   42711                                     break;
   42712                                   }
   42713                                 }
   42714                                 break;
   42715                               }
   42716                               case 0x00080400: {
   42717                                 // 0xf3bb0600
   42718                                 DataType dt1 =
   42719                                     Dt_op_1_Decode1((instr >> 7) & 0x3);
   42720                                 if (dt1.Is(kDataTypeValueInvalid)) {
   42721                                   UnallocatedA32(instr);
   42722                                   return;
   42723                                 }
   42724                                 DataType dt2 =
   42725                                     Dt_op_1_Decode2((instr >> 7) & 0x3);
   42726                                 if (dt2.Is(kDataTypeValueInvalid)) {
   42727                                   UnallocatedA32(instr);
   42728                                   return;
   42729                                 }
   42730                                 unsigned rd = ExtractDRegister(instr, 22, 12);
   42731                                 unsigned rm = ExtractDRegister(instr, 5, 0);
   42732                                 // VCVT{<c>}{<q>}.<dt>.<dt> <Dd>, <Dm> ; A1
   42733                                 vcvt(al,
   42734                                      dt1,
   42735                                      dt2,
   42736                                      DRegister(rd),
   42737                                      DRegister(rm));
   42738                                 break;
   42739                               }
   42740                               case 0x00080440: {
   42741                                 // 0xf3bb0640
   42742                                 DataType dt1 =
   42743                                     Dt_op_1_Decode1((instr >> 7) & 0x3);
   42744                                 if (dt1.Is(kDataTypeValueInvalid)) {
   42745                                   UnallocatedA32(instr);
   42746                                   return;
   42747                                 }
   42748                                 DataType dt2 =
   42749                                     Dt_op_1_Decode2((instr >> 7) & 0x3);
   42750                                 if (dt2.Is(kDataTypeValueInvalid)) {
   42751                                   UnallocatedA32(instr);
   42752                                   return;
   42753                                 }
   42754                                 if (((instr >> 12) & 1) != 0) {
   42755                                   UnallocatedA32(instr);
   42756                                   return;
   42757                                 }
   42758                                 unsigned rd = ExtractQRegister(instr, 22, 12);
   42759                                 if ((instr & 1) != 0) {
   42760                                   UnallocatedA32(instr);
   42761                                   return;
   42762                                 }
   42763                                 unsigned rm = ExtractQRegister(instr, 5, 0);
   42764                                 // VCVT{<c>}{<q>}.<dt>.<dt> <Qd>, <Qm> ; A1
   42765                                 vcvt(al,
   42766                                      dt1,
   42767                                      dt2,
   42768                                      QRegister(rd),
   42769                                      QRegister(rm));
   42770                                 break;
   42771                               }
   42772                               default:
   42773                                 UnallocatedA32(instr);
   42774                                 break;
   42775                             }
   42776                             break;
   42777                           }
   42778                         }
   42779                         break;
   42780                       }
   42781                       case 0x00000800: {
   42782                         // 0xf3b00800
   42783                         switch (instr & 0x00000440) {
   42784                           case 0x00000000: {
   42785                             // 0xf3b00800
   42786                             unsigned rd = ExtractDRegister(instr, 22, 12);
   42787                             unsigned first = ExtractDRegister(instr, 7, 16);
   42788                             unsigned length;
   42789                             SpacingType spacing = kSingle;
   42790                             switch ((instr >> 8) & 0x3) {
   42791                               default:
   42792                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
   42793                               case 0x0:
   42794                                 length = 1;
   42795                                 break;
   42796                               case 0x1:
   42797                                 length = 2;
   42798                                 break;
   42799                               case 0x2:
   42800                                 length = 3;
   42801                                 break;
   42802                               case 0x3:
   42803                                 length = 4;
   42804                                 break;
   42805                             }
   42806                             unsigned last = first + length - 1;
   42807                             TransferType transfer = kMultipleLanes;
   42808                             unsigned rm = ExtractDRegister(instr, 5, 0);
   42809                             // VTBL{<c>}{<q>}.8 <Dd>, <list>, <Dm> ; A1
   42810                             vtbl(al,
   42811                                  Untyped8,
   42812                                  DRegister(rd),
   42813                                  NeonRegisterList(DRegister(first),
   42814                                                   DRegister(last),
   42815                                                   spacing,
   42816                                                   transfer),
   42817                                  DRegister(rm));
   42818                             break;
   42819                           }
   42820                           case 0x00000040: {
   42821                             // 0xf3b00840
   42822                             unsigned rd = ExtractDRegister(instr, 22, 12);
   42823                             unsigned first = ExtractDRegister(instr, 7, 16);
   42824                             unsigned length;
   42825                             SpacingType spacing = kSingle;
   42826                             switch ((instr >> 8) & 0x3) {
   42827                               default:
   42828                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
   42829                               case 0x0:
   42830                                 length = 1;
   42831                                 break;
   42832                               case 0x1:
   42833                                 length = 2;
   42834                                 break;
   42835                               case 0x2:
   42836                                 length = 3;
   42837                                 break;
   42838                               case 0x3:
   42839                                 length = 4;
   42840                                 break;
   42841                             }
   42842                             unsigned last = first + length - 1;
   42843                             TransferType transfer = kMultipleLanes;
   42844                             unsigned rm = ExtractDRegister(instr, 5, 0);
   42845                             // VTBX{<c>}{<q>}.8 <Dd>, <list>, <Dm> ; A1
   42846                             vtbx(al,
   42847                                  Untyped8,
   42848                                  DRegister(rd),
   42849                                  NeonRegisterList(DRegister(first),
   42850                                                   DRegister(last),
   42851                                                   spacing,
   42852                                                   transfer),
   42853                                  DRegister(rm));
   42854                             break;
   42855                           }
   42856                           case 0x00000400: {
   42857                             // 0xf3b00c00
   42858                             if ((instr & 0x00000380) == 0x00000000) {
   42859                               unsigned lane;
   42860                               DataType dt =
   42861                                   Dt_imm4_1_Decode((instr >> 16) & 0xf, &lane);
   42862                               if (dt.Is(kDataTypeValueInvalid)) {
   42863                                 UnallocatedA32(instr);
   42864                                 return;
   42865                               }
   42866                               unsigned rd = ExtractDRegister(instr, 22, 12);
   42867                               unsigned rm = ExtractDRegister(instr, 5, 0);
   42868                               // VDUP{<c>}{<q>}.<dt> <Dd>, <Dm[x]> ; A1
   42869                               vdup(al,
   42870                                    dt,
   42871                                    DRegister(rd),
   42872                                    DRegisterLane(rm, lane));
   42873                             } else {
   42874                               UnallocatedA32(instr);
   42875                             }
   42876                             break;
   42877                           }
   42878                           case 0x00000440: {
   42879                             // 0xf3b00c40
   42880                             if ((instr & 0x00000380) == 0x00000000) {
   42881                               unsigned lane;
   42882                               DataType dt =
   42883                                   Dt_imm4_1_Decode((instr >> 16) & 0xf, &lane);
   42884                               if (dt.Is(kDataTypeValueInvalid)) {
   42885                                 UnallocatedA32(instr);
   42886                                 return;
   42887                               }
   42888                               if (((instr >> 12) & 1) != 0) {
   42889                                 UnallocatedA32(instr);
   42890                                 return;
   42891                               }
   42892                               unsigned rd = ExtractQRegister(instr, 22, 12);
   42893                               unsigned rm = ExtractDRegister(instr, 5, 0);
   42894                               // VDUP{<c>}{<q>}.<dt> <Qd>, <Dm[x]> ; A1
   42895                               vdup(al,
   42896                                    dt,
   42897                                    QRegister(rd),
   42898                                    DRegisterLane(rm, lane));
   42899                             } else {
   42900                               UnallocatedA32(instr);
   42901                             }
   42902                             break;
   42903                           }
   42904                         }
   42905                         break;
   42906                       }
   42907                     }
   42908                     break;
   42909                   }
   42910                 }
   42911                 break;
   42912               }
   42913               default: {
   42914                 switch (instr & 0x00000c40) {
   42915                   case 0x00000000: {
   42916                     // 0xf2800000
   42917                     switch (instr & 0x00000300) {
   42918                       case 0x00000000: {
   42919                         // 0xf2800000
   42920                         if (((instr & 0x300000) == 0x300000)) {
   42921                           UnallocatedA32(instr);
   42922                           return;
   42923                         }
   42924                         DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
   42925                                                          ((instr >> 22) & 0x4));
   42926                         if (dt.Is(kDataTypeValueInvalid)) {
   42927                           UnallocatedA32(instr);
   42928                           return;
   42929                         }
   42930                         if (((instr >> 12) & 1) != 0) {
   42931                           UnallocatedA32(instr);
   42932                           return;
   42933                         }
   42934                         unsigned rd = ExtractQRegister(instr, 22, 12);
   42935                         unsigned rn = ExtractDRegister(instr, 7, 16);
   42936                         unsigned rm = ExtractDRegister(instr, 5, 0);
   42937                         // VADDL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; A1
   42938                         vaddl(al,
   42939                               dt,
   42940                               QRegister(rd),
   42941                               DRegister(rn),
   42942                               DRegister(rm));
   42943                         break;
   42944                       }
   42945                       case 0x00000100: {
   42946                         // 0xf2800100
   42947                         if (((instr & 0x300000) == 0x300000)) {
   42948                           UnallocatedA32(instr);
   42949                           return;
   42950                         }
   42951                         DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
   42952                                                          ((instr >> 22) & 0x4));
   42953                         if (dt.Is(kDataTypeValueInvalid)) {
   42954                           UnallocatedA32(instr);
   42955                           return;
   42956                         }
   42957                         if (((instr >> 12) & 1) != 0) {
   42958                           UnallocatedA32(instr);
   42959                           return;
   42960                         }
   42961                         unsigned rd = ExtractQRegister(instr, 22, 12);
   42962                         if (((instr >> 16) & 1) != 0) {
   42963                           UnallocatedA32(instr);
   42964                           return;
   42965                         }
   42966                         unsigned rn = ExtractQRegister(instr, 7, 16);
   42967                         unsigned rm = ExtractDRegister(instr, 5, 0);
   42968                         // VADDW{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Dm> ; A1
   42969                         vaddw(al,
   42970                               dt,
   42971                               QRegister(rd),
   42972                               QRegister(rn),
   42973                               DRegister(rm));
   42974                         break;
   42975                       }
   42976                       case 0x00000200: {
   42977                         // 0xf2800200
   42978                         if (((instr & 0x300000) == 0x300000)) {
   42979                           UnallocatedA32(instr);
   42980                           return;
   42981                         }
   42982                         DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
   42983                                                          ((instr >> 22) & 0x4));
   42984                         if (dt.Is(kDataTypeValueInvalid)) {
   42985                           UnallocatedA32(instr);
   42986                           return;
   42987                         }
   42988                         if (((instr >> 12) & 1) != 0) {
   42989                           UnallocatedA32(instr);
   42990                           return;
   42991                         }
   42992                         unsigned rd = ExtractQRegister(instr, 22, 12);
   42993                         unsigned rn = ExtractDRegister(instr, 7, 16);
   42994                         unsigned rm = ExtractDRegister(instr, 5, 0);
   42995                         // VSUBL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; A1
   42996                         vsubl(al,
   42997                               dt,
   42998                               QRegister(rd),
   42999                               DRegister(rn),
   43000                               DRegister(rm));
   43001                         break;
   43002                       }
   43003                       case 0x00000300: {
   43004                         // 0xf2800300
   43005                         if (((instr & 0x300000) == 0x300000)) {
   43006                           UnallocatedA32(instr);
   43007                           return;
   43008                         }
   43009                         DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
   43010                                                          ((instr >> 22) & 0x4));
   43011                         if (dt.Is(kDataTypeValueInvalid)) {
   43012                           UnallocatedA32(instr);
   43013                           return;
   43014                         }
   43015                         if (((instr >> 12) & 1) != 0) {
   43016                           UnallocatedA32(instr);
   43017                           return;
   43018                         }
   43019                         unsigned rd = ExtractQRegister(instr, 22, 12);
   43020                         if (((instr >> 16) & 1) != 0) {
   43021                           UnallocatedA32(instr);
   43022                           return;
   43023                         }
   43024                         unsigned rn = ExtractQRegister(instr, 7, 16);
   43025                         unsigned rm = ExtractDRegister(instr, 5, 0);
   43026                         // VSUBW{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Dm> ; A1
   43027                         vsubw(al,
   43028                               dt,
   43029                               QRegister(rd),
   43030                               QRegister(rn),
   43031                               DRegister(rm));
   43032                         break;
   43033                       }
   43034                     }
   43035                     break;
   43036                   }
   43037                   case 0x00000040: {
   43038                     // 0xf2800040
   43039                     switch (instr & 0x00000200) {
   43040                       case 0x00000000: {
   43041                         // 0xf2800040
   43042                         switch (instr & 0x01000000) {
   43043                           case 0x00000000: {
   43044                             // 0xf2800040
   43045                             if (((instr & 0x300000) == 0x300000)) {
   43046                               UnallocatedA32(instr);
   43047                               return;
   43048                             }
   43049                             DataType dt = Dt_size_9_Decode((instr >> 20) & 0x3,
   43050                                                            (instr >> 8) & 0x1);
   43051                             if (dt.Is(kDataTypeValueInvalid)) {
   43052                               UnallocatedA32(instr);
   43053                               return;
   43054                             }
   43055                             unsigned rd = ExtractDRegister(instr, 22, 12);
   43056                             unsigned rn = ExtractDRegister(instr, 7, 16);
   43057                             int lane;
   43058                             unsigned rm =
   43059                                 ExtractDRegisterAndLane(instr, dt, 5, 0, &lane);
   43060                             // VMLA{<c>}{<q>}.<type><size> <Dd>, <Dn>, <Dm[x]> ; A1 NOLINT(whitespace/line_length)
   43061                             vmla(al,
   43062                                  dt,
   43063                                  DRegister(rd),
   43064                                  DRegister(rn),
   43065                                  DRegisterLane(rm, lane));
   43066                             break;
   43067                           }
   43068                           case 0x01000000: {
   43069                             // 0xf3800040
   43070                             if (((instr & 0x300000) == 0x300000)) {
   43071                               UnallocatedA32(instr);
   43072                               return;
   43073                             }
   43074                             DataType dt = Dt_size_9_Decode((instr >> 20) & 0x3,
   43075                                                            (instr >> 8) & 0x1);
   43076                             if (dt.Is(kDataTypeValueInvalid)) {
   43077                               UnallocatedA32(instr);
   43078                               return;
   43079                             }
   43080                             if (((instr >> 12) & 1) != 0) {
   43081                               UnallocatedA32(instr);
   43082                               return;
   43083                             }
   43084                             unsigned rd = ExtractQRegister(instr, 22, 12);
   43085                             if (((instr >> 16) & 1) != 0) {
   43086                               UnallocatedA32(instr);
   43087                               return;
   43088                             }
   43089                             unsigned rn = ExtractQRegister(instr, 7, 16);
   43090                             int lane;
   43091                             unsigned rm =
   43092                                 ExtractDRegisterAndLane(instr, dt, 5, 0, &lane);
   43093                             // VMLA{<c>}{<q>}.<type><size> <Qd>, <Qn>, <Dm[x]> ; A1 NOLINT(whitespace/line_length)
   43094                             vmla(al,
   43095                                  dt,
   43096                                  QRegister(rd),
   43097                                  QRegister(rn),
   43098                                  DRegisterLane(rm, lane));
   43099                             break;
   43100                           }
   43101                         }
   43102                         break;
   43103                       }
   43104                       case 0x00000200: {
   43105                         // 0xf2800240
   43106                         switch (instr & 0x00000100) {
   43107                           case 0x00000000: {
   43108                             // 0xf2800240
   43109                             if (((instr & 0x300000) == 0x300000)) {
   43110                               UnallocatedA32(instr);
   43111                               return;
   43112                             }
   43113                             DataType dt =
   43114                                 Dt_size_11_Decode((instr >> 20) & 0x3,
   43115                                                   (instr >> 24) & 0x1);
   43116                             if (dt.Is(kDataTypeValueInvalid)) {
   43117                               UnallocatedA32(instr);
   43118                               return;
   43119                             }
   43120                             if (((instr >> 12) & 1) != 0) {
   43121                               UnallocatedA32(instr);
   43122                               return;
   43123                             }
   43124                             unsigned rd = ExtractQRegister(instr, 22, 12);
   43125                             unsigned rn = ExtractDRegister(instr, 7, 16);
   43126                             int lane;
   43127                             unsigned rm =
   43128                                 ExtractDRegisterAndLane(instr, dt, 5, 0, &lane);
   43129                             // VMLAL{<c>}{<q>}.<type><size> <Qd>, <Dn>, <Dm[x]> ; A1 NOLINT(whitespace/line_length)
   43130                             vmlal(al,
   43131                                   dt,
   43132                                   QRegister(rd),
   43133                                   DRegister(rn),
   43134                                   DRegisterLane(rm, lane));
   43135                             break;
   43136                           }
   43137                           case 0x00000100: {
   43138                             // 0xf2800340
   43139                             if ((instr & 0x01000000) == 0x00000000) {
   43140                               if (((instr & 0x300000) == 0x300000)) {
   43141                                 UnallocatedA32(instr);
   43142                                 return;
   43143                               }
   43144                               DataType dt =
   43145                                   Dt_size_13_Decode((instr >> 20) & 0x3);
   43146                               if (dt.Is(kDataTypeValueInvalid)) {
   43147                                 UnallocatedA32(instr);
   43148                                 return;
   43149                               }
   43150                               if (((instr >> 12) & 1) != 0) {
   43151                                 UnallocatedA32(instr);
   43152                                 return;
   43153                               }
   43154                               unsigned rd = ExtractQRegister(instr, 22, 12);
   43155                               unsigned rn = ExtractDRegister(instr, 7, 16);
   43156                               uint32_t mvm =
   43157                                   (instr & 0xf) | ((instr >> 1) & 0x10);
   43158                               uint32_t shift = 4;
   43159                               if (dt.Is(S16)) {
   43160                                 shift = 3;
   43161                               }
   43162                               uint32_t vm = mvm & ((1 << shift) - 1);
   43163                               uint32_t index = mvm >> shift;
   43164                               // VQDMLAL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm>[<index>] ; A2 NOLINT(whitespace/line_length)
   43165                               vqdmlal(al,
   43166                                       dt,
   43167                                       QRegister(rd),
   43168                                       DRegister(rn),
   43169                                       DRegister(vm),
   43170                                       index);
   43171                             } else {
   43172                               UnallocatedA32(instr);
   43173                             }
   43174                             break;
   43175                           }
   43176                         }
   43177                         break;
   43178                       }
   43179                     }
   43180                     break;
   43181                   }
   43182                   case 0x00000400: {
   43183                     // 0xf2800400
   43184                     switch (instr & 0x00000300) {
   43185                       case 0x00000000: {
   43186                         // 0xf2800400
   43187                         switch (instr & 0x01000000) {
   43188                           case 0x00000000: {
   43189                             // 0xf2800400
   43190                             if (((instr & 0x300000) == 0x300000)) {
   43191                               UnallocatedA32(instr);
   43192                               return;
   43193                             }
   43194                             DataType dt = Dt_size_3_Decode((instr >> 20) & 0x3);
   43195                             if (dt.Is(kDataTypeValueInvalid)) {
   43196                               UnallocatedA32(instr);
   43197                               return;
   43198                             }
   43199                             unsigned rd = ExtractDRegister(instr, 22, 12);
   43200                             if (((instr >> 16) & 1) != 0) {
   43201                               UnallocatedA32(instr);
   43202                               return;
   43203                             }
   43204                             unsigned rn = ExtractQRegister(instr, 7, 16);
   43205                             if ((instr & 1) != 0) {
   43206                               UnallocatedA32(instr);
   43207                               return;
   43208                             }
   43209                             unsigned rm = ExtractQRegister(instr, 5, 0);
   43210                             // VADDHN{<c>}{<q>}.<dt> <Dd>, <Qn>, <Qm> ; A1
   43211                             vaddhn(al,
   43212                                    dt,
   43213                                    DRegister(rd),
   43214                                    QRegister(rn),
   43215                                    QRegister(rm));
   43216                             break;
   43217                           }
   43218                           case 0x01000000: {
   43219                             // 0xf3800400
   43220                             if (((instr & 0x300000) == 0x300000)) {
   43221                               UnallocatedA32(instr);
   43222                               return;
   43223                             }
   43224                             DataType dt = Dt_size_3_Decode((instr >> 20) & 0x3);
   43225                             if (dt.Is(kDataTypeValueInvalid)) {
   43226                               UnallocatedA32(instr);
   43227                               return;
   43228                             }
   43229                             unsigned rd = ExtractDRegister(instr, 22, 12);
   43230                             if (((instr >> 16) & 1) != 0) {
   43231                               UnallocatedA32(instr);
   43232                               return;
   43233                             }
   43234                             unsigned rn = ExtractQRegister(instr, 7, 16);
   43235                             if ((instr & 1) != 0) {
   43236                               UnallocatedA32(instr);
   43237                               return;
   43238                             }
   43239                             unsigned rm = ExtractQRegister(instr, 5, 0);
   43240                             // VRADDHN{<c>}{<q>}.<dt> <Dd>, <Qn>, <Qm> ; A1
   43241                             vraddhn(al,
   43242                                     dt,
   43243                                     DRegister(rd),
   43244                                     QRegister(rn),
   43245                                     QRegister(rm));
   43246                             break;
   43247                           }
   43248                         }
   43249                         break;
   43250                       }
   43251                       case 0x00000100: {
   43252                         // 0xf2800500
   43253                         if (((instr & 0x300000) == 0x300000)) {
   43254                           UnallocatedA32(instr);
   43255                           return;
   43256                         }
   43257                         DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
   43258                                                          ((instr >> 22) & 0x4));
   43259                         if (dt.Is(kDataTypeValueInvalid)) {
   43260                           UnallocatedA32(instr);
   43261                           return;
   43262                         }
   43263                         if (((instr >> 12) & 1) != 0) {
   43264                           UnallocatedA32(instr);
   43265                           return;
   43266                         }
   43267                         unsigned rd = ExtractQRegister(instr, 22, 12);
   43268                         unsigned rn = ExtractDRegister(instr, 7, 16);
   43269                         unsigned rm = ExtractDRegister(instr, 5, 0);
   43270                         // VABAL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; A1
   43271                         vabal(al,
   43272                               dt,
   43273                               QRegister(rd),
   43274                               DRegister(rn),
   43275                               DRegister(rm));
   43276                         break;
   43277                       }
   43278                       case 0x00000200: {
   43279                         // 0xf2800600
   43280                         switch (instr & 0x01000000) {
   43281                           case 0x00000000: {
   43282                             // 0xf2800600
   43283                             if (((instr & 0x300000) == 0x300000)) {
   43284                               UnallocatedA32(instr);
   43285                               return;
   43286                             }
   43287                             DataType dt = Dt_size_3_Decode((instr >> 20) & 0x3);
   43288                             if (dt.Is(kDataTypeValueInvalid)) {
   43289                               UnallocatedA32(instr);
   43290                               return;
   43291                             }
   43292                             unsigned rd = ExtractDRegister(instr, 22, 12);
   43293                             if (((instr >> 16) & 1) != 0) {
   43294                               UnallocatedA32(instr);
   43295                               return;
   43296                             }
   43297                             unsigned rn = ExtractQRegister(instr, 7, 16);
   43298                             if ((instr & 1) != 0) {
   43299                               UnallocatedA32(instr);
   43300                               return;
   43301                             }
   43302                             unsigned rm = ExtractQRegister(instr, 5, 0);
   43303                             // VSUBHN{<c>}{<q>}.<dt> <Dd>, <Qn>, <Qm> ; A1
   43304                             vsubhn(al,
   43305                                    dt,
   43306                                    DRegister(rd),
   43307                                    QRegister(rn),
   43308                                    QRegister(rm));
   43309                             break;
   43310                           }
   43311                           case 0x01000000: {
   43312                             // 0xf3800600
   43313                             if (((instr & 0x300000) == 0x300000)) {
   43314                               UnallocatedA32(instr);
   43315                               return;
   43316                             }
   43317                             DataType dt = Dt_size_3_Decode((instr >> 20) & 0x3);
   43318                             if (dt.Is(kDataTypeValueInvalid)) {
   43319                               UnallocatedA32(instr);
   43320                               return;
   43321                             }
   43322                             unsigned rd = ExtractDRegister(instr, 22, 12);
   43323                             if (((instr >> 16) & 1) != 0) {
   43324                               UnallocatedA32(instr);
   43325                               return;
   43326                             }
   43327                             unsigned rn = ExtractQRegister(instr, 7, 16);
   43328                             if ((instr & 1) != 0) {
   43329                               UnallocatedA32(instr);
   43330                               return;
   43331                             }
   43332                             unsigned rm = ExtractQRegister(instr, 5, 0);
   43333                             // VRSUBHN{<c>}{<q>}.<dt> <Dd>, <Qn>, <Qm> ; A1
   43334                             vrsubhn(al,
   43335                                     dt,
   43336                                     DRegister(rd),
   43337                                     QRegister(rn),
   43338                                     QRegister(rm));
   43339                             break;
   43340                           }
   43341                         }
   43342                         break;
   43343                       }
   43344                       case 0x00000300: {
   43345                         // 0xf2800700
   43346                         if (((instr & 0x300000) == 0x300000)) {
   43347                           UnallocatedA32(instr);
   43348                           return;
   43349                         }
   43350                         DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
   43351                                                          ((instr >> 22) & 0x4));
   43352                         if (dt.Is(kDataTypeValueInvalid)) {
   43353                           UnallocatedA32(instr);
   43354                           return;
   43355                         }
   43356                         if (((instr >> 12) & 1) != 0) {
   43357                           UnallocatedA32(instr);
   43358                           return;
   43359                         }
   43360                         unsigned rd = ExtractQRegister(instr, 22, 12);
   43361                         unsigned rn = ExtractDRegister(instr, 7, 16);
   43362                         unsigned rm = ExtractDRegister(instr, 5, 0);
   43363                         // VABDL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; A1
   43364                         vabdl(al,
   43365                               dt,
   43366                               QRegister(rd),
   43367                               DRegister(rn),
   43368                               DRegister(rm));
   43369                         break;
   43370                       }
   43371                     }
   43372                     break;
   43373                   }
   43374                   case 0x00000440: {
   43375                     // 0xf2800440
   43376                     switch (instr & 0x00000200) {
   43377                       case 0x00000000: {
   43378                         // 0xf2800440
   43379                         switch (instr & 0x01000000) {
   43380                           case 0x00000000: {
   43381                             // 0xf2800440
   43382                             if (((instr & 0x300000) == 0x300000)) {
   43383                               UnallocatedA32(instr);
   43384                               return;
   43385                             }
   43386                             DataType dt = Dt_size_9_Decode((instr >> 20) & 0x3,
   43387                                                            (instr >> 8) & 0x1);
   43388                             if (dt.Is(kDataTypeValueInvalid)) {
   43389                               UnallocatedA32(instr);
   43390                               return;
   43391                             }
   43392                             unsigned rd = ExtractDRegister(instr, 22, 12);
   43393                             unsigned rn = ExtractDRegister(instr, 7, 16);
   43394                             int lane;
   43395                             unsigned rm =
   43396                                 ExtractDRegisterAndLane(instr, dt, 5, 0, &lane);
   43397                             // VMLS{<c>}{<q>}.<type><size> <Dd>, <Dn>, <Dm[x]> ; A1 NOLINT(whitespace/line_length)
   43398                             vmls(al,
   43399                                  dt,
   43400                                  DRegister(rd),
   43401                                  DRegister(rn),
   43402                                  DRegisterLane(rm, lane));
   43403                             break;
   43404                           }
   43405                           case 0x01000000: {
   43406                             // 0xf3800440
   43407                             if (((instr & 0x300000) == 0x300000)) {
   43408                               UnallocatedA32(instr);
   43409                               return;
   43410                             }
   43411                             DataType dt = Dt_size_9_Decode((instr >> 20) & 0x3,
   43412                                                            (instr >> 8) & 0x1);
   43413                             if (dt.Is(kDataTypeValueInvalid)) {
   43414                               UnallocatedA32(instr);
   43415                               return;
   43416                             }
   43417                             if (((instr >> 12) & 1) != 0) {
   43418                               UnallocatedA32(instr);
   43419                               return;
   43420                             }
   43421                             unsigned rd = ExtractQRegister(instr, 22, 12);
   43422                             if (((instr >> 16) & 1) != 0) {
   43423                               UnallocatedA32(instr);
   43424                               return;
   43425                             }
   43426                             unsigned rn = ExtractQRegister(instr, 7, 16);
   43427                             int lane;
   43428                             unsigned rm =
   43429                                 ExtractDRegisterAndLane(instr, dt, 5, 0, &lane);
   43430                             // VMLS{<c>}{<q>}.<type><size> <Qd>, <Qn>, <Dm[x]> ; A1 NOLINT(whitespace/line_length)
   43431                             vmls(al,
   43432                                  dt,
   43433                                  QRegister(rd),
   43434                                  QRegister(rn),
   43435                                  DRegisterLane(rm, lane));
   43436                             break;
   43437                           }
   43438                         }
   43439                         break;
   43440                       }
   43441                       case 0x00000200: {
   43442                         // 0xf2800640
   43443                         switch (instr & 0x00000100) {
   43444                           case 0x00000000: {
   43445                             // 0xf2800640
   43446                             if (((instr & 0x300000) == 0x300000)) {
   43447                               UnallocatedA32(instr);
   43448                               return;
   43449                             }
   43450                             DataType dt =
   43451                                 Dt_size_11_Decode((instr >> 20) & 0x3,
   43452                                                   (instr >> 24) & 0x1);
   43453                             if (dt.Is(kDataTypeValueInvalid)) {
   43454                               UnallocatedA32(instr);
   43455                               return;
   43456                             }
   43457                             if (((instr >> 12) & 1) != 0) {
   43458                               UnallocatedA32(instr);
   43459                               return;
   43460                             }
   43461                             unsigned rd = ExtractQRegister(instr, 22, 12);
   43462                             unsigned rn = ExtractDRegister(instr, 7, 16);
   43463                             int lane;
   43464                             unsigned rm =
   43465                                 ExtractDRegisterAndLane(instr, dt, 5, 0, &lane);
   43466                             // VMLSL{<c>}{<q>}.<type><size> <Qd>, <Dn>, <Dm[x]> ; A1 NOLINT(whitespace/line_length)
   43467                             vmlsl(al,
   43468                                   dt,
   43469                                   QRegister(rd),
   43470                                   DRegister(rn),
   43471                                   DRegisterLane(rm, lane));
   43472                             break;
   43473                           }
   43474                           case 0x00000100: {
   43475                             // 0xf2800740
   43476                             if ((instr & 0x01000000) == 0x00000000) {
   43477                               if (((instr & 0x300000) == 0x300000)) {
   43478                                 UnallocatedA32(instr);
   43479                                 return;
   43480                               }
   43481                               DataType dt =
   43482                                   Dt_size_13_Decode((instr >> 20) & 0x3);
   43483                               if (dt.Is(kDataTypeValueInvalid)) {
   43484                                 UnallocatedA32(instr);
   43485                                 return;
   43486                               }
   43487                               if (((instr >> 12) & 1) != 0) {
   43488                                 UnallocatedA32(instr);
   43489                                 return;
   43490                               }
   43491                               unsigned rd = ExtractQRegister(instr, 22, 12);
   43492                               unsigned rn = ExtractDRegister(instr, 7, 16);
   43493                               uint32_t mvm =
   43494                                   (instr & 0xf) | ((instr >> 1) & 0x10);
   43495                               uint32_t shift = 4;
   43496                               if (dt.Is(S16)) {
   43497                                 shift = 3;
   43498                               }
   43499                               uint32_t vm = mvm & ((1 << shift) - 1);
   43500                               uint32_t index = mvm >> shift;
   43501                               // VQDMLSL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm>[<index>] ; A2 NOLINT(whitespace/line_length)
   43502                               vqdmlsl(al,
   43503                                       dt,
   43504                                       QRegister(rd),
   43505                                       DRegister(rn),
   43506                                       DRegister(vm),
   43507                                       index);
   43508                             } else {
   43509                               UnallocatedA32(instr);
   43510                             }
   43511                             break;
   43512                           }
   43513                         }
   43514                         break;
   43515                       }
   43516                     }
   43517                     break;
   43518                   }
   43519                   case 0x00000800: {
   43520                     // 0xf2800800
   43521                     switch (instr & 0x00000300) {
   43522                       case 0x00000000: {
   43523                         // 0xf2800800
   43524                         if (((instr & 0x300000) == 0x300000)) {
   43525                           UnallocatedA32(instr);
   43526                           return;
   43527                         }
   43528                         DataType dt = Dt_size_12_Decode((instr >> 20) & 0x3,
   43529                                                         (instr >> 24) & 0x1);
   43530                         if (dt.Is(kDataTypeValueInvalid)) {
   43531                           UnallocatedA32(instr);
   43532                           return;
   43533                         }
   43534                         if (((instr >> 12) & 1) != 0) {
   43535                           UnallocatedA32(instr);
   43536                           return;
   43537                         }
   43538                         unsigned rd = ExtractQRegister(instr, 22, 12);
   43539                         unsigned rn = ExtractDRegister(instr, 7, 16);
   43540                         unsigned rm = ExtractDRegister(instr, 5, 0);
   43541                         // VMLAL{<c>}{<q>}.<type><size> <Qd>, <Dn>, <Dm> ; A1
   43542                         vmlal(al,
   43543                               dt,
   43544                               QRegister(rd),
   43545                               DRegister(rn),
   43546                               DRegister(rm));
   43547                         break;
   43548                       }
   43549                       case 0x00000100: {
   43550                         // 0xf2800900
   43551                         if ((instr & 0x01000000) == 0x00000000) {
   43552                           if (((instr & 0x300000) == 0x300000)) {
   43553                             UnallocatedA32(instr);
   43554                             return;
   43555                           }
   43556                           DataType dt = Dt_size_13_Decode((instr >> 20) & 0x3);
   43557                           if (dt.Is(kDataTypeValueInvalid)) {
   43558                             UnallocatedA32(instr);
   43559                             return;
   43560                           }
   43561                           if (((instr >> 12) & 1) != 0) {
   43562                             UnallocatedA32(instr);
   43563                             return;
   43564                           }
   43565                           unsigned rd = ExtractQRegister(instr, 22, 12);
   43566                           unsigned rn = ExtractDRegister(instr, 7, 16);
   43567                           unsigned rm = ExtractDRegister(instr, 5, 0);
   43568                           // VQDMLAL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; A1
   43569                           vqdmlal(al,
   43570                                   dt,
   43571                                   QRegister(rd),
   43572                                   DRegister(rn),
   43573                                   DRegister(rm));
   43574                         } else {
   43575                           UnallocatedA32(instr);
   43576                         }
   43577                         break;
   43578                       }
   43579                       case 0x00000200: {
   43580                         // 0xf2800a00
   43581                         if (((instr & 0x300000) == 0x300000)) {
   43582                           UnallocatedA32(instr);
   43583                           return;
   43584                         }
   43585                         DataType dt = Dt_size_12_Decode((instr >> 20) & 0x3,
   43586                                                         (instr >> 24) & 0x1);
   43587                         if (dt.Is(kDataTypeValueInvalid)) {
   43588                           UnallocatedA32(instr);
   43589                           return;
   43590                         }
   43591                         if (((instr >> 12) & 1) != 0) {
   43592                           UnallocatedA32(instr);
   43593                           return;
   43594                         }
   43595                         unsigned rd = ExtractQRegister(instr, 22, 12);
   43596                         unsigned rn = ExtractDRegister(instr, 7, 16);
   43597                         unsigned rm = ExtractDRegister(instr, 5, 0);
   43598                         // VMLSL{<c>}{<q>}.<type><size> <Qd>, <Dn>, <Dm> ; A1
   43599                         vmlsl(al,
   43600                               dt,
   43601                               QRegister(rd),
   43602                               DRegister(rn),
   43603                               DRegister(rm));
   43604                         break;
   43605                       }
   43606                       case 0x00000300: {
   43607                         // 0xf2800b00
   43608                         if ((instr & 0x01000000) == 0x00000000) {
   43609                           if (((instr & 0x300000) == 0x300000)) {
   43610                             UnallocatedA32(instr);
   43611                             return;
   43612                           }
   43613                           DataType dt = Dt_size_13_Decode((instr >> 20) & 0x3);
   43614                           if (dt.Is(kDataTypeValueInvalid)) {
   43615                             UnallocatedA32(instr);
   43616                             return;
   43617                           }
   43618                           if (((instr >> 12) & 1) != 0) {
   43619                             UnallocatedA32(instr);
   43620                             return;
   43621                           }
   43622                           unsigned rd = ExtractQRegister(instr, 22, 12);
   43623                           unsigned rn = ExtractDRegister(instr, 7, 16);
   43624                           unsigned rm = ExtractDRegister(instr, 5, 0);
   43625                           // VQDMLSL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; A1
   43626                           vqdmlsl(al,
   43627                                   dt,
   43628                                   QRegister(rd),
   43629                                   DRegister(rn),
   43630                                   DRegister(rm));
   43631                         } else {
   43632                           UnallocatedA32(instr);
   43633                         }
   43634                         break;
   43635                       }
   43636                     }
   43637                     break;
   43638                   }
   43639                   case 0x00000840: {
   43640                     // 0xf2800840
   43641                     switch (instr & 0x00000200) {
   43642                       case 0x00000000: {
   43643                         // 0xf2800840
   43644                         switch (instr & 0x01000000) {
   43645                           case 0x00000000: {
   43646                             // 0xf2800840
   43647                             if (((instr & 0x300000) == 0x300000)) {
   43648                               UnallocatedA32(instr);
   43649                               return;
   43650                             }
   43651                             DataType dt = Dt_F_size_3_Decode(
   43652                                 ((instr >> 20) & 0x3) | ((instr >> 6) & 0x4));
   43653                             if (dt.Is(kDataTypeValueInvalid)) {
   43654                               UnallocatedA32(instr);
   43655                               return;
   43656                             }
   43657                             unsigned rd = ExtractDRegister(instr, 22, 12);
   43658                             unsigned rn = ExtractDRegister(instr, 7, 16);
   43659                             uint32_t mvm =
   43660                                 (instr & 0xf) | ((instr >> 1) & 0x10);
   43661                             uint32_t shift = 4;
   43662                             if (dt.Is(I16)) {
   43663                               shift = 3;
   43664                             }
   43665                             uint32_t vm = mvm & ((1 << shift) - 1);
   43666                             uint32_t index = mvm >> shift;
   43667                             // VMUL{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm>[<index>] ; A1 NOLINT(whitespace/line_length)
   43668                             vmul(al,
   43669                                  dt,
   43670                                  DRegister(rd),
   43671                                  DRegister(rn),
   43672                                  DRegister(vm),
   43673                                  index);
   43674                             break;
   43675                           }
   43676                           case 0x01000000: {
   43677                             // 0xf3800840
   43678                             if (((instr & 0x300000) == 0x300000)) {
   43679                               UnallocatedA32(instr);
   43680                               return;
   43681                             }
   43682                             DataType dt = Dt_F_size_3_Decode(
   43683                                 ((instr >> 20) & 0x3) | ((instr >> 6) & 0x4));
   43684                             if (dt.Is(kDataTypeValueInvalid)) {
   43685                               UnallocatedA32(instr);
   43686                               return;
   43687                             }
   43688                             if (((instr >> 12) & 1) != 0) {
   43689                               UnallocatedA32(instr);
   43690                               return;
   43691                             }
   43692                             unsigned rd = ExtractQRegister(instr, 22, 12);
   43693                             if (((instr >> 16) & 1) != 0) {
   43694                               UnallocatedA32(instr);
   43695                               return;
   43696                             }
   43697                             unsigned rn = ExtractQRegister(instr, 7, 16);
   43698                             uint32_t mvm =
   43699                                 (instr & 0xf) | ((instr >> 1) & 0x10);
   43700                             uint32_t shift = 4;
   43701                             if (dt.Is(I16)) {
   43702                               shift = 3;
   43703                             }
   43704                             uint32_t vm = mvm & ((1 << shift) - 1);
   43705                             uint32_t index = mvm >> shift;
   43706                             // VMUL{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Dm>[<index>] ; A1 NOLINT(whitespace/line_length)
   43707                             vmul(al,
   43708                                  dt,
   43709                                  QRegister(rd),
   43710                                  QRegister(rn),
   43711                                  DRegister(vm),
   43712                                  index);
   43713                             break;
   43714                           }
   43715                         }
   43716                         break;
   43717                       }
   43718                       case 0x00000200: {
   43719                         // 0xf2800a40
   43720                         switch (instr & 0x00000100) {
   43721                           case 0x00000000: {
   43722                             // 0xf2800a40
   43723                             if (((instr & 0x300000) == 0x300000)) {
   43724                               UnallocatedA32(instr);
   43725                               return;
   43726                             }
   43727                             DataType dt = Dt_U_size_2_Decode(
   43728                                 ((instr >> 20) & 0x3) | ((instr >> 22) & 0x4));
   43729                             if (dt.Is(kDataTypeValueInvalid)) {
   43730                               UnallocatedA32(instr);
   43731                               return;
   43732                             }
   43733                             if (((instr >> 12) & 1) != 0) {
   43734                               UnallocatedA32(instr);
   43735                               return;
   43736                             }
   43737                             unsigned rd = ExtractQRegister(instr, 22, 12);
   43738                             unsigned rn = ExtractDRegister(instr, 7, 16);
   43739                             uint32_t mvm =
   43740                                 (instr & 0xf) | ((instr >> 1) & 0x10);
   43741                             uint32_t shift = 4;
   43742                             if (dt.Is(S16) || dt.Is(U16)) {
   43743                               shift = 3;
   43744                             }
   43745                             uint32_t vm = mvm & ((1 << shift) - 1);
   43746                             uint32_t index = mvm >> shift;
   43747                             // VMULL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm>[<index>] ; A1 NOLINT(whitespace/line_length)
   43748                             vmull(al,
   43749                                   dt,
   43750                                   QRegister(rd),
   43751                                   DRegister(rn),
   43752                                   DRegister(vm),
   43753                                   index);
   43754                             break;
   43755                           }
   43756                           case 0x00000100: {
   43757                             // 0xf2800b40
   43758                             if ((instr & 0x01000000) == 0x00000000) {
   43759                               if (((instr & 0x300000) == 0x300000)) {
   43760                                 UnallocatedA32(instr);
   43761                                 return;
   43762                               }
   43763                               DataType dt =
   43764                                   Dt_size_13_Decode((instr >> 20) & 0x3);
   43765                               if (dt.Is(kDataTypeValueInvalid)) {
   43766                                 UnallocatedA32(instr);
   43767                                 return;
   43768                               }
   43769                               if (((instr >> 12) & 1) != 0) {
   43770                                 UnallocatedA32(instr);
   43771                                 return;
   43772                               }
   43773                               unsigned rd = ExtractQRegister(instr, 22, 12);
   43774                               unsigned rn = ExtractDRegister(instr, 7, 16);
   43775                               int lane;
   43776                               unsigned rm = ExtractDRegisterAndLane(instr,
   43777                                                                     dt,
   43778                                                                     5,
   43779                                                                     0,
   43780                                                                     &lane);
   43781                               // VQDMULL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm[x]> ; A2
   43782                               vqdmull(al,
   43783                                       dt,
   43784                                       QRegister(rd),
   43785                                       DRegister(rn),
   43786                                       DRegisterLane(rm, lane));
   43787                             } else {
   43788                               UnallocatedA32(instr);
   43789                             }
   43790                             break;
   43791                           }
   43792                         }
   43793                         break;
   43794                       }
   43795                     }
   43796                     break;
   43797                   }
   43798                   case 0x00000c00: {
   43799                     // 0xf2800c00
   43800                     switch (instr & 0x00000100) {
   43801                       case 0x00000000: {
   43802                         // 0xf2800c00
   43803                         if (((instr & 0x300000) == 0x300000)) {
   43804                           UnallocatedA32(instr);
   43805                           return;
   43806                         }
   43807                         DataType dt = Dt_op_U_size_1_Decode(
   43808                             ((instr >> 20) & 0x3) | ((instr >> 22) & 0x4) |
   43809                             ((instr >> 6) & 0x8));
   43810                         if (dt.Is(kDataTypeValueInvalid)) {
   43811                           UnallocatedA32(instr);
   43812                           return;
   43813                         }
   43814                         if (((instr >> 12) & 1) != 0) {
   43815                           UnallocatedA32(instr);
   43816                           return;
   43817                         }
   43818                         unsigned rd = ExtractQRegister(instr, 22, 12);
   43819                         unsigned rn = ExtractDRegister(instr, 7, 16);
   43820                         unsigned rm = ExtractDRegister(instr, 5, 0);
   43821                         // VMULL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; A1
   43822                         vmull(al,
   43823                               dt,
   43824                               QRegister(rd),
   43825                               DRegister(rn),
   43826                               DRegister(rm));
   43827                         break;
   43828                       }
   43829                       case 0x00000100: {
   43830                         // 0xf2800d00
   43831                         if ((instr & 0x01000200) == 0x00000000) {
   43832                           if (((instr & 0x300000) == 0x300000)) {
   43833                             UnallocatedA32(instr);
   43834                             return;
   43835                           }
   43836                           DataType dt = Dt_size_13_Decode((instr >> 20) & 0x3);
   43837                           if (dt.Is(kDataTypeValueInvalid)) {
   43838                             UnallocatedA32(instr);
   43839                             return;
   43840                           }
   43841                           if (((instr >> 12) & 1) != 0) {
   43842                             UnallocatedA32(instr);
   43843                             return;
   43844                           }
   43845                           unsigned rd = ExtractQRegister(instr, 22, 12);
   43846                           unsigned rn = ExtractDRegister(instr, 7, 16);
   43847                           unsigned rm = ExtractDRegister(instr, 5, 0);
   43848                           // VQDMULL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; A1
   43849                           vqdmull(al,
   43850                                   dt,
   43851                                   QRegister(rd),
   43852                                   DRegister(rn),
   43853                                   DRegister(rm));
   43854                         } else {
   43855                           UnallocatedA32(instr);
   43856                         }
   43857                         break;
   43858                       }
   43859                     }
   43860                     break;
   43861                   }
   43862                   case 0x00000c40: {
   43863                     // 0xf2800c40
   43864                     switch (instr & 0x01000300) {
   43865                       case 0x00000000: {
   43866                         // 0xf2800c40
   43867                         if (((instr & 0x300000) == 0x300000)) {
   43868                           UnallocatedA32(instr);
   43869                           return;
   43870                         }
   43871                         DataType dt = Dt_size_13_Decode((instr >> 20) & 0x3);
   43872                         if (dt.Is(kDataTypeValueInvalid)) {
   43873                           UnallocatedA32(instr);
   43874                           return;
   43875                         }
   43876                         unsigned rd = ExtractDRegister(instr, 22, 12);
   43877                         unsigned rn = ExtractDRegister(instr, 7, 16);
   43878                         int lane;
   43879                         unsigned rm =
   43880                             ExtractDRegisterAndLane(instr, dt, 5, 0, &lane);
   43881                         // VQDMULH{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm[x]> ; A2
   43882                         vqdmulh(al,
   43883                                 dt,
   43884                                 DRegister(rd),
   43885                                 DRegister(rn),
   43886                                 DRegisterLane(rm, lane));
   43887                         break;
   43888                       }
   43889                       case 0x00000100: {
   43890                         // 0xf2800d40
   43891                         if (((instr & 0x300000) == 0x300000)) {
   43892                           UnallocatedA32(instr);
   43893                           return;
   43894                         }
   43895                         DataType dt = Dt_size_13_Decode((instr >> 20) & 0x3);
   43896                         if (dt.Is(kDataTypeValueInvalid)) {
   43897                           UnallocatedA32(instr);
   43898                           return;
   43899                         }
   43900                         unsigned rd = ExtractDRegister(instr, 22, 12);
   43901                         unsigned rn = ExtractDRegister(instr, 7, 16);
   43902                         int lane;
   43903                         unsigned rm =
   43904                             ExtractDRegisterAndLane(instr, dt, 5, 0, &lane);
   43905                         // VQRDMULH{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm[x]> ; A2
   43906                         vqrdmulh(al,
   43907                                  dt,
   43908                                  DRegister(rd),
   43909                                  DRegister(rn),
   43910                                  DRegisterLane(rm, lane));
   43911                         break;
   43912                       }
   43913                       case 0x01000000: {
   43914                         // 0xf3800c40
   43915                         if (((instr & 0x300000) == 0x300000)) {
   43916                           UnallocatedA32(instr);
   43917                           return;
   43918                         }
   43919                         DataType dt = Dt_size_13_Decode((instr >> 20) & 0x3);
   43920                         if (dt.Is(kDataTypeValueInvalid)) {
   43921                           UnallocatedA32(instr);
   43922                           return;
   43923                         }
   43924                         if (((instr >> 12) & 1) != 0) {
   43925                           UnallocatedA32(instr);
   43926                           return;
   43927                         }
   43928                         unsigned rd = ExtractQRegister(instr, 22, 12);
   43929                         if (((instr >> 16) & 1) != 0) {
   43930                           UnallocatedA32(instr);
   43931                           return;
   43932                         }
   43933                         unsigned rn = ExtractQRegister(instr, 7, 16);
   43934                         int lane;
   43935                         unsigned rm =
   43936                             ExtractDRegisterAndLane(instr, dt, 5, 0, &lane);
   43937                         // VQDMULH{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Dm[x]> ; A2
   43938                         vqdmulh(al,
   43939                                 dt,
   43940                                 QRegister(rd),
   43941                                 QRegister(rn),
   43942                                 DRegisterLane(rm, lane));
   43943                         break;
   43944                       }
   43945                       case 0x01000100: {
   43946                         // 0xf3800d40
   43947                         if (((instr & 0x300000) == 0x300000)) {
   43948                           UnallocatedA32(instr);
   43949                           return;
   43950                         }
   43951                         DataType dt = Dt_size_13_Decode((instr >> 20) & 0x3);
   43952                         if (dt.Is(kDataTypeValueInvalid)) {
   43953                           UnallocatedA32(instr);
   43954                           return;
   43955                         }
   43956                         if (((instr >> 12) & 1) != 0) {
   43957                           UnallocatedA32(instr);
   43958                           return;
   43959                         }
   43960                         unsigned rd = ExtractQRegister(instr, 22, 12);
   43961                         if (((instr >> 16) & 1) != 0) {
   43962                           UnallocatedA32(instr);
   43963                           return;
   43964                         }
   43965                         unsigned rn = ExtractQRegister(instr, 7, 16);
   43966                         int lane;
   43967                         unsigned rm =
   43968                             ExtractDRegisterAndLane(instr, dt, 5, 0, &lane);
   43969                         // VQRDMULH{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Dm[x]> ; A2
   43970                         vqrdmulh(al,
   43971                                  dt,
   43972                                  QRegister(rd),
   43973                                  QRegister(rn),
   43974                                  DRegisterLane(rm, lane));
   43975                         break;
   43976                       }
   43977                       default:
   43978                         UnallocatedA32(instr);
   43979                         break;
   43980                     }
   43981                     break;
   43982                   }
   43983                 }
   43984                 break;
   43985               }
   43986             }
   43987             break;
   43988           }
   43989           case 0x00800010: {
   43990             // 0xf2800010
   43991             switch (instr & 0x00000040) {
   43992               case 0x00000000: {
   43993                 // 0xf2800010
   43994                 switch (instr & 0x00000c00) {
   43995                   case 0x00000000: {
   43996                     // 0xf2800010
   43997                     switch (instr & 0x00380080) {
   43998                       case 0x00000000: {
   43999                         // 0xf2800010
   44000                         switch (instr & 0x00000100) {
   44001                           case 0x00000000: {
   44002                             // 0xf2800010
   44003                             switch (instr & 0x00000200) {
   44004                               default: {
   44005                                 switch (instr & 0x00000020) {
   44006                                   case 0x00000020: {
   44007                                     // 0xf2800030
   44008                                     if (((instr & 0xd00) == 0x100) ||
   44009                                         ((instr & 0xd00) == 0x500) ||
   44010                                         ((instr & 0xd00) == 0x900) ||
   44011                                         ((instr & 0xe00) == 0xe00)) {
   44012                                       UnallocatedA32(instr);
   44013                                       return;
   44014                                     }
   44015                                     unsigned cmode = (instr >> 8) & 0xf;
   44016                                     DataType dt =
   44017                                         ImmediateVmvn::DecodeDt(cmode);
   44018                                     if (dt.Is(kDataTypeValueInvalid)) {
   44019                                       UnallocatedA32(instr);
   44020                                       return;
   44021                                     }
   44022                                     unsigned rd =
   44023                                         ExtractDRegister(instr, 22, 12);
   44024                                     DOperand imm =
   44025                                         ImmediateVmvn::DecodeImmediate(
   44026                                             cmode,
   44027                                             (instr & 0xf) |
   44028                                                 ((instr >> 12) & 0x70) |
   44029                                                 ((instr >> 17) & 0x80));
   44030                                     // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1
   44031                                     vmvn(al, dt, DRegister(rd), imm);
   44032                                     break;
   44033                                   }
   44034                                   default: {
   44035                                     if (((instr & 0x920) == 0x100) ||
   44036                                         ((instr & 0x520) == 0x100) ||
   44037                                         ((instr & 0x820) == 0x20) ||
   44038                                         ((instr & 0x420) == 0x20) ||
   44039                                         ((instr & 0x220) == 0x20) ||
   44040                                         ((instr & 0x120) == 0x120)) {
   44041                                       UnallocatedA32(instr);
   44042                                       return;
   44043                                     }
   44044                                     unsigned cmode = ((instr >> 8) & 0xf) |
   44045                                                      ((instr >> 1) & 0x10);
   44046                                     DataType dt =
   44047                                         ImmediateVmov::DecodeDt(cmode);
   44048                                     if (dt.Is(kDataTypeValueInvalid)) {
   44049                                       UnallocatedA32(instr);
   44050                                       return;
   44051                                     }
   44052                                     unsigned rd =
   44053                                         ExtractDRegister(instr, 22, 12);
   44054                                     DOperand imm =
   44055                                         ImmediateVmov::DecodeImmediate(
   44056                                             cmode,
   44057                                             (instr & 0xf) |
   44058                                                 ((instr >> 12) & 0x70) |
   44059                                                 ((instr >> 17) & 0x80));
   44060                                     // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1
   44061                                     vmov(al, dt, DRegister(rd), imm);
   44062                                     break;
   44063                                   }
   44064                                 }
   44065                                 break;
   44066                               }
   44067                             }
   44068                             break;
   44069                           }
   44070                           case 0x00000100: {
   44071                             // 0xf2800110
   44072                             switch (instr & 0x00000020) {
   44073                               case 0x00000000: {
   44074                                 // 0xf2800110
   44075                                 if (((instr & 0x100) == 0x0) ||
   44076                                     ((instr & 0xc00) == 0xc00)) {
   44077                                   UnallocatedA32(instr);
   44078                                   return;
   44079                                 }
   44080                                 unsigned cmode = (instr >> 8) & 0xf;
   44081                                 DataType dt = ImmediateVorr::DecodeDt(cmode);
   44082                                 if (dt.Is(kDataTypeValueInvalid)) {
   44083                                   UnallocatedA32(instr);
   44084                                   return;
   44085                                 }
   44086                                 unsigned rd = ExtractDRegister(instr, 22, 12);
   44087                                 DOperand imm = ImmediateVorr::DecodeImmediate(
   44088                                     cmode,
   44089                                     (instr & 0xf) | ((instr >> 12) & 0x70) |
   44090                                         ((instr >> 17) & 0x80));
   44091                                 // VORR{<c>}{<q>}.<dt> {<Ddn>}, <Ddn>, #<imm> ; A1 NOLINT(whitespace/line_length)
   44092                                 vorr(al, dt, DRegister(rd), DRegister(rd), imm);
   44093                                 break;
   44094                               }
   44095                               case 0x00000020: {
   44096                                 // 0xf2800130
   44097                                 if (((instr & 0x100) == 0x0) ||
   44098                                     ((instr & 0xc00) == 0xc00)) {
   44099                                   UnallocatedA32(instr);
   44100                                   return;
   44101                                 }
   44102                                 unsigned cmode = (instr >> 8) & 0xf;
   44103                                 DataType dt = ImmediateVbic::DecodeDt(cmode);
   44104                                 if (dt.Is(kDataTypeValueInvalid)) {
   44105                                   UnallocatedA32(instr);
   44106                                   return;
   44107                                 }
   44108                                 unsigned rd = ExtractDRegister(instr, 22, 12);
   44109                                 DOperand imm = ImmediateVbic::DecodeImmediate(
   44110                                     cmode,
   44111                                     (instr & 0xf) | ((instr >> 12) & 0x70) |
   44112                                         ((instr >> 17) & 0x80));
   44113                                 // VBIC{<c>}{<q>}.<dt> {<Ddn>}, <Ddn>, #<imm> ; A1 NOLINT(whitespace/line_length)
   44114                                 vbic(al, dt, DRegister(rd), DRegister(rd), imm);
   44115                                 break;
   44116                               }
   44117                             }
   44118                             break;
   44119                           }
   44120                         }
   44121                         break;
   44122                       }
   44123                       default: {
   44124                         switch (instr & 0x00000300) {
   44125                           case 0x00000000: {
   44126                             // 0xf2800010
   44127                             if (((instr & 0x380080) == 0x0)) {
   44128                               UnallocatedA32(instr);
   44129                               return;
   44130                             }
   44131                             DataType dt =
   44132                                 Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
   44133                                                        ((instr >> 4) & 0x8),
   44134                                                    (instr >> 24) & 0x1);
   44135                             if (dt.Is(kDataTypeValueInvalid)) {
   44136                               UnallocatedA32(instr);
   44137                               return;
   44138                             }
   44139                             unsigned rd = ExtractDRegister(instr, 22, 12);
   44140                             unsigned rm = ExtractDRegister(instr, 5, 0);
   44141                             uint32_t imm6 = (instr >> 16) & 0x3f;
   44142                             uint32_t imm =
   44143                                 (dt.IsSize(64) ? 64 : (dt.GetSize() * 2)) -
   44144                                 imm6;
   44145                             // VSHR{<c>}{<q>}.<type><size> {<Dd>}, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   44146                             vshr(al, dt, DRegister(rd), DRegister(rm), imm);
   44147                             break;
   44148                           }
   44149                           case 0x00000100: {
   44150                             // 0xf2800110
   44151                             if (((instr & 0x380080) == 0x0)) {
   44152                               UnallocatedA32(instr);
   44153                               return;
   44154                             }
   44155                             DataType dt =
   44156                                 Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
   44157                                                        ((instr >> 4) & 0x8),
   44158                                                    (instr >> 24) & 0x1);
   44159                             if (dt.Is(kDataTypeValueInvalid)) {
   44160                               UnallocatedA32(instr);
   44161                               return;
   44162                             }
   44163                             unsigned rd = ExtractDRegister(instr, 22, 12);
   44164                             unsigned rm = ExtractDRegister(instr, 5, 0);
   44165                             uint32_t imm6 = (instr >> 16) & 0x3f;
   44166                             uint32_t imm =
   44167                                 (dt.IsSize(64) ? 64 : (dt.GetSize() * 2)) -
   44168                                 imm6;
   44169                             // VSRA{<c>}{<q>}.<type><size> {<Dd>}, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   44170                             vsra(al, dt, DRegister(rd), DRegister(rm), imm);
   44171                             break;
   44172                           }
   44173                           case 0x00000200: {
   44174                             // 0xf2800210
   44175                             if (((instr & 0x380080) == 0x0)) {
   44176                               UnallocatedA32(instr);
   44177                               return;
   44178                             }
   44179                             DataType dt =
   44180                                 Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
   44181                                                        ((instr >> 4) & 0x8),
   44182                                                    (instr >> 24) & 0x1);
   44183                             if (dt.Is(kDataTypeValueInvalid)) {
   44184                               UnallocatedA32(instr);
   44185                               return;
   44186                             }
   44187                             unsigned rd = ExtractDRegister(instr, 22, 12);
   44188                             unsigned rm = ExtractDRegister(instr, 5, 0);
   44189                             uint32_t imm6 = (instr >> 16) & 0x3f;
   44190                             uint32_t imm =
   44191                                 (dt.IsSize(64) ? 64 : (dt.GetSize() * 2)) -
   44192                                 imm6;
   44193                             // VRSHR{<c>}{<q>}.<type><size> {<Dd>}, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   44194                             vrshr(al, dt, DRegister(rd), DRegister(rm), imm);
   44195                             break;
   44196                           }
   44197                           case 0x00000300: {
   44198                             // 0xf2800310
   44199                             if (((instr & 0x380080) == 0x0)) {
   44200                               UnallocatedA32(instr);
   44201                               return;
   44202                             }
   44203                             DataType dt =
   44204                                 Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
   44205                                                        ((instr >> 4) & 0x8),
   44206                                                    (instr >> 24) & 0x1);
   44207                             if (dt.Is(kDataTypeValueInvalid)) {
   44208                               UnallocatedA32(instr);
   44209                               return;
   44210                             }
   44211                             unsigned rd = ExtractDRegister(instr, 22, 12);
   44212                             unsigned rm = ExtractDRegister(instr, 5, 0);
   44213                             uint32_t imm6 = (instr >> 16) & 0x3f;
   44214                             uint32_t imm =
   44215                                 (dt.IsSize(64) ? 64 : (dt.GetSize() * 2)) -
   44216                                 imm6;
   44217                             // VRSRA{<c>}{<q>}.<type><size> {<Dd>}, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   44218                             vrsra(al, dt, DRegister(rd), DRegister(rm), imm);
   44219                             break;
   44220                           }
   44221                         }
   44222                         break;
   44223                       }
   44224                     }
   44225                     break;
   44226                   }
   44227                   case 0x00000400: {
   44228                     // 0xf2800410
   44229                     switch (instr & 0x00380080) {
   44230                       case 0x00000000: {
   44231                         // 0xf2800410
   44232                         switch (instr & 0x00000100) {
   44233                           case 0x00000000: {
   44234                             // 0xf2800410
   44235                             switch (instr & 0x00000200) {
   44236                               default: {
   44237                                 switch (instr & 0x00000020) {
   44238                                   case 0x00000020: {
   44239                                     // 0xf2800430
   44240                                     if (((instr & 0xd00) == 0x100) ||
   44241                                         ((instr & 0xd00) == 0x500) ||
   44242                                         ((instr & 0xd00) == 0x900) ||
   44243                                         ((instr & 0xe00) == 0xe00)) {
   44244                                       UnallocatedA32(instr);
   44245                                       return;
   44246                                     }
   44247                                     unsigned cmode = (instr >> 8) & 0xf;
   44248                                     DataType dt =
   44249                                         ImmediateVmvn::DecodeDt(cmode);
   44250                                     if (dt.Is(kDataTypeValueInvalid)) {
   44251                                       UnallocatedA32(instr);
   44252                                       return;
   44253                                     }
   44254                                     unsigned rd =
   44255                                         ExtractDRegister(instr, 22, 12);
   44256                                     DOperand imm =
   44257                                         ImmediateVmvn::DecodeImmediate(
   44258                                             cmode,
   44259                                             (instr & 0xf) |
   44260                                                 ((instr >> 12) & 0x70) |
   44261                                                 ((instr >> 17) & 0x80));
   44262                                     // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1
   44263                                     vmvn(al, dt, DRegister(rd), imm);
   44264                                     break;
   44265                                   }
   44266                                   default: {
   44267                                     if (((instr & 0x920) == 0x100) ||
   44268                                         ((instr & 0x520) == 0x100) ||
   44269                                         ((instr & 0x820) == 0x20) ||
   44270                                         ((instr & 0x420) == 0x20) ||
   44271                                         ((instr & 0x220) == 0x20) ||
   44272                                         ((instr & 0x120) == 0x120)) {
   44273                                       UnallocatedA32(instr);
   44274                                       return;
   44275                                     }
   44276                                     unsigned cmode = ((instr >> 8) & 0xf) |
   44277                                                      ((instr >> 1) & 0x10);
   44278                                     DataType dt =
   44279                                         ImmediateVmov::DecodeDt(cmode);
   44280                                     if (dt.Is(kDataTypeValueInvalid)) {
   44281                                       UnallocatedA32(instr);
   44282                                       return;
   44283                                     }
   44284                                     unsigned rd =
   44285                                         ExtractDRegister(instr, 22, 12);
   44286                                     DOperand imm =
   44287                                         ImmediateVmov::DecodeImmediate(
   44288                                             cmode,
   44289                                             (instr & 0xf) |
   44290                                                 ((instr >> 12) & 0x70) |
   44291                                                 ((instr >> 17) & 0x80));
   44292                                     // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1
   44293                                     vmov(al, dt, DRegister(rd), imm);
   44294                                     break;
   44295                                   }
   44296                                 }
   44297                                 break;
   44298                               }
   44299                             }
   44300                             break;
   44301                           }
   44302                           case 0x00000100: {
   44303                             // 0xf2800510
   44304                             switch (instr & 0x00000020) {
   44305                               case 0x00000000: {
   44306                                 // 0xf2800510
   44307                                 if (((instr & 0x100) == 0x0) ||
   44308                                     ((instr & 0xc00) == 0xc00)) {
   44309                                   UnallocatedA32(instr);
   44310                                   return;
   44311                                 }
   44312                                 unsigned cmode = (instr >> 8) & 0xf;
   44313                                 DataType dt = ImmediateVorr::DecodeDt(cmode);
   44314                                 if (dt.Is(kDataTypeValueInvalid)) {
   44315                                   UnallocatedA32(instr);
   44316                                   return;
   44317                                 }
   44318                                 unsigned rd = ExtractDRegister(instr, 22, 12);
   44319                                 DOperand imm = ImmediateVorr::DecodeImmediate(
   44320                                     cmode,
   44321                                     (instr & 0xf) | ((instr >> 12) & 0x70) |
   44322                                         ((instr >> 17) & 0x80));
   44323                                 // VORR{<c>}{<q>}.<dt> {<Ddn>}, <Ddn>, #<imm> ; A1 NOLINT(whitespace/line_length)
   44324                                 vorr(al, dt, DRegister(rd), DRegister(rd), imm);
   44325                                 break;
   44326                               }
   44327                               case 0x00000020: {
   44328                                 // 0xf2800530
   44329                                 if (((instr & 0x100) == 0x0) ||
   44330                                     ((instr & 0xc00) == 0xc00)) {
   44331                                   UnallocatedA32(instr);
   44332                                   return;
   44333                                 }
   44334                                 unsigned cmode = (instr >> 8) & 0xf;
   44335                                 DataType dt = ImmediateVbic::DecodeDt(cmode);
   44336                                 if (dt.Is(kDataTypeValueInvalid)) {
   44337                                   UnallocatedA32(instr);
   44338                                   return;
   44339                                 }
   44340                                 unsigned rd = ExtractDRegister(instr, 22, 12);
   44341                                 DOperand imm = ImmediateVbic::DecodeImmediate(
   44342                                     cmode,
   44343                                     (instr & 0xf) | ((instr >> 12) & 0x70) |
   44344                                         ((instr >> 17) & 0x80));
   44345                                 // VBIC{<c>}{<q>}.<dt> {<Ddn>}, <Ddn>, #<imm> ; A1 NOLINT(whitespace/line_length)
   44346                                 vbic(al, dt, DRegister(rd), DRegister(rd), imm);
   44347                                 break;
   44348                               }
   44349                             }
   44350                             break;
   44351                           }
   44352                         }
   44353                         break;
   44354                       }
   44355                       default: {
   44356                         switch (instr & 0x00000300) {
   44357                           case 0x00000000: {
   44358                             // 0xf2800410
   44359                             if ((instr & 0x01000000) == 0x01000000) {
   44360                               if (((instr & 0x380080) == 0x0)) {
   44361                                 UnallocatedA32(instr);
   44362                                 return;
   44363                               }
   44364                               DataType dt = Dt_L_imm6_4_Decode(
   44365                                   ((instr >> 19) & 0x7) | ((instr >> 4) & 0x8));
   44366                               if (dt.Is(kDataTypeValueInvalid)) {
   44367                                 UnallocatedA32(instr);
   44368                                 return;
   44369                               }
   44370                               unsigned rd = ExtractDRegister(instr, 22, 12);
   44371                               unsigned rm = ExtractDRegister(instr, 5, 0);
   44372                               uint32_t imm6 = (instr >> 16) & 0x3f;
   44373                               uint32_t imm =
   44374                                   (dt.IsSize(64) ? 64 : (dt.GetSize() * 2)) -
   44375                                   imm6;
   44376                               // VSRI{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #<imm> ; A1
   44377                               vsri(al, dt, DRegister(rd), DRegister(rm), imm);
   44378                             } else {
   44379                               UnallocatedA32(instr);
   44380                             }
   44381                             break;
   44382                           }
   44383                           case 0x00000100: {
   44384                             // 0xf2800510
   44385                             switch (instr & 0x01000000) {
   44386                               case 0x00000000: {
   44387                                 // 0xf2800510
   44388                                 if (((instr & 0x380080) == 0x0)) {
   44389                                   UnallocatedA32(instr);
   44390                                   return;
   44391                                 }
   44392                                 DataType dt =
   44393                                     Dt_L_imm6_3_Decode(((instr >> 19) & 0x7) |
   44394                                                        ((instr >> 4) & 0x8));
   44395                                 if (dt.Is(kDataTypeValueInvalid)) {
   44396                                   UnallocatedA32(instr);
   44397                                   return;
   44398                                 }
   44399                                 unsigned rd = ExtractDRegister(instr, 22, 12);
   44400                                 unsigned rm = ExtractDRegister(instr, 5, 0);
   44401                                 uint32_t imm6 = (instr >> 16) & 0x3f;
   44402                                 uint32_t imm =
   44403                                     imm6 - (dt.IsSize(64) ? 0 : dt.GetSize());
   44404                                 // VSHL{<c>}{<q>}.I<size> {<Dd>}, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   44405                                 vshl(al, dt, DRegister(rd), DRegister(rm), imm);
   44406                                 break;
   44407                               }
   44408                               case 0x01000000: {
   44409                                 // 0xf3800510
   44410                                 if (((instr & 0x380080) == 0x0)) {
   44411                                   UnallocatedA32(instr);
   44412                                   return;
   44413                                 }
   44414                                 DataType dt =
   44415                                     Dt_L_imm6_4_Decode(((instr >> 19) & 0x7) |
   44416                                                        ((instr >> 4) & 0x8));
   44417                                 if (dt.Is(kDataTypeValueInvalid)) {
   44418                                   UnallocatedA32(instr);
   44419                                   return;
   44420                                 }
   44421                                 unsigned rd = ExtractDRegister(instr, 22, 12);
   44422                                 unsigned rm = ExtractDRegister(instr, 5, 0);
   44423                                 uint32_t imm6 = (instr >> 16) & 0x3f;
   44424                                 uint32_t imm =
   44425                                     imm6 - (dt.IsSize(64) ? 0 : dt.GetSize());
   44426                                 // VSLI{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #<imm> ; A1
   44427                                 vsli(al, dt, DRegister(rd), DRegister(rm), imm);
   44428                                 break;
   44429                               }
   44430                             }
   44431                             break;
   44432                           }
   44433                           case 0x00000200: {
   44434                             // 0xf2800610
   44435                             if (((instr & 0x380080) == 0x0)) {
   44436                               UnallocatedA32(instr);
   44437                               return;
   44438                             }
   44439                             DataType dt =
   44440                                 Dt_L_imm6_2_Decode(((instr >> 19) & 0x7) |
   44441                                                        ((instr >> 4) & 0x8),
   44442                                                    (instr >> 24) & 0x1);
   44443                             if (dt.Is(kDataTypeValueInvalid)) {
   44444                               UnallocatedA32(instr);
   44445                               return;
   44446                             }
   44447                             unsigned rd = ExtractDRegister(instr, 22, 12);
   44448                             unsigned rm = ExtractDRegister(instr, 5, 0);
   44449                             uint32_t imm6 = (instr >> 16) & 0x3f;
   44450                             uint32_t imm =
   44451                                 imm6 - (dt.IsSize(64) ? 0 : dt.GetSize());
   44452                             // VQSHLU{<c>}{<q>}.<type><size> {<Dd>}, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   44453                             vqshlu(al, dt, DRegister(rd), DRegister(rm), imm);
   44454                             break;
   44455                           }
   44456                           case 0x00000300: {
   44457                             // 0xf2800710
   44458                             if (((instr & 0x380080) == 0x0)) {
   44459                               UnallocatedA32(instr);
   44460                               return;
   44461                             }
   44462                             DataType dt =
   44463                                 Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
   44464                                                        ((instr >> 4) & 0x8),
   44465                                                    (instr >> 24) & 0x1);
   44466                             if (dt.Is(kDataTypeValueInvalid)) {
   44467                               UnallocatedA32(instr);
   44468                               return;
   44469                             }
   44470                             unsigned rd = ExtractDRegister(instr, 22, 12);
   44471                             unsigned rm = ExtractDRegister(instr, 5, 0);
   44472                             uint32_t imm6 = (instr >> 16) & 0x3f;
   44473                             uint32_t imm =
   44474                                 imm6 - (dt.IsSize(64) ? 0 : dt.GetSize());
   44475                             // VQSHL{<c>}{<q>}.<type><size> {<Dd>}, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   44476                             vqshl(al, dt, DRegister(rd), DRegister(rm), imm);
   44477                             break;
   44478                           }
   44479                         }
   44480                         break;
   44481                       }
   44482                     }
   44483                     break;
   44484                   }
   44485                   case 0x00000800: {
   44486                     // 0xf2800810
   44487                     switch (instr & 0x00000080) {
   44488                       case 0x00000000: {
   44489                         // 0xf2800810
   44490                         switch (instr & 0x00380000) {
   44491                           case 0x00000000: {
   44492                             // 0xf2800810
   44493                             switch (instr & 0x00000100) {
   44494                               case 0x00000000: {
   44495                                 // 0xf2800810
   44496                                 switch (instr & 0x00000200) {
   44497                                   default: {
   44498                                     switch (instr & 0x00000020) {
   44499                                       case 0x00000020: {
   44500                                         // 0xf2800830
   44501                                         if (((instr & 0xd00) == 0x100) ||
   44502                                             ((instr & 0xd00) == 0x500) ||
   44503                                             ((instr & 0xd00) == 0x900) ||
   44504                                             ((instr & 0xe00) == 0xe00)) {
   44505                                           UnallocatedA32(instr);
   44506                                           return;
   44507                                         }
   44508                                         unsigned cmode = (instr >> 8) & 0xf;
   44509                                         DataType dt =
   44510                                             ImmediateVmvn::DecodeDt(cmode);
   44511                                         if (dt.Is(kDataTypeValueInvalid)) {
   44512                                           UnallocatedA32(instr);
   44513                                           return;
   44514                                         }
   44515                                         unsigned rd =
   44516                                             ExtractDRegister(instr, 22, 12);
   44517                                         DOperand imm =
   44518                                             ImmediateVmvn::DecodeImmediate(
   44519                                                 cmode,
   44520                                                 (instr & 0xf) |
   44521                                                     ((instr >> 12) & 0x70) |
   44522                                                     ((instr >> 17) & 0x80));
   44523                                         // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1
   44524                                         vmvn(al, dt, DRegister(rd), imm);
   44525                                         break;
   44526                                       }
   44527                                       default: {
   44528                                         if (((instr & 0x920) == 0x100) ||
   44529                                             ((instr & 0x520) == 0x100) ||
   44530                                             ((instr & 0x820) == 0x20) ||
   44531                                             ((instr & 0x420) == 0x20) ||
   44532                                             ((instr & 0x220) == 0x20) ||
   44533                                             ((instr & 0x120) == 0x120)) {
   44534                                           UnallocatedA32(instr);
   44535                                           return;
   44536                                         }
   44537                                         unsigned cmode = ((instr >> 8) & 0xf) |
   44538                                                          ((instr >> 1) & 0x10);
   44539                                         DataType dt =
   44540                                             ImmediateVmov::DecodeDt(cmode);
   44541                                         if (dt.Is(kDataTypeValueInvalid)) {
   44542                                           UnallocatedA32(instr);
   44543                                           return;
   44544                                         }
   44545                                         unsigned rd =
   44546                                             ExtractDRegister(instr, 22, 12);
   44547                                         DOperand imm =
   44548                                             ImmediateVmov::DecodeImmediate(
   44549                                                 cmode,
   44550                                                 (instr & 0xf) |
   44551                                                     ((instr >> 12) & 0x70) |
   44552                                                     ((instr >> 17) & 0x80));
   44553                                         // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1
   44554                                         vmov(al, dt, DRegister(rd), imm);
   44555                                         break;
   44556                                       }
   44557                                     }
   44558                                     break;
   44559                                   }
   44560                                 }
   44561                                 break;
   44562                               }
   44563                               case 0x00000100: {
   44564                                 // 0xf2800910
   44565                                 switch (instr & 0x00000020) {
   44566                                   case 0x00000000: {
   44567                                     // 0xf2800910
   44568                                     if (((instr & 0x100) == 0x0) ||
   44569                                         ((instr & 0xc00) == 0xc00)) {
   44570                                       UnallocatedA32(instr);
   44571                                       return;
   44572                                     }
   44573                                     unsigned cmode = (instr >> 8) & 0xf;
   44574                                     DataType dt =
   44575                                         ImmediateVorr::DecodeDt(cmode);
   44576                                     if (dt.Is(kDataTypeValueInvalid)) {
   44577                                       UnallocatedA32(instr);
   44578                                       return;
   44579                                     }
   44580                                     unsigned rd =
   44581                                         ExtractDRegister(instr, 22, 12);
   44582                                     DOperand imm =
   44583                                         ImmediateVorr::DecodeImmediate(
   44584                                             cmode,
   44585                                             (instr & 0xf) |
   44586                                                 ((instr >> 12) & 0x70) |
   44587                                                 ((instr >> 17) & 0x80));
   44588                                     // VORR{<c>}{<q>}.<dt> {<Ddn>}, <Ddn>, #<imm> ; A1 NOLINT(whitespace/line_length)
   44589                                     vorr(al,
   44590                                          dt,
   44591                                          DRegister(rd),
   44592                                          DRegister(rd),
   44593                                          imm);
   44594                                     break;
   44595                                   }
   44596                                   case 0x00000020: {
   44597                                     // 0xf2800930
   44598                                     if (((instr & 0x100) == 0x0) ||
   44599                                         ((instr & 0xc00) == 0xc00)) {
   44600                                       UnallocatedA32(instr);
   44601                                       return;
   44602                                     }
   44603                                     unsigned cmode = (instr >> 8) & 0xf;
   44604                                     DataType dt =
   44605                                         ImmediateVbic::DecodeDt(cmode);
   44606                                     if (dt.Is(kDataTypeValueInvalid)) {
   44607                                       UnallocatedA32(instr);
   44608                                       return;
   44609                                     }
   44610                                     unsigned rd =
   44611                                         ExtractDRegister(instr, 22, 12);
   44612                                     DOperand imm =
   44613                                         ImmediateVbic::DecodeImmediate(
   44614                                             cmode,
   44615                                             (instr & 0xf) |
   44616                                                 ((instr >> 12) & 0x70) |
   44617                                                 ((instr >> 17) & 0x80));
   44618                                     // VBIC{<c>}{<q>}.<dt> {<Ddn>}, <Ddn>, #<imm> ; A1 NOLINT(whitespace/line_length)
   44619                                     vbic(al,
   44620                                          dt,
   44621                                          DRegister(rd),
   44622                                          DRegister(rd),
   44623                                          imm);
   44624                                     break;
   44625                                   }
   44626                                 }
   44627                                 break;
   44628                               }
   44629                             }
   44630                             break;
   44631                           }
   44632                           case 0x00180000: {
   44633                             // 0xf2980810
   44634                             switch (instr & 0x00000300) {
   44635                               case 0x00000000: {
   44636                                 // 0xf2980810
   44637                                 switch (instr & 0x01000000) {
   44638                                   case 0x00000000: {
   44639                                     // 0xf2980810
   44640                                     if (((instr & 0x380000) == 0x0)) {
   44641                                       UnallocatedA32(instr);
   44642                                       return;
   44643                                     }
   44644                                     DataType dt =
   44645                                         Dt_imm6_3_Decode((instr >> 19) & 0x7);
   44646                                     if (dt.Is(kDataTypeValueInvalid)) {
   44647                                       UnallocatedA32(instr);
   44648                                       return;
   44649                                     }
   44650                                     unsigned rd =
   44651                                         ExtractDRegister(instr, 22, 12);
   44652                                     if ((instr & 1) != 0) {
   44653                                       UnallocatedA32(instr);
   44654                                       return;
   44655                                     }
   44656                                     unsigned rm = ExtractQRegister(instr, 5, 0);
   44657                                     uint32_t imm6 = (instr >> 16) & 0x3f;
   44658                                     uint32_t imm = dt.GetSize() - imm6;
   44659                                     // VSHRN{<c>}{<q>}.I<size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   44660                                     vshrn(al,
   44661                                           dt,
   44662                                           DRegister(rd),
   44663                                           QRegister(rm),
   44664                                           imm);
   44665                                     break;
   44666                                   }
   44667                                   case 0x01000000: {
   44668                                     // 0xf3980810
   44669                                     if (((instr & 0x380000) == 0x0)) {
   44670                                       UnallocatedA32(instr);
   44671                                       return;
   44672                                     }
   44673                                     DataType dt =
   44674                                         Dt_imm6_2_Decode((instr >> 19) & 0x7,
   44675                                                          (instr >> 24) & 0x1);
   44676                                     if (dt.Is(kDataTypeValueInvalid)) {
   44677                                       UnallocatedA32(instr);
   44678                                       return;
   44679                                     }
   44680                                     unsigned rd =
   44681                                         ExtractDRegister(instr, 22, 12);
   44682                                     if ((instr & 1) != 0) {
   44683                                       UnallocatedA32(instr);
   44684                                       return;
   44685                                     }
   44686                                     unsigned rm = ExtractQRegister(instr, 5, 0);
   44687                                     uint32_t imm6 = (instr >> 16) & 0x3f;
   44688                                     uint32_t imm = dt.GetSize() - imm6;
   44689                                     // VQSHRUN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   44690                                     vqshrun(al,
   44691                                             dt,
   44692                                             DRegister(rd),
   44693                                             QRegister(rm),
   44694                                             imm);
   44695                                     break;
   44696                                   }
   44697                                 }
   44698                                 break;
   44699                               }
   44700                               case 0x00000100: {
   44701                                 // 0xf2980910
   44702                                 if (((instr & 0x380000) == 0x0)) {
   44703                                   UnallocatedA32(instr);
   44704                                   return;
   44705                                 }
   44706                                 DataType dt =
   44707                                     Dt_imm6_1_Decode((instr >> 19) & 0x7,
   44708                                                      (instr >> 24) & 0x1);
   44709                                 if (dt.Is(kDataTypeValueInvalid)) {
   44710                                   UnallocatedA32(instr);
   44711                                   return;
   44712                                 }
   44713                                 unsigned rd = ExtractDRegister(instr, 22, 12);
   44714                                 if ((instr & 1) != 0) {
   44715                                   UnallocatedA32(instr);
   44716                                   return;
   44717                                 }
   44718                                 unsigned rm = ExtractQRegister(instr, 5, 0);
   44719                                 uint32_t imm6 = (instr >> 16) & 0x3f;
   44720                                 uint32_t imm = dt.GetSize() - imm6;
   44721                                 // VQSHRN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   44722                                 vqshrn(al,
   44723                                        dt,
   44724                                        DRegister(rd),
   44725                                        QRegister(rm),
   44726                                        imm);
   44727                                 break;
   44728                               }
   44729                               case 0x00000200: {
   44730                                 // 0xf2980a10
   44731                                 if (((instr & 0x380000) == 0x0) ||
   44732                                     ((instr & 0x3f0000) == 0x80000) ||
   44733                                     ((instr & 0x3f0000) == 0x100000) ||
   44734                                     ((instr & 0x3f0000) == 0x200000)) {
   44735                                   UnallocatedA32(instr);
   44736                                   return;
   44737                                 }
   44738                                 DataType dt =
   44739                                     Dt_imm6_4_Decode((instr >> 19) & 0x7,
   44740                                                      (instr >> 24) & 0x1);
   44741                                 if (dt.Is(kDataTypeValueInvalid)) {
   44742                                   UnallocatedA32(instr);
   44743                                   return;
   44744                                 }
   44745                                 if (((instr >> 12) & 1) != 0) {
   44746                                   UnallocatedA32(instr);
   44747                                   return;
   44748                                 }
   44749                                 unsigned rd = ExtractQRegister(instr, 22, 12);
   44750                                 unsigned rm = ExtractDRegister(instr, 5, 0);
   44751                                 uint32_t imm6 = (instr >> 16) & 0x3f;
   44752                                 uint32_t imm = imm6 - dt.GetSize();
   44753                                 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   44754                                 vshll(al,
   44755                                       dt,
   44756                                       QRegister(rd),
   44757                                       DRegister(rm),
   44758                                       imm);
   44759                                 break;
   44760                               }
   44761                               default:
   44762                                 UnallocatedA32(instr);
   44763                                 break;
   44764                             }
   44765                             break;
   44766                           }
   44767                           case 0x00280000: {
   44768                             // 0xf2a80810
   44769                             switch (instr & 0x00000300) {
   44770                               case 0x00000000: {
   44771                                 // 0xf2a80810
   44772                                 switch (instr & 0x01000000) {
   44773                                   case 0x00000000: {
   44774                                     // 0xf2a80810
   44775                                     if (((instr & 0x380000) == 0x0)) {
   44776                                       UnallocatedA32(instr);
   44777                                       return;
   44778                                     }
   44779                                     DataType dt =
   44780                                         Dt_imm6_3_Decode((instr >> 19) & 0x7);
   44781                                     if (dt.Is(kDataTypeValueInvalid)) {
   44782                                       UnallocatedA32(instr);
   44783                                       return;
   44784                                     }
   44785                                     unsigned rd =
   44786                                         ExtractDRegister(instr, 22, 12);
   44787                                     if ((instr & 1) != 0) {
   44788                                       UnallocatedA32(instr);
   44789                                       return;
   44790                                     }
   44791                                     unsigned rm = ExtractQRegister(instr, 5, 0);
   44792                                     uint32_t imm6 = (instr >> 16) & 0x3f;
   44793                                     uint32_t imm = dt.GetSize() - imm6;
   44794                                     // VSHRN{<c>}{<q>}.I<size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   44795                                     vshrn(al,
   44796                                           dt,
   44797                                           DRegister(rd),
   44798                                           QRegister(rm),
   44799                                           imm);
   44800                                     break;
   44801                                   }
   44802                                   case 0x01000000: {
   44803                                     // 0xf3a80810
   44804                                     if (((instr & 0x380000) == 0x0)) {
   44805                                       UnallocatedA32(instr);
   44806                                       return;
   44807                                     }
   44808                                     DataType dt =
   44809                                         Dt_imm6_2_Decode((instr >> 19) & 0x7,
   44810                                                          (instr >> 24) & 0x1);
   44811                                     if (dt.Is(kDataTypeValueInvalid)) {
   44812                                       UnallocatedA32(instr);
   44813                                       return;
   44814                                     }
   44815                                     unsigned rd =
   44816                                         ExtractDRegister(instr, 22, 12);
   44817                                     if ((instr & 1) != 0) {
   44818                                       UnallocatedA32(instr);
   44819                                       return;
   44820                                     }
   44821                                     unsigned rm = ExtractQRegister(instr, 5, 0);
   44822                                     uint32_t imm6 = (instr >> 16) & 0x3f;
   44823                                     uint32_t imm = dt.GetSize() - imm6;
   44824                                     // VQSHRUN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   44825                                     vqshrun(al,
   44826                                             dt,
   44827                                             DRegister(rd),
   44828                                             QRegister(rm),
   44829                                             imm);
   44830                                     break;
   44831                                   }
   44832                                 }
   44833                                 break;
   44834                               }
   44835                               case 0x00000100: {
   44836                                 // 0xf2a80910
   44837                                 if (((instr & 0x380000) == 0x0)) {
   44838                                   UnallocatedA32(instr);
   44839                                   return;
   44840                                 }
   44841                                 DataType dt =
   44842                                     Dt_imm6_1_Decode((instr >> 19) & 0x7,
   44843                                                      (instr >> 24) & 0x1);
   44844                                 if (dt.Is(kDataTypeValueInvalid)) {
   44845                                   UnallocatedA32(instr);
   44846                                   return;
   44847                                 }
   44848                                 unsigned rd = ExtractDRegister(instr, 22, 12);
   44849                                 if ((instr & 1) != 0) {
   44850                                   UnallocatedA32(instr);
   44851                                   return;
   44852                                 }
   44853                                 unsigned rm = ExtractQRegister(instr, 5, 0);
   44854                                 uint32_t imm6 = (instr >> 16) & 0x3f;
   44855                                 uint32_t imm = dt.GetSize() - imm6;
   44856                                 // VQSHRN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   44857                                 vqshrn(al,
   44858                                        dt,
   44859                                        DRegister(rd),
   44860                                        QRegister(rm),
   44861                                        imm);
   44862                                 break;
   44863                               }
   44864                               case 0x00000200: {
   44865                                 // 0xf2a80a10
   44866                                 if (((instr & 0x380000) == 0x0) ||
   44867                                     ((instr & 0x3f0000) == 0x80000) ||
   44868                                     ((instr & 0x3f0000) == 0x100000) ||
   44869                                     ((instr & 0x3f0000) == 0x200000)) {
   44870                                   UnallocatedA32(instr);
   44871                                   return;
   44872                                 }
   44873                                 DataType dt =
   44874                                     Dt_imm6_4_Decode((instr >> 19) & 0x7,
   44875                                                      (instr >> 24) & 0x1);
   44876                                 if (dt.Is(kDataTypeValueInvalid)) {
   44877                                   UnallocatedA32(instr);
   44878                                   return;
   44879                                 }
   44880                                 if (((instr >> 12) & 1) != 0) {
   44881                                   UnallocatedA32(instr);
   44882                                   return;
   44883                                 }
   44884                                 unsigned rd = ExtractQRegister(instr, 22, 12);
   44885                                 unsigned rm = ExtractDRegister(instr, 5, 0);
   44886                                 uint32_t imm6 = (instr >> 16) & 0x3f;
   44887                                 uint32_t imm = imm6 - dt.GetSize();
   44888                                 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   44889                                 vshll(al,
   44890                                       dt,
   44891                                       QRegister(rd),
   44892                                       DRegister(rm),
   44893                                       imm);
   44894                                 break;
   44895                               }
   44896                               default:
   44897                                 UnallocatedA32(instr);
   44898                                 break;
   44899                             }
   44900                             break;
   44901                           }
   44902                           case 0x00300000: {
   44903                             // 0xf2b00810
   44904                             switch (instr & 0x00000300) {
   44905                               case 0x00000000: {
   44906                                 // 0xf2b00810
   44907                                 switch (instr & 0x01000000) {
   44908                                   case 0x00000000: {
   44909                                     // 0xf2b00810
   44910                                     if (((instr & 0x380000) == 0x0)) {
   44911                                       UnallocatedA32(instr);
   44912                                       return;
   44913                                     }
   44914                                     DataType dt =
   44915                                         Dt_imm6_3_Decode((instr >> 19) & 0x7);
   44916                                     if (dt.Is(kDataTypeValueInvalid)) {
   44917                                       UnallocatedA32(instr);
   44918                                       return;
   44919                                     }
   44920                                     unsigned rd =
   44921                                         ExtractDRegister(instr, 22, 12);
   44922                                     if ((instr & 1) != 0) {
   44923                                       UnallocatedA32(instr);
   44924                                       return;
   44925                                     }
   44926                                     unsigned rm = ExtractQRegister(instr, 5, 0);
   44927                                     uint32_t imm6 = (instr >> 16) & 0x3f;
   44928                                     uint32_t imm = dt.GetSize() - imm6;
   44929                                     // VSHRN{<c>}{<q>}.I<size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   44930                                     vshrn(al,
   44931                                           dt,
   44932                                           DRegister(rd),
   44933                                           QRegister(rm),
   44934                                           imm);
   44935                                     break;
   44936                                   }
   44937                                   case 0x01000000: {
   44938                                     // 0xf3b00810
   44939                                     if (((instr & 0x380000) == 0x0)) {
   44940                                       UnallocatedA32(instr);
   44941                                       return;
   44942                                     }
   44943                                     DataType dt =
   44944                                         Dt_imm6_2_Decode((instr >> 19) & 0x7,
   44945                                                          (instr >> 24) & 0x1);
   44946                                     if (dt.Is(kDataTypeValueInvalid)) {
   44947                                       UnallocatedA32(instr);
   44948                                       return;
   44949                                     }
   44950                                     unsigned rd =
   44951                                         ExtractDRegister(instr, 22, 12);
   44952                                     if ((instr & 1) != 0) {
   44953                                       UnallocatedA32(instr);
   44954                                       return;
   44955                                     }
   44956                                     unsigned rm = ExtractQRegister(instr, 5, 0);
   44957                                     uint32_t imm6 = (instr >> 16) & 0x3f;
   44958                                     uint32_t imm = dt.GetSize() - imm6;
   44959                                     // VQSHRUN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   44960                                     vqshrun(al,
   44961                                             dt,
   44962                                             DRegister(rd),
   44963                                             QRegister(rm),
   44964                                             imm);
   44965                                     break;
   44966                                   }
   44967                                 }
   44968                                 break;
   44969                               }
   44970                               case 0x00000100: {
   44971                                 // 0xf2b00910
   44972                                 if (((instr & 0x380000) == 0x0)) {
   44973                                   UnallocatedA32(instr);
   44974                                   return;
   44975                                 }
   44976                                 DataType dt =
   44977                                     Dt_imm6_1_Decode((instr >> 19) & 0x7,
   44978                                                      (instr >> 24) & 0x1);
   44979                                 if (dt.Is(kDataTypeValueInvalid)) {
   44980                                   UnallocatedA32(instr);
   44981                                   return;
   44982                                 }
   44983                                 unsigned rd = ExtractDRegister(instr, 22, 12);
   44984                                 if ((instr & 1) != 0) {
   44985                                   UnallocatedA32(instr);
   44986                                   return;
   44987                                 }
   44988                                 unsigned rm = ExtractQRegister(instr, 5, 0);
   44989                                 uint32_t imm6 = (instr >> 16) & 0x3f;
   44990                                 uint32_t imm = dt.GetSize() - imm6;
   44991                                 // VQSHRN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   44992                                 vqshrn(al,
   44993                                        dt,
   44994                                        DRegister(rd),
   44995                                        QRegister(rm),
   44996                                        imm);
   44997                                 break;
   44998                               }
   44999                               case 0x00000200: {
   45000                                 // 0xf2b00a10
   45001                                 if (((instr & 0x380000) == 0x0) ||
   45002                                     ((instr & 0x3f0000) == 0x80000) ||
   45003                                     ((instr & 0x3f0000) == 0x100000) ||
   45004                                     ((instr & 0x3f0000) == 0x200000)) {
   45005                                   UnallocatedA32(instr);
   45006                                   return;
   45007                                 }
   45008                                 DataType dt =
   45009                                     Dt_imm6_4_Decode((instr >> 19) & 0x7,
   45010                                                      (instr >> 24) & 0x1);
   45011                                 if (dt.Is(kDataTypeValueInvalid)) {
   45012                                   UnallocatedA32(instr);
   45013                                   return;
   45014                                 }
   45015                                 if (((instr >> 12) & 1) != 0) {
   45016                                   UnallocatedA32(instr);
   45017                                   return;
   45018                                 }
   45019                                 unsigned rd = ExtractQRegister(instr, 22, 12);
   45020                                 unsigned rm = ExtractDRegister(instr, 5, 0);
   45021                                 uint32_t imm6 = (instr >> 16) & 0x3f;
   45022                                 uint32_t imm = imm6 - dt.GetSize();
   45023                                 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   45024                                 vshll(al,
   45025                                       dt,
   45026                                       QRegister(rd),
   45027                                       DRegister(rm),
   45028                                       imm);
   45029                                 break;
   45030                               }
   45031                               default:
   45032                                 UnallocatedA32(instr);
   45033                                 break;
   45034                             }
   45035                             break;
   45036                           }
   45037                           case 0x00380000: {
   45038                             // 0xf2b80810
   45039                             switch (instr & 0x00000300) {
   45040                               case 0x00000000: {
   45041                                 // 0xf2b80810
   45042                                 switch (instr & 0x01000000) {
   45043                                   case 0x00000000: {
   45044                                     // 0xf2b80810
   45045                                     if (((instr & 0x380000) == 0x0)) {
   45046                                       UnallocatedA32(instr);
   45047                                       return;
   45048                                     }
   45049                                     DataType dt =
   45050                                         Dt_imm6_3_Decode((instr >> 19) & 0x7);
   45051                                     if (dt.Is(kDataTypeValueInvalid)) {
   45052                                       UnallocatedA32(instr);
   45053                                       return;
   45054                                     }
   45055                                     unsigned rd =
   45056                                         ExtractDRegister(instr, 22, 12);
   45057                                     if ((instr & 1) != 0) {
   45058                                       UnallocatedA32(instr);
   45059                                       return;
   45060                                     }
   45061                                     unsigned rm = ExtractQRegister(instr, 5, 0);
   45062                                     uint32_t imm6 = (instr >> 16) & 0x3f;
   45063                                     uint32_t imm = dt.GetSize() - imm6;
   45064                                     // VSHRN{<c>}{<q>}.I<size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   45065                                     vshrn(al,
   45066                                           dt,
   45067                                           DRegister(rd),
   45068                                           QRegister(rm),
   45069                                           imm);
   45070                                     break;
   45071                                   }
   45072                                   case 0x01000000: {
   45073                                     // 0xf3b80810
   45074                                     if (((instr & 0x380000) == 0x0)) {
   45075                                       UnallocatedA32(instr);
   45076                                       return;
   45077                                     }
   45078                                     DataType dt =
   45079                                         Dt_imm6_2_Decode((instr >> 19) & 0x7,
   45080                                                          (instr >> 24) & 0x1);
   45081                                     if (dt.Is(kDataTypeValueInvalid)) {
   45082                                       UnallocatedA32(instr);
   45083                                       return;
   45084                                     }
   45085                                     unsigned rd =
   45086                                         ExtractDRegister(instr, 22, 12);
   45087                                     if ((instr & 1) != 0) {
   45088                                       UnallocatedA32(instr);
   45089                                       return;
   45090                                     }
   45091                                     unsigned rm = ExtractQRegister(instr, 5, 0);
   45092                                     uint32_t imm6 = (instr >> 16) & 0x3f;
   45093                                     uint32_t imm = dt.GetSize() - imm6;
   45094                                     // VQSHRUN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   45095                                     vqshrun(al,
   45096                                             dt,
   45097                                             DRegister(rd),
   45098                                             QRegister(rm),
   45099                                             imm);
   45100                                     break;
   45101                                   }
   45102                                 }
   45103                                 break;
   45104                               }
   45105                               case 0x00000100: {
   45106                                 // 0xf2b80910
   45107                                 if (((instr & 0x380000) == 0x0)) {
   45108                                   UnallocatedA32(instr);
   45109                                   return;
   45110                                 }
   45111                                 DataType dt =
   45112                                     Dt_imm6_1_Decode((instr >> 19) & 0x7,
   45113                                                      (instr >> 24) & 0x1);
   45114                                 if (dt.Is(kDataTypeValueInvalid)) {
   45115                                   UnallocatedA32(instr);
   45116                                   return;
   45117                                 }
   45118                                 unsigned rd = ExtractDRegister(instr, 22, 12);
   45119                                 if ((instr & 1) != 0) {
   45120                                   UnallocatedA32(instr);
   45121                                   return;
   45122                                 }
   45123                                 unsigned rm = ExtractQRegister(instr, 5, 0);
   45124                                 uint32_t imm6 = (instr >> 16) & 0x3f;
   45125                                 uint32_t imm = dt.GetSize() - imm6;
   45126                                 // VQSHRN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   45127                                 vqshrn(al,
   45128                                        dt,
   45129                                        DRegister(rd),
   45130                                        QRegister(rm),
   45131                                        imm);
   45132                                 break;
   45133                               }
   45134                               case 0x00000200: {
   45135                                 // 0xf2b80a10
   45136                                 if (((instr & 0x380000) == 0x0) ||
   45137                                     ((instr & 0x3f0000) == 0x80000) ||
   45138                                     ((instr & 0x3f0000) == 0x100000) ||
   45139                                     ((instr & 0x3f0000) == 0x200000)) {
   45140                                   UnallocatedA32(instr);
   45141                                   return;
   45142                                 }
   45143                                 DataType dt =
   45144                                     Dt_imm6_4_Decode((instr >> 19) & 0x7,
   45145                                                      (instr >> 24) & 0x1);
   45146                                 if (dt.Is(kDataTypeValueInvalid)) {
   45147                                   UnallocatedA32(instr);
   45148                                   return;
   45149                                 }
   45150                                 if (((instr >> 12) & 1) != 0) {
   45151                                   UnallocatedA32(instr);
   45152                                   return;
   45153                                 }
   45154                                 unsigned rd = ExtractQRegister(instr, 22, 12);
   45155                                 unsigned rm = ExtractDRegister(instr, 5, 0);
   45156                                 uint32_t imm6 = (instr >> 16) & 0x3f;
   45157                                 uint32_t imm = imm6 - dt.GetSize();
   45158                                 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   45159                                 vshll(al,
   45160                                       dt,
   45161                                       QRegister(rd),
   45162                                       DRegister(rm),
   45163                                       imm);
   45164                                 break;
   45165                               }
   45166                               default:
   45167                                 UnallocatedA32(instr);
   45168                                 break;
   45169                             }
   45170                             break;
   45171                           }
   45172                           default: {
   45173                             switch (instr & 0x00000300) {
   45174                               case 0x00000000: {
   45175                                 // 0xf2800810
   45176                                 switch (instr & 0x01000000) {
   45177                                   case 0x00000000: {
   45178                                     // 0xf2800810
   45179                                     if (((instr & 0x380000) == 0x0)) {
   45180                                       UnallocatedA32(instr);
   45181                                       return;
   45182                                     }
   45183                                     DataType dt =
   45184                                         Dt_imm6_3_Decode((instr >> 19) & 0x7);
   45185                                     if (dt.Is(kDataTypeValueInvalid)) {
   45186                                       UnallocatedA32(instr);
   45187                                       return;
   45188                                     }
   45189                                     unsigned rd =
   45190                                         ExtractDRegister(instr, 22, 12);
   45191                                     if ((instr & 1) != 0) {
   45192                                       UnallocatedA32(instr);
   45193                                       return;
   45194                                     }
   45195                                     unsigned rm = ExtractQRegister(instr, 5, 0);
   45196                                     uint32_t imm6 = (instr >> 16) & 0x3f;
   45197                                     uint32_t imm = dt.GetSize() - imm6;
   45198                                     // VSHRN{<c>}{<q>}.I<size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   45199                                     vshrn(al,
   45200                                           dt,
   45201                                           DRegister(rd),
   45202                                           QRegister(rm),
   45203                                           imm);
   45204                                     break;
   45205                                   }
   45206                                   case 0x01000000: {
   45207                                     // 0xf3800810
   45208                                     if (((instr & 0x380000) == 0x0)) {
   45209                                       UnallocatedA32(instr);
   45210                                       return;
   45211                                     }
   45212                                     DataType dt =
   45213                                         Dt_imm6_2_Decode((instr >> 19) & 0x7,
   45214                                                          (instr >> 24) & 0x1);
   45215                                     if (dt.Is(kDataTypeValueInvalid)) {
   45216                                       UnallocatedA32(instr);
   45217                                       return;
   45218                                     }
   45219                                     unsigned rd =
   45220                                         ExtractDRegister(instr, 22, 12);
   45221                                     if ((instr & 1) != 0) {
   45222                                       UnallocatedA32(instr);
   45223                                       return;
   45224                                     }
   45225                                     unsigned rm = ExtractQRegister(instr, 5, 0);
   45226                                     uint32_t imm6 = (instr >> 16) & 0x3f;
   45227                                     uint32_t imm = dt.GetSize() - imm6;
   45228                                     // VQSHRUN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   45229                                     vqshrun(al,
   45230                                             dt,
   45231                                             DRegister(rd),
   45232                                             QRegister(rm),
   45233                                             imm);
   45234                                     break;
   45235                                   }
   45236                                 }
   45237                                 break;
   45238                               }
   45239                               case 0x00000100: {
   45240                                 // 0xf2800910
   45241                                 if (((instr & 0x380000) == 0x0)) {
   45242                                   UnallocatedA32(instr);
   45243                                   return;
   45244                                 }
   45245                                 DataType dt =
   45246                                     Dt_imm6_1_Decode((instr >> 19) & 0x7,
   45247                                                      (instr >> 24) & 0x1);
   45248                                 if (dt.Is(kDataTypeValueInvalid)) {
   45249                                   UnallocatedA32(instr);
   45250                                   return;
   45251                                 }
   45252                                 unsigned rd = ExtractDRegister(instr, 22, 12);
   45253                                 if ((instr & 1) != 0) {
   45254                                   UnallocatedA32(instr);
   45255                                   return;
   45256                                 }
   45257                                 unsigned rm = ExtractQRegister(instr, 5, 0);
   45258                                 uint32_t imm6 = (instr >> 16) & 0x3f;
   45259                                 uint32_t imm = dt.GetSize() - imm6;
   45260                                 // VQSHRN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   45261                                 vqshrn(al,
   45262                                        dt,
   45263                                        DRegister(rd),
   45264                                        QRegister(rm),
   45265                                        imm);
   45266                                 break;
   45267                               }
   45268                               case 0x00000200: {
   45269                                 // 0xf2800a10
   45270                                 switch (instr & 0x00070000) {
   45271                                   case 0x00000000: {
   45272                                     // 0xf2800a10
   45273                                     switch (instr & 0x003f0000) {
   45274                                       case 0x00080000: {
   45275                                         // 0xf2880a10
   45276                                         if (((instr & 0x380000) == 0x0) ||
   45277                                             ((instr & 0x380000) == 0x180000) ||
   45278                                             ((instr & 0x380000) == 0x280000) ||
   45279                                             ((instr & 0x380000) == 0x300000) ||
   45280                                             ((instr & 0x380000) == 0x380000)) {
   45281                                           UnallocatedA32(instr);
   45282                                           return;
   45283                                         }
   45284                                         DataType dt = Dt_U_imm3H_1_Decode(
   45285                                             ((instr >> 19) & 0x7) |
   45286                                             ((instr >> 21) & 0x8));
   45287                                         if (dt.Is(kDataTypeValueInvalid)) {
   45288                                           UnallocatedA32(instr);
   45289                                           return;
   45290                                         }
   45291                                         if (((instr >> 12) & 1) != 0) {
   45292                                           UnallocatedA32(instr);
   45293                                           return;
   45294                                         }
   45295                                         unsigned rd =
   45296                                             ExtractQRegister(instr, 22, 12);
   45297                                         unsigned rm =
   45298                                             ExtractDRegister(instr, 5, 0);
   45299                                         // VMOVL{<c>}{<q>}.<dt> <Qd>, <Dm> ; A1
   45300                                         vmovl(al,
   45301                                               dt,
   45302                                               QRegister(rd),
   45303                                               DRegister(rm));
   45304                                         break;
   45305                                       }
   45306                                       case 0x00090000: {
   45307                                         // 0xf2890a10
   45308                                         if (((instr & 0x380000) == 0x0) ||
   45309                                             ((instr & 0x3f0000) == 0x80000) ||
   45310                                             ((instr & 0x3f0000) == 0x100000) ||
   45311                                             ((instr & 0x3f0000) == 0x200000)) {
   45312                                           UnallocatedA32(instr);
   45313                                           return;
   45314                                         }
   45315                                         DataType dt =
   45316                                             Dt_imm6_4_Decode((instr >> 19) &
   45317                                                                  0x7,
   45318                                                              (instr >> 24) &
   45319                                                                  0x1);
   45320                                         if (dt.Is(kDataTypeValueInvalid)) {
   45321                                           UnallocatedA32(instr);
   45322                                           return;
   45323                                         }
   45324                                         if (((instr >> 12) & 1) != 0) {
   45325                                           UnallocatedA32(instr);
   45326                                           return;
   45327                                         }
   45328                                         unsigned rd =
   45329                                             ExtractQRegister(instr, 22, 12);
   45330                                         unsigned rm =
   45331                                             ExtractDRegister(instr, 5, 0);
   45332                                         uint32_t imm6 = (instr >> 16) & 0x3f;
   45333                                         uint32_t imm = imm6 - dt.GetSize();
   45334                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   45335                                         vshll(al,
   45336                                               dt,
   45337                                               QRegister(rd),
   45338                                               DRegister(rm),
   45339                                               imm);
   45340                                         break;
   45341                                       }
   45342                                       case 0x000a0000: {
   45343                                         // 0xf28a0a10
   45344                                         if (((instr & 0x380000) == 0x0) ||
   45345                                             ((instr & 0x3f0000) == 0x80000) ||
   45346                                             ((instr & 0x3f0000) == 0x100000) ||
   45347                                             ((instr & 0x3f0000) == 0x200000)) {
   45348                                           UnallocatedA32(instr);
   45349                                           return;
   45350                                         }
   45351                                         DataType dt =
   45352                                             Dt_imm6_4_Decode((instr >> 19) &
   45353                                                                  0x7,
   45354                                                              (instr >> 24) &
   45355                                                                  0x1);
   45356                                         if (dt.Is(kDataTypeValueInvalid)) {
   45357                                           UnallocatedA32(instr);
   45358                                           return;
   45359                                         }
   45360                                         if (((instr >> 12) & 1) != 0) {
   45361                                           UnallocatedA32(instr);
   45362                                           return;
   45363                                         }
   45364                                         unsigned rd =
   45365                                             ExtractQRegister(instr, 22, 12);
   45366                                         unsigned rm =
   45367                                             ExtractDRegister(instr, 5, 0);
   45368                                         uint32_t imm6 = (instr >> 16) & 0x3f;
   45369                                         uint32_t imm = imm6 - dt.GetSize();
   45370                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   45371                                         vshll(al,
   45372                                               dt,
   45373                                               QRegister(rd),
   45374                                               DRegister(rm),
   45375                                               imm);
   45376                                         break;
   45377                                       }
   45378                                       case 0x000b0000: {
   45379                                         // 0xf28b0a10
   45380                                         if (((instr & 0x380000) == 0x0) ||
   45381                                             ((instr & 0x3f0000) == 0x80000) ||
   45382                                             ((instr & 0x3f0000) == 0x100000) ||
   45383                                             ((instr & 0x3f0000) == 0x200000)) {
   45384                                           UnallocatedA32(instr);
   45385                                           return;
   45386                                         }
   45387                                         DataType dt =
   45388                                             Dt_imm6_4_Decode((instr >> 19) &
   45389                                                                  0x7,
   45390                                                              (instr >> 24) &
   45391                                                                  0x1);
   45392                                         if (dt.Is(kDataTypeValueInvalid)) {
   45393                                           UnallocatedA32(instr);
   45394                                           return;
   45395                                         }
   45396                                         if (((instr >> 12) & 1) != 0) {
   45397                                           UnallocatedA32(instr);
   45398                                           return;
   45399                                         }
   45400                                         unsigned rd =
   45401                                             ExtractQRegister(instr, 22, 12);
   45402                                         unsigned rm =
   45403                                             ExtractDRegister(instr, 5, 0);
   45404                                         uint32_t imm6 = (instr >> 16) & 0x3f;
   45405                                         uint32_t imm = imm6 - dt.GetSize();
   45406                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   45407                                         vshll(al,
   45408                                               dt,
   45409                                               QRegister(rd),
   45410                                               DRegister(rm),
   45411                                               imm);
   45412                                         break;
   45413                                       }
   45414                                       case 0x000c0000: {
   45415                                         // 0xf28c0a10
   45416                                         if (((instr & 0x380000) == 0x0) ||
   45417                                             ((instr & 0x3f0000) == 0x80000) ||
   45418                                             ((instr & 0x3f0000) == 0x100000) ||
   45419                                             ((instr & 0x3f0000) == 0x200000)) {
   45420                                           UnallocatedA32(instr);
   45421                                           return;
   45422                                         }
   45423                                         DataType dt =
   45424                                             Dt_imm6_4_Decode((instr >> 19) &
   45425                                                                  0x7,
   45426                                                              (instr >> 24) &
   45427                                                                  0x1);
   45428                                         if (dt.Is(kDataTypeValueInvalid)) {
   45429                                           UnallocatedA32(instr);
   45430                                           return;
   45431                                         }
   45432                                         if (((instr >> 12) & 1) != 0) {
   45433                                           UnallocatedA32(instr);
   45434                                           return;
   45435                                         }
   45436                                         unsigned rd =
   45437                                             ExtractQRegister(instr, 22, 12);
   45438                                         unsigned rm =
   45439                                             ExtractDRegister(instr, 5, 0);
   45440                                         uint32_t imm6 = (instr >> 16) & 0x3f;
   45441                                         uint32_t imm = imm6 - dt.GetSize();
   45442                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   45443                                         vshll(al,
   45444                                               dt,
   45445                                               QRegister(rd),
   45446                                               DRegister(rm),
   45447                                               imm);
   45448                                         break;
   45449                                       }
   45450                                       case 0x000d0000: {
   45451                                         // 0xf28d0a10
   45452                                         if (((instr & 0x380000) == 0x0) ||
   45453                                             ((instr & 0x3f0000) == 0x80000) ||
   45454                                             ((instr & 0x3f0000) == 0x100000) ||
   45455                                             ((instr & 0x3f0000) == 0x200000)) {
   45456                                           UnallocatedA32(instr);
   45457                                           return;
   45458                                         }
   45459                                         DataType dt =
   45460                                             Dt_imm6_4_Decode((instr >> 19) &
   45461                                                                  0x7,
   45462                                                              (instr >> 24) &
   45463                                                                  0x1);
   45464                                         if (dt.Is(kDataTypeValueInvalid)) {
   45465                                           UnallocatedA32(instr);
   45466                                           return;
   45467                                         }
   45468                                         if (((instr >> 12) & 1) != 0) {
   45469                                           UnallocatedA32(instr);
   45470                                           return;
   45471                                         }
   45472                                         unsigned rd =
   45473                                             ExtractQRegister(instr, 22, 12);
   45474                                         unsigned rm =
   45475                                             ExtractDRegister(instr, 5, 0);
   45476                                         uint32_t imm6 = (instr >> 16) & 0x3f;
   45477                                         uint32_t imm = imm6 - dt.GetSize();
   45478                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   45479                                         vshll(al,
   45480                                               dt,
   45481                                               QRegister(rd),
   45482                                               DRegister(rm),
   45483                                               imm);
   45484                                         break;
   45485                                       }
   45486                                       case 0x000e0000: {
   45487                                         // 0xf28e0a10
   45488                                         if (((instr & 0x380000) == 0x0) ||
   45489                                             ((instr & 0x3f0000) == 0x80000) ||
   45490                                             ((instr & 0x3f0000) == 0x100000) ||
   45491                                             ((instr & 0x3f0000) == 0x200000)) {
   45492                                           UnallocatedA32(instr);
   45493                                           return;
   45494                                         }
   45495                                         DataType dt =
   45496                                             Dt_imm6_4_Decode((instr >> 19) &
   45497                                                                  0x7,
   45498                                                              (instr >> 24) &
   45499                                                                  0x1);
   45500                                         if (dt.Is(kDataTypeValueInvalid)) {
   45501                                           UnallocatedA32(instr);
   45502                                           return;
   45503                                         }
   45504                                         if (((instr >> 12) & 1) != 0) {
   45505                                           UnallocatedA32(instr);
   45506                                           return;
   45507                                         }
   45508                                         unsigned rd =
   45509                                             ExtractQRegister(instr, 22, 12);
   45510                                         unsigned rm =
   45511                                             ExtractDRegister(instr, 5, 0);
   45512                                         uint32_t imm6 = (instr >> 16) & 0x3f;
   45513                                         uint32_t imm = imm6 - dt.GetSize();
   45514                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   45515                                         vshll(al,
   45516                                               dt,
   45517                                               QRegister(rd),
   45518                                               DRegister(rm),
   45519                                               imm);
   45520                                         break;
   45521                                       }
   45522                                       case 0x000f0000: {
   45523                                         // 0xf28f0a10
   45524                                         if (((instr & 0x380000) == 0x0) ||
   45525                                             ((instr & 0x3f0000) == 0x80000) ||
   45526                                             ((instr & 0x3f0000) == 0x100000) ||
   45527                                             ((instr & 0x3f0000) == 0x200000)) {
   45528                                           UnallocatedA32(instr);
   45529                                           return;
   45530                                         }
   45531                                         DataType dt =
   45532                                             Dt_imm6_4_Decode((instr >> 19) &
   45533                                                                  0x7,
   45534                                                              (instr >> 24) &
   45535                                                                  0x1);
   45536                                         if (dt.Is(kDataTypeValueInvalid)) {
   45537                                           UnallocatedA32(instr);
   45538                                           return;
   45539                                         }
   45540                                         if (((instr >> 12) & 1) != 0) {
   45541                                           UnallocatedA32(instr);
   45542                                           return;
   45543                                         }
   45544                                         unsigned rd =
   45545                                             ExtractQRegister(instr, 22, 12);
   45546                                         unsigned rm =
   45547                                             ExtractDRegister(instr, 5, 0);
   45548                                         uint32_t imm6 = (instr >> 16) & 0x3f;
   45549                                         uint32_t imm = imm6 - dt.GetSize();
   45550                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   45551                                         vshll(al,
   45552                                               dt,
   45553                                               QRegister(rd),
   45554                                               DRegister(rm),
   45555                                               imm);
   45556                                         break;
   45557                                       }
   45558                                       case 0x00100000: {
   45559                                         // 0xf2900a10
   45560                                         if (((instr & 0x380000) == 0x0) ||
   45561                                             ((instr & 0x380000) == 0x180000) ||
   45562                                             ((instr & 0x380000) == 0x280000) ||
   45563                                             ((instr & 0x380000) == 0x300000) ||
   45564                                             ((instr & 0x380000) == 0x380000)) {
   45565                                           UnallocatedA32(instr);
   45566                                           return;
   45567                                         }
   45568                                         DataType dt = Dt_U_imm3H_1_Decode(
   45569                                             ((instr >> 19) & 0x7) |
   45570                                             ((instr >> 21) & 0x8));
   45571                                         if (dt.Is(kDataTypeValueInvalid)) {
   45572                                           UnallocatedA32(instr);
   45573                                           return;
   45574                                         }
   45575                                         if (((instr >> 12) & 1) != 0) {
   45576                                           UnallocatedA32(instr);
   45577                                           return;
   45578                                         }
   45579                                         unsigned rd =
   45580                                             ExtractQRegister(instr, 22, 12);
   45581                                         unsigned rm =
   45582                                             ExtractDRegister(instr, 5, 0);
   45583                                         // VMOVL{<c>}{<q>}.<dt> <Qd>, <Dm> ; A1
   45584                                         vmovl(al,
   45585                                               dt,
   45586                                               QRegister(rd),
   45587                                               DRegister(rm));
   45588                                         break;
   45589                                       }
   45590                                       case 0x00110000: {
   45591                                         // 0xf2910a10
   45592                                         if (((instr & 0x380000) == 0x0) ||
   45593                                             ((instr & 0x3f0000) == 0x80000) ||
   45594                                             ((instr & 0x3f0000) == 0x100000) ||
   45595                                             ((instr & 0x3f0000) == 0x200000)) {
   45596                                           UnallocatedA32(instr);
   45597                                           return;
   45598                                         }
   45599                                         DataType dt =
   45600                                             Dt_imm6_4_Decode((instr >> 19) &
   45601                                                                  0x7,
   45602                                                              (instr >> 24) &
   45603                                                                  0x1);
   45604                                         if (dt.Is(kDataTypeValueInvalid)) {
   45605                                           UnallocatedA32(instr);
   45606                                           return;
   45607                                         }
   45608                                         if (((instr >> 12) & 1) != 0) {
   45609                                           UnallocatedA32(instr);
   45610                                           return;
   45611                                         }
   45612                                         unsigned rd =
   45613                                             ExtractQRegister(instr, 22, 12);
   45614                                         unsigned rm =
   45615                                             ExtractDRegister(instr, 5, 0);
   45616                                         uint32_t imm6 = (instr >> 16) & 0x3f;
   45617                                         uint32_t imm = imm6 - dt.GetSize();
   45618                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   45619                                         vshll(al,
   45620                                               dt,
   45621                                               QRegister(rd),
   45622                                               DRegister(rm),
   45623                                               imm);
   45624                                         break;
   45625                                       }
   45626                                       case 0x00120000: {
   45627                                         // 0xf2920a10
   45628                                         if (((instr & 0x380000) == 0x0) ||
   45629                                             ((instr & 0x3f0000) == 0x80000) ||
   45630                                             ((instr & 0x3f0000) == 0x100000) ||
   45631                                             ((instr & 0x3f0000) == 0x200000)) {
   45632                                           UnallocatedA32(instr);
   45633                                           return;
   45634                                         }
   45635                                         DataType dt =
   45636                                             Dt_imm6_4_Decode((instr >> 19) &
   45637                                                                  0x7,
   45638                                                              (instr >> 24) &
   45639                                                                  0x1);
   45640                                         if (dt.Is(kDataTypeValueInvalid)) {
   45641                                           UnallocatedA32(instr);
   45642                                           return;
   45643                                         }
   45644                                         if (((instr >> 12) & 1) != 0) {
   45645                                           UnallocatedA32(instr);
   45646                                           return;
   45647                                         }
   45648                                         unsigned rd =
   45649                                             ExtractQRegister(instr, 22, 12);
   45650                                         unsigned rm =
   45651                                             ExtractDRegister(instr, 5, 0);
   45652                                         uint32_t imm6 = (instr >> 16) & 0x3f;
   45653                                         uint32_t imm = imm6 - dt.GetSize();
   45654                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   45655                                         vshll(al,
   45656                                               dt,
   45657                                               QRegister(rd),
   45658                                               DRegister(rm),
   45659                                               imm);
   45660                                         break;
   45661                                       }
   45662                                       case 0x00130000: {
   45663                                         // 0xf2930a10
   45664                                         if (((instr & 0x380000) == 0x0) ||
   45665                                             ((instr & 0x3f0000) == 0x80000) ||
   45666                                             ((instr & 0x3f0000) == 0x100000) ||
   45667                                             ((instr & 0x3f0000) == 0x200000)) {
   45668                                           UnallocatedA32(instr);
   45669                                           return;
   45670                                         }
   45671                                         DataType dt =
   45672                                             Dt_imm6_4_Decode((instr >> 19) &
   45673                                                                  0x7,
   45674                                                              (instr >> 24) &
   45675                                                                  0x1);
   45676                                         if (dt.Is(kDataTypeValueInvalid)) {
   45677                                           UnallocatedA32(instr);
   45678                                           return;
   45679                                         }
   45680                                         if (((instr >> 12) & 1) != 0) {
   45681                                           UnallocatedA32(instr);
   45682                                           return;
   45683                                         }
   45684                                         unsigned rd =
   45685                                             ExtractQRegister(instr, 22, 12);
   45686                                         unsigned rm =
   45687                                             ExtractDRegister(instr, 5, 0);
   45688                                         uint32_t imm6 = (instr >> 16) & 0x3f;
   45689                                         uint32_t imm = imm6 - dt.GetSize();
   45690                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   45691                                         vshll(al,
   45692                                               dt,
   45693                                               QRegister(rd),
   45694                                               DRegister(rm),
   45695                                               imm);
   45696                                         break;
   45697                                       }
   45698                                       case 0x00140000: {
   45699                                         // 0xf2940a10
   45700                                         if (((instr & 0x380000) == 0x0) ||
   45701                                             ((instr & 0x3f0000) == 0x80000) ||
   45702                                             ((instr & 0x3f0000) == 0x100000) ||
   45703                                             ((instr & 0x3f0000) == 0x200000)) {
   45704                                           UnallocatedA32(instr);
   45705                                           return;
   45706                                         }
   45707                                         DataType dt =
   45708                                             Dt_imm6_4_Decode((instr >> 19) &
   45709                                                                  0x7,
   45710                                                              (instr >> 24) &
   45711                                                                  0x1);
   45712                                         if (dt.Is(kDataTypeValueInvalid)) {
   45713                                           UnallocatedA32(instr);
   45714                                           return;
   45715                                         }
   45716                                         if (((instr >> 12) & 1) != 0) {
   45717                                           UnallocatedA32(instr);
   45718                                           return;
   45719                                         }
   45720                                         unsigned rd =
   45721                                             ExtractQRegister(instr, 22, 12);
   45722                                         unsigned rm =
   45723                                             ExtractDRegister(instr, 5, 0);
   45724                                         uint32_t imm6 = (instr >> 16) & 0x3f;
   45725                                         uint32_t imm = imm6 - dt.GetSize();
   45726                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   45727                                         vshll(al,
   45728                                               dt,
   45729                                               QRegister(rd),
   45730                                               DRegister(rm),
   45731                                               imm);
   45732                                         break;
   45733                                       }
   45734                                       case 0x00150000: {
   45735                                         // 0xf2950a10
   45736                                         if (((instr & 0x380000) == 0x0) ||
   45737                                             ((instr & 0x3f0000) == 0x80000) ||
   45738                                             ((instr & 0x3f0000) == 0x100000) ||
   45739                                             ((instr & 0x3f0000) == 0x200000)) {
   45740                                           UnallocatedA32(instr);
   45741                                           return;
   45742                                         }
   45743                                         DataType dt =
   45744                                             Dt_imm6_4_Decode((instr >> 19) &
   45745                                                                  0x7,
   45746                                                              (instr >> 24) &
   45747                                                                  0x1);
   45748                                         if (dt.Is(kDataTypeValueInvalid)) {
   45749                                           UnallocatedA32(instr);
   45750                                           return;
   45751                                         }
   45752                                         if (((instr >> 12) & 1) != 0) {
   45753                                           UnallocatedA32(instr);
   45754                                           return;
   45755                                         }
   45756                                         unsigned rd =
   45757                                             ExtractQRegister(instr, 22, 12);
   45758                                         unsigned rm =
   45759                                             ExtractDRegister(instr, 5, 0);
   45760                                         uint32_t imm6 = (instr >> 16) & 0x3f;
   45761                                         uint32_t imm = imm6 - dt.GetSize();
   45762                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   45763                                         vshll(al,
   45764                                               dt,
   45765                                               QRegister(rd),
   45766                                               DRegister(rm),
   45767                                               imm);
   45768                                         break;
   45769                                       }
   45770                                       case 0x00160000: {
   45771                                         // 0xf2960a10
   45772                                         if (((instr & 0x380000) == 0x0) ||
   45773                                             ((instr & 0x3f0000) == 0x80000) ||
   45774                                             ((instr & 0x3f0000) == 0x100000) ||
   45775                                             ((instr & 0x3f0000) == 0x200000)) {
   45776                                           UnallocatedA32(instr);
   45777                                           return;
   45778                                         }
   45779                                         DataType dt =
   45780                                             Dt_imm6_4_Decode((instr >> 19) &
   45781                                                                  0x7,
   45782                                                              (instr >> 24) &
   45783                                                                  0x1);
   45784                                         if (dt.Is(kDataTypeValueInvalid)) {
   45785                                           UnallocatedA32(instr);
   45786                                           return;
   45787                                         }
   45788                                         if (((instr >> 12) & 1) != 0) {
   45789                                           UnallocatedA32(instr);
   45790                                           return;
   45791                                         }
   45792                                         unsigned rd =
   45793                                             ExtractQRegister(instr, 22, 12);
   45794                                         unsigned rm =
   45795                                             ExtractDRegister(instr, 5, 0);
   45796                                         uint32_t imm6 = (instr >> 16) & 0x3f;
   45797                                         uint32_t imm = imm6 - dt.GetSize();
   45798                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   45799                                         vshll(al,
   45800                                               dt,
   45801                                               QRegister(rd),
   45802                                               DRegister(rm),
   45803                                               imm);
   45804                                         break;
   45805                                       }
   45806                                       case 0x00170000: {
   45807                                         // 0xf2970a10
   45808                                         if (((instr & 0x380000) == 0x0) ||
   45809                                             ((instr & 0x3f0000) == 0x80000) ||
   45810                                             ((instr & 0x3f0000) == 0x100000) ||
   45811                                             ((instr & 0x3f0000) == 0x200000)) {
   45812                                           UnallocatedA32(instr);
   45813                                           return;
   45814                                         }
   45815                                         DataType dt =
   45816                                             Dt_imm6_4_Decode((instr >> 19) &
   45817                                                                  0x7,
   45818                                                              (instr >> 24) &
   45819                                                                  0x1);
   45820                                         if (dt.Is(kDataTypeValueInvalid)) {
   45821                                           UnallocatedA32(instr);
   45822                                           return;
   45823                                         }
   45824                                         if (((instr >> 12) & 1) != 0) {
   45825                                           UnallocatedA32(instr);
   45826                                           return;
   45827                                         }
   45828                                         unsigned rd =
   45829                                             ExtractQRegister(instr, 22, 12);
   45830                                         unsigned rm =
   45831                                             ExtractDRegister(instr, 5, 0);
   45832                                         uint32_t imm6 = (instr >> 16) & 0x3f;
   45833                                         uint32_t imm = imm6 - dt.GetSize();
   45834                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   45835                                         vshll(al,
   45836                                               dt,
   45837                                               QRegister(rd),
   45838                                               DRegister(rm),
   45839                                               imm);
   45840                                         break;
   45841                                       }
   45842                                       case 0x00180000: {
   45843                                         // 0xf2980a10
   45844                                         if (((instr & 0x380000) == 0x0) ||
   45845                                             ((instr & 0x3f0000) == 0x80000) ||
   45846                                             ((instr & 0x3f0000) == 0x100000) ||
   45847                                             ((instr & 0x3f0000) == 0x200000)) {
   45848                                           UnallocatedA32(instr);
   45849                                           return;
   45850                                         }
   45851                                         DataType dt =
   45852                                             Dt_imm6_4_Decode((instr >> 19) &
   45853                                                                  0x7,
   45854                                                              (instr >> 24) &
   45855                                                                  0x1);
   45856                                         if (dt.Is(kDataTypeValueInvalid)) {
   45857                                           UnallocatedA32(instr);
   45858                                           return;
   45859                                         }
   45860                                         if (((instr >> 12) & 1) != 0) {
   45861                                           UnallocatedA32(instr);
   45862                                           return;
   45863                                         }
   45864                                         unsigned rd =
   45865                                             ExtractQRegister(instr, 22, 12);
   45866                                         unsigned rm =
   45867                                             ExtractDRegister(instr, 5, 0);
   45868                                         uint32_t imm6 = (instr >> 16) & 0x3f;
   45869                                         uint32_t imm = imm6 - dt.GetSize();
   45870                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   45871                                         vshll(al,
   45872                                               dt,
   45873                                               QRegister(rd),
   45874                                               DRegister(rm),
   45875                                               imm);
   45876                                         break;
   45877                                       }
   45878                                       case 0x00190000: {
   45879                                         // 0xf2990a10
   45880                                         if (((instr & 0x380000) == 0x0) ||
   45881                                             ((instr & 0x3f0000) == 0x80000) ||
   45882                                             ((instr & 0x3f0000) == 0x100000) ||
   45883                                             ((instr & 0x3f0000) == 0x200000)) {
   45884                                           UnallocatedA32(instr);
   45885                                           return;
   45886                                         }
   45887                                         DataType dt =
   45888                                             Dt_imm6_4_Decode((instr >> 19) &
   45889                                                                  0x7,
   45890                                                              (instr >> 24) &
   45891                                                                  0x1);
   45892                                         if (dt.Is(kDataTypeValueInvalid)) {
   45893                                           UnallocatedA32(instr);
   45894                                           return;
   45895                                         }
   45896                                         if (((instr >> 12) & 1) != 0) {
   45897                                           UnallocatedA32(instr);
   45898                                           return;
   45899                                         }
   45900                                         unsigned rd =
   45901                                             ExtractQRegister(instr, 22, 12);
   45902                                         unsigned rm =
   45903                                             ExtractDRegister(instr, 5, 0);
   45904                                         uint32_t imm6 = (instr >> 16) & 0x3f;
   45905                                         uint32_t imm = imm6 - dt.GetSize();
   45906                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   45907                                         vshll(al,
   45908                                               dt,
   45909                                               QRegister(rd),
   45910                                               DRegister(rm),
   45911                                               imm);
   45912                                         break;
   45913                                       }
   45914                                       case 0x001a0000: {
   45915                                         // 0xf29a0a10
   45916                                         if (((instr & 0x380000) == 0x0) ||
   45917                                             ((instr & 0x3f0000) == 0x80000) ||
   45918                                             ((instr & 0x3f0000) == 0x100000) ||
   45919                                             ((instr & 0x3f0000) == 0x200000)) {
   45920                                           UnallocatedA32(instr);
   45921                                           return;
   45922                                         }
   45923                                         DataType dt =
   45924                                             Dt_imm6_4_Decode((instr >> 19) &
   45925                                                                  0x7,
   45926                                                              (instr >> 24) &
   45927                                                                  0x1);
   45928                                         if (dt.Is(kDataTypeValueInvalid)) {
   45929                                           UnallocatedA32(instr);
   45930                                           return;
   45931                                         }
   45932                                         if (((instr >> 12) & 1) != 0) {
   45933                                           UnallocatedA32(instr);
   45934                                           return;
   45935                                         }
   45936                                         unsigned rd =
   45937                                             ExtractQRegister(instr, 22, 12);
   45938                                         unsigned rm =
   45939                                             ExtractDRegister(instr, 5, 0);
   45940                                         uint32_t imm6 = (instr >> 16) & 0x3f;
   45941                                         uint32_t imm = imm6 - dt.GetSize();
   45942                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   45943                                         vshll(al,
   45944                                               dt,
   45945                                               QRegister(rd),
   45946                                               DRegister(rm),
   45947                                               imm);
   45948                                         break;
   45949                                       }
   45950                                       case 0x001b0000: {
   45951                                         // 0xf29b0a10
   45952                                         if (((instr & 0x380000) == 0x0) ||
   45953                                             ((instr & 0x3f0000) == 0x80000) ||
   45954                                             ((instr & 0x3f0000) == 0x100000) ||
   45955                                             ((instr & 0x3f0000) == 0x200000)) {
   45956                                           UnallocatedA32(instr);
   45957                                           return;
   45958                                         }
   45959                                         DataType dt =
   45960                                             Dt_imm6_4_Decode((instr >> 19) &
   45961                                                                  0x7,
   45962                                                              (instr >> 24) &
   45963                                                                  0x1);
   45964                                         if (dt.Is(kDataTypeValueInvalid)) {
   45965                                           UnallocatedA32(instr);
   45966                                           return;
   45967                                         }
   45968                                         if (((instr >> 12) & 1) != 0) {
   45969                                           UnallocatedA32(instr);
   45970                                           return;
   45971                                         }
   45972                                         unsigned rd =
   45973                                             ExtractQRegister(instr, 22, 12);
   45974                                         unsigned rm =
   45975                                             ExtractDRegister(instr, 5, 0);
   45976                                         uint32_t imm6 = (instr >> 16) & 0x3f;
   45977                                         uint32_t imm = imm6 - dt.GetSize();
   45978                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   45979                                         vshll(al,
   45980                                               dt,
   45981                                               QRegister(rd),
   45982                                               DRegister(rm),
   45983                                               imm);
   45984                                         break;
   45985                                       }
   45986                                       case 0x001c0000: {
   45987                                         // 0xf29c0a10
   45988                                         if (((instr & 0x380000) == 0x0) ||
   45989                                             ((instr & 0x3f0000) == 0x80000) ||
   45990                                             ((instr & 0x3f0000) == 0x100000) ||
   45991                                             ((instr & 0x3f0000) == 0x200000)) {
   45992                                           UnallocatedA32(instr);
   45993                                           return;
   45994                                         }
   45995                                         DataType dt =
   45996                                             Dt_imm6_4_Decode((instr >> 19) &
   45997                                                                  0x7,
   45998                                                              (instr >> 24) &
   45999                                                                  0x1);
   46000                                         if (dt.Is(kDataTypeValueInvalid)) {
   46001                                           UnallocatedA32(instr);
   46002                                           return;
   46003                                         }
   46004                                         if (((instr >> 12) & 1) != 0) {
   46005                                           UnallocatedA32(instr);
   46006                                           return;
   46007                                         }
   46008                                         unsigned rd =
   46009                                             ExtractQRegister(instr, 22, 12);
   46010                                         unsigned rm =
   46011                                             ExtractDRegister(instr, 5, 0);
   46012                                         uint32_t imm6 = (instr >> 16) & 0x3f;
   46013                                         uint32_t imm = imm6 - dt.GetSize();
   46014                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   46015                                         vshll(al,
   46016                                               dt,
   46017                                               QRegister(rd),
   46018                                               DRegister(rm),
   46019                                               imm);
   46020                                         break;
   46021                                       }
   46022                                       case 0x001d0000: {
   46023                                         // 0xf29d0a10
   46024                                         if (((instr & 0x380000) == 0x0) ||
   46025                                             ((instr & 0x3f0000) == 0x80000) ||
   46026                                             ((instr & 0x3f0000) == 0x100000) ||
   46027                                             ((instr & 0x3f0000) == 0x200000)) {
   46028                                           UnallocatedA32(instr);
   46029                                           return;
   46030                                         }
   46031                                         DataType dt =
   46032                                             Dt_imm6_4_Decode((instr >> 19) &
   46033                                                                  0x7,
   46034                                                              (instr >> 24) &
   46035                                                                  0x1);
   46036                                         if (dt.Is(kDataTypeValueInvalid)) {
   46037                                           UnallocatedA32(instr);
   46038                                           return;
   46039                                         }
   46040                                         if (((instr >> 12) & 1) != 0) {
   46041                                           UnallocatedA32(instr);
   46042                                           return;
   46043                                         }
   46044                                         unsigned rd =
   46045                                             ExtractQRegister(instr, 22, 12);
   46046                                         unsigned rm =
   46047                                             ExtractDRegister(instr, 5, 0);
   46048                                         uint32_t imm6 = (instr >> 16) & 0x3f;
   46049                                         uint32_t imm = imm6 - dt.GetSize();
   46050                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   46051                                         vshll(al,
   46052                                               dt,
   46053                                               QRegister(rd),
   46054                                               DRegister(rm),
   46055                                               imm);
   46056                                         break;
   46057                                       }
   46058                                       case 0x001e0000: {
   46059                                         // 0xf29e0a10
   46060                                         if (((instr & 0x380000) == 0x0) ||
   46061                                             ((instr & 0x3f0000) == 0x80000) ||
   46062                                             ((instr & 0x3f0000) == 0x100000) ||
   46063                                             ((instr & 0x3f0000) == 0x200000)) {
   46064                                           UnallocatedA32(instr);
   46065                                           return;
   46066                                         }
   46067                                         DataType dt =
   46068                                             Dt_imm6_4_Decode((instr >> 19) &
   46069                                                                  0x7,
   46070                                                              (instr >> 24) &
   46071                                                                  0x1);
   46072                                         if (dt.Is(kDataTypeValueInvalid)) {
   46073                                           UnallocatedA32(instr);
   46074                                           return;
   46075                                         }
   46076                                         if (((instr >> 12) & 1) != 0) {
   46077                                           UnallocatedA32(instr);
   46078                                           return;
   46079                                         }
   46080                                         unsigned rd =
   46081                                             ExtractQRegister(instr, 22, 12);
   46082                                         unsigned rm =
   46083                                             ExtractDRegister(instr, 5, 0);
   46084                                         uint32_t imm6 = (instr >> 16) & 0x3f;
   46085                                         uint32_t imm = imm6 - dt.GetSize();
   46086                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   46087                                         vshll(al,
   46088                                               dt,
   46089                                               QRegister(rd),
   46090                                               DRegister(rm),
   46091                                               imm);
   46092                                         break;
   46093                                       }
   46094                                       case 0x001f0000: {
   46095                                         // 0xf29f0a10
   46096                                         if (((instr & 0x380000) == 0x0) ||
   46097                                             ((instr & 0x3f0000) == 0x80000) ||
   46098                                             ((instr & 0x3f0000) == 0x100000) ||
   46099                                             ((instr & 0x3f0000) == 0x200000)) {
   46100                                           UnallocatedA32(instr);
   46101                                           return;
   46102                                         }
   46103                                         DataType dt =
   46104                                             Dt_imm6_4_Decode((instr >> 19) &
   46105                                                                  0x7,
   46106                                                              (instr >> 24) &
   46107                                                                  0x1);
   46108                                         if (dt.Is(kDataTypeValueInvalid)) {
   46109                                           UnallocatedA32(instr);
   46110                                           return;
   46111                                         }
   46112                                         if (((instr >> 12) & 1) != 0) {
   46113                                           UnallocatedA32(instr);
   46114                                           return;
   46115                                         }
   46116                                         unsigned rd =
   46117                                             ExtractQRegister(instr, 22, 12);
   46118                                         unsigned rm =
   46119                                             ExtractDRegister(instr, 5, 0);
   46120                                         uint32_t imm6 = (instr >> 16) & 0x3f;
   46121                                         uint32_t imm = imm6 - dt.GetSize();
   46122                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   46123                                         vshll(al,
   46124                                               dt,
   46125                                               QRegister(rd),
   46126                                               DRegister(rm),
   46127                                               imm);
   46128                                         break;
   46129                                       }
   46130                                       case 0x00200000: {
   46131                                         // 0xf2a00a10
   46132                                         if (((instr & 0x380000) == 0x0) ||
   46133                                             ((instr & 0x380000) == 0x180000) ||
   46134                                             ((instr & 0x380000) == 0x280000) ||
   46135                                             ((instr & 0x380000) == 0x300000) ||
   46136                                             ((instr & 0x380000) == 0x380000)) {
   46137                                           UnallocatedA32(instr);
   46138                                           return;
   46139                                         }
   46140                                         DataType dt = Dt_U_imm3H_1_Decode(
   46141                                             ((instr >> 19) & 0x7) |
   46142                                             ((instr >> 21) & 0x8));
   46143                                         if (dt.Is(kDataTypeValueInvalid)) {
   46144                                           UnallocatedA32(instr);
   46145                                           return;
   46146                                         }
   46147                                         if (((instr >> 12) & 1) != 0) {
   46148                                           UnallocatedA32(instr);
   46149                                           return;
   46150                                         }
   46151                                         unsigned rd =
   46152                                             ExtractQRegister(instr, 22, 12);
   46153                                         unsigned rm =
   46154                                             ExtractDRegister(instr, 5, 0);
   46155                                         // VMOVL{<c>}{<q>}.<dt> <Qd>, <Dm> ; A1
   46156                                         vmovl(al,
   46157                                               dt,
   46158                                               QRegister(rd),
   46159                                               DRegister(rm));
   46160                                         break;
   46161                                       }
   46162                                       case 0x00210000: {
   46163                                         // 0xf2a10a10
   46164                                         if (((instr & 0x380000) == 0x0) ||
   46165                                             ((instr & 0x3f0000) == 0x80000) ||
   46166                                             ((instr & 0x3f0000) == 0x100000) ||
   46167                                             ((instr & 0x3f0000) == 0x200000)) {
   46168                                           UnallocatedA32(instr);
   46169                                           return;
   46170                                         }
   46171                                         DataType dt =
   46172                                             Dt_imm6_4_Decode((instr >> 19) &
   46173                                                                  0x7,
   46174                                                              (instr >> 24) &
   46175                                                                  0x1);
   46176                                         if (dt.Is(kDataTypeValueInvalid)) {
   46177                                           UnallocatedA32(instr);
   46178                                           return;
   46179                                         }
   46180                                         if (((instr >> 12) & 1) != 0) {
   46181                                           UnallocatedA32(instr);
   46182                                           return;
   46183                                         }
   46184                                         unsigned rd =
   46185                                             ExtractQRegister(instr, 22, 12);
   46186                                         unsigned rm =
   46187                                             ExtractDRegister(instr, 5, 0);
   46188                                         uint32_t imm6 = (instr >> 16) & 0x3f;
   46189                                         uint32_t imm = imm6 - dt.GetSize();
   46190                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   46191                                         vshll(al,
   46192                                               dt,
   46193                                               QRegister(rd),
   46194                                               DRegister(rm),
   46195                                               imm);
   46196                                         break;
   46197                                       }
   46198                                       case 0x00220000: {
   46199                                         // 0xf2a20a10
   46200                                         if (((instr & 0x380000) == 0x0) ||
   46201                                             ((instr & 0x3f0000) == 0x80000) ||
   46202                                             ((instr & 0x3f0000) == 0x100000) ||
   46203                                             ((instr & 0x3f0000) == 0x200000)) {
   46204                                           UnallocatedA32(instr);
   46205                                           return;
   46206                                         }
   46207                                         DataType dt =
   46208                                             Dt_imm6_4_Decode((instr >> 19) &
   46209                                                                  0x7,
   46210                                                              (instr >> 24) &
   46211                                                                  0x1);
   46212                                         if (dt.Is(kDataTypeValueInvalid)) {
   46213                                           UnallocatedA32(instr);
   46214                                           return;
   46215                                         }
   46216                                         if (((instr >> 12) & 1) != 0) {
   46217                                           UnallocatedA32(instr);
   46218                                           return;
   46219                                         }
   46220                                         unsigned rd =
   46221                                             ExtractQRegister(instr, 22, 12);
   46222                                         unsigned rm =
   46223                                             ExtractDRegister(instr, 5, 0);
   46224                                         uint32_t imm6 = (instr >> 16) & 0x3f;
   46225                                         uint32_t imm = imm6 - dt.GetSize();
   46226                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   46227                                         vshll(al,
   46228                                               dt,
   46229                                               QRegister(rd),
   46230                                               DRegister(rm),
   46231                                               imm);
   46232                                         break;
   46233                                       }
   46234                                       case 0x00230000: {
   46235                                         // 0xf2a30a10
   46236                                         if (((instr & 0x380000) == 0x0) ||
   46237                                             ((instr & 0x3f0000) == 0x80000) ||
   46238                                             ((instr & 0x3f0000) == 0x100000) ||
   46239                                             ((instr & 0x3f0000) == 0x200000)) {
   46240                                           UnallocatedA32(instr);
   46241                                           return;
   46242                                         }
   46243                                         DataType dt =
   46244                                             Dt_imm6_4_Decode((instr >> 19) &
   46245                                                                  0x7,
   46246                                                              (instr >> 24) &
   46247                                                                  0x1);
   46248                                         if (dt.Is(kDataTypeValueInvalid)) {
   46249                                           UnallocatedA32(instr);
   46250                                           return;
   46251                                         }
   46252                                         if (((instr >> 12) & 1) != 0) {
   46253                                           UnallocatedA32(instr);
   46254                                           return;
   46255                                         }
   46256                                         unsigned rd =
   46257                                             ExtractQRegister(instr, 22, 12);
   46258                                         unsigned rm =
   46259                                             ExtractDRegister(instr, 5, 0);
   46260                                         uint32_t imm6 = (instr >> 16) & 0x3f;
   46261                                         uint32_t imm = imm6 - dt.GetSize();
   46262                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   46263                                         vshll(al,
   46264                                               dt,
   46265                                               QRegister(rd),
   46266                                               DRegister(rm),
   46267                                               imm);
   46268                                         break;
   46269                                       }
   46270                                       case 0x00240000: {
   46271                                         // 0xf2a40a10
   46272                                         if (((instr & 0x380000) == 0x0) ||
   46273                                             ((instr & 0x3f0000) == 0x80000) ||
   46274                                             ((instr & 0x3f0000) == 0x100000) ||
   46275                                             ((instr & 0x3f0000) == 0x200000)) {
   46276                                           UnallocatedA32(instr);
   46277                                           return;
   46278                                         }
   46279                                         DataType dt =
   46280                                             Dt_imm6_4_Decode((instr >> 19) &
   46281                                                                  0x7,
   46282                                                              (instr >> 24) &
   46283                                                                  0x1);
   46284                                         if (dt.Is(kDataTypeValueInvalid)) {
   46285                                           UnallocatedA32(instr);
   46286                                           return;
   46287                                         }
   46288                                         if (((instr >> 12) & 1) != 0) {
   46289                                           UnallocatedA32(instr);
   46290                                           return;
   46291                                         }
   46292                                         unsigned rd =
   46293                                             ExtractQRegister(instr, 22, 12);
   46294                                         unsigned rm =
   46295                                             ExtractDRegister(instr, 5, 0);
   46296                                         uint32_t imm6 = (instr >> 16) & 0x3f;
   46297                                         uint32_t imm = imm6 - dt.GetSize();
   46298                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   46299                                         vshll(al,
   46300                                               dt,
   46301                                               QRegister(rd),
   46302                                               DRegister(rm),
   46303                                               imm);
   46304                                         break;
   46305                                       }
   46306                                       case 0x00250000: {
   46307                                         // 0xf2a50a10
   46308                                         if (((instr & 0x380000) == 0x0) ||
   46309                                             ((instr & 0x3f0000) == 0x80000) ||
   46310                                             ((instr & 0x3f0000) == 0x100000) ||
   46311                                             ((instr & 0x3f0000) == 0x200000)) {
   46312                                           UnallocatedA32(instr);
   46313                                           return;
   46314                                         }
   46315                                         DataType dt =
   46316                                             Dt_imm6_4_Decode((instr >> 19) &
   46317                                                                  0x7,
   46318                                                              (instr >> 24) &
   46319                                                                  0x1);
   46320                                         if (dt.Is(kDataTypeValueInvalid)) {
   46321                                           UnallocatedA32(instr);
   46322                                           return;
   46323                                         }
   46324                                         if (((instr >> 12) & 1) != 0) {
   46325                                           UnallocatedA32(instr);
   46326                                           return;
   46327                                         }
   46328                                         unsigned rd =
   46329                                             ExtractQRegister(instr, 22, 12);
   46330                                         unsigned rm =
   46331                                             ExtractDRegister(instr, 5, 0);
   46332                                         uint32_t imm6 = (instr >> 16) & 0x3f;
   46333                                         uint32_t imm = imm6 - dt.GetSize();
   46334                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   46335                                         vshll(al,
   46336                                               dt,
   46337                                               QRegister(rd),
   46338                                               DRegister(rm),
   46339                                               imm);
   46340                                         break;
   46341                                       }
   46342                                       case 0x00260000: {
   46343                                         // 0xf2a60a10
   46344                                         if (((instr & 0x380000) == 0x0) ||
   46345                                             ((instr & 0x3f0000) == 0x80000) ||
   46346                                             ((instr & 0x3f0000) == 0x100000) ||
   46347                                             ((instr & 0x3f0000) == 0x200000)) {
   46348                                           UnallocatedA32(instr);
   46349                                           return;
   46350                                         }
   46351                                         DataType dt =
   46352                                             Dt_imm6_4_Decode((instr >> 19) &
   46353                                                                  0x7,
   46354                                                              (instr >> 24) &
   46355                                                                  0x1);
   46356                                         if (dt.Is(kDataTypeValueInvalid)) {
   46357                                           UnallocatedA32(instr);
   46358                                           return;
   46359                                         }
   46360                                         if (((instr >> 12) & 1) != 0) {
   46361                                           UnallocatedA32(instr);
   46362                                           return;
   46363                                         }
   46364                                         unsigned rd =
   46365                                             ExtractQRegister(instr, 22, 12);
   46366                                         unsigned rm =
   46367                                             ExtractDRegister(instr, 5, 0);
   46368                                         uint32_t imm6 = (instr >> 16) & 0x3f;
   46369                                         uint32_t imm = imm6 - dt.GetSize();
   46370                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   46371                                         vshll(al,
   46372                                               dt,
   46373                                               QRegister(rd),
   46374                                               DRegister(rm),
   46375                                               imm);
   46376                                         break;
   46377                                       }
   46378                                       case 0x00270000: {
   46379                                         // 0xf2a70a10
   46380                                         if (((instr & 0x380000) == 0x0) ||
   46381                                             ((instr & 0x3f0000) == 0x80000) ||
   46382                                             ((instr & 0x3f0000) == 0x100000) ||
   46383                                             ((instr & 0x3f0000) == 0x200000)) {
   46384                                           UnallocatedA32(instr);
   46385                                           return;
   46386                                         }
   46387                                         DataType dt =
   46388                                             Dt_imm6_4_Decode((instr >> 19) &
   46389                                                                  0x7,
   46390                                                              (instr >> 24) &
   46391                                                                  0x1);
   46392                                         if (dt.Is(kDataTypeValueInvalid)) {
   46393                                           UnallocatedA32(instr);
   46394                                           return;
   46395                                         }
   46396                                         if (((instr >> 12) & 1) != 0) {
   46397                                           UnallocatedA32(instr);
   46398                                           return;
   46399                                         }
   46400                                         unsigned rd =
   46401                                             ExtractQRegister(instr, 22, 12);
   46402                                         unsigned rm =
   46403                                             ExtractDRegister(instr, 5, 0);
   46404                                         uint32_t imm6 = (instr >> 16) & 0x3f;
   46405                                         uint32_t imm = imm6 - dt.GetSize();
   46406                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   46407                                         vshll(al,
   46408                                               dt,
   46409                                               QRegister(rd),
   46410                                               DRegister(rm),
   46411                                               imm);
   46412                                         break;
   46413                                       }
   46414                                       case 0x00280000: {
   46415                                         // 0xf2a80a10
   46416                                         if (((instr & 0x380000) == 0x0) ||
   46417                                             ((instr & 0x3f0000) == 0x80000) ||
   46418                                             ((instr & 0x3f0000) == 0x100000) ||
   46419                                             ((instr & 0x3f0000) == 0x200000)) {
   46420                                           UnallocatedA32(instr);
   46421                                           return;
   46422                                         }
   46423                                         DataType dt =
   46424                                             Dt_imm6_4_Decode((instr >> 19) &
   46425                                                                  0x7,
   46426                                                              (instr >> 24) &
   46427                                                                  0x1);
   46428                                         if (dt.Is(kDataTypeValueInvalid)) {
   46429                                           UnallocatedA32(instr);
   46430                                           return;
   46431                                         }
   46432                                         if (((instr >> 12) & 1) != 0) {
   46433                                           UnallocatedA32(instr);
   46434                                           return;
   46435                                         }
   46436                                         unsigned rd =
   46437                                             ExtractQRegister(instr, 22, 12);
   46438                                         unsigned rm =
   46439                                             ExtractDRegister(instr, 5, 0);
   46440                                         uint32_t imm6 = (instr >> 16) & 0x3f;
   46441                                         uint32_t imm = imm6 - dt.GetSize();
   46442                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   46443                                         vshll(al,
   46444                                               dt,
   46445                                               QRegister(rd),
   46446                                               DRegister(rm),
   46447                                               imm);
   46448                                         break;
   46449                                       }
   46450                                       case 0x00290000: {
   46451                                         // 0xf2a90a10
   46452                                         if (((instr & 0x380000) == 0x0) ||
   46453                                             ((instr & 0x3f0000) == 0x80000) ||
   46454                                             ((instr & 0x3f0000) == 0x100000) ||
   46455                                             ((instr & 0x3f0000) == 0x200000)) {
   46456                                           UnallocatedA32(instr);
   46457                                           return;
   46458                                         }
   46459                                         DataType dt =
   46460                                             Dt_imm6_4_Decode((instr >> 19) &
   46461                                                                  0x7,
   46462                                                              (instr >> 24) &
   46463                                                                  0x1);
   46464                                         if (dt.Is(kDataTypeValueInvalid)) {
   46465                                           UnallocatedA32(instr);
   46466                                           return;
   46467                                         }
   46468                                         if (((instr >> 12) & 1) != 0) {
   46469                                           UnallocatedA32(instr);
   46470                                           return;
   46471                                         }
   46472                                         unsigned rd =
   46473                                             ExtractQRegister(instr, 22, 12);
   46474                                         unsigned rm =
   46475                                             ExtractDRegister(instr, 5, 0);
   46476                                         uint32_t imm6 = (instr >> 16) & 0x3f;
   46477                                         uint32_t imm = imm6 - dt.GetSize();
   46478                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   46479                                         vshll(al,
   46480                                               dt,
   46481                                               QRegister(rd),
   46482                                               DRegister(rm),
   46483                                               imm);
   46484                                         break;
   46485                                       }
   46486                                       case 0x002a0000: {
   46487                                         // 0xf2aa0a10
   46488                                         if (((instr & 0x380000) == 0x0) ||
   46489                                             ((instr & 0x3f0000) == 0x80000) ||
   46490                                             ((instr & 0x3f0000) == 0x100000) ||
   46491                                             ((instr & 0x3f0000) == 0x200000)) {
   46492                                           UnallocatedA32(instr);
   46493                                           return;
   46494                                         }
   46495                                         DataType dt =
   46496                                             Dt_imm6_4_Decode((instr >> 19) &
   46497                                                                  0x7,
   46498                                                              (instr >> 24) &
   46499                                                                  0x1);
   46500                                         if (dt.Is(kDataTypeValueInvalid)) {
   46501                                           UnallocatedA32(instr);
   46502                                           return;
   46503                                         }
   46504                                         if (((instr >> 12) & 1) != 0) {
   46505                                           UnallocatedA32(instr);
   46506                                           return;
   46507                                         }
   46508                                         unsigned rd =
   46509                                             ExtractQRegister(instr, 22, 12);
   46510                                         unsigned rm =
   46511                                             ExtractDRegister(instr, 5, 0);
   46512                                         uint32_t imm6 = (instr >> 16) & 0x3f;
   46513                                         uint32_t imm = imm6 - dt.GetSize();
   46514                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   46515                                         vshll(al,
   46516                                               dt,
   46517                                               QRegister(rd),
   46518                                               DRegister(rm),
   46519                                               imm);
   46520                                         break;
   46521                                       }
   46522                                       case 0x002b0000: {
   46523                                         // 0xf2ab0a10
   46524                                         if (((instr & 0x380000) == 0x0) ||
   46525                                             ((instr & 0x3f0000) == 0x80000) ||
   46526                                             ((instr & 0x3f0000) == 0x100000) ||
   46527                                             ((instr & 0x3f0000) == 0x200000)) {
   46528                                           UnallocatedA32(instr);
   46529                                           return;
   46530                                         }
   46531                                         DataType dt =
   46532                                             Dt_imm6_4_Decode((instr >> 19) &
   46533                                                                  0x7,
   46534                                                              (instr >> 24) &
   46535                                                                  0x1);
   46536                                         if (dt.Is(kDataTypeValueInvalid)) {
   46537                                           UnallocatedA32(instr);
   46538                                           return;
   46539                                         }
   46540                                         if (((instr >> 12) & 1) != 0) {
   46541                                           UnallocatedA32(instr);
   46542                                           return;
   46543                                         }
   46544                                         unsigned rd =
   46545                                             ExtractQRegister(instr, 22, 12);
   46546                                         unsigned rm =
   46547                                             ExtractDRegister(instr, 5, 0);
   46548                                         uint32_t imm6 = (instr >> 16) & 0x3f;
   46549                                         uint32_t imm = imm6 - dt.GetSize();
   46550                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   46551                                         vshll(al,
   46552                                               dt,
   46553                                               QRegister(rd),
   46554                                               DRegister(rm),
   46555                                               imm);
   46556                                         break;
   46557                                       }
   46558                                       case 0x002c0000: {
   46559                                         // 0xf2ac0a10
   46560                                         if (((instr & 0x380000) == 0x0) ||
   46561                                             ((instr & 0x3f0000) == 0x80000) ||
   46562                                             ((instr & 0x3f0000) == 0x100000) ||
   46563                                             ((instr & 0x3f0000) == 0x200000)) {
   46564                                           UnallocatedA32(instr);
   46565                                           return;
   46566                                         }
   46567                                         DataType dt =
   46568                                             Dt_imm6_4_Decode((instr >> 19) &
   46569                                                                  0x7,
   46570                                                              (instr >> 24) &
   46571                                                                  0x1);
   46572                                         if (dt.Is(kDataTypeValueInvalid)) {
   46573                                           UnallocatedA32(instr);
   46574                                           return;
   46575                                         }
   46576                                         if (((instr >> 12) & 1) != 0) {
   46577                                           UnallocatedA32(instr);
   46578                                           return;
   46579                                         }
   46580                                         unsigned rd =
   46581                                             ExtractQRegister(instr, 22, 12);
   46582                                         unsigned rm =
   46583                                             ExtractDRegister(instr, 5, 0);
   46584                                         uint32_t imm6 = (instr >> 16) & 0x3f;
   46585                                         uint32_t imm = imm6 - dt.GetSize();
   46586                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   46587                                         vshll(al,
   46588                                               dt,
   46589                                               QRegister(rd),
   46590                                               DRegister(rm),
   46591                                               imm);
   46592                                         break;
   46593                                       }
   46594                                       case 0x002d0000: {
   46595                                         // 0xf2ad0a10
   46596                                         if (((instr & 0x380000) == 0x0) ||
   46597                                             ((instr & 0x3f0000) == 0x80000) ||
   46598                                             ((instr & 0x3f0000) == 0x100000) ||
   46599                                             ((instr & 0x3f0000) == 0x200000)) {
   46600                                           UnallocatedA32(instr);
   46601                                           return;
   46602                                         }
   46603                                         DataType dt =
   46604                                             Dt_imm6_4_Decode((instr >> 19) &
   46605                                                                  0x7,
   46606                                                              (instr >> 24) &
   46607                                                                  0x1);
   46608                                         if (dt.Is(kDataTypeValueInvalid)) {
   46609                                           UnallocatedA32(instr);
   46610                                           return;
   46611                                         }
   46612                                         if (((instr >> 12) & 1) != 0) {
   46613                                           UnallocatedA32(instr);
   46614                                           return;
   46615                                         }
   46616                                         unsigned rd =
   46617                                             ExtractQRegister(instr, 22, 12);
   46618                                         unsigned rm =
   46619                                             ExtractDRegister(instr, 5, 0);
   46620                                         uint32_t imm6 = (instr >> 16) & 0x3f;
   46621                                         uint32_t imm = imm6 - dt.GetSize();
   46622                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   46623                                         vshll(al,
   46624                                               dt,
   46625                                               QRegister(rd),
   46626                                               DRegister(rm),
   46627                                               imm);
   46628                                         break;
   46629                                       }
   46630                                       case 0x002e0000: {
   46631                                         // 0xf2ae0a10
   46632                                         if (((instr & 0x380000) == 0x0) ||
   46633                                             ((instr & 0x3f0000) == 0x80000) ||
   46634                                             ((instr & 0x3f0000) == 0x100000) ||
   46635                                             ((instr & 0x3f0000) == 0x200000)) {
   46636                                           UnallocatedA32(instr);
   46637                                           return;
   46638                                         }
   46639                                         DataType dt =
   46640                                             Dt_imm6_4_Decode((instr >> 19) &
   46641                                                                  0x7,
   46642                                                              (instr >> 24) &
   46643                                                                  0x1);
   46644                                         if (dt.Is(kDataTypeValueInvalid)) {
   46645                                           UnallocatedA32(instr);
   46646                                           return;
   46647                                         }
   46648                                         if (((instr >> 12) & 1) != 0) {
   46649                                           UnallocatedA32(instr);
   46650                                           return;
   46651                                         }
   46652                                         unsigned rd =
   46653                                             ExtractQRegister(instr, 22, 12);
   46654                                         unsigned rm =
   46655                                             ExtractDRegister(instr, 5, 0);
   46656                                         uint32_t imm6 = (instr >> 16) & 0x3f;
   46657                                         uint32_t imm = imm6 - dt.GetSize();
   46658                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   46659                                         vshll(al,
   46660                                               dt,
   46661                                               QRegister(rd),
   46662                                               DRegister(rm),
   46663                                               imm);
   46664                                         break;
   46665                                       }
   46666                                       case 0x002f0000: {
   46667                                         // 0xf2af0a10
   46668                                         if (((instr & 0x380000) == 0x0) ||
   46669                                             ((instr & 0x3f0000) == 0x80000) ||
   46670                                             ((instr & 0x3f0000) == 0x100000) ||
   46671                                             ((instr & 0x3f0000) == 0x200000)) {
   46672                                           UnallocatedA32(instr);
   46673                                           return;
   46674                                         }
   46675                                         DataType dt =
   46676                                             Dt_imm6_4_Decode((instr >> 19) &
   46677                                                                  0x7,
   46678                                                              (instr >> 24) &
   46679                                                                  0x1);
   46680                                         if (dt.Is(kDataTypeValueInvalid)) {
   46681                                           UnallocatedA32(instr);
   46682                                           return;
   46683                                         }
   46684                                         if (((instr >> 12) & 1) != 0) {
   46685                                           UnallocatedA32(instr);
   46686                                           return;
   46687                                         }
   46688                                         unsigned rd =
   46689                                             ExtractQRegister(instr, 22, 12);
   46690                                         unsigned rm =
   46691                                             ExtractDRegister(instr, 5, 0);
   46692                                         uint32_t imm6 = (instr >> 16) & 0x3f;
   46693                                         uint32_t imm = imm6 - dt.GetSize();
   46694                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   46695                                         vshll(al,
   46696                                               dt,
   46697                                               QRegister(rd),
   46698                                               DRegister(rm),
   46699                                               imm);
   46700                                         break;
   46701                                       }
   46702                                       case 0x00300000: {
   46703                                         // 0xf2b00a10
   46704                                         if (((instr & 0x380000) == 0x0) ||
   46705                                             ((instr & 0x3f0000) == 0x80000) ||
   46706                                             ((instr & 0x3f0000) == 0x100000) ||
   46707                                             ((instr & 0x3f0000) == 0x200000)) {
   46708                                           UnallocatedA32(instr);
   46709                                           return;
   46710                                         }
   46711                                         DataType dt =
   46712                                             Dt_imm6_4_Decode((instr >> 19) &
   46713                                                                  0x7,
   46714                                                              (instr >> 24) &
   46715                                                                  0x1);
   46716                                         if (dt.Is(kDataTypeValueInvalid)) {
   46717                                           UnallocatedA32(instr);
   46718                                           return;
   46719                                         }
   46720                                         if (((instr >> 12) & 1) != 0) {
   46721                                           UnallocatedA32(instr);
   46722                                           return;
   46723                                         }
   46724                                         unsigned rd =
   46725                                             ExtractQRegister(instr, 22, 12);
   46726                                         unsigned rm =
   46727                                             ExtractDRegister(instr, 5, 0);
   46728                                         uint32_t imm6 = (instr >> 16) & 0x3f;
   46729                                         uint32_t imm = imm6 - dt.GetSize();
   46730                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   46731                                         vshll(al,
   46732                                               dt,
   46733                                               QRegister(rd),
   46734                                               DRegister(rm),
   46735                                               imm);
   46736                                         break;
   46737                                       }
   46738                                       case 0x00310000: {
   46739                                         // 0xf2b10a10
   46740                                         if (((instr & 0x380000) == 0x0) ||
   46741                                             ((instr & 0x3f0000) == 0x80000) ||
   46742                                             ((instr & 0x3f0000) == 0x100000) ||
   46743                                             ((instr & 0x3f0000) == 0x200000)) {
   46744                                           UnallocatedA32(instr);
   46745                                           return;
   46746                                         }
   46747                                         DataType dt =
   46748                                             Dt_imm6_4_Decode((instr >> 19) &
   46749                                                                  0x7,
   46750                                                              (instr >> 24) &
   46751                                                                  0x1);
   46752                                         if (dt.Is(kDataTypeValueInvalid)) {
   46753                                           UnallocatedA32(instr);
   46754                                           return;
   46755                                         }
   46756                                         if (((instr >> 12) & 1) != 0) {
   46757                                           UnallocatedA32(instr);
   46758                                           return;
   46759                                         }
   46760                                         unsigned rd =
   46761                                             ExtractQRegister(instr, 22, 12);
   46762                                         unsigned rm =
   46763                                             ExtractDRegister(instr, 5, 0);
   46764                                         uint32_t imm6 = (instr >> 16) & 0x3f;
   46765                                         uint32_t imm = imm6 - dt.GetSize();
   46766                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   46767                                         vshll(al,
   46768                                               dt,
   46769                                               QRegister(rd),
   46770                                               DRegister(rm),
   46771                                               imm);
   46772                                         break;
   46773                                       }
   46774                                       case 0x00320000: {
   46775                                         // 0xf2b20a10
   46776                                         if (((instr & 0x380000) == 0x0) ||
   46777                                             ((instr & 0x3f0000) == 0x80000) ||
   46778                                             ((instr & 0x3f0000) == 0x100000) ||
   46779                                             ((instr & 0x3f0000) == 0x200000)) {
   46780                                           UnallocatedA32(instr);
   46781                                           return;
   46782                                         }
   46783                                         DataType dt =
   46784                                             Dt_imm6_4_Decode((instr >> 19) &
   46785                                                                  0x7,
   46786                                                              (instr >> 24) &
   46787                                                                  0x1);
   46788                                         if (dt.Is(kDataTypeValueInvalid)) {
   46789                                           UnallocatedA32(instr);
   46790                                           return;
   46791                                         }
   46792                                         if (((instr >> 12) & 1) != 0) {
   46793                                           UnallocatedA32(instr);
   46794                                           return;
   46795                                         }
   46796                                         unsigned rd =
   46797                                             ExtractQRegister(instr, 22, 12);
   46798                                         unsigned rm =
   46799                                             ExtractDRegister(instr, 5, 0);
   46800                                         uint32_t imm6 = (instr >> 16) & 0x3f;
   46801                                         uint32_t imm = imm6 - dt.GetSize();
   46802                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   46803                                         vshll(al,
   46804                                               dt,
   46805                                               QRegister(rd),
   46806                                               DRegister(rm),
   46807                                               imm);
   46808                                         break;
   46809                                       }
   46810                                       case 0x00330000: {
   46811                                         // 0xf2b30a10
   46812                                         if (((instr & 0x380000) == 0x0) ||
   46813                                             ((instr & 0x3f0000) == 0x80000) ||
   46814                                             ((instr & 0x3f0000) == 0x100000) ||
   46815                                             ((instr & 0x3f0000) == 0x200000)) {
   46816                                           UnallocatedA32(instr);
   46817                                           return;
   46818                                         }
   46819                                         DataType dt =
   46820                                             Dt_imm6_4_Decode((instr >> 19) &
   46821                                                                  0x7,
   46822                                                              (instr >> 24) &
   46823                                                                  0x1);
   46824                                         if (dt.Is(kDataTypeValueInvalid)) {
   46825                                           UnallocatedA32(instr);
   46826                                           return;
   46827                                         }
   46828                                         if (((instr >> 12) & 1) != 0) {
   46829                                           UnallocatedA32(instr);
   46830                                           return;
   46831                                         }
   46832                                         unsigned rd =
   46833                                             ExtractQRegister(instr, 22, 12);
   46834                                         unsigned rm =
   46835                                             ExtractDRegister(instr, 5, 0);
   46836                                         uint32_t imm6 = (instr >> 16) & 0x3f;
   46837                                         uint32_t imm = imm6 - dt.GetSize();
   46838                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   46839                                         vshll(al,
   46840                                               dt,
   46841                                               QRegister(rd),
   46842                                               DRegister(rm),
   46843                                               imm);
   46844                                         break;
   46845                                       }
   46846                                       case 0x00340000: {
   46847                                         // 0xf2b40a10
   46848                                         if (((instr & 0x380000) == 0x0) ||
   46849                                             ((instr & 0x3f0000) == 0x80000) ||
   46850                                             ((instr & 0x3f0000) == 0x100000) ||
   46851                                             ((instr & 0x3f0000) == 0x200000)) {
   46852                                           UnallocatedA32(instr);
   46853                                           return;
   46854                                         }
   46855                                         DataType dt =
   46856                                             Dt_imm6_4_Decode((instr >> 19) &
   46857                                                                  0x7,
   46858                                                              (instr >> 24) &
   46859                                                                  0x1);
   46860                                         if (dt.Is(kDataTypeValueInvalid)) {
   46861                                           UnallocatedA32(instr);
   46862                                           return;
   46863                                         }
   46864                                         if (((instr >> 12) & 1) != 0) {
   46865                                           UnallocatedA32(instr);
   46866                                           return;
   46867                                         }
   46868                                         unsigned rd =
   46869                                             ExtractQRegister(instr, 22, 12);
   46870                                         unsigned rm =
   46871                                             ExtractDRegister(instr, 5, 0);
   46872                                         uint32_t imm6 = (instr >> 16) & 0x3f;
   46873                                         uint32_t imm = imm6 - dt.GetSize();
   46874                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   46875                                         vshll(al,
   46876                                               dt,
   46877                                               QRegister(rd),
   46878                                               DRegister(rm),
   46879                                               imm);
   46880                                         break;
   46881                                       }
   46882                                       case 0x00350000: {
   46883                                         // 0xf2b50a10
   46884                                         if (((instr & 0x380000) == 0x0) ||
   46885                                             ((instr & 0x3f0000) == 0x80000) ||
   46886                                             ((instr & 0x3f0000) == 0x100000) ||
   46887                                             ((instr & 0x3f0000) == 0x200000)) {
   46888                                           UnallocatedA32(instr);
   46889                                           return;
   46890                                         }
   46891                                         DataType dt =
   46892                                             Dt_imm6_4_Decode((instr >> 19) &
   46893                                                                  0x7,
   46894                                                              (instr >> 24) &
   46895                                                                  0x1);
   46896                                         if (dt.Is(kDataTypeValueInvalid)) {
   46897                                           UnallocatedA32(instr);
   46898                                           return;
   46899                                         }
   46900                                         if (((instr >> 12) & 1) != 0) {
   46901                                           UnallocatedA32(instr);
   46902                                           return;
   46903                                         }
   46904                                         unsigned rd =
   46905                                             ExtractQRegister(instr, 22, 12);
   46906                                         unsigned rm =
   46907                                             ExtractDRegister(instr, 5, 0);
   46908                                         uint32_t imm6 = (instr >> 16) & 0x3f;
   46909                                         uint32_t imm = imm6 - dt.GetSize();
   46910                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   46911                                         vshll(al,
   46912                                               dt,
   46913                                               QRegister(rd),
   46914                                               DRegister(rm),
   46915                                               imm);
   46916                                         break;
   46917                                       }
   46918                                       case 0x00360000: {
   46919                                         // 0xf2b60a10
   46920                                         if (((instr & 0x380000) == 0x0) ||
   46921                                             ((instr & 0x3f0000) == 0x80000) ||
   46922                                             ((instr & 0x3f0000) == 0x100000) ||
   46923                                             ((instr & 0x3f0000) == 0x200000)) {
   46924                                           UnallocatedA32(instr);
   46925                                           return;
   46926                                         }
   46927                                         DataType dt =
   46928                                             Dt_imm6_4_Decode((instr >> 19) &
   46929                                                                  0x7,
   46930                                                              (instr >> 24) &
   46931                                                                  0x1);
   46932                                         if (dt.Is(kDataTypeValueInvalid)) {
   46933                                           UnallocatedA32(instr);
   46934                                           return;
   46935                                         }
   46936                                         if (((instr >> 12) & 1) != 0) {
   46937                                           UnallocatedA32(instr);
   46938                                           return;
   46939                                         }
   46940                                         unsigned rd =
   46941                                             ExtractQRegister(instr, 22, 12);
   46942                                         unsigned rm =
   46943                                             ExtractDRegister(instr, 5, 0);
   46944                                         uint32_t imm6 = (instr >> 16) & 0x3f;
   46945                                         uint32_t imm = imm6 - dt.GetSize();
   46946                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   46947                                         vshll(al,
   46948                                               dt,
   46949                                               QRegister(rd),
   46950                                               DRegister(rm),
   46951                                               imm);
   46952                                         break;
   46953                                       }
   46954                                       case 0x00370000: {
   46955                                         // 0xf2b70a10
   46956                                         if (((instr & 0x380000) == 0x0) ||
   46957                                             ((instr & 0x3f0000) == 0x80000) ||
   46958                                             ((instr & 0x3f0000) == 0x100000) ||
   46959                                             ((instr & 0x3f0000) == 0x200000)) {
   46960                                           UnallocatedA32(instr);
   46961                                           return;
   46962                                         }
   46963                                         DataType dt =
   46964                                             Dt_imm6_4_Decode((instr >> 19) &
   46965                                                                  0x7,
   46966                                                              (instr >> 24) &
   46967                                                                  0x1);
   46968                                         if (dt.Is(kDataTypeValueInvalid)) {
   46969                                           UnallocatedA32(instr);
   46970                                           return;
   46971                                         }
   46972                                         if (((instr >> 12) & 1) != 0) {
   46973                                           UnallocatedA32(instr);
   46974                                           return;
   46975                                         }
   46976                                         unsigned rd =
   46977                                             ExtractQRegister(instr, 22, 12);
   46978                                         unsigned rm =
   46979                                             ExtractDRegister(instr, 5, 0);
   46980                                         uint32_t imm6 = (instr >> 16) & 0x3f;
   46981                                         uint32_t imm = imm6 - dt.GetSize();
   46982                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   46983                                         vshll(al,
   46984                                               dt,
   46985                                               QRegister(rd),
   46986                                               DRegister(rm),
   46987                                               imm);
   46988                                         break;
   46989                                       }
   46990                                       case 0x00380000: {
   46991                                         // 0xf2b80a10
   46992                                         if (((instr & 0x380000) == 0x0) ||
   46993                                             ((instr & 0x3f0000) == 0x80000) ||
   46994                                             ((instr & 0x3f0000) == 0x100000) ||
   46995                                             ((instr & 0x3f0000) == 0x200000)) {
   46996                                           UnallocatedA32(instr);
   46997                                           return;
   46998                                         }
   46999                                         DataType dt =
   47000                                             Dt_imm6_4_Decode((instr >> 19) &
   47001                                                                  0x7,
   47002                                                              (instr >> 24) &
   47003                                                                  0x1);
   47004                                         if (dt.Is(kDataTypeValueInvalid)) {
   47005                                           UnallocatedA32(instr);
   47006                                           return;
   47007                                         }
   47008                                         if (((instr >> 12) & 1) != 0) {
   47009                                           UnallocatedA32(instr);
   47010                                           return;
   47011                                         }
   47012                                         unsigned rd =
   47013                                             ExtractQRegister(instr, 22, 12);
   47014                                         unsigned rm =
   47015                                             ExtractDRegister(instr, 5, 0);
   47016                                         uint32_t imm6 = (instr >> 16) & 0x3f;
   47017                                         uint32_t imm = imm6 - dt.GetSize();
   47018                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   47019                                         vshll(al,
   47020                                               dt,
   47021                                               QRegister(rd),
   47022                                               DRegister(rm),
   47023                                               imm);
   47024                                         break;
   47025                                       }
   47026                                       case 0x00390000: {
   47027                                         // 0xf2b90a10
   47028                                         if (((instr & 0x380000) == 0x0) ||
   47029                                             ((instr & 0x3f0000) == 0x80000) ||
   47030                                             ((instr & 0x3f0000) == 0x100000) ||
   47031                                             ((instr & 0x3f0000) == 0x200000)) {
   47032                                           UnallocatedA32(instr);
   47033                                           return;
   47034                                         }
   47035                                         DataType dt =
   47036                                             Dt_imm6_4_Decode((instr >> 19) &
   47037                                                                  0x7,
   47038                                                              (instr >> 24) &
   47039                                                                  0x1);
   47040                                         if (dt.Is(kDataTypeValueInvalid)) {
   47041                                           UnallocatedA32(instr);
   47042                                           return;
   47043                                         }
   47044                                         if (((instr >> 12) & 1) != 0) {
   47045                                           UnallocatedA32(instr);
   47046                                           return;
   47047                                         }
   47048                                         unsigned rd =
   47049                                             ExtractQRegister(instr, 22, 12);
   47050                                         unsigned rm =
   47051                                             ExtractDRegister(instr, 5, 0);
   47052                                         uint32_t imm6 = (instr >> 16) & 0x3f;
   47053                                         uint32_t imm = imm6 - dt.GetSize();
   47054                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   47055                                         vshll(al,
   47056                                               dt,
   47057                                               QRegister(rd),
   47058                                               DRegister(rm),
   47059                                               imm);
   47060                                         break;
   47061                                       }
   47062                                       case 0x003a0000: {
   47063                                         // 0xf2ba0a10
   47064                                         if (((instr & 0x380000) == 0x0) ||
   47065                                             ((instr & 0x3f0000) == 0x80000) ||
   47066                                             ((instr & 0x3f0000) == 0x100000) ||
   47067                                             ((instr & 0x3f0000) == 0x200000)) {
   47068                                           UnallocatedA32(instr);
   47069                                           return;
   47070                                         }
   47071                                         DataType dt =
   47072                                             Dt_imm6_4_Decode((instr >> 19) &
   47073                                                                  0x7,
   47074                                                              (instr >> 24) &
   47075                                                                  0x1);
   47076                                         if (dt.Is(kDataTypeValueInvalid)) {
   47077                                           UnallocatedA32(instr);
   47078                                           return;
   47079                                         }
   47080                                         if (((instr >> 12) & 1) != 0) {
   47081                                           UnallocatedA32(instr);
   47082                                           return;
   47083                                         }
   47084                                         unsigned rd =
   47085                                             ExtractQRegister(instr, 22, 12);
   47086                                         unsigned rm =
   47087                                             ExtractDRegister(instr, 5, 0);
   47088                                         uint32_t imm6 = (instr >> 16) & 0x3f;
   47089                                         uint32_t imm = imm6 - dt.GetSize();
   47090                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   47091                                         vshll(al,
   47092                                               dt,
   47093                                               QRegister(rd),
   47094                                               DRegister(rm),
   47095                                               imm);
   47096                                         break;
   47097                                       }
   47098                                       case 0x003b0000: {
   47099                                         // 0xf2bb0a10
   47100                                         if (((instr & 0x380000) == 0x0) ||
   47101                                             ((instr & 0x3f0000) == 0x80000) ||
   47102                                             ((instr & 0x3f0000) == 0x100000) ||
   47103                                             ((instr & 0x3f0000) == 0x200000)) {
   47104                                           UnallocatedA32(instr);
   47105                                           return;
   47106                                         }
   47107                                         DataType dt =
   47108                                             Dt_imm6_4_Decode((instr >> 19) &
   47109                                                                  0x7,
   47110                                                              (instr >> 24) &
   47111                                                                  0x1);
   47112                                         if (dt.Is(kDataTypeValueInvalid)) {
   47113                                           UnallocatedA32(instr);
   47114                                           return;
   47115                                         }
   47116                                         if (((instr >> 12) & 1) != 0) {
   47117                                           UnallocatedA32(instr);
   47118                                           return;
   47119                                         }
   47120                                         unsigned rd =
   47121                                             ExtractQRegister(instr, 22, 12);
   47122                                         unsigned rm =
   47123                                             ExtractDRegister(instr, 5, 0);
   47124                                         uint32_t imm6 = (instr >> 16) & 0x3f;
   47125                                         uint32_t imm = imm6 - dt.GetSize();
   47126                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   47127                                         vshll(al,
   47128                                               dt,
   47129                                               QRegister(rd),
   47130                                               DRegister(rm),
   47131                                               imm);
   47132                                         break;
   47133                                       }
   47134                                       case 0x003c0000: {
   47135                                         // 0xf2bc0a10
   47136                                         if (((instr & 0x380000) == 0x0) ||
   47137                                             ((instr & 0x3f0000) == 0x80000) ||
   47138                                             ((instr & 0x3f0000) == 0x100000) ||
   47139                                             ((instr & 0x3f0000) == 0x200000)) {
   47140                                           UnallocatedA32(instr);
   47141                                           return;
   47142                                         }
   47143                                         DataType dt =
   47144                                             Dt_imm6_4_Decode((instr >> 19) &
   47145                                                                  0x7,
   47146                                                              (instr >> 24) &
   47147                                                                  0x1);
   47148                                         if (dt.Is(kDataTypeValueInvalid)) {
   47149                                           UnallocatedA32(instr);
   47150                                           return;
   47151                                         }
   47152                                         if (((instr >> 12) & 1) != 0) {
   47153                                           UnallocatedA32(instr);
   47154                                           return;
   47155                                         }
   47156                                         unsigned rd =
   47157                                             ExtractQRegister(instr, 22, 12);
   47158                                         unsigned rm =
   47159                                             ExtractDRegister(instr, 5, 0);
   47160                                         uint32_t imm6 = (instr >> 16) & 0x3f;
   47161                                         uint32_t imm = imm6 - dt.GetSize();
   47162                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   47163                                         vshll(al,
   47164                                               dt,
   47165                                               QRegister(rd),
   47166                                               DRegister(rm),
   47167                                               imm);
   47168                                         break;
   47169                                       }
   47170                                       case 0x003d0000: {
   47171                                         // 0xf2bd0a10
   47172                                         if (((instr & 0x380000) == 0x0) ||
   47173                                             ((instr & 0x3f0000) == 0x80000) ||
   47174                                             ((instr & 0x3f0000) == 0x100000) ||
   47175                                             ((instr & 0x3f0000) == 0x200000)) {
   47176                                           UnallocatedA32(instr);
   47177                                           return;
   47178                                         }
   47179                                         DataType dt =
   47180                                             Dt_imm6_4_Decode((instr >> 19) &
   47181                                                                  0x7,
   47182                                                              (instr >> 24) &
   47183                                                                  0x1);
   47184                                         if (dt.Is(kDataTypeValueInvalid)) {
   47185                                           UnallocatedA32(instr);
   47186                                           return;
   47187                                         }
   47188                                         if (((instr >> 12) & 1) != 0) {
   47189                                           UnallocatedA32(instr);
   47190                                           return;
   47191                                         }
   47192                                         unsigned rd =
   47193                                             ExtractQRegister(instr, 22, 12);
   47194                                         unsigned rm =
   47195                                             ExtractDRegister(instr, 5, 0);
   47196                                         uint32_t imm6 = (instr >> 16) & 0x3f;
   47197                                         uint32_t imm = imm6 - dt.GetSize();
   47198                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   47199                                         vshll(al,
   47200                                               dt,
   47201                                               QRegister(rd),
   47202                                               DRegister(rm),
   47203                                               imm);
   47204                                         break;
   47205                                       }
   47206                                       case 0x003e0000: {
   47207                                         // 0xf2be0a10
   47208                                         if (((instr & 0x380000) == 0x0) ||
   47209                                             ((instr & 0x3f0000) == 0x80000) ||
   47210                                             ((instr & 0x3f0000) == 0x100000) ||
   47211                                             ((instr & 0x3f0000) == 0x200000)) {
   47212                                           UnallocatedA32(instr);
   47213                                           return;
   47214                                         }
   47215                                         DataType dt =
   47216                                             Dt_imm6_4_Decode((instr >> 19) &
   47217                                                                  0x7,
   47218                                                              (instr >> 24) &
   47219                                                                  0x1);
   47220                                         if (dt.Is(kDataTypeValueInvalid)) {
   47221                                           UnallocatedA32(instr);
   47222                                           return;
   47223                                         }
   47224                                         if (((instr >> 12) & 1) != 0) {
   47225                                           UnallocatedA32(instr);
   47226                                           return;
   47227                                         }
   47228                                         unsigned rd =
   47229                                             ExtractQRegister(instr, 22, 12);
   47230                                         unsigned rm =
   47231                                             ExtractDRegister(instr, 5, 0);
   47232                                         uint32_t imm6 = (instr >> 16) & 0x3f;
   47233                                         uint32_t imm = imm6 - dt.GetSize();
   47234                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   47235                                         vshll(al,
   47236                                               dt,
   47237                                               QRegister(rd),
   47238                                               DRegister(rm),
   47239                                               imm);
   47240                                         break;
   47241                                       }
   47242                                       case 0x003f0000: {
   47243                                         // 0xf2bf0a10
   47244                                         if (((instr & 0x380000) == 0x0) ||
   47245                                             ((instr & 0x3f0000) == 0x80000) ||
   47246                                             ((instr & 0x3f0000) == 0x100000) ||
   47247                                             ((instr & 0x3f0000) == 0x200000)) {
   47248                                           UnallocatedA32(instr);
   47249                                           return;
   47250                                         }
   47251                                         DataType dt =
   47252                                             Dt_imm6_4_Decode((instr >> 19) &
   47253                                                                  0x7,
   47254                                                              (instr >> 24) &
   47255                                                                  0x1);
   47256                                         if (dt.Is(kDataTypeValueInvalid)) {
   47257                                           UnallocatedA32(instr);
   47258                                           return;
   47259                                         }
   47260                                         if (((instr >> 12) & 1) != 0) {
   47261                                           UnallocatedA32(instr);
   47262                                           return;
   47263                                         }
   47264                                         unsigned rd =
   47265                                             ExtractQRegister(instr, 22, 12);
   47266                                         unsigned rm =
   47267                                             ExtractDRegister(instr, 5, 0);
   47268                                         uint32_t imm6 = (instr >> 16) & 0x3f;
   47269                                         uint32_t imm = imm6 - dt.GetSize();
   47270                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   47271                                         vshll(al,
   47272                                               dt,
   47273                                               QRegister(rd),
   47274                                               DRegister(rm),
   47275                                               imm);
   47276                                         break;
   47277                                       }
   47278                                       default:
   47279                                         UnallocatedA32(instr);
   47280                                         break;
   47281                                     }
   47282                                     break;
   47283                                   }
   47284                                   default: {
   47285                                     if (((instr & 0x380000) == 0x0) ||
   47286                                         ((instr & 0x3f0000) == 0x80000) ||
   47287                                         ((instr & 0x3f0000) == 0x100000) ||
   47288                                         ((instr & 0x3f0000) == 0x200000)) {
   47289                                       UnallocatedA32(instr);
   47290                                       return;
   47291                                     }
   47292                                     DataType dt =
   47293                                         Dt_imm6_4_Decode((instr >> 19) & 0x7,
   47294                                                          (instr >> 24) & 0x1);
   47295                                     if (dt.Is(kDataTypeValueInvalid)) {
   47296                                       UnallocatedA32(instr);
   47297                                       return;
   47298                                     }
   47299                                     if (((instr >> 12) & 1) != 0) {
   47300                                       UnallocatedA32(instr);
   47301                                       return;
   47302                                     }
   47303                                     unsigned rd =
   47304                                         ExtractQRegister(instr, 22, 12);
   47305                                     unsigned rm = ExtractDRegister(instr, 5, 0);
   47306                                     uint32_t imm6 = (instr >> 16) & 0x3f;
   47307                                     uint32_t imm = imm6 - dt.GetSize();
   47308                                     // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   47309                                     vshll(al,
   47310                                           dt,
   47311                                           QRegister(rd),
   47312                                           DRegister(rm),
   47313                                           imm);
   47314                                     break;
   47315                                   }
   47316                                 }
   47317                                 break;
   47318                               }
   47319                               default:
   47320                                 UnallocatedA32(instr);
   47321                                 break;
   47322                             }
   47323                             break;
   47324                           }
   47325                         }
   47326                         break;
   47327                       }
   47328                       default:
   47329                         UnallocatedA32(instr);
   47330                         break;
   47331                     }
   47332                     break;
   47333                   }
   47334                   case 0x00000c00: {
   47335                     // 0xf2800c10
   47336                     switch (instr & 0x00000080) {
   47337                       case 0x00000000: {
   47338                         // 0xf2800c10
   47339                         switch (instr & 0x00200000) {
   47340                           case 0x00000000: {
   47341                             // 0xf2800c10
   47342                             switch (instr & 0x00180000) {
   47343                               case 0x00000000: {
   47344                                 // 0xf2800c10
   47345                                 switch (instr & 0x00000300) {
   47346                                   case 0x00000200: {
   47347                                     // 0xf2800e10
   47348                                     if (((instr & 0x920) == 0x100) ||
   47349                                         ((instr & 0x520) == 0x100) ||
   47350                                         ((instr & 0x820) == 0x20) ||
   47351                                         ((instr & 0x420) == 0x20) ||
   47352                                         ((instr & 0x220) == 0x20) ||
   47353                                         ((instr & 0x120) == 0x120)) {
   47354                                       UnallocatedA32(instr);
   47355                                       return;
   47356                                     }
   47357                                     unsigned cmode = ((instr >> 8) & 0xf) |
   47358                                                      ((instr >> 1) & 0x10);
   47359                                     DataType dt =
   47360                                         ImmediateVmov::DecodeDt(cmode);
   47361                                     if (dt.Is(kDataTypeValueInvalid)) {
   47362                                       UnallocatedA32(instr);
   47363                                       return;
   47364                                     }
   47365                                     unsigned rd =
   47366                                         ExtractDRegister(instr, 22, 12);
   47367                                     DOperand imm =
   47368                                         ImmediateVmov::DecodeImmediate(
   47369                                             cmode,
   47370                                             (instr & 0xf) |
   47371                                                 ((instr >> 12) & 0x70) |
   47372                                                 ((instr >> 17) & 0x80));
   47373                                     // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1
   47374                                     vmov(al, dt, DRegister(rd), imm);
   47375                                     break;
   47376                                   }
   47377                                   case 0x00000300: {
   47378                                     // 0xf2800f10
   47379                                     if (((instr & 0x920) == 0x100) ||
   47380                                         ((instr & 0x520) == 0x100) ||
   47381                                         ((instr & 0x820) == 0x20) ||
   47382                                         ((instr & 0x420) == 0x20) ||
   47383                                         ((instr & 0x220) == 0x20) ||
   47384                                         ((instr & 0x120) == 0x120)) {
   47385                                       UnallocatedA32(instr);
   47386                                       return;
   47387                                     }
   47388                                     unsigned cmode = ((instr >> 8) & 0xf) |
   47389                                                      ((instr >> 1) & 0x10);
   47390                                     DataType dt =
   47391                                         ImmediateVmov::DecodeDt(cmode);
   47392                                     if (dt.Is(kDataTypeValueInvalid)) {
   47393                                       UnallocatedA32(instr);
   47394                                       return;
   47395                                     }
   47396                                     unsigned rd =
   47397                                         ExtractDRegister(instr, 22, 12);
   47398                                     DOperand imm =
   47399                                         ImmediateVmov::DecodeImmediate(
   47400                                             cmode,
   47401                                             (instr & 0xf) |
   47402                                                 ((instr >> 12) & 0x70) |
   47403                                                 ((instr >> 17) & 0x80));
   47404                                     // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1
   47405                                     vmov(al, dt, DRegister(rd), imm);
   47406                                     break;
   47407                                   }
   47408                                   default: {
   47409                                     switch (instr & 0x00000020) {
   47410                                       case 0x00000020: {
   47411                                         // 0xf2800c30
   47412                                         switch (instr & 0x00000f20) {
   47413                                           case 0x00000000: {
   47414                                             // 0xf2800c10
   47415                                             if (((instr & 0x920) == 0x100) ||
   47416                                                 ((instr & 0x520) == 0x100) ||
   47417                                                 ((instr & 0x820) == 0x20) ||
   47418                                                 ((instr & 0x420) == 0x20) ||
   47419                                                 ((instr & 0x220) == 0x20) ||
   47420                                                 ((instr & 0x120) == 0x120)) {
   47421                                               UnallocatedA32(instr);
   47422                                               return;
   47423                                             }
   47424                                             unsigned cmode =
   47425                                                 ((instr >> 8) & 0xf) |
   47426                                                 ((instr >> 1) & 0x10);
   47427                                             DataType dt =
   47428                                                 ImmediateVmov::DecodeDt(cmode);
   47429                                             if (dt.Is(kDataTypeValueInvalid)) {
   47430                                               UnallocatedA32(instr);
   47431                                               return;
   47432                                             }
   47433                                             unsigned rd =
   47434                                                 ExtractDRegister(instr, 22, 12);
   47435                                             DOperand imm =
   47436                                                 ImmediateVmov::DecodeImmediate(
   47437                                                     cmode,
   47438                                                     (instr & 0xf) |
   47439                                                         ((instr >> 12) & 0x70) |
   47440                                                         ((instr >> 17) & 0x80));
   47441                                             // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
   47442                                             vmov(al, dt, DRegister(rd), imm);
   47443                                             break;
   47444                                           }
   47445                                           case 0x00000020: {
   47446                                             // 0xf2800c30
   47447                                             if (((instr & 0xd00) == 0x100) ||
   47448                                                 ((instr & 0xd00) == 0x500) ||
   47449                                                 ((instr & 0xd00) == 0x900) ||
   47450                                                 ((instr & 0xe00) == 0xe00)) {
   47451                                               UnallocatedA32(instr);
   47452                                               return;
   47453                                             }
   47454                                             unsigned cmode = (instr >> 8) & 0xf;
   47455                                             DataType dt =
   47456                                                 ImmediateVmvn::DecodeDt(cmode);
   47457                                             if (dt.Is(kDataTypeValueInvalid)) {
   47458                                               UnallocatedA32(instr);
   47459                                               return;
   47460                                             }
   47461                                             unsigned rd =
   47462                                                 ExtractDRegister(instr, 22, 12);
   47463                                             DOperand imm =
   47464                                                 ImmediateVmvn::DecodeImmediate(
   47465                                                     cmode,
   47466                                                     (instr & 0xf) |
   47467                                                         ((instr >> 12) & 0x70) |
   47468                                                         ((instr >> 17) & 0x80));
   47469                                             // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
   47470                                             vmvn(al, dt, DRegister(rd), imm);
   47471                                             break;
   47472                                           }
   47473                                           case 0x00000200: {
   47474                                             // 0xf2800e10
   47475                                             if (((instr & 0x920) == 0x100) ||
   47476                                                 ((instr & 0x520) == 0x100) ||
   47477                                                 ((instr & 0x820) == 0x20) ||
   47478                                                 ((instr & 0x420) == 0x20) ||
   47479                                                 ((instr & 0x220) == 0x20) ||
   47480                                                 ((instr & 0x120) == 0x120)) {
   47481                                               UnallocatedA32(instr);
   47482                                               return;
   47483                                             }
   47484                                             unsigned cmode =
   47485                                                 ((instr >> 8) & 0xf) |
   47486                                                 ((instr >> 1) & 0x10);
   47487                                             DataType dt =
   47488                                                 ImmediateVmov::DecodeDt(cmode);
   47489                                             if (dt.Is(kDataTypeValueInvalid)) {
   47490                                               UnallocatedA32(instr);
   47491                                               return;
   47492                                             }
   47493                                             unsigned rd =
   47494                                                 ExtractDRegister(instr, 22, 12);
   47495                                             DOperand imm =
   47496                                                 ImmediateVmov::DecodeImmediate(
   47497                                                     cmode,
   47498                                                     (instr & 0xf) |
   47499                                                         ((instr >> 12) & 0x70) |
   47500                                                         ((instr >> 17) & 0x80));
   47501                                             // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
   47502                                             vmov(al, dt, DRegister(rd), imm);
   47503                                             break;
   47504                                           }
   47505                                           case 0x00000220: {
   47506                                             // 0xf2800e30
   47507                                             if (((instr & 0xd00) == 0x100) ||
   47508                                                 ((instr & 0xd00) == 0x500) ||
   47509                                                 ((instr & 0xd00) == 0x900) ||
   47510                                                 ((instr & 0xe00) == 0xe00)) {
   47511                                               UnallocatedA32(instr);
   47512                                               return;
   47513                                             }
   47514                                             unsigned cmode = (instr >> 8) & 0xf;
   47515                                             DataType dt =
   47516                                                 ImmediateVmvn::DecodeDt(cmode);
   47517                                             if (dt.Is(kDataTypeValueInvalid)) {
   47518                                               UnallocatedA32(instr);
   47519                                               return;
   47520                                             }
   47521                                             unsigned rd =
   47522                                                 ExtractDRegister(instr, 22, 12);
   47523                                             DOperand imm =
   47524                                                 ImmediateVmvn::DecodeImmediate(
   47525                                                     cmode,
   47526                                                     (instr & 0xf) |
   47527                                                         ((instr >> 12) & 0x70) |
   47528                                                         ((instr >> 17) & 0x80));
   47529                                             // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
   47530                                             vmvn(al, dt, DRegister(rd), imm);
   47531                                             break;
   47532                                           }
   47533                                           case 0x00000400: {
   47534                                             // 0xf2800c10
   47535                                             if (((instr & 0x920) == 0x100) ||
   47536                                                 ((instr & 0x520) == 0x100) ||
   47537                                                 ((instr & 0x820) == 0x20) ||
   47538                                                 ((instr & 0x420) == 0x20) ||
   47539                                                 ((instr & 0x220) == 0x20) ||
   47540                                                 ((instr & 0x120) == 0x120)) {
   47541                                               UnallocatedA32(instr);
   47542                                               return;
   47543                                             }
   47544                                             unsigned cmode =
   47545                                                 ((instr >> 8) & 0xf) |
   47546                                                 ((instr >> 1) & 0x10);
   47547                                             DataType dt =
   47548                                                 ImmediateVmov::DecodeDt(cmode);
   47549                                             if (dt.Is(kDataTypeValueInvalid)) {
   47550                                               UnallocatedA32(instr);
   47551                                               return;
   47552                                             }
   47553                                             unsigned rd =
   47554                                                 ExtractDRegister(instr, 22, 12);
   47555                                             DOperand imm =
   47556                                                 ImmediateVmov::DecodeImmediate(
   47557                                                     cmode,
   47558                                                     (instr & 0xf) |
   47559                                                         ((instr >> 12) & 0x70) |
   47560                                                         ((instr >> 17) & 0x80));
   47561                                             // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
   47562                                             vmov(al, dt, DRegister(rd), imm);
   47563                                             break;
   47564                                           }
   47565                                           case 0x00000420: {
   47566                                             // 0xf2800c30
   47567                                             if (((instr & 0xd00) == 0x100) ||
   47568                                                 ((instr & 0xd00) == 0x500) ||
   47569                                                 ((instr & 0xd00) == 0x900) ||
   47570                                                 ((instr & 0xe00) == 0xe00)) {
   47571                                               UnallocatedA32(instr);
   47572                                               return;
   47573                                             }
   47574                                             unsigned cmode = (instr >> 8) & 0xf;
   47575                                             DataType dt =
   47576                                                 ImmediateVmvn::DecodeDt(cmode);
   47577                                             if (dt.Is(kDataTypeValueInvalid)) {
   47578                                               UnallocatedA32(instr);
   47579                                               return;
   47580                                             }
   47581                                             unsigned rd =
   47582                                                 ExtractDRegister(instr, 22, 12);
   47583                                             DOperand imm =
   47584                                                 ImmediateVmvn::DecodeImmediate(
   47585                                                     cmode,
   47586                                                     (instr & 0xf) |
   47587                                                         ((instr >> 12) & 0x70) |
   47588                                                         ((instr >> 17) & 0x80));
   47589                                             // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
   47590                                             vmvn(al, dt, DRegister(rd), imm);
   47591                                             break;
   47592                                           }
   47593                                           case 0x00000600: {
   47594                                             // 0xf2800e10
   47595                                             if (((instr & 0x920) == 0x100) ||
   47596                                                 ((instr & 0x520) == 0x100) ||
   47597                                                 ((instr & 0x820) == 0x20) ||
   47598                                                 ((instr & 0x420) == 0x20) ||
   47599                                                 ((instr & 0x220) == 0x20) ||
   47600                                                 ((instr & 0x120) == 0x120)) {
   47601                                               UnallocatedA32(instr);
   47602                                               return;
   47603                                             }
   47604                                             unsigned cmode =
   47605                                                 ((instr >> 8) & 0xf) |
   47606                                                 ((instr >> 1) & 0x10);
   47607                                             DataType dt =
   47608                                                 ImmediateVmov::DecodeDt(cmode);
   47609                                             if (dt.Is(kDataTypeValueInvalid)) {
   47610                                               UnallocatedA32(instr);
   47611                                               return;
   47612                                             }
   47613                                             unsigned rd =
   47614                                                 ExtractDRegister(instr, 22, 12);
   47615                                             DOperand imm =
   47616                                                 ImmediateVmov::DecodeImmediate(
   47617                                                     cmode,
   47618                                                     (instr & 0xf) |
   47619                                                         ((instr >> 12) & 0x70) |
   47620                                                         ((instr >> 17) & 0x80));
   47621                                             // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
   47622                                             vmov(al, dt, DRegister(rd), imm);
   47623                                             break;
   47624                                           }
   47625                                           case 0x00000620: {
   47626                                             // 0xf2800e30
   47627                                             if (((instr & 0xd00) == 0x100) ||
   47628                                                 ((instr & 0xd00) == 0x500) ||
   47629                                                 ((instr & 0xd00) == 0x900) ||
   47630                                                 ((instr & 0xe00) == 0xe00)) {
   47631                                               UnallocatedA32(instr);
   47632                                               return;
   47633                                             }
   47634                                             unsigned cmode = (instr >> 8) & 0xf;
   47635                                             DataType dt =
   47636                                                 ImmediateVmvn::DecodeDt(cmode);
   47637                                             if (dt.Is(kDataTypeValueInvalid)) {
   47638                                               UnallocatedA32(instr);
   47639                                               return;
   47640                                             }
   47641                                             unsigned rd =
   47642                                                 ExtractDRegister(instr, 22, 12);
   47643                                             DOperand imm =
   47644                                                 ImmediateVmvn::DecodeImmediate(
   47645                                                     cmode,
   47646                                                     (instr & 0xf) |
   47647                                                         ((instr >> 12) & 0x70) |
   47648                                                         ((instr >> 17) & 0x80));
   47649                                             // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
   47650                                             vmvn(al, dt, DRegister(rd), imm);
   47651                                             break;
   47652                                           }
   47653                                           case 0x00000800: {
   47654                                             // 0xf2800c10
   47655                                             if (((instr & 0x920) == 0x100) ||
   47656                                                 ((instr & 0x520) == 0x100) ||
   47657                                                 ((instr & 0x820) == 0x20) ||
   47658                                                 ((instr & 0x420) == 0x20) ||
   47659                                                 ((instr & 0x220) == 0x20) ||
   47660                                                 ((instr & 0x120) == 0x120)) {
   47661                                               UnallocatedA32(instr);
   47662                                               return;
   47663                                             }
   47664                                             unsigned cmode =
   47665                                                 ((instr >> 8) & 0xf) |
   47666                                                 ((instr >> 1) & 0x10);
   47667                                             DataType dt =
   47668                                                 ImmediateVmov::DecodeDt(cmode);
   47669                                             if (dt.Is(kDataTypeValueInvalid)) {
   47670                                               UnallocatedA32(instr);
   47671                                               return;
   47672                                             }
   47673                                             unsigned rd =
   47674                                                 ExtractDRegister(instr, 22, 12);
   47675                                             DOperand imm =
   47676                                                 ImmediateVmov::DecodeImmediate(
   47677                                                     cmode,
   47678                                                     (instr & 0xf) |
   47679                                                         ((instr >> 12) & 0x70) |
   47680                                                         ((instr >> 17) & 0x80));
   47681                                             // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
   47682                                             vmov(al, dt, DRegister(rd), imm);
   47683                                             break;
   47684                                           }
   47685                                           case 0x00000820: {
   47686                                             // 0xf2800c30
   47687                                             if (((instr & 0xd00) == 0x100) ||
   47688                                                 ((instr & 0xd00) == 0x500) ||
   47689                                                 ((instr & 0xd00) == 0x900) ||
   47690                                                 ((instr & 0xe00) == 0xe00)) {
   47691                                               UnallocatedA32(instr);
   47692                                               return;
   47693                                             }
   47694                                             unsigned cmode = (instr >> 8) & 0xf;
   47695                                             DataType dt =
   47696                                                 ImmediateVmvn::DecodeDt(cmode);
   47697                                             if (dt.Is(kDataTypeValueInvalid)) {
   47698                                               UnallocatedA32(instr);
   47699                                               return;
   47700                                             }
   47701                                             unsigned rd =
   47702                                                 ExtractDRegister(instr, 22, 12);
   47703                                             DOperand imm =
   47704                                                 ImmediateVmvn::DecodeImmediate(
   47705                                                     cmode,
   47706                                                     (instr & 0xf) |
   47707                                                         ((instr >> 12) & 0x70) |
   47708                                                         ((instr >> 17) & 0x80));
   47709                                             // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
   47710                                             vmvn(al, dt, DRegister(rd), imm);
   47711                                             break;
   47712                                           }
   47713                                           case 0x00000a00: {
   47714                                             // 0xf2800e10
   47715                                             if (((instr & 0x920) == 0x100) ||
   47716                                                 ((instr & 0x520) == 0x100) ||
   47717                                                 ((instr & 0x820) == 0x20) ||
   47718                                                 ((instr & 0x420) == 0x20) ||
   47719                                                 ((instr & 0x220) == 0x20) ||
   47720                                                 ((instr & 0x120) == 0x120)) {
   47721                                               UnallocatedA32(instr);
   47722                                               return;
   47723                                             }
   47724                                             unsigned cmode =
   47725                                                 ((instr >> 8) & 0xf) |
   47726                                                 ((instr >> 1) & 0x10);
   47727                                             DataType dt =
   47728                                                 ImmediateVmov::DecodeDt(cmode);
   47729                                             if (dt.Is(kDataTypeValueInvalid)) {
   47730                                               UnallocatedA32(instr);
   47731                                               return;
   47732                                             }
   47733                                             unsigned rd =
   47734                                                 ExtractDRegister(instr, 22, 12);
   47735                                             DOperand imm =
   47736                                                 ImmediateVmov::DecodeImmediate(
   47737                                                     cmode,
   47738                                                     (instr & 0xf) |
   47739                                                         ((instr >> 12) & 0x70) |
   47740                                                         ((instr >> 17) & 0x80));
   47741                                             // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
   47742                                             vmov(al, dt, DRegister(rd), imm);
   47743                                             break;
   47744                                           }
   47745                                           case 0x00000a20: {
   47746                                             // 0xf2800e30
   47747                                             if (((instr & 0xd00) == 0x100) ||
   47748                                                 ((instr & 0xd00) == 0x500) ||
   47749                                                 ((instr & 0xd00) == 0x900) ||
   47750                                                 ((instr & 0xe00) == 0xe00)) {
   47751                                               UnallocatedA32(instr);
   47752                                               return;
   47753                                             }
   47754                                             unsigned cmode = (instr >> 8) & 0xf;
   47755                                             DataType dt =
   47756                                                 ImmediateVmvn::DecodeDt(cmode);
   47757                                             if (dt.Is(kDataTypeValueInvalid)) {
   47758                                               UnallocatedA32(instr);
   47759                                               return;
   47760                                             }
   47761                                             unsigned rd =
   47762                                                 ExtractDRegister(instr, 22, 12);
   47763                                             DOperand imm =
   47764                                                 ImmediateVmvn::DecodeImmediate(
   47765                                                     cmode,
   47766                                                     (instr & 0xf) |
   47767                                                         ((instr >> 12) & 0x70) |
   47768                                                         ((instr >> 17) & 0x80));
   47769                                             // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
   47770                                             vmvn(al, dt, DRegister(rd), imm);
   47771                                             break;
   47772                                           }
   47773                                           case 0x00000c00: {
   47774                                             // 0xf2800c10
   47775                                             if (((instr & 0x920) == 0x100) ||
   47776                                                 ((instr & 0x520) == 0x100) ||
   47777                                                 ((instr & 0x820) == 0x20) ||
   47778                                                 ((instr & 0x420) == 0x20) ||
   47779                                                 ((instr & 0x220) == 0x20) ||
   47780                                                 ((instr & 0x120) == 0x120)) {
   47781                                               UnallocatedA32(instr);
   47782                                               return;
   47783                                             }
   47784                                             unsigned cmode =
   47785                                                 ((instr >> 8) & 0xf) |
   47786                                                 ((instr >> 1) & 0x10);
   47787                                             DataType dt =
   47788                                                 ImmediateVmov::DecodeDt(cmode);
   47789                                             if (dt.Is(kDataTypeValueInvalid)) {
   47790                                               UnallocatedA32(instr);
   47791                                               return;
   47792                                             }
   47793                                             unsigned rd =
   47794                                                 ExtractDRegister(instr, 22, 12);
   47795                                             DOperand imm =
   47796                                                 ImmediateVmov::DecodeImmediate(
   47797                                                     cmode,
   47798                                                     (instr & 0xf) |
   47799                                                         ((instr >> 12) & 0x70) |
   47800                                                         ((instr >> 17) & 0x80));
   47801                                             // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
   47802                                             vmov(al, dt, DRegister(rd), imm);
   47803                                             break;
   47804                                           }
   47805                                           case 0x00000c20: {
   47806                                             // 0xf2800c30
   47807                                             if (((instr & 0xd00) == 0x100) ||
   47808                                                 ((instr & 0xd00) == 0x500) ||
   47809                                                 ((instr & 0xd00) == 0x900) ||
   47810                                                 ((instr & 0xe00) == 0xe00)) {
   47811                                               UnallocatedA32(instr);
   47812                                               return;
   47813                                             }
   47814                                             unsigned cmode = (instr >> 8) & 0xf;
   47815                                             DataType dt =
   47816                                                 ImmediateVmvn::DecodeDt(cmode);
   47817                                             if (dt.Is(kDataTypeValueInvalid)) {
   47818                                               UnallocatedA32(instr);
   47819                                               return;
   47820                                             }
   47821                                             unsigned rd =
   47822                                                 ExtractDRegister(instr, 22, 12);
   47823                                             DOperand imm =
   47824                                                 ImmediateVmvn::DecodeImmediate(
   47825                                                     cmode,
   47826                                                     (instr & 0xf) |
   47827                                                         ((instr >> 12) & 0x70) |
   47828                                                         ((instr >> 17) & 0x80));
   47829                                             // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
   47830                                             vmvn(al, dt, DRegister(rd), imm);
   47831                                             break;
   47832                                           }
   47833                                           case 0x00000d00: {
   47834                                             // 0xf2800d10
   47835                                             if (((instr & 0x920) == 0x100) ||
   47836                                                 ((instr & 0x520) == 0x100) ||
   47837                                                 ((instr & 0x820) == 0x20) ||
   47838                                                 ((instr & 0x420) == 0x20) ||
   47839                                                 ((instr & 0x220) == 0x20) ||
   47840                                                 ((instr & 0x120) == 0x120)) {
   47841                                               UnallocatedA32(instr);
   47842                                               return;
   47843                                             }
   47844                                             unsigned cmode =
   47845                                                 ((instr >> 8) & 0xf) |
   47846                                                 ((instr >> 1) & 0x10);
   47847                                             DataType dt =
   47848                                                 ImmediateVmov::DecodeDt(cmode);
   47849                                             if (dt.Is(kDataTypeValueInvalid)) {
   47850                                               UnallocatedA32(instr);
   47851                                               return;
   47852                                             }
   47853                                             unsigned rd =
   47854                                                 ExtractDRegister(instr, 22, 12);
   47855                                             DOperand imm =
   47856                                                 ImmediateVmov::DecodeImmediate(
   47857                                                     cmode,
   47858                                                     (instr & 0xf) |
   47859                                                         ((instr >> 12) & 0x70) |
   47860                                                         ((instr >> 17) & 0x80));
   47861                                             // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
   47862                                             vmov(al, dt, DRegister(rd), imm);
   47863                                             break;
   47864                                           }
   47865                                           case 0x00000d20: {
   47866                                             // 0xf2800d30
   47867                                             if (((instr & 0xd00) == 0x100) ||
   47868                                                 ((instr & 0xd00) == 0x500) ||
   47869                                                 ((instr & 0xd00) == 0x900) ||
   47870                                                 ((instr & 0xe00) == 0xe00)) {
   47871                                               UnallocatedA32(instr);
   47872                                               return;
   47873                                             }
   47874                                             unsigned cmode = (instr >> 8) & 0xf;
   47875                                             DataType dt =
   47876                                                 ImmediateVmvn::DecodeDt(cmode);
   47877                                             if (dt.Is(kDataTypeValueInvalid)) {
   47878                                               UnallocatedA32(instr);
   47879                                               return;
   47880                                             }
   47881                                             unsigned rd =
   47882                                                 ExtractDRegister(instr, 22, 12);
   47883                                             DOperand imm =
   47884                                                 ImmediateVmvn::DecodeImmediate(
   47885                                                     cmode,
   47886                                                     (instr & 0xf) |
   47887                                                         ((instr >> 12) & 0x70) |
   47888                                                         ((instr >> 17) & 0x80));
   47889                                             // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
   47890                                             vmvn(al, dt, DRegister(rd), imm);
   47891                                             break;
   47892                                           }
   47893                                           case 0x00000e00: {
   47894                                             // 0xf2800e10
   47895                                             if (((instr & 0x920) == 0x100) ||
   47896                                                 ((instr & 0x520) == 0x100) ||
   47897                                                 ((instr & 0x820) == 0x20) ||
   47898                                                 ((instr & 0x420) == 0x20) ||
   47899                                                 ((instr & 0x220) == 0x20) ||
   47900                                                 ((instr & 0x120) == 0x120)) {
   47901                                               UnallocatedA32(instr);
   47902                                               return;
   47903                                             }
   47904                                             unsigned cmode =
   47905                                                 ((instr >> 8) & 0xf) |
   47906                                                 ((instr >> 1) & 0x10);
   47907                                             DataType dt =
   47908                                                 ImmediateVmov::DecodeDt(cmode);
   47909                                             if (dt.Is(kDataTypeValueInvalid)) {
   47910                                               UnallocatedA32(instr);
   47911                                               return;
   47912                                             }
   47913                                             unsigned rd =
   47914                                                 ExtractDRegister(instr, 22, 12);
   47915                                             DOperand imm =
   47916                                                 ImmediateVmov::DecodeImmediate(
   47917                                                     cmode,
   47918                                                     (instr & 0xf) |
   47919                                                         ((instr >> 12) & 0x70) |
   47920                                                         ((instr >> 17) & 0x80));
   47921                                             // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
   47922                                             vmov(al, dt, DRegister(rd), imm);
   47923                                             break;
   47924                                           }
   47925                                           case 0x00000e20: {
   47926                                             // 0xf2800e30
   47927                                             if (((instr & 0x920) == 0x100) ||
   47928                                                 ((instr & 0x520) == 0x100) ||
   47929                                                 ((instr & 0x820) == 0x20) ||
   47930                                                 ((instr & 0x420) == 0x20) ||
   47931                                                 ((instr & 0x220) == 0x20) ||
   47932                                                 ((instr & 0x120) == 0x120)) {
   47933                                               UnallocatedA32(instr);
   47934                                               return;
   47935                                             }
   47936                                             unsigned cmode =
   47937                                                 ((instr >> 8) & 0xf) |
   47938                                                 ((instr >> 1) & 0x10);
   47939                                             DataType dt =
   47940                                                 ImmediateVmov::DecodeDt(cmode);
   47941                                             if (dt.Is(kDataTypeValueInvalid)) {
   47942                                               UnallocatedA32(instr);
   47943                                               return;
   47944                                             }
   47945                                             unsigned rd =
   47946                                                 ExtractDRegister(instr, 22, 12);
   47947                                             DOperand imm =
   47948                                                 ImmediateVmov::DecodeImmediate(
   47949                                                     cmode,
   47950                                                     (instr & 0xf) |
   47951                                                         ((instr >> 12) & 0x70) |
   47952                                                         ((instr >> 17) & 0x80));
   47953                                             // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
   47954                                             vmov(al, dt, DRegister(rd), imm);
   47955                                             break;
   47956                                           }
   47957                                           case 0x00000f00: {
   47958                                             // 0xf2800f10
   47959                                             if (((instr & 0x920) == 0x100) ||
   47960                                                 ((instr & 0x520) == 0x100) ||
   47961                                                 ((instr & 0x820) == 0x20) ||
   47962                                                 ((instr & 0x420) == 0x20) ||
   47963                                                 ((instr & 0x220) == 0x20) ||
   47964                                                 ((instr & 0x120) == 0x120)) {
   47965                                               UnallocatedA32(instr);
   47966                                               return;
   47967                                             }
   47968                                             unsigned cmode =
   47969                                                 ((instr >> 8) & 0xf) |
   47970                                                 ((instr >> 1) & 0x10);
   47971                                             DataType dt =
   47972                                                 ImmediateVmov::DecodeDt(cmode);
   47973                                             if (dt.Is(kDataTypeValueInvalid)) {
   47974                                               UnallocatedA32(instr);
   47975                                               return;
   47976                                             }
   47977                                             unsigned rd =
   47978                                                 ExtractDRegister(instr, 22, 12);
   47979                                             DOperand imm =
   47980                                                 ImmediateVmov::DecodeImmediate(
   47981                                                     cmode,
   47982                                                     (instr & 0xf) |
   47983                                                         ((instr >> 12) & 0x70) |
   47984                                                         ((instr >> 17) & 0x80));
   47985                                             // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
   47986                                             vmov(al, dt, DRegister(rd), imm);
   47987                                             break;
   47988                                           }
   47989                                           default:
   47990                                             UnallocatedA32(instr);
   47991                                             break;
   47992                                         }
   47993                                         break;
   47994                                       }
   47995                                       default: {
   47996                                         if (((instr & 0x920) == 0x100) ||
   47997                                             ((instr & 0x520) == 0x100) ||
   47998                                             ((instr & 0x820) == 0x20) ||
   47999                                             ((instr & 0x420) == 0x20) ||
   48000                                             ((instr & 0x220) == 0x20) ||
   48001                                             ((instr & 0x120) == 0x120)) {
   48002                                           UnallocatedA32(instr);
   48003                                           return;
   48004                                         }
   48005                                         unsigned cmode = ((instr >> 8) & 0xf) |
   48006                                                          ((instr >> 1) & 0x10);
   48007                                         DataType dt =
   48008                                             ImmediateVmov::DecodeDt(cmode);
   48009                                         if (dt.Is(kDataTypeValueInvalid)) {
   48010                                           UnallocatedA32(instr);
   48011                                           return;
   48012                                         }
   48013                                         unsigned rd =
   48014                                             ExtractDRegister(instr, 22, 12);
   48015                                         DOperand imm =
   48016                                             ImmediateVmov::DecodeImmediate(
   48017                                                 cmode,
   48018                                                 (instr & 0xf) |
   48019                                                     ((instr >> 12) & 0x70) |
   48020                                                     ((instr >> 17) & 0x80));
   48021                                         // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1
   48022                                         vmov(al, dt, DRegister(rd), imm);
   48023                                         break;
   48024                                       }
   48025                                     }
   48026                                     break;
   48027                                   }
   48028                                 }
   48029                                 break;
   48030                               }
   48031                               default:
   48032                                 UnallocatedA32(instr);
   48033                                 break;
   48034                             }
   48035                             break;
   48036                           }
   48037                           default: {
   48038                             if ((instr & 0x00000200) == 0x00000200) {
   48039                               if (((instr & 0x200000) == 0x0)) {
   48040                                 UnallocatedA32(instr);
   48041                                 return;
   48042                               }
   48043                               DataType dt1 = Dt_op_U_1_Decode1(
   48044                                   ((instr >> 24) & 0x1) | ((instr >> 7) & 0x2));
   48045                               if (dt1.Is(kDataTypeValueInvalid)) {
   48046                                 UnallocatedA32(instr);
   48047                                 return;
   48048                               }
   48049                               DataType dt2 = Dt_op_U_1_Decode2(
   48050                                   ((instr >> 24) & 0x1) | ((instr >> 7) & 0x2));
   48051                               if (dt2.Is(kDataTypeValueInvalid)) {
   48052                                 UnallocatedA32(instr);
   48053                                 return;
   48054                               }
   48055                               unsigned rd = ExtractDRegister(instr, 22, 12);
   48056                               unsigned rm = ExtractDRegister(instr, 5, 0);
   48057                               uint32_t fbits = 64 - ((instr >> 16) & 0x3f);
   48058                               // VCVT{<c>}{<q>}.<dt>.<dt> <Dd>, <Dm>, #<fbits> ; A1 NOLINT(whitespace/line_length)
   48059                               vcvt(al,
   48060                                    dt1,
   48061                                    dt2,
   48062                                    DRegister(rd),
   48063                                    DRegister(rm),
   48064                                    fbits);
   48065                             } else {
   48066                               UnallocatedA32(instr);
   48067                             }
   48068                             break;
   48069                           }
   48070                         }
   48071                         break;
   48072                       }
   48073                       default:
   48074                         UnallocatedA32(instr);
   48075                         break;
   48076                     }
   48077                     break;
   48078                   }
   48079                 }
   48080                 break;
   48081               }
   48082               case 0x00000040: {
   48083                 // 0xf2800050
   48084                 switch (instr & 0x00000c00) {
   48085                   case 0x00000000: {
   48086                     // 0xf2800050
   48087                     switch (instr & 0x00380080) {
   48088                       case 0x00000000: {
   48089                         // 0xf2800050
   48090                         switch (instr & 0x00000100) {
   48091                           case 0x00000000: {
   48092                             // 0xf2800050
   48093                             switch (instr & 0x00000200) {
   48094                               default: {
   48095                                 switch (instr & 0x00000020) {
   48096                                   case 0x00000020: {
   48097                                     // 0xf2800070
   48098                                     if (((instr & 0xd00) == 0x100) ||
   48099                                         ((instr & 0xd00) == 0x500) ||
   48100                                         ((instr & 0xd00) == 0x900) ||
   48101                                         ((instr & 0xe00) == 0xe00)) {
   48102                                       UnallocatedA32(instr);
   48103                                       return;
   48104                                     }
   48105                                     unsigned cmode = (instr >> 8) & 0xf;
   48106                                     DataType dt =
   48107                                         ImmediateVmvn::DecodeDt(cmode);
   48108                                     if (dt.Is(kDataTypeValueInvalid)) {
   48109                                       UnallocatedA32(instr);
   48110                                       return;
   48111                                     }
   48112                                     if (((instr >> 12) & 1) != 0) {
   48113                                       UnallocatedA32(instr);
   48114                                       return;
   48115                                     }
   48116                                     unsigned rd =
   48117                                         ExtractQRegister(instr, 22, 12);
   48118                                     QOperand imm =
   48119                                         ImmediateVmvn::DecodeImmediate(
   48120                                             cmode,
   48121                                             (instr & 0xf) |
   48122                                                 ((instr >> 12) & 0x70) |
   48123                                                 ((instr >> 17) & 0x80));
   48124                                     // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1
   48125                                     vmvn(al, dt, QRegister(rd), imm);
   48126                                     break;
   48127                                   }
   48128                                   default: {
   48129                                     if (((instr & 0x920) == 0x100) ||
   48130                                         ((instr & 0x520) == 0x100) ||
   48131                                         ((instr & 0x820) == 0x20) ||
   48132                                         ((instr & 0x420) == 0x20) ||
   48133                                         ((instr & 0x220) == 0x20) ||
   48134                                         ((instr & 0x120) == 0x120)) {
   48135                                       UnallocatedA32(instr);
   48136                                       return;
   48137                                     }
   48138                                     unsigned cmode = ((instr >> 8) & 0xf) |
   48139                                                      ((instr >> 1) & 0x10);
   48140                                     DataType dt =
   48141                                         ImmediateVmov::DecodeDt(cmode);
   48142                                     if (dt.Is(kDataTypeValueInvalid)) {
   48143                                       UnallocatedA32(instr);
   48144                                       return;
   48145                                     }
   48146                                     if (((instr >> 12) & 1) != 0) {
   48147                                       UnallocatedA32(instr);
   48148                                       return;
   48149                                     }
   48150                                     unsigned rd =
   48151                                         ExtractQRegister(instr, 22, 12);
   48152                                     QOperand imm =
   48153                                         ImmediateVmov::DecodeImmediate(
   48154                                             cmode,
   48155                                             (instr & 0xf) |
   48156                                                 ((instr >> 12) & 0x70) |
   48157                                                 ((instr >> 17) & 0x80));
   48158                                     // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1
   48159                                     vmov(al, dt, QRegister(rd), imm);
   48160                                     break;
   48161                                   }
   48162                                 }
   48163                                 break;
   48164                               }
   48165                             }
   48166                             break;
   48167                           }
   48168                           case 0x00000100: {
   48169                             // 0xf2800150
   48170                             switch (instr & 0x00000020) {
   48171                               case 0x00000000: {
   48172                                 // 0xf2800150
   48173                                 if (((instr & 0x100) == 0x0) ||
   48174                                     ((instr & 0xc00) == 0xc00)) {
   48175                                   UnallocatedA32(instr);
   48176                                   return;
   48177                                 }
   48178                                 unsigned cmode = (instr >> 8) & 0xf;
   48179                                 DataType dt = ImmediateVorr::DecodeDt(cmode);
   48180                                 if (dt.Is(kDataTypeValueInvalid)) {
   48181                                   UnallocatedA32(instr);
   48182                                   return;
   48183                                 }
   48184                                 if (((instr >> 12) & 1) != 0) {
   48185                                   UnallocatedA32(instr);
   48186                                   return;
   48187                                 }
   48188                                 unsigned rd = ExtractQRegister(instr, 22, 12);
   48189                                 QOperand imm = ImmediateVorr::DecodeImmediate(
   48190                                     cmode,
   48191                                     (instr & 0xf) | ((instr >> 12) & 0x70) |
   48192                                         ((instr >> 17) & 0x80));
   48193                                 // VORR{<c>}{<q>}.<dt> {<Qdn>}, <Qdn>, #<imm> ; A1 NOLINT(whitespace/line_length)
   48194                                 vorr(al, dt, QRegister(rd), QRegister(rd), imm);
   48195                                 break;
   48196                               }
   48197                               case 0x00000020: {
   48198                                 // 0xf2800170
   48199                                 if (((instr & 0x100) == 0x0) ||
   48200                                     ((instr & 0xc00) == 0xc00)) {
   48201                                   UnallocatedA32(instr);
   48202                                   return;
   48203                                 }
   48204                                 unsigned cmode = (instr >> 8) & 0xf;
   48205                                 DataType dt = ImmediateVbic::DecodeDt(cmode);
   48206                                 if (dt.Is(kDataTypeValueInvalid)) {
   48207                                   UnallocatedA32(instr);
   48208                                   return;
   48209                                 }
   48210                                 if (((instr >> 12) & 1) != 0) {
   48211                                   UnallocatedA32(instr);
   48212                                   return;
   48213                                 }
   48214                                 unsigned rd = ExtractQRegister(instr, 22, 12);
   48215                                 QOperand imm = ImmediateVbic::DecodeImmediate(
   48216                                     cmode,
   48217                                     (instr & 0xf) | ((instr >> 12) & 0x70) |
   48218                                         ((instr >> 17) & 0x80));
   48219                                 // VBIC{<c>}{<q>}.<dt> {<Qdn>}, <Qdn>, #<imm> ; A1 NOLINT(whitespace/line_length)
   48220                                 vbic(al, dt, QRegister(rd), QRegister(rd), imm);
   48221                                 break;
   48222                               }
   48223                             }
   48224                             break;
   48225                           }
   48226                         }
   48227                         break;
   48228                       }
   48229                       default: {
   48230                         switch (instr & 0x00000300) {
   48231                           case 0x00000000: {
   48232                             // 0xf2800050
   48233                             if (((instr & 0x380080) == 0x0)) {
   48234                               UnallocatedA32(instr);
   48235                               return;
   48236                             }
   48237                             DataType dt =
   48238                                 Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
   48239                                                        ((instr >> 4) & 0x8),
   48240                                                    (instr >> 24) & 0x1);
   48241                             if (dt.Is(kDataTypeValueInvalid)) {
   48242                               UnallocatedA32(instr);
   48243                               return;
   48244                             }
   48245                             if (((instr >> 12) & 1) != 0) {
   48246                               UnallocatedA32(instr);
   48247                               return;
   48248                             }
   48249                             unsigned rd = ExtractQRegister(instr, 22, 12);
   48250                             if ((instr & 1) != 0) {
   48251                               UnallocatedA32(instr);
   48252                               return;
   48253                             }
   48254                             unsigned rm = ExtractQRegister(instr, 5, 0);
   48255                             uint32_t imm6 = (instr >> 16) & 0x3f;
   48256                             uint32_t imm =
   48257                                 (dt.IsSize(64) ? 64 : (dt.GetSize() * 2)) -
   48258                                 imm6;
   48259                             // VSHR{<c>}{<q>}.<type><size> {<Qd>}, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   48260                             vshr(al, dt, QRegister(rd), QRegister(rm), imm);
   48261                             break;
   48262                           }
   48263                           case 0x00000100: {
   48264                             // 0xf2800150
   48265                             if (((instr & 0x380080) == 0x0)) {
   48266                               UnallocatedA32(instr);
   48267                               return;
   48268                             }
   48269                             DataType dt =
   48270                                 Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
   48271                                                        ((instr >> 4) & 0x8),
   48272                                                    (instr >> 24) & 0x1);
   48273                             if (dt.Is(kDataTypeValueInvalid)) {
   48274                               UnallocatedA32(instr);
   48275                               return;
   48276                             }
   48277                             if (((instr >> 12) & 1) != 0) {
   48278                               UnallocatedA32(instr);
   48279                               return;
   48280                             }
   48281                             unsigned rd = ExtractQRegister(instr, 22, 12);
   48282                             if ((instr & 1) != 0) {
   48283                               UnallocatedA32(instr);
   48284                               return;
   48285                             }
   48286                             unsigned rm = ExtractQRegister(instr, 5, 0);
   48287                             uint32_t imm6 = (instr >> 16) & 0x3f;
   48288                             uint32_t imm =
   48289                                 (dt.IsSize(64) ? 64 : (dt.GetSize() * 2)) -
   48290                                 imm6;
   48291                             // VSRA{<c>}{<q>}.<type><size> {<Qd>}, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   48292                             vsra(al, dt, QRegister(rd), QRegister(rm), imm);
   48293                             break;
   48294                           }
   48295                           case 0x00000200: {
   48296                             // 0xf2800250
   48297                             if (((instr & 0x380080) == 0x0)) {
   48298                               UnallocatedA32(instr);
   48299                               return;
   48300                             }
   48301                             DataType dt =
   48302                                 Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
   48303                                                        ((instr >> 4) & 0x8),
   48304                                                    (instr >> 24) & 0x1);
   48305                             if (dt.Is(kDataTypeValueInvalid)) {
   48306                               UnallocatedA32(instr);
   48307                               return;
   48308                             }
   48309                             if (((instr >> 12) & 1) != 0) {
   48310                               UnallocatedA32(instr);
   48311                               return;
   48312                             }
   48313                             unsigned rd = ExtractQRegister(instr, 22, 12);
   48314                             if ((instr & 1) != 0) {
   48315                               UnallocatedA32(instr);
   48316                               return;
   48317                             }
   48318                             unsigned rm = ExtractQRegister(instr, 5, 0);
   48319                             uint32_t imm6 = (instr >> 16) & 0x3f;
   48320                             uint32_t imm =
   48321                                 (dt.IsSize(64) ? 64 : (dt.GetSize() * 2)) -
   48322                                 imm6;
   48323                             // VRSHR{<c>}{<q>}.<type><size> {<Qd>}, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   48324                             vrshr(al, dt, QRegister(rd), QRegister(rm), imm);
   48325                             break;
   48326                           }
   48327                           case 0x00000300: {
   48328                             // 0xf2800350
   48329                             if (((instr & 0x380080) == 0x0)) {
   48330                               UnallocatedA32(instr);
   48331                               return;
   48332                             }
   48333                             DataType dt =
   48334                                 Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
   48335                                                        ((instr >> 4) & 0x8),
   48336                                                    (instr >> 24) & 0x1);
   48337                             if (dt.Is(kDataTypeValueInvalid)) {
   48338                               UnallocatedA32(instr);
   48339                               return;
   48340                             }
   48341                             if (((instr >> 12) & 1) != 0) {
   48342                               UnallocatedA32(instr);
   48343                               return;
   48344                             }
   48345                             unsigned rd = ExtractQRegister(instr, 22, 12);
   48346                             if ((instr & 1) != 0) {
   48347                               UnallocatedA32(instr);
   48348                               return;
   48349                             }
   48350                             unsigned rm = ExtractQRegister(instr, 5, 0);
   48351                             uint32_t imm6 = (instr >> 16) & 0x3f;
   48352                             uint32_t imm =
   48353                                 (dt.IsSize(64) ? 64 : (dt.GetSize() * 2)) -
   48354                                 imm6;
   48355                             // VRSRA{<c>}{<q>}.<type><size> {<Qd>}, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   48356                             vrsra(al, dt, QRegister(rd), QRegister(rm), imm);
   48357                             break;
   48358                           }
   48359                         }
   48360                         break;
   48361                       }
   48362                     }
   48363                     break;
   48364                   }
   48365                   case 0x00000400: {
   48366                     // 0xf2800450
   48367                     switch (instr & 0x00380080) {
   48368                       case 0x00000000: {
   48369                         // 0xf2800450
   48370                         switch (instr & 0x00000100) {
   48371                           case 0x00000000: {
   48372                             // 0xf2800450
   48373                             switch (instr & 0x00000200) {
   48374                               default: {
   48375                                 switch (instr & 0x00000020) {
   48376                                   case 0x00000020: {
   48377                                     // 0xf2800470
   48378                                     if (((instr & 0xd00) == 0x100) ||
   48379                                         ((instr & 0xd00) == 0x500) ||
   48380                                         ((instr & 0xd00) == 0x900) ||
   48381                                         ((instr & 0xe00) == 0xe00)) {
   48382                                       UnallocatedA32(instr);
   48383                                       return;
   48384                                     }
   48385                                     unsigned cmode = (instr >> 8) & 0xf;
   48386                                     DataType dt =
   48387                                         ImmediateVmvn::DecodeDt(cmode);
   48388                                     if (dt.Is(kDataTypeValueInvalid)) {
   48389                                       UnallocatedA32(instr);
   48390                                       return;
   48391                                     }
   48392                                     if (((instr >> 12) & 1) != 0) {
   48393                                       UnallocatedA32(instr);
   48394                                       return;
   48395                                     }
   48396                                     unsigned rd =
   48397                                         ExtractQRegister(instr, 22, 12);
   48398                                     QOperand imm =
   48399                                         ImmediateVmvn::DecodeImmediate(
   48400                                             cmode,
   48401                                             (instr & 0xf) |
   48402                                                 ((instr >> 12) & 0x70) |
   48403                                                 ((instr >> 17) & 0x80));
   48404                                     // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1
   48405                                     vmvn(al, dt, QRegister(rd), imm);
   48406                                     break;
   48407                                   }
   48408                                   default: {
   48409                                     if (((instr & 0x920) == 0x100) ||
   48410                                         ((instr & 0x520) == 0x100) ||
   48411                                         ((instr & 0x820) == 0x20) ||
   48412                                         ((instr & 0x420) == 0x20) ||
   48413                                         ((instr & 0x220) == 0x20) ||
   48414                                         ((instr & 0x120) == 0x120)) {
   48415                                       UnallocatedA32(instr);
   48416                                       return;
   48417                                     }
   48418                                     unsigned cmode = ((instr >> 8) & 0xf) |
   48419                                                      ((instr >> 1) & 0x10);
   48420                                     DataType dt =
   48421                                         ImmediateVmov::DecodeDt(cmode);
   48422                                     if (dt.Is(kDataTypeValueInvalid)) {
   48423                                       UnallocatedA32(instr);
   48424                                       return;
   48425                                     }
   48426                                     if (((instr >> 12) & 1) != 0) {
   48427                                       UnallocatedA32(instr);
   48428                                       return;
   48429                                     }
   48430                                     unsigned rd =
   48431                                         ExtractQRegister(instr, 22, 12);
   48432                                     QOperand imm =
   48433                                         ImmediateVmov::DecodeImmediate(
   48434                                             cmode,
   48435                                             (instr & 0xf) |
   48436                                                 ((instr >> 12) & 0x70) |
   48437                                                 ((instr >> 17) & 0x80));
   48438                                     // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1
   48439                                     vmov(al, dt, QRegister(rd), imm);
   48440                                     break;
   48441                                   }
   48442                                 }
   48443                                 break;
   48444                               }
   48445                             }
   48446                             break;
   48447                           }
   48448                           case 0x00000100: {
   48449                             // 0xf2800550
   48450                             switch (instr & 0x00000020) {
   48451                               case 0x00000000: {
   48452                                 // 0xf2800550
   48453                                 if (((instr & 0x100) == 0x0) ||
   48454                                     ((instr & 0xc00) == 0xc00)) {
   48455                                   UnallocatedA32(instr);
   48456                                   return;
   48457                                 }
   48458                                 unsigned cmode = (instr >> 8) & 0xf;
   48459                                 DataType dt = ImmediateVorr::DecodeDt(cmode);
   48460                                 if (dt.Is(kDataTypeValueInvalid)) {
   48461                                   UnallocatedA32(instr);
   48462                                   return;
   48463                                 }
   48464                                 if (((instr >> 12) & 1) != 0) {
   48465                                   UnallocatedA32(instr);
   48466                                   return;
   48467                                 }
   48468                                 unsigned rd = ExtractQRegister(instr, 22, 12);
   48469                                 QOperand imm = ImmediateVorr::DecodeImmediate(
   48470                                     cmode,
   48471                                     (instr & 0xf) | ((instr >> 12) & 0x70) |
   48472                                         ((instr >> 17) & 0x80));
   48473                                 // VORR{<c>}{<q>}.<dt> {<Qdn>}, <Qdn>, #<imm> ; A1 NOLINT(whitespace/line_length)
   48474                                 vorr(al, dt, QRegister(rd), QRegister(rd), imm);
   48475                                 break;
   48476                               }
   48477                               case 0x00000020: {
   48478                                 // 0xf2800570
   48479                                 if (((instr & 0x100) == 0x0) ||
   48480                                     ((instr & 0xc00) == 0xc00)) {
   48481                                   UnallocatedA32(instr);
   48482                                   return;
   48483                                 }
   48484                                 unsigned cmode = (instr >> 8) & 0xf;
   48485                                 DataType dt = ImmediateVbic::DecodeDt(cmode);
   48486                                 if (dt.Is(kDataTypeValueInvalid)) {
   48487                                   UnallocatedA32(instr);
   48488                                   return;
   48489                                 }
   48490                                 if (((instr >> 12) & 1) != 0) {
   48491                                   UnallocatedA32(instr);
   48492                                   return;
   48493                                 }
   48494                                 unsigned rd = ExtractQRegister(instr, 22, 12);
   48495                                 QOperand imm = ImmediateVbic::DecodeImmediate(
   48496                                     cmode,
   48497                                     (instr & 0xf) | ((instr >> 12) & 0x70) |
   48498                                         ((instr >> 17) & 0x80));
   48499                                 // VBIC{<c>}{<q>}.<dt> {<Qdn>}, <Qdn>, #<imm> ; A1 NOLINT(whitespace/line_length)
   48500                                 vbic(al, dt, QRegister(rd), QRegister(rd), imm);
   48501                                 break;
   48502                               }
   48503                             }
   48504                             break;
   48505                           }
   48506                         }
   48507                         break;
   48508                       }
   48509                       default: {
   48510                         switch (instr & 0x00000300) {
   48511                           case 0x00000000: {
   48512                             // 0xf2800450
   48513                             if ((instr & 0x01000000) == 0x01000000) {
   48514                               if (((instr & 0x380080) == 0x0)) {
   48515                                 UnallocatedA32(instr);
   48516                                 return;
   48517                               }
   48518                               DataType dt = Dt_L_imm6_4_Decode(
   48519                                   ((instr >> 19) & 0x7) | ((instr >> 4) & 0x8));
   48520                               if (dt.Is(kDataTypeValueInvalid)) {
   48521                                 UnallocatedA32(instr);
   48522                                 return;
   48523                               }
   48524                               if (((instr >> 12) & 1) != 0) {
   48525                                 UnallocatedA32(instr);
   48526                                 return;
   48527                               }
   48528                               unsigned rd = ExtractQRegister(instr, 22, 12);
   48529                               if ((instr & 1) != 0) {
   48530                                 UnallocatedA32(instr);
   48531                                 return;
   48532                               }
   48533                               unsigned rm = ExtractQRegister(instr, 5, 0);
   48534                               uint32_t imm6 = (instr >> 16) & 0x3f;
   48535                               uint32_t imm =
   48536                                   (dt.IsSize(64) ? 64 : (dt.GetSize() * 2)) -
   48537                                   imm6;
   48538                               // VSRI{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #<imm> ; A1
   48539                               vsri(al, dt, QRegister(rd), QRegister(rm), imm);
   48540                             } else {
   48541                               UnallocatedA32(instr);
   48542                             }
   48543                             break;
   48544                           }
   48545                           case 0x00000100: {
   48546                             // 0xf2800550
   48547                             switch (instr & 0x01000000) {
   48548                               case 0x00000000: {
   48549                                 // 0xf2800550
   48550                                 if (((instr & 0x380080) == 0x0)) {
   48551                                   UnallocatedA32(instr);
   48552                                   return;
   48553                                 }
   48554                                 DataType dt =
   48555                                     Dt_L_imm6_3_Decode(((instr >> 19) & 0x7) |
   48556                                                        ((instr >> 4) & 0x8));
   48557                                 if (dt.Is(kDataTypeValueInvalid)) {
   48558                                   UnallocatedA32(instr);
   48559                                   return;
   48560                                 }
   48561                                 if (((instr >> 12) & 1) != 0) {
   48562                                   UnallocatedA32(instr);
   48563                                   return;
   48564                                 }
   48565                                 unsigned rd = ExtractQRegister(instr, 22, 12);
   48566                                 if ((instr & 1) != 0) {
   48567                                   UnallocatedA32(instr);
   48568                                   return;
   48569                                 }
   48570                                 unsigned rm = ExtractQRegister(instr, 5, 0);
   48571                                 uint32_t imm6 = (instr >> 16) & 0x3f;
   48572                                 uint32_t imm =
   48573                                     imm6 - (dt.IsSize(64) ? 0 : dt.GetSize());
   48574                                 // VSHL{<c>}{<q>}.I<size> {<Qd>}, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   48575                                 vshl(al, dt, QRegister(rd), QRegister(rm), imm);
   48576                                 break;
   48577                               }
   48578                               case 0x01000000: {
   48579                                 // 0xf3800550
   48580                                 if (((instr & 0x380080) == 0x0)) {
   48581                                   UnallocatedA32(instr);
   48582                                   return;
   48583                                 }
   48584                                 DataType dt =
   48585                                     Dt_L_imm6_4_Decode(((instr >> 19) & 0x7) |
   48586                                                        ((instr >> 4) & 0x8));
   48587                                 if (dt.Is(kDataTypeValueInvalid)) {
   48588                                   UnallocatedA32(instr);
   48589                                   return;
   48590                                 }
   48591                                 if (((instr >> 12) & 1) != 0) {
   48592                                   UnallocatedA32(instr);
   48593                                   return;
   48594                                 }
   48595                                 unsigned rd = ExtractQRegister(instr, 22, 12);
   48596                                 if ((instr & 1) != 0) {
   48597                                   UnallocatedA32(instr);
   48598                                   return;
   48599                                 }
   48600                                 unsigned rm = ExtractQRegister(instr, 5, 0);
   48601                                 uint32_t imm6 = (instr >> 16) & 0x3f;
   48602                                 uint32_t imm =
   48603                                     imm6 - (dt.IsSize(64) ? 0 : dt.GetSize());
   48604                                 // VSLI{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #<imm> ; A1
   48605                                 vsli(al, dt, QRegister(rd), QRegister(rm), imm);
   48606                                 break;
   48607                               }
   48608                             }
   48609                             break;
   48610                           }
   48611                           case 0x00000200: {
   48612                             // 0xf2800650
   48613                             if (((instr & 0x380080) == 0x0)) {
   48614                               UnallocatedA32(instr);
   48615                               return;
   48616                             }
   48617                             DataType dt =
   48618                                 Dt_L_imm6_2_Decode(((instr >> 19) & 0x7) |
   48619                                                        ((instr >> 4) & 0x8),
   48620                                                    (instr >> 24) & 0x1);
   48621                             if (dt.Is(kDataTypeValueInvalid)) {
   48622                               UnallocatedA32(instr);
   48623                               return;
   48624                             }
   48625                             if (((instr >> 12) & 1) != 0) {
   48626                               UnallocatedA32(instr);
   48627                               return;
   48628                             }
   48629                             unsigned rd = ExtractQRegister(instr, 22, 12);
   48630                             if ((instr & 1) != 0) {
   48631                               UnallocatedA32(instr);
   48632                               return;
   48633                             }
   48634                             unsigned rm = ExtractQRegister(instr, 5, 0);
   48635                             uint32_t imm6 = (instr >> 16) & 0x3f;
   48636                             uint32_t imm =
   48637                                 imm6 - (dt.IsSize(64) ? 0 : dt.GetSize());
   48638                             // VQSHLU{<c>}{<q>}.<type><size> {<Qd>}, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   48639                             vqshlu(al, dt, QRegister(rd), QRegister(rm), imm);
   48640                             break;
   48641                           }
   48642                           case 0x00000300: {
   48643                             // 0xf2800750
   48644                             if (((instr & 0x380080) == 0x0)) {
   48645                               UnallocatedA32(instr);
   48646                               return;
   48647                             }
   48648                             DataType dt =
   48649                                 Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
   48650                                                        ((instr >> 4) & 0x8),
   48651                                                    (instr >> 24) & 0x1);
   48652                             if (dt.Is(kDataTypeValueInvalid)) {
   48653                               UnallocatedA32(instr);
   48654                               return;
   48655                             }
   48656                             if (((instr >> 12) & 1) != 0) {
   48657                               UnallocatedA32(instr);
   48658                               return;
   48659                             }
   48660                             unsigned rd = ExtractQRegister(instr, 22, 12);
   48661                             if ((instr & 1) != 0) {
   48662                               UnallocatedA32(instr);
   48663                               return;
   48664                             }
   48665                             unsigned rm = ExtractQRegister(instr, 5, 0);
   48666                             uint32_t imm6 = (instr >> 16) & 0x3f;
   48667                             uint32_t imm =
   48668                                 imm6 - (dt.IsSize(64) ? 0 : dt.GetSize());
   48669                             // VQSHL{<c>}{<q>}.<type><size> {<Qd>}, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   48670                             vqshl(al, dt, QRegister(rd), QRegister(rm), imm);
   48671                             break;
   48672                           }
   48673                         }
   48674                         break;
   48675                       }
   48676                     }
   48677                     break;
   48678                   }
   48679                   case 0x00000800: {
   48680                     // 0xf2800850
   48681                     switch (instr & 0x00000080) {
   48682                       case 0x00000000: {
   48683                         // 0xf2800850
   48684                         switch (instr & 0x00380000) {
   48685                           case 0x00000000: {
   48686                             // 0xf2800850
   48687                             switch (instr & 0x00000100) {
   48688                               case 0x00000000: {
   48689                                 // 0xf2800850
   48690                                 switch (instr & 0x00000200) {
   48691                                   default: {
   48692                                     switch (instr & 0x00000020) {
   48693                                       case 0x00000020: {
   48694                                         // 0xf2800870
   48695                                         if (((instr & 0xd00) == 0x100) ||
   48696                                             ((instr & 0xd00) == 0x500) ||
   48697                                             ((instr & 0xd00) == 0x900) ||
   48698                                             ((instr & 0xe00) == 0xe00)) {
   48699                                           UnallocatedA32(instr);
   48700                                           return;
   48701                                         }
   48702                                         unsigned cmode = (instr >> 8) & 0xf;
   48703                                         DataType dt =
   48704                                             ImmediateVmvn::DecodeDt(cmode);
   48705                                         if (dt.Is(kDataTypeValueInvalid)) {
   48706                                           UnallocatedA32(instr);
   48707                                           return;
   48708                                         }
   48709                                         if (((instr >> 12) & 1) != 0) {
   48710                                           UnallocatedA32(instr);
   48711                                           return;
   48712                                         }
   48713                                         unsigned rd =
   48714                                             ExtractQRegister(instr, 22, 12);
   48715                                         QOperand imm =
   48716                                             ImmediateVmvn::DecodeImmediate(
   48717                                                 cmode,
   48718                                                 (instr & 0xf) |
   48719                                                     ((instr >> 12) & 0x70) |
   48720                                                     ((instr >> 17) & 0x80));
   48721                                         // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1
   48722                                         vmvn(al, dt, QRegister(rd), imm);
   48723                                         break;
   48724                                       }
   48725                                       default: {
   48726                                         if (((instr & 0x920) == 0x100) ||
   48727                                             ((instr & 0x520) == 0x100) ||
   48728                                             ((instr & 0x820) == 0x20) ||
   48729                                             ((instr & 0x420) == 0x20) ||
   48730                                             ((instr & 0x220) == 0x20) ||
   48731                                             ((instr & 0x120) == 0x120)) {
   48732                                           UnallocatedA32(instr);
   48733                                           return;
   48734                                         }
   48735                                         unsigned cmode = ((instr >> 8) & 0xf) |
   48736                                                          ((instr >> 1) & 0x10);
   48737                                         DataType dt =
   48738                                             ImmediateVmov::DecodeDt(cmode);
   48739                                         if (dt.Is(kDataTypeValueInvalid)) {
   48740                                           UnallocatedA32(instr);
   48741                                           return;
   48742                                         }
   48743                                         if (((instr >> 12) & 1) != 0) {
   48744                                           UnallocatedA32(instr);
   48745                                           return;
   48746                                         }
   48747                                         unsigned rd =
   48748                                             ExtractQRegister(instr, 22, 12);
   48749                                         QOperand imm =
   48750                                             ImmediateVmov::DecodeImmediate(
   48751                                                 cmode,
   48752                                                 (instr & 0xf) |
   48753                                                     ((instr >> 12) & 0x70) |
   48754                                                     ((instr >> 17) & 0x80));
   48755                                         // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1
   48756                                         vmov(al, dt, QRegister(rd), imm);
   48757                                         break;
   48758                                       }
   48759                                     }
   48760                                     break;
   48761                                   }
   48762                                 }
   48763                                 break;
   48764                               }
   48765                               case 0x00000100: {
   48766                                 // 0xf2800950
   48767                                 switch (instr & 0x00000020) {
   48768                                   case 0x00000000: {
   48769                                     // 0xf2800950
   48770                                     if (((instr & 0x100) == 0x0) ||
   48771                                         ((instr & 0xc00) == 0xc00)) {
   48772                                       UnallocatedA32(instr);
   48773                                       return;
   48774                                     }
   48775                                     unsigned cmode = (instr >> 8) & 0xf;
   48776                                     DataType dt =
   48777                                         ImmediateVorr::DecodeDt(cmode);
   48778                                     if (dt.Is(kDataTypeValueInvalid)) {
   48779                                       UnallocatedA32(instr);
   48780                                       return;
   48781                                     }
   48782                                     if (((instr >> 12) & 1) != 0) {
   48783                                       UnallocatedA32(instr);
   48784                                       return;
   48785                                     }
   48786                                     unsigned rd =
   48787                                         ExtractQRegister(instr, 22, 12);
   48788                                     QOperand imm =
   48789                                         ImmediateVorr::DecodeImmediate(
   48790                                             cmode,
   48791                                             (instr & 0xf) |
   48792                                                 ((instr >> 12) & 0x70) |
   48793                                                 ((instr >> 17) & 0x80));
   48794                                     // VORR{<c>}{<q>}.<dt> {<Qdn>}, <Qdn>, #<imm> ; A1 NOLINT(whitespace/line_length)
   48795                                     vorr(al,
   48796                                          dt,
   48797                                          QRegister(rd),
   48798                                          QRegister(rd),
   48799                                          imm);
   48800                                     break;
   48801                                   }
   48802                                   case 0x00000020: {
   48803                                     // 0xf2800970
   48804                                     if (((instr & 0x100) == 0x0) ||
   48805                                         ((instr & 0xc00) == 0xc00)) {
   48806                                       UnallocatedA32(instr);
   48807                                       return;
   48808                                     }
   48809                                     unsigned cmode = (instr >> 8) & 0xf;
   48810                                     DataType dt =
   48811                                         ImmediateVbic::DecodeDt(cmode);
   48812                                     if (dt.Is(kDataTypeValueInvalid)) {
   48813                                       UnallocatedA32(instr);
   48814                                       return;
   48815                                     }
   48816                                     if (((instr >> 12) & 1) != 0) {
   48817                                       UnallocatedA32(instr);
   48818                                       return;
   48819                                     }
   48820                                     unsigned rd =
   48821                                         ExtractQRegister(instr, 22, 12);
   48822                                     QOperand imm =
   48823                                         ImmediateVbic::DecodeImmediate(
   48824                                             cmode,
   48825                                             (instr & 0xf) |
   48826                                                 ((instr >> 12) & 0x70) |
   48827                                                 ((instr >> 17) & 0x80));
   48828                                     // VBIC{<c>}{<q>}.<dt> {<Qdn>}, <Qdn>, #<imm> ; A1 NOLINT(whitespace/line_length)
   48829                                     vbic(al,
   48830                                          dt,
   48831                                          QRegister(rd),
   48832                                          QRegister(rd),
   48833                                          imm);
   48834                                     break;
   48835                                   }
   48836                                 }
   48837                                 break;
   48838                               }
   48839                             }
   48840                             break;
   48841                           }
   48842                           default: {
   48843                             switch (instr & 0x00000300) {
   48844                               case 0x00000000: {
   48845                                 // 0xf2800850
   48846                                 switch (instr & 0x01000000) {
   48847                                   case 0x00000000: {
   48848                                     // 0xf2800850
   48849                                     if (((instr & 0x380000) == 0x0)) {
   48850                                       UnallocatedA32(instr);
   48851                                       return;
   48852                                     }
   48853                                     DataType dt =
   48854                                         Dt_imm6_3_Decode((instr >> 19) & 0x7);
   48855                                     if (dt.Is(kDataTypeValueInvalid)) {
   48856                                       UnallocatedA32(instr);
   48857                                       return;
   48858                                     }
   48859                                     unsigned rd =
   48860                                         ExtractDRegister(instr, 22, 12);
   48861                                     if ((instr & 1) != 0) {
   48862                                       UnallocatedA32(instr);
   48863                                       return;
   48864                                     }
   48865                                     unsigned rm = ExtractQRegister(instr, 5, 0);
   48866                                     uint32_t imm6 = (instr >> 16) & 0x3f;
   48867                                     uint32_t imm = dt.GetSize() - imm6;
   48868                                     // VRSHRN{<c>}{<q>}.I<size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   48869                                     vrshrn(al,
   48870                                            dt,
   48871                                            DRegister(rd),
   48872                                            QRegister(rm),
   48873                                            imm);
   48874                                     break;
   48875                                   }
   48876                                   case 0x01000000: {
   48877                                     // 0xf3800850
   48878                                     if (((instr & 0x380000) == 0x0)) {
   48879                                       UnallocatedA32(instr);
   48880                                       return;
   48881                                     }
   48882                                     DataType dt =
   48883                                         Dt_imm6_2_Decode((instr >> 19) & 0x7,
   48884                                                          (instr >> 24) & 0x1);
   48885                                     if (dt.Is(kDataTypeValueInvalid)) {
   48886                                       UnallocatedA32(instr);
   48887                                       return;
   48888                                     }
   48889                                     unsigned rd =
   48890                                         ExtractDRegister(instr, 22, 12);
   48891                                     if ((instr & 1) != 0) {
   48892                                       UnallocatedA32(instr);
   48893                                       return;
   48894                                     }
   48895                                     unsigned rm = ExtractQRegister(instr, 5, 0);
   48896                                     uint32_t imm6 = (instr >> 16) & 0x3f;
   48897                                     uint32_t imm = dt.GetSize() - imm6;
   48898                                     // VQRSHRUN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   48899                                     vqrshrun(al,
   48900                                              dt,
   48901                                              DRegister(rd),
   48902                                              QRegister(rm),
   48903                                              imm);
   48904                                     break;
   48905                                   }
   48906                                 }
   48907                                 break;
   48908                               }
   48909                               case 0x00000100: {
   48910                                 // 0xf2800950
   48911                                 if (((instr & 0x380000) == 0x0)) {
   48912                                   UnallocatedA32(instr);
   48913                                   return;
   48914                                 }
   48915                                 DataType dt =
   48916                                     Dt_imm6_1_Decode((instr >> 19) & 0x7,
   48917                                                      (instr >> 24) & 0x1);
   48918                                 if (dt.Is(kDataTypeValueInvalid)) {
   48919                                   UnallocatedA32(instr);
   48920                                   return;
   48921                                 }
   48922                                 unsigned rd = ExtractDRegister(instr, 22, 12);
   48923                                 if ((instr & 1) != 0) {
   48924                                   UnallocatedA32(instr);
   48925                                   return;
   48926                                 }
   48927                                 unsigned rm = ExtractQRegister(instr, 5, 0);
   48928                                 uint32_t imm6 = (instr >> 16) & 0x3f;
   48929                                 uint32_t imm = dt.GetSize() - imm6;
   48930                                 // VQRSHRN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
   48931                                 vqrshrn(al,
   48932                                         dt,
   48933                                         DRegister(rd),
   48934                                         QRegister(rm),
   48935                                         imm);
   48936                                 break;
   48937                               }
   48938                               default:
   48939                                 UnallocatedA32(instr);
   48940                                 break;
   48941                             }
   48942                             break;
   48943                           }
   48944                         }
   48945                         break;
   48946                       }
   48947                       default:
   48948                         UnallocatedA32(instr);
   48949                         break;
   48950                     }
   48951                     break;
   48952                   }
   48953                   case 0x00000c00: {
   48954                     // 0xf2800c50
   48955                     switch (instr & 0x00000080) {
   48956                       case 0x00000000: {
   48957                         // 0xf2800c50
   48958                         switch (instr & 0x00200000) {
   48959                           case 0x00000000: {
   48960                             // 0xf2800c50
   48961                             switch (instr & 0x00180000) {
   48962                               case 0x00000000: {
   48963                                 // 0xf2800c50
   48964                                 switch (instr & 0x00000300) {
   48965                                   case 0x00000200: {
   48966                                     // 0xf2800e50
   48967                                     if (((instr & 0x920) == 0x100) ||
   48968                                         ((instr & 0x520) == 0x100) ||
   48969                                         ((instr & 0x820) == 0x20) ||
   48970                                         ((instr & 0x420) == 0x20) ||
   48971                                         ((instr & 0x220) == 0x20) ||
   48972                                         ((instr & 0x120) == 0x120)) {
   48973                                       UnallocatedA32(instr);
   48974                                       return;
   48975                                     }
   48976                                     unsigned cmode = ((instr >> 8) & 0xf) |
   48977                                                      ((instr >> 1) & 0x10);
   48978                                     DataType dt =
   48979                                         ImmediateVmov::DecodeDt(cmode);
   48980                                     if (dt.Is(kDataTypeValueInvalid)) {
   48981                                       UnallocatedA32(instr);
   48982                                       return;
   48983                                     }
   48984                                     if (((instr >> 12) & 1) != 0) {
   48985                                       UnallocatedA32(instr);
   48986                                       return;
   48987                                     }
   48988                                     unsigned rd =
   48989                                         ExtractQRegister(instr, 22, 12);
   48990                                     QOperand imm =
   48991                                         ImmediateVmov::DecodeImmediate(
   48992                                             cmode,
   48993                                             (instr & 0xf) |
   48994                                                 ((instr >> 12) & 0x70) |
   48995                                                 ((instr >> 17) & 0x80));
   48996                                     // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1
   48997                                     vmov(al, dt, QRegister(rd), imm);
   48998                                     break;
   48999                                   }
   49000                                   case 0x00000300: {
   49001                                     // 0xf2800f50
   49002                                     if (((instr & 0x920) == 0x100) ||
   49003                                         ((instr & 0x520) == 0x100) ||
   49004                                         ((instr & 0x820) == 0x20) ||
   49005                                         ((instr & 0x420) == 0x20) ||
   49006                                         ((instr & 0x220) == 0x20) ||
   49007                                         ((instr & 0x120) == 0x120)) {
   49008                                       UnallocatedA32(instr);
   49009                                       return;
   49010                                     }
   49011                                     unsigned cmode = ((instr >> 8) & 0xf) |
   49012                                                      ((instr >> 1) & 0x10);
   49013                                     DataType dt =
   49014                                         ImmediateVmov::DecodeDt(cmode);
   49015                                     if (dt.Is(kDataTypeValueInvalid)) {
   49016                                       UnallocatedA32(instr);
   49017                                       return;
   49018                                     }
   49019                                     if (((instr >> 12) & 1) != 0) {
   49020                                       UnallocatedA32(instr);
   49021                                       return;
   49022                                     }
   49023                                     unsigned rd =
   49024                                         ExtractQRegister(instr, 22, 12);
   49025                                     QOperand imm =
   49026                                         ImmediateVmov::DecodeImmediate(
   49027                                             cmode,
   49028                                             (instr & 0xf) |
   49029                                                 ((instr >> 12) & 0x70) |
   49030                                                 ((instr >> 17) & 0x80));
   49031                                     // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1
   49032                                     vmov(al, dt, QRegister(rd), imm);
   49033                                     break;
   49034                                   }
   49035                                   default: {
   49036                                     switch (instr & 0x00000020) {
   49037                                       case 0x00000020: {
   49038                                         // 0xf2800c70
   49039                                         switch (instr & 0x00000f20) {
   49040                                           case 0x00000000: {
   49041                                             // 0xf2800c50
   49042                                             if (((instr & 0x920) == 0x100) ||
   49043                                                 ((instr & 0x520) == 0x100) ||
   49044                                                 ((instr & 0x820) == 0x20) ||
   49045                                                 ((instr & 0x420) == 0x20) ||
   49046                                                 ((instr & 0x220) == 0x20) ||
   49047                                                 ((instr & 0x120) == 0x120)) {
   49048                                               UnallocatedA32(instr);
   49049                                               return;
   49050                                             }
   49051                                             unsigned cmode =
   49052                                                 ((instr >> 8) & 0xf) |
   49053                                                 ((instr >> 1) & 0x10);
   49054                                             DataType dt =
   49055                                                 ImmediateVmov::DecodeDt(cmode);
   49056                                             if (dt.Is(kDataTypeValueInvalid)) {
   49057                                               UnallocatedA32(instr);
   49058                                               return;
   49059                                             }
   49060                                             if (((instr >> 12) & 1) != 0) {
   49061                                               UnallocatedA32(instr);
   49062                                               return;
   49063                                             }
   49064                                             unsigned rd =
   49065                                                 ExtractQRegister(instr, 22, 12);
   49066                                             QOperand imm =
   49067                                                 ImmediateVmov::DecodeImmediate(
   49068                                                     cmode,
   49069                                                     (instr & 0xf) |
   49070                                                         ((instr >> 12) & 0x70) |
   49071                                                         ((instr >> 17) & 0x80));
   49072                                             // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
   49073                                             vmov(al, dt, QRegister(rd), imm);
   49074                                             break;
   49075                                           }
   49076                                           case 0x00000020: {
   49077                                             // 0xf2800c70
   49078                                             if (((instr & 0xd00) == 0x100) ||
   49079                                                 ((instr & 0xd00) == 0x500) ||
   49080                                                 ((instr & 0xd00) == 0x900) ||
   49081                                                 ((instr & 0xe00) == 0xe00)) {
   49082                                               UnallocatedA32(instr);
   49083                                               return;
   49084                                             }
   49085                                             unsigned cmode = (instr >> 8) & 0xf;
   49086                                             DataType dt =
   49087                                                 ImmediateVmvn::DecodeDt(cmode);
   49088                                             if (dt.Is(kDataTypeValueInvalid)) {
   49089                                               UnallocatedA32(instr);
   49090                                               return;
   49091                                             }
   49092                                             if (((instr >> 12) & 1) != 0) {
   49093                                               UnallocatedA32(instr);
   49094                                               return;
   49095                                             }
   49096                                             unsigned rd =
   49097                                                 ExtractQRegister(instr, 22, 12);
   49098                                             QOperand imm =
   49099                                                 ImmediateVmvn::DecodeImmediate(
   49100                                                     cmode,
   49101                                                     (instr & 0xf) |
   49102                                                         ((instr >> 12) & 0x70) |
   49103                                                         ((instr >> 17) & 0x80));
   49104                                             // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
   49105                                             vmvn(al, dt, QRegister(rd), imm);
   49106                                             break;
   49107                                           }
   49108                                           case 0x00000200: {
   49109                                             // 0xf2800e50
   49110                                             if (((instr & 0x920) == 0x100) ||
   49111                                                 ((instr & 0x520) == 0x100) ||
   49112                                                 ((instr & 0x820) == 0x20) ||
   49113                                                 ((instr & 0x420) == 0x20) ||
   49114                                                 ((instr & 0x220) == 0x20) ||
   49115                                                 ((instr & 0x120) == 0x120)) {
   49116                                               UnallocatedA32(instr);
   49117                                               return;
   49118                                             }
   49119                                             unsigned cmode =
   49120                                                 ((instr >> 8) & 0xf) |
   49121                                                 ((instr >> 1) & 0x10);
   49122                                             DataType dt =
   49123                                                 ImmediateVmov::DecodeDt(cmode);
   49124                                             if (dt.Is(kDataTypeValueInvalid)) {
   49125                                               UnallocatedA32(instr);
   49126                                               return;
   49127                                             }
   49128                                             if (((instr >> 12) & 1) != 0) {
   49129                                               UnallocatedA32(instr);
   49130                                               return;
   49131                                             }
   49132                                             unsigned rd =
   49133                                                 ExtractQRegister(instr, 22, 12);
   49134                                             QOperand imm =
   49135                                                 ImmediateVmov::DecodeImmediate(
   49136                                                     cmode,
   49137                                                     (instr & 0xf) |
   49138                                                         ((instr >> 12) & 0x70) |
   49139                                                         ((instr >> 17) & 0x80));
   49140                                             // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
   49141                                             vmov(al, dt, QRegister(rd), imm);
   49142                                             break;
   49143                                           }
   49144                                           case 0x00000220: {
   49145                                             // 0xf2800e70
   49146                                             if (((instr & 0xd00) == 0x100) ||
   49147                                                 ((instr & 0xd00) == 0x500) ||
   49148                                                 ((instr & 0xd00) == 0x900) ||
   49149                                                 ((instr & 0xe00) == 0xe00)) {
   49150                                               UnallocatedA32(instr);
   49151                                               return;
   49152                                             }
   49153                                             unsigned cmode = (instr >> 8) & 0xf;
   49154                                             DataType dt =
   49155                                                 ImmediateVmvn::DecodeDt(cmode);
   49156                                             if (dt.Is(kDataTypeValueInvalid)) {
   49157                                               UnallocatedA32(instr);
   49158                                               return;
   49159                                             }
   49160                                             if (((instr >> 12) & 1) != 0) {
   49161                                               UnallocatedA32(instr);
   49162                                               return;
   49163                                             }
   49164                                             unsigned rd =
   49165                                                 ExtractQRegister(instr, 22, 12);
   49166                                             QOperand imm =
   49167                                                 ImmediateVmvn::DecodeImmediate(
   49168                                                     cmode,
   49169                                                     (instr & 0xf) |
   49170                                                         ((instr >> 12) & 0x70) |
   49171                                                         ((instr >> 17) & 0x80));
   49172                                             // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
   49173                                             vmvn(al, dt, QRegister(rd), imm);
   49174                                             break;
   49175                                           }
   49176                                           case 0x00000400: {
   49177                                             // 0xf2800c50
   49178                                             if (((instr & 0x920) == 0x100) ||
   49179                                                 ((instr & 0x520) == 0x100) ||
   49180                                                 ((instr & 0x820) == 0x20) ||
   49181                                                 ((instr & 0x420) == 0x20) ||
   49182                                                 ((instr & 0x220) == 0x20) ||
   49183                                                 ((instr & 0x120) == 0x120)) {
   49184                                               UnallocatedA32(instr);
   49185                                               return;
   49186                                             }
   49187                                             unsigned cmode =
   49188                                                 ((instr >> 8) & 0xf) |
   49189                                                 ((instr >> 1) & 0x10);
   49190                                             DataType dt =
   49191                                                 ImmediateVmov::DecodeDt(cmode);
   49192                                             if (dt.Is(kDataTypeValueInvalid)) {
   49193                                               UnallocatedA32(instr);
   49194                                               return;
   49195                                             }
   49196                                             if (((instr >> 12) & 1) != 0) {
   49197                                               UnallocatedA32(instr);
   49198                                               return;
   49199                                             }
   49200                                             unsigned rd =
   49201                                                 ExtractQRegister(instr, 22, 12);
   49202                                             QOperand imm =
   49203                                                 ImmediateVmov::DecodeImmediate(
   49204                                                     cmode,
   49205                                                     (instr & 0xf) |
   49206                                                         ((instr >> 12) & 0x70) |
   49207                                                         ((instr >> 17) & 0x80));
   49208                                             // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
   49209                                             vmov(al, dt, QRegister(rd), imm);
   49210                                             break;
   49211                                           }
   49212                                           case 0x00000420: {
   49213                                             // 0xf2800c70
   49214                                             if (((instr & 0xd00) == 0x100) ||
   49215                                                 ((instr & 0xd00) == 0x500) ||
   49216                                                 ((instr & 0xd00) == 0x900) ||
   49217                                                 ((instr & 0xe00) == 0xe00)) {
   49218                                               UnallocatedA32(instr);
   49219                                               return;
   49220                                             }
   49221                                             unsigned cmode = (instr >> 8) & 0xf;
   49222                                             DataType dt =
   49223                                                 ImmediateVmvn::DecodeDt(cmode);
   49224                                             if (dt.Is(kDataTypeValueInvalid)) {
   49225                                               UnallocatedA32(instr);
   49226                                               return;
   49227                                             }
   49228                                             if (((instr >> 12) & 1) != 0) {
   49229                                               UnallocatedA32(instr);
   49230                                               return;
   49231                                             }
   49232                                             unsigned rd =
   49233                                                 ExtractQRegister(instr, 22, 12);
   49234                                             QOperand imm =
   49235                                                 ImmediateVmvn::DecodeImmediate(
   49236                                                     cmode,
   49237                                                     (instr & 0xf) |
   49238                                                         ((instr >> 12) & 0x70) |
   49239                                                         ((instr >> 17) & 0x80));
   49240                                             // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
   49241                                             vmvn(al, dt, QRegister(rd), imm);
   49242                                             break;
   49243                                           }
   49244                                           case 0x00000600: {
   49245                                             // 0xf2800e50
   49246                                             if (((instr & 0x920) == 0x100) ||
   49247                                                 ((instr & 0x520) == 0x100) ||
   49248                                                 ((instr & 0x820) == 0x20) ||
   49249                                                 ((instr & 0x420) == 0x20) ||
   49250                                                 ((instr & 0x220) == 0x20) ||
   49251                                                 ((instr & 0x120) == 0x120)) {
   49252                                               UnallocatedA32(instr);
   49253                                               return;
   49254                                             }
   49255                                             unsigned cmode =
   49256                                                 ((instr >> 8) & 0xf) |
   49257                                                 ((instr >> 1) & 0x10);
   49258                                             DataType dt =
   49259                                                 ImmediateVmov::DecodeDt(cmode);
   49260                                             if (dt.Is(kDataTypeValueInvalid)) {
   49261                                               UnallocatedA32(instr);
   49262                                               return;
   49263                                             }
   49264                                             if (((instr >> 12) & 1) != 0) {
   49265                                               UnallocatedA32(instr);
   49266                                               return;
   49267                                             }
   49268                                             unsigned rd =
   49269                                                 ExtractQRegister(instr, 22, 12);
   49270                                             QOperand imm =
   49271                                                 ImmediateVmov::DecodeImmediate(
   49272                                                     cmode,
   49273                                                     (instr & 0xf) |
   49274                                                         ((instr >> 12) & 0x70) |
   49275                                                         ((instr >> 17) & 0x80));
   49276                                             // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
   49277                                             vmov(al, dt, QRegister(rd), imm);
   49278                                             break;
   49279                                           }
   49280                                           case 0x00000620: {
   49281                                             // 0xf2800e70
   49282                                             if (((instr & 0xd00) == 0x100) ||
   49283                                                 ((instr & 0xd00) == 0x500) ||
   49284                                                 ((instr & 0xd00) == 0x900) ||
   49285                                                 ((instr & 0xe00) == 0xe00)) {
   49286                                               UnallocatedA32(instr);
   49287                                               return;
   49288                                             }
   49289                                             unsigned cmode = (instr >> 8) & 0xf;
   49290                                             DataType dt =
   49291                                                 ImmediateVmvn::DecodeDt(cmode);
   49292                                             if (dt.Is(kDataTypeValueInvalid)) {
   49293                                               UnallocatedA32(instr);
   49294                                               return;
   49295                                             }
   49296                                             if (((instr >> 12) & 1) != 0) {
   49297                                               UnallocatedA32(instr);
   49298                                               return;
   49299                                             }
   49300                                             unsigned rd =
   49301                                                 ExtractQRegister(instr, 22, 12);
   49302                                             QOperand imm =
   49303                                                 ImmediateVmvn::DecodeImmediate(
   49304                                                     cmode,
   49305                                                     (instr & 0xf) |
   49306                                                         ((instr >> 12) & 0x70) |
   49307                                                         ((instr >> 17) & 0x80));
   49308                                             // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
   49309                                             vmvn(al, dt, QRegister(rd), imm);
   49310                                             break;
   49311                                           }
   49312                                           case 0x00000800: {
   49313                                             // 0xf2800c50
   49314                                             if (((instr & 0x920) == 0x100) ||
   49315                                                 ((instr & 0x520) == 0x100) ||
   49316                                                 ((instr & 0x820) == 0x20) ||
   49317                                                 ((instr & 0x420) == 0x20) ||
   49318                                                 ((instr & 0x220) == 0x20) ||
   49319                                                 ((instr & 0x120) == 0x120)) {
   49320                                               UnallocatedA32(instr);
   49321                                               return;
   49322                                             }
   49323                                             unsigned cmode =
   49324                                                 ((instr >> 8) & 0xf) |
   49325                                                 ((instr >> 1) & 0x10);
   49326                                             DataType dt =
   49327                                                 ImmediateVmov::DecodeDt(cmode);
   49328                                             if (dt.Is(kDataTypeValueInvalid)) {
   49329                                               UnallocatedA32(instr);
   49330                                               return;
   49331                                             }
   49332                                             if (((instr >> 12) & 1) != 0) {
   49333                                               UnallocatedA32(instr);
   49334                                               return;
   49335                                             }
   49336                                             unsigned rd =
   49337                                                 ExtractQRegister(instr, 22, 12);
   49338                                             QOperand imm =
   49339                                                 ImmediateVmov::DecodeImmediate(
   49340                                                     cmode,
   49341                                                     (instr & 0xf) |
   49342                                                         ((instr >> 12) & 0x70) |
   49343                                                         ((instr >> 17) & 0x80));
   49344                                             // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
   49345                                             vmov(al, dt, QRegister(rd), imm);
   49346                                             break;
   49347                                           }
   49348                                           case 0x00000820: {
   49349                                             // 0xf2800c70
   49350                                             if (((instr & 0xd00) == 0x100) ||
   49351                                                 ((instr & 0xd00) == 0x500) ||
   49352                                                 ((instr & 0xd00) == 0x900) ||
   49353                                                 ((instr & 0xe00) == 0xe00)) {
   49354                                               UnallocatedA32(instr);
   49355                                               return;
   49356                                             }
   49357                                             unsigned cmode = (instr >> 8) & 0xf;
   49358                                             DataType dt =
   49359                                                 ImmediateVmvn::DecodeDt(cmode);
   49360                                             if (dt.Is(kDataTypeValueInvalid)) {
   49361                                               UnallocatedA32(instr);
   49362                                               return;
   49363                                             }
   49364                                             if (((instr >> 12) & 1) != 0) {
   49365                                               UnallocatedA32(instr);
   49366                                               return;
   49367                                             }
   49368                                             unsigned rd =
   49369                                                 ExtractQRegister(instr, 22, 12);
   49370                                             QOperand imm =
   49371                                                 ImmediateVmvn::DecodeImmediate(
   49372                                                     cmode,
   49373                                                     (instr & 0xf) |
   49374                                                         ((instr >> 12) & 0x70) |
   49375                                                         ((instr >> 17) & 0x80));
   49376                                             // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
   49377                                             vmvn(al, dt, QRegister(rd), imm);
   49378                                             break;
   49379                                           }
   49380                                           case 0x00000a00: {
   49381                                             // 0xf2800e50
   49382                                             if (((instr & 0x920) == 0x100) ||
   49383                                                 ((instr & 0x520) == 0x100) ||
   49384                                                 ((instr & 0x820) == 0x20) ||
   49385                                                 ((instr & 0x420) == 0x20) ||
   49386                                                 ((instr & 0x220) == 0x20) ||
   49387                                                 ((instr & 0x120) == 0x120)) {
   49388                                               UnallocatedA32(instr);
   49389                                               return;
   49390                                             }
   49391                                             unsigned cmode =
   49392                                                 ((instr >> 8) & 0xf) |
   49393                                                 ((instr >> 1) & 0x10);
   49394                                             DataType dt =
   49395                                                 ImmediateVmov::DecodeDt(cmode);
   49396                                             if (dt.Is(kDataTypeValueInvalid)) {
   49397                                               UnallocatedA32(instr);
   49398                                               return;
   49399                                             }
   49400                                             if (((instr >> 12) & 1) != 0) {
   49401                                               UnallocatedA32(instr);
   49402                                               return;
   49403                                             }
   49404                                             unsigned rd =
   49405                                                 ExtractQRegister(instr, 22, 12);
   49406                                             QOperand imm =
   49407                                                 ImmediateVmov::DecodeImmediate(
   49408                                                     cmode,
   49409                                                     (instr & 0xf) |
   49410                                                         ((instr >> 12) & 0x70) |
   49411                                                         ((instr >> 17) & 0x80));
   49412                                             // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
   49413                                             vmov(al, dt, QRegister(rd), imm);
   49414                                             break;
   49415                                           }
   49416                                           case 0x00000a20: {
   49417                                             // 0xf2800e70
   49418                                             if (((instr & 0xd00) == 0x100) ||
   49419                                                 ((instr & 0xd00) == 0x500) ||
   49420                                                 ((instr & 0xd00) == 0x900) ||
   49421                                                 ((instr & 0xe00) == 0xe00)) {
   49422                                               UnallocatedA32(instr);
   49423                                               return;
   49424                                             }
   49425                                             unsigned cmode = (instr >> 8) & 0xf;
   49426                                             DataType dt =
   49427                                                 ImmediateVmvn::DecodeDt(cmode);
   49428                                             if (dt.Is(kDataTypeValueInvalid)) {
   49429                                               UnallocatedA32(instr);
   49430                                               return;
   49431                                             }
   49432                                             if (((instr >> 12) & 1) != 0) {
   49433                                               UnallocatedA32(instr);
   49434                                               return;
   49435                                             }
   49436                                             unsigned rd =
   49437                                                 ExtractQRegister(instr, 22, 12);
   49438                                             QOperand imm =
   49439                                                 ImmediateVmvn::DecodeImmediate(
   49440                                                     cmode,
   49441                                                     (instr & 0xf) |
   49442                                                         ((instr >> 12) & 0x70) |
   49443                                                         ((instr >> 17) & 0x80));
   49444                                             // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
   49445                                             vmvn(al, dt, QRegister(rd), imm);
   49446                                             break;
   49447                                           }
   49448                                           case 0x00000c00: {
   49449                                             // 0xf2800c50
   49450                                             if (((instr & 0x920) == 0x100) ||
   49451                                                 ((instr & 0x520) == 0x100) ||
   49452                                                 ((instr & 0x820) == 0x20) ||
   49453                                                 ((instr & 0x420) == 0x20) ||
   49454                                                 ((instr & 0x220) == 0x20) ||
   49455                                                 ((instr & 0x120) == 0x120)) {
   49456                                               UnallocatedA32(instr);
   49457                                               return;
   49458                                             }
   49459                                             unsigned cmode =
   49460                                                 ((instr >> 8) & 0xf) |
   49461                                                 ((instr >> 1) & 0x10);
   49462                                             DataType dt =
   49463                                                 ImmediateVmov::DecodeDt(cmode);
   49464                                             if (dt.Is(kDataTypeValueInvalid)) {
   49465                                               UnallocatedA32(instr);
   49466                                               return;
   49467                                             }
   49468                                             if (((instr >> 12) & 1) != 0) {
   49469                                               UnallocatedA32(instr);
   49470                                               return;
   49471                                             }
   49472                                             unsigned rd =
   49473                                                 ExtractQRegister(instr, 22, 12);
   49474                                             QOperand imm =
   49475                                                 ImmediateVmov::DecodeImmediate(
   49476                                                     cmode,
   49477                                                     (instr & 0xf) |
   49478                                                         ((instr >> 12) & 0x70) |
   49479                                                         ((instr >> 17) & 0x80));
   49480                                             // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
   49481                                             vmov(al, dt, QRegister(rd), imm);
   49482                                             break;
   49483                                           }
   49484                                           case 0x00000c20: {
   49485                                             // 0xf2800c70
   49486                                             if (((instr & 0xd00) == 0x100) ||
   49487                                                 ((instr & 0xd00) == 0x500) ||
   49488                                                 ((instr & 0xd00) == 0x900) ||
   49489                                                 ((instr & 0xe00) == 0xe00)) {
   49490                                               UnallocatedA32(instr);
   49491                                               return;
   49492                                             }
   49493                                             unsigned cmode = (instr >> 8) & 0xf;
   49494                                             DataType dt =
   49495                                                 ImmediateVmvn::DecodeDt(cmode);
   49496                                             if (dt.Is(kDataTypeValueInvalid)) {
   49497                                               UnallocatedA32(instr);
   49498                                               return;
   49499                                             }
   49500                                             if (((instr >> 12) & 1) != 0) {
   49501                                               UnallocatedA32(instr);
   49502                                               return;
   49503                                             }
   49504                                             unsigned rd =
   49505                                                 ExtractQRegister(instr, 22, 12);
   49506                                             QOperand imm =
   49507                                                 ImmediateVmvn::DecodeImmediate(
   49508                                                     cmode,
   49509                                                     (instr & 0xf) |
   49510                                                         ((instr >> 12) & 0x70) |
   49511                                                         ((instr >> 17) & 0x80));
   49512                                             // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
   49513                                             vmvn(al, dt, QRegister(rd), imm);
   49514                                             break;
   49515                                           }
   49516                                           case 0x00000d00: {
   49517                                             // 0xf2800d50
   49518                                             if (((instr & 0x920) == 0x100) ||
   49519                                                 ((instr & 0x520) == 0x100) ||
   49520                                                 ((instr & 0x820) == 0x20) ||
   49521                                                 ((instr & 0x420) == 0x20) ||
   49522                                                 ((instr & 0x220) == 0x20) ||
   49523                                                 ((instr & 0x120) == 0x120)) {
   49524                                               UnallocatedA32(instr);
   49525                                               return;
   49526                                             }
   49527                                             unsigned cmode =
   49528                                                 ((instr >> 8) & 0xf) |
   49529                                                 ((instr >> 1) & 0x10);
   49530                                             DataType dt =
   49531                                                 ImmediateVmov::DecodeDt(cmode);
   49532                                             if (dt.Is(kDataTypeValueInvalid)) {
   49533                                               UnallocatedA32(instr);
   49534                                               return;
   49535                                             }
   49536                                             if (((instr >> 12) & 1) != 0) {
   49537                                               UnallocatedA32(instr);
   49538                                               return;
   49539                                             }
   49540                                             unsigned rd =
   49541                                                 ExtractQRegister(instr, 22, 12);
   49542                                             QOperand imm =
   49543                                                 ImmediateVmov::DecodeImmediate(
   49544                                                     cmode,
   49545                                                     (instr & 0xf) |
   49546                                                         ((instr >> 12) & 0x70) |
   49547                                                         ((instr >> 17) & 0x80));
   49548                                             // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
   49549                                             vmov(al, dt, QRegister(rd), imm);
   49550                                             break;
   49551                                           }
   49552                                           case 0x00000d20: {
   49553                                             // 0xf2800d70
   49554                                             if (((instr & 0xd00) == 0x100) ||
   49555                                                 ((instr & 0xd00) == 0x500) ||
   49556                                                 ((instr & 0xd00) == 0x900) ||
   49557                                                 ((instr & 0xe00) == 0xe00)) {
   49558                                               UnallocatedA32(instr);
   49559                                               return;
   49560                                             }
   49561                                             unsigned cmode = (instr >> 8) & 0xf;
   49562                                             DataType dt =
   49563                                                 ImmediateVmvn::DecodeDt(cmode);
   49564                                             if (dt.Is(kDataTypeValueInvalid)) {
   49565                                               UnallocatedA32(instr);
   49566                                               return;
   49567                                             }
   49568                                             if (((instr >> 12) & 1) != 0) {
   49569                                               UnallocatedA32(instr);
   49570                                               return;
   49571                                             }
   49572                                             unsigned rd =
   49573                                                 ExtractQRegister(instr, 22, 12);
   49574                                             QOperand imm =
   49575                                                 ImmediateVmvn::DecodeImmediate(
   49576                                                     cmode,
   49577                                                     (instr & 0xf) |
   49578                                                         ((instr >> 12) & 0x70) |
   49579                                                         ((instr >> 17) & 0x80));
   49580                                             // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
   49581                                             vmvn(al, dt, QRegister(rd), imm);
   49582                                             break;
   49583                                           }
   49584                                           case 0x00000e00: {
   49585                                             // 0xf2800e50
   49586                                             if (((instr & 0x920) == 0x100) ||
   49587                                                 ((instr & 0x520) == 0x100) ||
   49588                                                 ((instr & 0x820) == 0x20) ||
   49589                                                 ((instr & 0x420) == 0x20) ||
   49590                                                 ((instr & 0x220) == 0x20) ||
   49591                                                 ((instr & 0x120) == 0x120)) {
   49592                                               UnallocatedA32(instr);
   49593                                               return;
   49594                                             }
   49595                                             unsigned cmode =
   49596                                                 ((instr >> 8) & 0xf) |
   49597                                                 ((instr >> 1) & 0x10);
   49598                                             DataType dt =
   49599                                                 ImmediateVmov::DecodeDt(cmode);
   49600                                             if (dt.Is(kDataTypeValueInvalid)) {
   49601                                               UnallocatedA32(instr);
   49602                                               return;
   49603                                             }
   49604                                             if (((instr >> 12) & 1) != 0) {
   49605                                               UnallocatedA32(instr);
   49606                                               return;
   49607                                             }
   49608                                             unsigned rd =
   49609                                                 ExtractQRegister(instr, 22, 12);
   49610                                             QOperand imm =
   49611                                                 ImmediateVmov::DecodeImmediate(
   49612                                                     cmode,
   49613                                                     (instr & 0xf) |
   49614                                                         ((instr >> 12) & 0x70) |
   49615                                                         ((instr >> 17) & 0x80));
   49616                                             // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
   49617                                             vmov(al, dt, QRegister(rd), imm);
   49618                                             break;
   49619                                           }
   49620                                           case 0x00000e20: {
   49621                                             // 0xf2800e70
   49622                                             if (((instr & 0x920) == 0x100) ||
   49623                                                 ((instr & 0x520) == 0x100) ||
   49624                                                 ((instr & 0x820) == 0x20) ||
   49625                                                 ((instr & 0x420) == 0x20) ||
   49626                                                 ((instr & 0x220) == 0x20) ||
   49627                                                 ((instr & 0x120) == 0x120)) {
   49628                                               UnallocatedA32(instr);
   49629                                               return;
   49630                                             }
   49631                                             unsigned cmode =
   49632                                                 ((instr >> 8) & 0xf) |
   49633                                                 ((instr >> 1) & 0x10);
   49634                                             DataType dt =
   49635                                                 ImmediateVmov::DecodeDt(cmode);
   49636                                             if (dt.Is(kDataTypeValueInvalid)) {
   49637                                               UnallocatedA32(instr);
   49638                                               return;
   49639                                             }
   49640                                             if (((instr >> 12) & 1) != 0) {
   49641                                               UnallocatedA32(instr);
   49642                                               return;
   49643                                             }
   49644                                             unsigned rd =
   49645                                                 ExtractQRegister(instr, 22, 12);
   49646                                             QOperand imm =
   49647                                                 ImmediateVmov::DecodeImmediate(
   49648                                                     cmode,
   49649                                                     (instr & 0xf) |
   49650                                                         ((instr >> 12) & 0x70) |
   49651                                                         ((instr >> 17) & 0x80));
   49652                                             // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
   49653                                             vmov(al, dt, QRegister(rd), imm);
   49654                                             break;
   49655                                           }
   49656                                           case 0x00000f00: {
   49657                                             // 0xf2800f50
   49658                                             if (((instr & 0x920) == 0x100) ||
   49659                                                 ((instr & 0x520) == 0x100) ||
   49660                                                 ((instr & 0x820) == 0x20) ||
   49661                                                 ((instr & 0x420) == 0x20) ||
   49662                                                 ((instr & 0x220) == 0x20) ||
   49663                                                 ((instr & 0x120) == 0x120)) {
   49664                                               UnallocatedA32(instr);
   49665                                               return;
   49666                                             }
   49667                                             unsigned cmode =
   49668                                                 ((instr >> 8) & 0xf) |
   49669                                                 ((instr >> 1) & 0x10);
   49670                                             DataType dt =
   49671                                                 ImmediateVmov::DecodeDt(cmode);
   49672                                             if (dt.Is(kDataTypeValueInvalid)) {
   49673                                               UnallocatedA32(instr);
   49674                                               return;
   49675                                             }
   49676                                             if (((instr >> 12) & 1) != 0) {
   49677                                               UnallocatedA32(instr);
   49678                                               return;
   49679                                             }
   49680                                             unsigned rd =
   49681                                                 ExtractQRegister(instr, 22, 12);
   49682                                             QOperand imm =
   49683                                                 ImmediateVmov::DecodeImmediate(
   49684                                                     cmode,
   49685                                                     (instr & 0xf) |
   49686                                                         ((instr >> 12) & 0x70) |
   49687                                                         ((instr >> 17) & 0x80));
   49688                                             // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
   49689                                             vmov(al, dt, QRegister(rd), imm);
   49690                                             break;
   49691                                           }
   49692                                           default:
   49693                                             UnallocatedA32(instr);
   49694                                             break;
   49695                                         }
   49696                                         break;
   49697                                       }
   49698                                       default: {
   49699                                         if (((instr & 0x920) == 0x100) ||
   49700                                             ((instr & 0x520) == 0x100) ||
   49701                                             ((instr & 0x820) == 0x20) ||
   49702                                             ((instr & 0x420) == 0x20) ||
   49703                                             ((instr & 0x220) == 0x20) ||
   49704                                             ((instr & 0x120) == 0x120)) {
   49705                                           UnallocatedA32(instr);
   49706                                           return;
   49707                                         }
   49708                                         unsigned cmode = ((instr >> 8) & 0xf) |
   49709                                                          ((instr >> 1) & 0x10);
   49710                                         DataType dt =
   49711                                             ImmediateVmov::DecodeDt(cmode);
   49712                                         if (dt.Is(kDataTypeValueInvalid)) {
   49713                                           UnallocatedA32(instr);
   49714                                           return;
   49715                                         }
   49716                                         if (((instr >> 12) & 1) != 0) {
   49717                                           UnallocatedA32(instr);
   49718                                           return;
   49719                                         }
   49720                                         unsigned rd =
   49721                                             ExtractQRegister(instr, 22, 12);
   49722                                         QOperand imm =
   49723                                             ImmediateVmov::DecodeImmediate(
   49724                                                 cmode,
   49725                                                 (instr & 0xf) |
   49726                                                     ((instr >> 12) & 0x70) |
   49727                                                     ((instr >> 17) & 0x80));
   49728                                         // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1
   49729                                         vmov(al, dt, QRegister(rd), imm);
   49730                                         break;
   49731                                       }
   49732                                     }
   49733                                     break;
   49734                                   }
   49735                                 }
   49736                                 break;
   49737                               }
   49738                               default:
   49739                                 UnallocatedA32(instr);
   49740                                 break;
   49741                             }
   49742                             break;
   49743                           }
   49744                           default: {
   49745                             if ((instr & 0x00000200) == 0x00000200) {
   49746                               if (((instr & 0x200000) == 0x0)) {
   49747                                 UnallocatedA32(instr);
   49748                                 return;
   49749                               }
   49750                               DataType dt1 = Dt_op_U_1_Decode1(
   49751                                   ((instr >> 24) & 0x1) | ((instr >> 7) & 0x2));
   49752                               if (dt1.Is(kDataTypeValueInvalid)) {
   49753                                 UnallocatedA32(instr);
   49754                                 return;
   49755                               }
   49756                               DataType dt2 = Dt_op_U_1_Decode2(
   49757                                   ((instr >> 24) & 0x1) | ((instr >> 7) & 0x2));
   49758                               if (dt2.Is(kDataTypeValueInvalid)) {
   49759                                 UnallocatedA32(instr);
   49760                                 return;
   49761                               }
   49762                               if (((instr >> 12) & 1) != 0) {
   49763                                 UnallocatedA32(instr);
   49764                                 return;
   49765                               }
   49766                               unsigned rd = ExtractQRegister(instr, 22, 12);
   49767                               if ((instr & 1) != 0) {
   49768                                 UnallocatedA32(instr);
   49769                                 return;
   49770                               }
   49771                               unsigned rm = ExtractQRegister(instr, 5, 0);
   49772                               uint32_t fbits = 64 - ((instr >> 16) & 0x3f);
   49773                               // VCVT{<c>}{<q>}.<dt>.<dt> <Qd>, <Qm>, #<fbits> ; A1 NOLINT(whitespace/line_length)
   49774                               vcvt(al,
   49775                                    dt1,
   49776                                    dt2,
   49777                                    QRegister(rd),
   49778                                    QRegister(rm),
   49779                                    fbits);
   49780                             } else {
   49781                               UnallocatedA32(instr);
   49782                             }
   49783                             break;
   49784                           }
   49785                         }
   49786                         break;
   49787                       }
   49788                       default:
   49789                         UnallocatedA32(instr);
   49790                         break;
   49791                     }
   49792                     break;
   49793                   }
   49794                 }
   49795                 break;
   49796               }
   49797             }
   49798             break;
   49799           }
   49800         }
   49801         break;
   49802       }
   49803       case 0x04000000: {
   49804         // 0xf4000000
   49805         switch (instr & 0x01300000) {
   49806           case 0x00000000: {
   49807             // 0xf4000000
   49808             switch (instr & 0x00800000) {
   49809               case 0x00000000: {
   49810                 // 0xf4000000
   49811                 switch (instr & 0x0000000d) {
   49812                   case 0x0000000d: {
   49813                     // 0xf400000d
   49814                     switch (instr & 0x00000002) {
   49815                       case 0x00000000: {
   49816                         // 0xf400000d
   49817                         switch (instr & 0x00000f00) {
   49818                           case 0x00000000: {
   49819                             // 0xf400000d
   49820                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
   49821                             if (dt.Is(kDataTypeValueInvalid)) {
   49822                               UnallocatedA32(instr);
   49823                               return;
   49824                             }
   49825                             Alignment align =
   49826                                 Align_align_4_Decode((instr >> 4) & 0x3);
   49827                             if (dt.Is(kDataTypeValueInvalid) ||
   49828                                 align.Is(kBadAlignment)) {
   49829                               UnallocatedA32(instr);
   49830                               return;
   49831                             }
   49832                             unsigned first = ExtractDRegister(instr, 22, 12);
   49833                             unsigned length;
   49834                             SpacingType spacing;
   49835                             switch ((instr >> 8) & 0xf) {
   49836                               default:
   49837                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
   49838                               case 0x0:
   49839                                 length = 4;
   49840                                 spacing = kSingle;
   49841                                 break;
   49842                               case 0x1:
   49843                                 length = 4;
   49844                                 spacing = kDouble;
   49845                                 break;
   49846                             }
   49847                             unsigned last =
   49848                                 first +
   49849                                 (length - 1) * (spacing == kSingle ? 1 : 2);
   49850                             TransferType transfer = kMultipleLanes;
   49851                             unsigned rn = (instr >> 16) & 0xf;
   49852                             // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
   49853                             vst4(al,
   49854                                  dt,
   49855                                  NeonRegisterList(DRegister(first),
   49856                                                   DRegister(last),
   49857                                                   spacing,
   49858                                                   transfer),
   49859                                  AlignedMemOperand(Register(rn),
   49860                                                    align,
   49861                                                    PostIndex));
   49862                             break;
   49863                           }
   49864                           case 0x00000100: {
   49865                             // 0xf400010d
   49866                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
   49867                             if (dt.Is(kDataTypeValueInvalid)) {
   49868                               UnallocatedA32(instr);
   49869                               return;
   49870                             }
   49871                             Alignment align =
   49872                                 Align_align_4_Decode((instr >> 4) & 0x3);
   49873                             if (dt.Is(kDataTypeValueInvalid) ||
   49874                                 align.Is(kBadAlignment)) {
   49875                               UnallocatedA32(instr);
   49876                               return;
   49877                             }
   49878                             unsigned first = ExtractDRegister(instr, 22, 12);
   49879                             unsigned length;
   49880                             SpacingType spacing;
   49881                             switch ((instr >> 8) & 0xf) {
   49882                               default:
   49883                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
   49884                               case 0x0:
   49885                                 length = 4;
   49886                                 spacing = kSingle;
   49887                                 break;
   49888                               case 0x1:
   49889                                 length = 4;
   49890                                 spacing = kDouble;
   49891                                 break;
   49892                             }
   49893                             unsigned last =
   49894                                 first +
   49895                                 (length - 1) * (spacing == kSingle ? 1 : 2);
   49896                             TransferType transfer = kMultipleLanes;
   49897                             unsigned rn = (instr >> 16) & 0xf;
   49898                             // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
   49899                             vst4(al,
   49900                                  dt,
   49901                                  NeonRegisterList(DRegister(first),
   49902                                                   DRegister(last),
   49903                                                   spacing,
   49904                                                   transfer),
   49905                                  AlignedMemOperand(Register(rn),
   49906                                                    align,
   49907                                                    PostIndex));
   49908                             break;
   49909                           }
   49910                           case 0x00000200: {
   49911                             // 0xf400020d
   49912                             if (((instr & 0xe20) == 0x620) ||
   49913                                 ((instr & 0xf30) == 0xa30)) {
   49914                               UnallocatedA32(instr);
   49915                               return;
   49916                             }
   49917                             DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
   49918                             if (dt.Is(kDataTypeValueInvalid)) {
   49919                               UnallocatedA32(instr);
   49920                               return;
   49921                             }
   49922                             Alignment align =
   49923                                 Align_align_5_Decode((instr >> 4) & 0x3);
   49924                             if (dt.Is(kDataTypeValueInvalid) ||
   49925                                 align.Is(kBadAlignment)) {
   49926                               UnallocatedA32(instr);
   49927                               return;
   49928                             }
   49929                             unsigned first = ExtractDRegister(instr, 22, 12);
   49930                             unsigned length;
   49931                             SpacingType spacing = kSingle;
   49932                             switch ((instr >> 8) & 0xf) {
   49933                               default:
   49934                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
   49935                               case 0x7:
   49936                                 length = 1;
   49937                                 break;
   49938                               case 0xa:
   49939                                 length = 2;
   49940                                 break;
   49941                               case 0x6:
   49942                                 length = 3;
   49943                                 break;
   49944                               case 0x2:
   49945                                 length = 4;
   49946                                 break;
   49947                             }
   49948                             unsigned last = first + length - 1;
   49949                             TransferType transfer = kMultipleLanes;
   49950                             unsigned rn = (instr >> 16) & 0xf;
   49951                             // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
   49952                             vst1(al,
   49953                                  dt,
   49954                                  NeonRegisterList(DRegister(first),
   49955                                                   DRegister(last),
   49956                                                   spacing,
   49957                                                   transfer),
   49958                                  AlignedMemOperand(Register(rn),
   49959                                                    align,
   49960                                                    PostIndex));
   49961                             break;
   49962                           }
   49963                           case 0x00000300: {
   49964                             // 0xf400030d
   49965                             if (((instr & 0xe30) == 0x830)) {
   49966                               UnallocatedA32(instr);
   49967                               return;
   49968                             }
   49969                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
   49970                             if (dt.Is(kDataTypeValueInvalid)) {
   49971                               UnallocatedA32(instr);
   49972                               return;
   49973                             }
   49974                             Alignment align =
   49975                                 Align_align_2_Decode((instr >> 4) & 0x3);
   49976                             if (dt.Is(kDataTypeValueInvalid) ||
   49977                                 align.Is(kBadAlignment)) {
   49978                               UnallocatedA32(instr);
   49979                               return;
   49980                             }
   49981                             unsigned first = ExtractDRegister(instr, 22, 12);
   49982                             unsigned length;
   49983                             SpacingType spacing;
   49984                             switch ((instr >> 8) & 0xf) {
   49985                               default:
   49986                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
   49987                               case 0x8:
   49988                                 length = 2;
   49989                                 spacing = kSingle;
   49990                                 break;
   49991                               case 0x9:
   49992                                 length = 2;
   49993                                 spacing = kDouble;
   49994                                 break;
   49995                               case 0x3:
   49996                                 length = 4;
   49997                                 spacing = kSingle;
   49998                                 break;
   49999                             }
   50000                             unsigned last =
   50001                                 first +
   50002                                 (length - 1) * (spacing == kSingle ? 1 : 2);
   50003                             TransferType transfer = kMultipleLanes;
   50004                             unsigned rn = (instr >> 16) & 0xf;
   50005                             // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
   50006                             vst2(al,
   50007                                  dt,
   50008                                  NeonRegisterList(DRegister(first),
   50009                                                   DRegister(last),
   50010                                                   spacing,
   50011                                                   transfer),
   50012                                  AlignedMemOperand(Register(rn),
   50013                                                    align,
   50014                                                    PostIndex));
   50015                             break;
   50016                           }
   50017                           case 0x00000400: {
   50018                             // 0xf400040d
   50019                             if (((instr & 0x20) == 0x20)) {
   50020                               UnallocatedA32(instr);
   50021                               return;
   50022                             }
   50023                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
   50024                             if (dt.Is(kDataTypeValueInvalid)) {
   50025                               UnallocatedA32(instr);
   50026                               return;
   50027                             }
   50028                             Alignment align =
   50029                                 Align_align_3_Decode((instr >> 4) & 0x3);
   50030                             if (dt.Is(kDataTypeValueInvalid) ||
   50031                                 align.Is(kBadAlignment)) {
   50032                               UnallocatedA32(instr);
   50033                               return;
   50034                             }
   50035                             unsigned first = ExtractDRegister(instr, 22, 12);
   50036                             unsigned length;
   50037                             SpacingType spacing;
   50038                             switch ((instr >> 8) & 0xf) {
   50039                               default:
   50040                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
   50041                               case 0x4:
   50042                                 length = 3;
   50043                                 spacing = kSingle;
   50044                                 break;
   50045                               case 0x5:
   50046                                 length = 3;
   50047                                 spacing = kDouble;
   50048                                 break;
   50049                             }
   50050                             unsigned last =
   50051                                 first +
   50052                                 (length - 1) * (spacing == kSingle ? 1 : 2);
   50053                             TransferType transfer = kMultipleLanes;
   50054                             unsigned rn = (instr >> 16) & 0xf;
   50055                             // VST3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
   50056                             vst3(al,
   50057                                  dt,
   50058                                  NeonRegisterList(DRegister(first),
   50059                                                   DRegister(last),
   50060                                                   spacing,
   50061                                                   transfer),
   50062                                  AlignedMemOperand(Register(rn),
   50063                                                    align,
   50064                                                    PostIndex));
   50065                             break;
   50066                           }
   50067                           case 0x00000500: {
   50068                             // 0xf400050d
   50069                             if (((instr & 0x20) == 0x20)) {
   50070                               UnallocatedA32(instr);
   50071                               return;
   50072                             }
   50073                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
   50074                             if (dt.Is(kDataTypeValueInvalid)) {
   50075                               UnallocatedA32(instr);
   50076                               return;
   50077                             }
   50078                             Alignment align =
   50079                                 Align_align_3_Decode((instr >> 4) & 0x3);
   50080                             if (dt.Is(kDataTypeValueInvalid) ||
   50081                                 align.Is(kBadAlignment)) {
   50082                               UnallocatedA32(instr);
   50083                               return;
   50084                             }
   50085                             unsigned first = ExtractDRegister(instr, 22, 12);
   50086                             unsigned length;
   50087                             SpacingType spacing;
   50088                             switch ((instr >> 8) & 0xf) {
   50089                               default:
   50090                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
   50091                               case 0x4:
   50092                                 length = 3;
   50093                                 spacing = kSingle;
   50094                                 break;
   50095                               case 0x5:
   50096                                 length = 3;
   50097                                 spacing = kDouble;
   50098                                 break;
   50099                             }
   50100                             unsigned last =
   50101                                 first +
   50102                                 (length - 1) * (spacing == kSingle ? 1 : 2);
   50103                             TransferType transfer = kMultipleLanes;
   50104                             unsigned rn = (instr >> 16) & 0xf;
   50105                             // VST3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
   50106                             vst3(al,
   50107                                  dt,
   50108                                  NeonRegisterList(DRegister(first),
   50109                                                   DRegister(last),
   50110                                                   spacing,
   50111                                                   transfer),
   50112                                  AlignedMemOperand(Register(rn),
   50113                                                    align,
   50114                                                    PostIndex));
   50115                             break;
   50116                           }
   50117                           case 0x00000600: {
   50118                             // 0xf400060d
   50119                             if (((instr & 0xe20) == 0x620) ||
   50120                                 ((instr & 0xf30) == 0xa30)) {
   50121                               UnallocatedA32(instr);
   50122                               return;
   50123                             }
   50124                             DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
   50125                             if (dt.Is(kDataTypeValueInvalid)) {
   50126                               UnallocatedA32(instr);
   50127                               return;
   50128                             }
   50129                             Alignment align =
   50130                                 Align_align_5_Decode((instr >> 4) & 0x3);
   50131                             if (dt.Is(kDataTypeValueInvalid) ||
   50132                                 align.Is(kBadAlignment)) {
   50133                               UnallocatedA32(instr);
   50134                               return;
   50135                             }
   50136                             unsigned first = ExtractDRegister(instr, 22, 12);
   50137                             unsigned length;
   50138                             SpacingType spacing = kSingle;
   50139                             switch ((instr >> 8) & 0xf) {
   50140                               default:
   50141                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
   50142                               case 0x7:
   50143                                 length = 1;
   50144                                 break;
   50145                               case 0xa:
   50146                                 length = 2;
   50147                                 break;
   50148                               case 0x6:
   50149                                 length = 3;
   50150                                 break;
   50151                               case 0x2:
   50152                                 length = 4;
   50153                                 break;
   50154                             }
   50155                             unsigned last = first + length - 1;
   50156                             TransferType transfer = kMultipleLanes;
   50157                             unsigned rn = (instr >> 16) & 0xf;
   50158                             // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
   50159                             vst1(al,
   50160                                  dt,
   50161                                  NeonRegisterList(DRegister(first),
   50162                                                   DRegister(last),
   50163                                                   spacing,
   50164                                                   transfer),
   50165                                  AlignedMemOperand(Register(rn),
   50166                                                    align,
   50167                                                    PostIndex));
   50168                             break;
   50169                           }
   50170                           case 0x00000700: {
   50171                             // 0xf400070d
   50172                             if (((instr & 0xe20) == 0x620) ||
   50173                                 ((instr & 0xf30) == 0xa30)) {
   50174                               UnallocatedA32(instr);
   50175                               return;
   50176                             }
   50177                             DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
   50178                             if (dt.Is(kDataTypeValueInvalid)) {
   50179                               UnallocatedA32(instr);
   50180                               return;
   50181                             }
   50182                             Alignment align =
   50183                                 Align_align_5_Decode((instr >> 4) & 0x3);
   50184                             if (dt.Is(kDataTypeValueInvalid) ||
   50185                                 align.Is(kBadAlignment)) {
   50186                               UnallocatedA32(instr);
   50187                               return;
   50188                             }
   50189                             unsigned first = ExtractDRegister(instr, 22, 12);
   50190                             unsigned length;
   50191                             SpacingType spacing = kSingle;
   50192                             switch ((instr >> 8) & 0xf) {
   50193                               default:
   50194                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
   50195                               case 0x7:
   50196                                 length = 1;
   50197                                 break;
   50198                               case 0xa:
   50199                                 length = 2;
   50200                                 break;
   50201                               case 0x6:
   50202                                 length = 3;
   50203                                 break;
   50204                               case 0x2:
   50205                                 length = 4;
   50206                                 break;
   50207                             }
   50208                             unsigned last = first + length - 1;
   50209                             TransferType transfer = kMultipleLanes;
   50210                             unsigned rn = (instr >> 16) & 0xf;
   50211                             // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
   50212                             vst1(al,
   50213                                  dt,
   50214                                  NeonRegisterList(DRegister(first),
   50215                                                   DRegister(last),
   50216                                                   spacing,
   50217                                                   transfer),
   50218                                  AlignedMemOperand(Register(rn),
   50219                                                    align,
   50220                                                    PostIndex));
   50221                             break;
   50222                           }
   50223                           case 0x00000800: {
   50224                             // 0xf400080d
   50225                             if (((instr & 0xe30) == 0x830)) {
   50226                               UnallocatedA32(instr);
   50227                               return;
   50228                             }
   50229                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
   50230                             if (dt.Is(kDataTypeValueInvalid)) {
   50231                               UnallocatedA32(instr);
   50232                               return;
   50233                             }
   50234                             Alignment align =
   50235                                 Align_align_2_Decode((instr >> 4) & 0x3);
   50236                             if (dt.Is(kDataTypeValueInvalid) ||
   50237                                 align.Is(kBadAlignment)) {
   50238                               UnallocatedA32(instr);
   50239                               return;
   50240                             }
   50241                             unsigned first = ExtractDRegister(instr, 22, 12);
   50242                             unsigned length;
   50243                             SpacingType spacing;
   50244                             switch ((instr >> 8) & 0xf) {
   50245                               default:
   50246                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
   50247                               case 0x8:
   50248                                 length = 2;
   50249                                 spacing = kSingle;
   50250                                 break;
   50251                               case 0x9:
   50252                                 length = 2;
   50253                                 spacing = kDouble;
   50254                                 break;
   50255                               case 0x3:
   50256                                 length = 4;
   50257                                 spacing = kSingle;
   50258                                 break;
   50259                             }
   50260                             unsigned last =
   50261                                 first +
   50262                                 (length - 1) * (spacing == kSingle ? 1 : 2);
   50263                             TransferType transfer = kMultipleLanes;
   50264                             unsigned rn = (instr >> 16) & 0xf;
   50265                             // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
   50266                             vst2(al,
   50267                                  dt,
   50268                                  NeonRegisterList(DRegister(first),
   50269                                                   DRegister(last),
   50270                                                   spacing,
   50271                                                   transfer),
   50272                                  AlignedMemOperand(Register(rn),
   50273                                                    align,
   50274                                                    PostIndex));
   50275                             break;
   50276                           }
   50277                           case 0x00000900: {
   50278                             // 0xf400090d
   50279                             if (((instr & 0xe30) == 0x830)) {
   50280                               UnallocatedA32(instr);
   50281                               return;
   50282                             }
   50283                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
   50284                             if (dt.Is(kDataTypeValueInvalid)) {
   50285                               UnallocatedA32(instr);
   50286                               return;
   50287                             }
   50288                             Alignment align =
   50289                                 Align_align_2_Decode((instr >> 4) & 0x3);
   50290                             if (dt.Is(kDataTypeValueInvalid) ||
   50291                                 align.Is(kBadAlignment)) {
   50292                               UnallocatedA32(instr);
   50293                               return;
   50294                             }
   50295                             unsigned first = ExtractDRegister(instr, 22, 12);
   50296                             unsigned length;
   50297                             SpacingType spacing;
   50298                             switch ((instr >> 8) & 0xf) {
   50299                               default:
   50300                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
   50301                               case 0x8:
   50302                                 length = 2;
   50303                                 spacing = kSingle;
   50304                                 break;
   50305                               case 0x9:
   50306                                 length = 2;
   50307                                 spacing = kDouble;
   50308                                 break;
   50309                               case 0x3:
   50310                                 length = 4;
   50311                                 spacing = kSingle;
   50312                                 break;
   50313                             }
   50314                             unsigned last =
   50315                                 first +
   50316                                 (length - 1) * (spacing == kSingle ? 1 : 2);
   50317                             TransferType transfer = kMultipleLanes;
   50318                             unsigned rn = (instr >> 16) & 0xf;
   50319                             // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
   50320                             vst2(al,
   50321                                  dt,
   50322                                  NeonRegisterList(DRegister(first),
   50323                                                   DRegister(last),
   50324                                                   spacing,
   50325                                                   transfer),
   50326                                  AlignedMemOperand(Register(rn),
   50327                                                    align,
   50328                                                    PostIndex));
   50329                             break;
   50330                           }
   50331                           case 0x00000a00: {
   50332                             // 0xf4000a0d
   50333                             if (((instr & 0xe20) == 0x620) ||
   50334                                 ((instr & 0xf30) == 0xa30)) {
   50335                               UnallocatedA32(instr);
   50336                               return;
   50337                             }
   50338                             DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
   50339                             if (dt.Is(kDataTypeValueInvalid)) {
   50340                               UnallocatedA32(instr);
   50341                               return;
   50342                             }
   50343                             Alignment align =
   50344                                 Align_align_5_Decode((instr >> 4) & 0x3);
   50345                             if (dt.Is(kDataTypeValueInvalid) ||
   50346                                 align.Is(kBadAlignment)) {
   50347                               UnallocatedA32(instr);
   50348                               return;
   50349                             }
   50350                             unsigned first = ExtractDRegister(instr, 22, 12);
   50351                             unsigned length;
   50352                             SpacingType spacing = kSingle;
   50353                             switch ((instr >> 8) & 0xf) {
   50354                               default:
   50355                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
   50356                               case 0x7:
   50357                                 length = 1;
   50358                                 break;
   50359                               case 0xa:
   50360                                 length = 2;
   50361                                 break;
   50362                               case 0x6:
   50363                                 length = 3;
   50364                                 break;
   50365                               case 0x2:
   50366                                 length = 4;
   50367                                 break;
   50368                             }
   50369                             unsigned last = first + length - 1;
   50370                             TransferType transfer = kMultipleLanes;
   50371                             unsigned rn = (instr >> 16) & 0xf;
   50372                             // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
   50373                             vst1(al,
   50374                                  dt,
   50375                                  NeonRegisterList(DRegister(first),
   50376                                                   DRegister(last),
   50377                                                   spacing,
   50378                                                   transfer),
   50379                                  AlignedMemOperand(Register(rn),
   50380                                                    align,
   50381                                                    PostIndex));
   50382                             break;
   50383                           }
   50384                           default:
   50385                             UnallocatedA32(instr);
   50386                             break;
   50387                         }
   50388                         break;
   50389                       }
   50390                       case 0x00000002: {
   50391                         // 0xf400000f
   50392                         switch (instr & 0x00000f00) {
   50393                           case 0x00000000: {
   50394                             // 0xf400000d
   50395                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
   50396                             if (dt.Is(kDataTypeValueInvalid)) {
   50397                               UnallocatedA32(instr);
   50398                               return;
   50399                             }
   50400                             Alignment align =
   50401                                 Align_align_4_Decode((instr >> 4) & 0x3);
   50402                             if (dt.Is(kDataTypeValueInvalid) ||
   50403                                 align.Is(kBadAlignment)) {
   50404                               UnallocatedA32(instr);
   50405                               return;
   50406                             }
   50407                             unsigned first = ExtractDRegister(instr, 22, 12);
   50408                             unsigned length;
   50409                             SpacingType spacing;
   50410                             switch ((instr >> 8) & 0xf) {
   50411                               default:
   50412                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
   50413                               case 0x0:
   50414                                 length = 4;
   50415                                 spacing = kSingle;
   50416                                 break;
   50417                               case 0x1:
   50418                                 length = 4;
   50419                                 spacing = kDouble;
   50420                                 break;
   50421                             }
   50422                             unsigned last =
   50423                                 first +
   50424                                 (length - 1) * (spacing == kSingle ? 1 : 2);
   50425                             TransferType transfer = kMultipleLanes;
   50426                             unsigned rn = (instr >> 16) & 0xf;
   50427                             // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
   50428                             vst4(al,
   50429                                  dt,
   50430                                  NeonRegisterList(DRegister(first),
   50431                                                   DRegister(last),
   50432                                                   spacing,
   50433                                                   transfer),
   50434                                  AlignedMemOperand(Register(rn),
   50435                                                    align,
   50436                                                    Offset));
   50437                             break;
   50438                           }
   50439                           case 0x00000100: {
   50440                             // 0xf400010d
   50441                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
   50442                             if (dt.Is(kDataTypeValueInvalid)) {
   50443                               UnallocatedA32(instr);
   50444                               return;
   50445                             }
   50446                             Alignment align =
   50447                                 Align_align_4_Decode((instr >> 4) & 0x3);
   50448                             if (dt.Is(kDataTypeValueInvalid) ||
   50449                                 align.Is(kBadAlignment)) {
   50450                               UnallocatedA32(instr);
   50451                               return;
   50452                             }
   50453                             unsigned first = ExtractDRegister(instr, 22, 12);
   50454                             unsigned length;
   50455                             SpacingType spacing;
   50456                             switch ((instr >> 8) & 0xf) {
   50457                               default:
   50458                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
   50459                               case 0x0:
   50460                                 length = 4;
   50461                                 spacing = kSingle;
   50462                                 break;
   50463                               case 0x1:
   50464                                 length = 4;
   50465                                 spacing = kDouble;
   50466                                 break;
   50467                             }
   50468                             unsigned last =
   50469                                 first +
   50470                                 (length - 1) * (spacing == kSingle ? 1 : 2);
   50471                             TransferType transfer = kMultipleLanes;
   50472                             unsigned rn = (instr >> 16) & 0xf;
   50473                             // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
   50474                             vst4(al,
   50475                                  dt,
   50476                                  NeonRegisterList(DRegister(first),
   50477                                                   DRegister(last),
   50478                                                   spacing,
   50479                                                   transfer),
   50480                                  AlignedMemOperand(Register(rn),
   50481                                                    align,
   50482                                                    Offset));
   50483                             break;
   50484                           }
   50485                           case 0x00000200: {
   50486                             // 0xf400020d
   50487                             if (((instr & 0xe20) == 0x620) ||
   50488                                 ((instr & 0xf30) == 0xa30)) {
   50489                               UnallocatedA32(instr);
   50490                               return;
   50491                             }
   50492                             DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
   50493                             if (dt.Is(kDataTypeValueInvalid)) {
   50494                               UnallocatedA32(instr);
   50495                               return;
   50496                             }
   50497                             Alignment align =
   50498                                 Align_align_5_Decode((instr >> 4) & 0x3);
   50499                             if (dt.Is(kDataTypeValueInvalid) ||
   50500                                 align.Is(kBadAlignment)) {
   50501                               UnallocatedA32(instr);
   50502                               return;
   50503                             }
   50504                             unsigned first = ExtractDRegister(instr, 22, 12);
   50505                             unsigned length;
   50506                             SpacingType spacing = kSingle;
   50507                             switch ((instr >> 8) & 0xf) {
   50508                               default:
   50509                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
   50510                               case 0x7:
   50511                                 length = 1;
   50512                                 break;
   50513                               case 0xa:
   50514                                 length = 2;
   50515                                 break;
   50516                               case 0x6:
   50517                                 length = 3;
   50518                                 break;
   50519                               case 0x2:
   50520                                 length = 4;
   50521                                 break;
   50522                             }
   50523                             unsigned last = first + length - 1;
   50524                             TransferType transfer = kMultipleLanes;
   50525                             unsigned rn = (instr >> 16) & 0xf;
   50526                             // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
   50527                             vst1(al,
   50528                                  dt,
   50529                                  NeonRegisterList(DRegister(first),
   50530                                                   DRegister(last),
   50531                                                   spacing,
   50532                                                   transfer),
   50533                                  AlignedMemOperand(Register(rn),
   50534                                                    align,
   50535                                                    Offset));
   50536                             break;
   50537                           }
   50538                           case 0x00000300: {
   50539                             // 0xf400030d
   50540                             if (((instr & 0xe30) == 0x830)) {
   50541                               UnallocatedA32(instr);
   50542                               return;
   50543                             }
   50544                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
   50545                             if (dt.Is(kDataTypeValueInvalid)) {
   50546                               UnallocatedA32(instr);
   50547                               return;
   50548                             }
   50549                             Alignment align =
   50550                                 Align_align_2_Decode((instr >> 4) & 0x3);
   50551                             if (dt.Is(kDataTypeValueInvalid) ||
   50552                                 align.Is(kBadAlignment)) {
   50553                               UnallocatedA32(instr);
   50554                               return;
   50555                             }
   50556                             unsigned first = ExtractDRegister(instr, 22, 12);
   50557                             unsigned length;
   50558                             SpacingType spacing;
   50559                             switch ((instr >> 8) & 0xf) {
   50560                               default:
   50561                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
   50562                               case 0x8:
   50563                                 length = 2;
   50564                                 spacing = kSingle;
   50565                                 break;
   50566                               case 0x9:
   50567                                 length = 2;
   50568                                 spacing = kDouble;
   50569                                 break;
   50570                               case 0x3:
   50571                                 length = 4;
   50572                                 spacing = kSingle;
   50573                                 break;
   50574                             }
   50575                             unsigned last =
   50576                                 first +
   50577                                 (length - 1) * (spacing == kSingle ? 1 : 2);
   50578                             TransferType transfer = kMultipleLanes;
   50579                             unsigned rn = (instr >> 16) & 0xf;
   50580                             // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
   50581                             vst2(al,
   50582                                  dt,
   50583                                  NeonRegisterList(DRegister(first),
   50584                                                   DRegister(last),
   50585                                                   spacing,
   50586                                                   transfer),
   50587                                  AlignedMemOperand(Register(rn),
   50588                                                    align,
   50589                                                    Offset));
   50590                             break;
   50591                           }
   50592                           case 0x00000400: {
   50593                             // 0xf400040d
   50594                             if (((instr & 0x20) == 0x20)) {
   50595                               UnallocatedA32(instr);
   50596                               return;
   50597                             }
   50598                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
   50599                             if (dt.Is(kDataTypeValueInvalid)) {
   50600                               UnallocatedA32(instr);
   50601                               return;
   50602                             }
   50603                             Alignment align =
   50604                                 Align_align_3_Decode((instr >> 4) & 0x3);
   50605                             if (dt.Is(kDataTypeValueInvalid) ||
   50606                                 align.Is(kBadAlignment)) {
   50607                               UnallocatedA32(instr);
   50608                               return;
   50609                             }
   50610                             unsigned first = ExtractDRegister(instr, 22, 12);
   50611                             unsigned length;
   50612                             SpacingType spacing;
   50613                             switch ((instr >> 8) & 0xf) {
   50614                               default:
   50615                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
   50616                               case 0x4:
   50617                                 length = 3;
   50618                                 spacing = kSingle;
   50619                                 break;
   50620                               case 0x5:
   50621                                 length = 3;
   50622                                 spacing = kDouble;
   50623                                 break;
   50624                             }
   50625                             unsigned last =
   50626                                 first +
   50627                                 (length - 1) * (spacing == kSingle ? 1 : 2);
   50628                             TransferType transfer = kMultipleLanes;
   50629                             unsigned rn = (instr >> 16) & 0xf;
   50630                             // VST3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
   50631                             vst3(al,
   50632                                  dt,
   50633                                  NeonRegisterList(DRegister(first),
   50634                                                   DRegister(last),
   50635                                                   spacing,
   50636                                                   transfer),
   50637                                  AlignedMemOperand(Register(rn),
   50638                                                    align,
   50639                                                    Offset));
   50640                             break;
   50641                           }
   50642                           case 0x00000500: {
   50643                             // 0xf400050d
   50644                             if (((instr & 0x20) == 0x20)) {
   50645                               UnallocatedA32(instr);
   50646                               return;
   50647                             }
   50648                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
   50649                             if (dt.Is(kDataTypeValueInvalid)) {
   50650                               UnallocatedA32(instr);
   50651                               return;
   50652                             }
   50653                             Alignment align =
   50654                                 Align_align_3_Decode((instr >> 4) & 0x3);
   50655                             if (dt.Is(kDataTypeValueInvalid) ||
   50656                                 align.Is(kBadAlignment)) {
   50657                               UnallocatedA32(instr);
   50658                               return;
   50659                             }
   50660                             unsigned first = ExtractDRegister(instr, 22, 12);
   50661                             unsigned length;
   50662                             SpacingType spacing;
   50663                             switch ((instr >> 8) & 0xf) {
   50664                               default:
   50665                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
   50666                               case 0x4:
   50667                                 length = 3;
   50668                                 spacing = kSingle;
   50669                                 break;
   50670                               case 0x5:
   50671                                 length = 3;
   50672                                 spacing = kDouble;
   50673                                 break;
   50674                             }
   50675                             unsigned last =
   50676                                 first +
   50677                                 (length - 1) * (spacing == kSingle ? 1 : 2);
   50678                             TransferType transfer = kMultipleLanes;
   50679                             unsigned rn = (instr >> 16) & 0xf;
   50680                             // VST3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
   50681                             vst3(al,
   50682                                  dt,
   50683                                  NeonRegisterList(DRegister(first),
   50684                                                   DRegister(last),
   50685                                                   spacing,
   50686                                                   transfer),
   50687                                  AlignedMemOperand(Register(rn),
   50688                                                    align,
   50689                                                    Offset));
   50690                             break;
   50691                           }
   50692                           case 0x00000600: {
   50693                             // 0xf400060d
   50694                             if (((instr & 0xe20) == 0x620) ||
   50695                                 ((instr & 0xf30) == 0xa30)) {
   50696                               UnallocatedA32(instr);
   50697                               return;
   50698                             }
   50699                             DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
   50700                             if (dt.Is(kDataTypeValueInvalid)) {
   50701                               UnallocatedA32(instr);
   50702                               return;
   50703                             }
   50704                             Alignment align =
   50705                                 Align_align_5_Decode((instr >> 4) & 0x3);
   50706                             if (dt.Is(kDataTypeValueInvalid) ||
   50707                                 align.Is(kBadAlignment)) {
   50708                               UnallocatedA32(instr);
   50709                               return;
   50710                             }
   50711                             unsigned first = ExtractDRegister(instr, 22, 12);
   50712                             unsigned length;
   50713                             SpacingType spacing = kSingle;
   50714                             switch ((instr >> 8) & 0xf) {
   50715                               default:
   50716                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
   50717                               case 0x7:
   50718                                 length = 1;
   50719                                 break;
   50720                               case 0xa:
   50721                                 length = 2;
   50722                                 break;
   50723                               case 0x6:
   50724                                 length = 3;
   50725                                 break;
   50726                               case 0x2:
   50727                                 length = 4;
   50728                                 break;
   50729                             }
   50730                             unsigned last = first + length - 1;
   50731                             TransferType transfer = kMultipleLanes;
   50732                             unsigned rn = (instr >> 16) & 0xf;
   50733                             // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
   50734                             vst1(al,
   50735                                  dt,
   50736                                  NeonRegisterList(DRegister(first),
   50737                                                   DRegister(last),
   50738                                                   spacing,
   50739                                                   transfer),
   50740                                  AlignedMemOperand(Register(rn),
   50741                                                    align,
   50742                                                    Offset));
   50743                             break;
   50744                           }
   50745                           case 0x00000700: {
   50746                             // 0xf400070d
   50747                             if (((instr & 0xe20) == 0x620) ||
   50748                                 ((instr & 0xf30) == 0xa30)) {
   50749                               UnallocatedA32(instr);
   50750                               return;
   50751                             }
   50752                             DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
   50753                             if (dt.Is(kDataTypeValueInvalid)) {
   50754                               UnallocatedA32(instr);
   50755                               return;
   50756                             }
   50757                             Alignment align =
   50758                                 Align_align_5_Decode((instr >> 4) & 0x3);
   50759                             if (dt.Is(kDataTypeValueInvalid) ||
   50760                                 align.Is(kBadAlignment)) {
   50761                               UnallocatedA32(instr);
   50762                               return;
   50763                             }
   50764                             unsigned first = ExtractDRegister(instr, 22, 12);
   50765                             unsigned length;
   50766                             SpacingType spacing = kSingle;
   50767                             switch ((instr >> 8) & 0xf) {
   50768                               default:
   50769                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
   50770                               case 0x7:
   50771                                 length = 1;
   50772                                 break;
   50773                               case 0xa:
   50774                                 length = 2;
   50775                                 break;
   50776                               case 0x6:
   50777                                 length = 3;
   50778                                 break;
   50779                               case 0x2:
   50780                                 length = 4;
   50781                                 break;
   50782                             }
   50783                             unsigned last = first + length - 1;
   50784                             TransferType transfer = kMultipleLanes;
   50785                             unsigned rn = (instr >> 16) & 0xf;
   50786                             // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
   50787                             vst1(al,
   50788                                  dt,
   50789                                  NeonRegisterList(DRegister(first),
   50790                                                   DRegister(last),
   50791                                                   spacing,
   50792                                                   transfer),
   50793                                  AlignedMemOperand(Register(rn),
   50794                                                    align,
   50795                                                    Offset));
   50796                             break;
   50797                           }
   50798                           case 0x00000800: {
   50799                             // 0xf400080d
   50800                             if (((instr & 0xe30) == 0x830)) {
   50801                               UnallocatedA32(instr);
   50802                               return;
   50803                             }
   50804                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
   50805                             if (dt.Is(kDataTypeValueInvalid)) {
   50806                               UnallocatedA32(instr);
   50807                               return;
   50808                             }
   50809                             Alignment align =
   50810                                 Align_align_2_Decode((instr >> 4) & 0x3);
   50811                             if (dt.Is(kDataTypeValueInvalid) ||
   50812                                 align.Is(kBadAlignment)) {
   50813                               UnallocatedA32(instr);
   50814                               return;
   50815                             }
   50816                             unsigned first = ExtractDRegister(instr, 22, 12);
   50817                             unsigned length;
   50818                             SpacingType spacing;
   50819                             switch ((instr >> 8) & 0xf) {
   50820                               default:
   50821                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
   50822                               case 0x8:
   50823                                 length = 2;
   50824                                 spacing = kSingle;
   50825                                 break;
   50826                               case 0x9:
   50827                                 length = 2;
   50828                                 spacing = kDouble;
   50829                                 break;
   50830                               case 0x3:
   50831                                 length = 4;
   50832                                 spacing = kSingle;
   50833                                 break;
   50834                             }
   50835                             unsigned last =
   50836                                 first +
   50837                                 (length - 1) * (spacing == kSingle ? 1 : 2);
   50838                             TransferType transfer = kMultipleLanes;
   50839                             unsigned rn = (instr >> 16) & 0xf;
   50840                             // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
   50841                             vst2(al,
   50842                                  dt,
   50843                                  NeonRegisterList(DRegister(first),
   50844                                                   DRegister(last),
   50845                                                   spacing,
   50846                                                   transfer),
   50847                                  AlignedMemOperand(Register(rn),
   50848                                                    align,
   50849                                                    Offset));
   50850                             break;
   50851                           }
   50852                           case 0x00000900: {
   50853                             // 0xf400090d
   50854                             if (((instr & 0xe30) == 0x830)) {
   50855                               UnallocatedA32(instr);
   50856                               return;
   50857                             }
   50858                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
   50859                             if (dt.Is(kDataTypeValueInvalid)) {
   50860                               UnallocatedA32(instr);
   50861                               return;
   50862                             }
   50863                             Alignment align =
   50864                                 Align_align_2_Decode((instr >> 4) & 0x3);
   50865                             if (dt.Is(kDataTypeValueInvalid) ||
   50866                                 align.Is(kBadAlignment)) {
   50867                               UnallocatedA32(instr);
   50868                               return;
   50869                             }
   50870                             unsigned first = ExtractDRegister(instr, 22, 12);
   50871                             unsigned length;
   50872                             SpacingType spacing;
   50873                             switch ((instr >> 8) & 0xf) {
   50874                               default:
   50875                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
   50876                               case 0x8:
   50877                                 length = 2;
   50878                                 spacing = kSingle;
   50879                                 break;
   50880                               case 0x9:
   50881                                 length = 2;
   50882                                 spacing = kDouble;
   50883                                 break;
   50884                               case 0x3:
   50885                                 length = 4;
   50886                                 spacing = kSingle;
   50887                                 break;
   50888                             }
   50889                             unsigned last =
   50890                                 first +
   50891                                 (length - 1) * (spacing == kSingle ? 1 : 2);
   50892                             TransferType transfer = kMultipleLanes;
   50893                             unsigned rn = (instr >> 16) & 0xf;
   50894                             // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
   50895                             vst2(al,
   50896                                  dt,
   50897                                  NeonRegisterList(DRegister(first),
   50898                                                   DRegister(last),
   50899                                                   spacing,
   50900                                                   transfer),
   50901                                  AlignedMemOperand(Register(rn),
   50902                                                    align,
   50903                                                    Offset));
   50904                             break;
   50905                           }
   50906                           case 0x00000a00: {
   50907                             // 0xf4000a0d
   50908                             if (((instr & 0xe20) == 0x620) ||
   50909                                 ((instr & 0xf30) == 0xa30)) {
   50910                               UnallocatedA32(instr);
   50911                               return;
   50912                             }
   50913                             DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
   50914                             if (dt.Is(kDataTypeValueInvalid)) {
   50915                               UnallocatedA32(instr);
   50916                               return;
   50917                             }
   50918                             Alignment align =
   50919                                 Align_align_5_Decode((instr >> 4) & 0x3);
   50920                             if (dt.Is(kDataTypeValueInvalid) ||
   50921                                 align.Is(kBadAlignment)) {
   50922                               UnallocatedA32(instr);
   50923                               return;
   50924                             }
   50925                             unsigned first = ExtractDRegister(instr, 22, 12);
   50926                             unsigned length;
   50927                             SpacingType spacing = kSingle;
   50928                             switch ((instr >> 8) & 0xf) {
   50929                               default:
   50930                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
   50931                               case 0x7:
   50932                                 length = 1;
   50933                                 break;
   50934                               case 0xa:
   50935                                 length = 2;
   50936                                 break;
   50937                               case 0x6:
   50938                                 length = 3;
   50939                                 break;
   50940                               case 0x2:
   50941                                 length = 4;
   50942                                 break;
   50943                             }
   50944                             unsigned last = first + length - 1;
   50945                             TransferType transfer = kMultipleLanes;
   50946                             unsigned rn = (instr >> 16) & 0xf;
   50947                             // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
   50948                             vst1(al,
   50949                                  dt,
   50950                                  NeonRegisterList(DRegister(first),
   50951                                                   DRegister(last),
   50952                                                   spacing,
   50953                                                   transfer),
   50954                                  AlignedMemOperand(Register(rn),
   50955                                                    align,
   50956                                                    Offset));
   50957                             break;
   50958                           }
   50959                           default:
   50960                             UnallocatedA32(instr);
   50961                             break;
   50962                         }
   50963                         break;
   50964                       }
   50965                     }
   50966                     break;
   50967                   }
   50968                   default: {
   50969                     switch (instr & 0x00000f00) {
   50970                       case 0x00000000: {
   50971                         // 0xf4000000
   50972                         if (((instr & 0xd) == 0xd)) {
   50973                           UnallocatedA32(instr);
   50974                           return;
   50975                         }
   50976                         DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
   50977                         if (dt.Is(kDataTypeValueInvalid)) {
   50978                           UnallocatedA32(instr);
   50979                           return;
   50980                         }
   50981                         Alignment align =
   50982                             Align_align_4_Decode((instr >> 4) & 0x3);
   50983                         if (dt.Is(kDataTypeValueInvalid) ||
   50984                             align.Is(kBadAlignment)) {
   50985                           UnallocatedA32(instr);
   50986                           return;
   50987                         }
   50988                         unsigned first = ExtractDRegister(instr, 22, 12);
   50989                         unsigned length;
   50990                         SpacingType spacing;
   50991                         switch ((instr >> 8) & 0xf) {
   50992                           default:
   50993                             VIXL_UNREACHABLE_OR_FALLTHROUGH();
   50994                           case 0x0:
   50995                             length = 4;
   50996                             spacing = kSingle;
   50997                             break;
   50998                           case 0x1:
   50999                             length = 4;
   51000                             spacing = kDouble;
   51001                             break;
   51002                         }
   51003                         unsigned last =
   51004                             first + (length - 1) * (spacing == kSingle ? 1 : 2);
   51005                         TransferType transfer = kMultipleLanes;
   51006                         unsigned rn = (instr >> 16) & 0xf;
   51007                         unsigned rm = instr & 0xf;
   51008                         // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
   51009                         vst4(al,
   51010                              dt,
   51011                              NeonRegisterList(DRegister(first),
   51012                                               DRegister(last),
   51013                                               spacing,
   51014                                               transfer),
   51015                              AlignedMemOperand(Register(rn),
   51016                                                align,
   51017                                                Register(rm),
   51018                                                PostIndex));
   51019                         break;
   51020                       }
   51021                       case 0x00000100: {
   51022                         // 0xf4000100
   51023                         if (((instr & 0xd) == 0xd)) {
   51024                           UnallocatedA32(instr);
   51025                           return;
   51026                         }
   51027                         DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
   51028                         if (dt.Is(kDataTypeValueInvalid)) {
   51029                           UnallocatedA32(instr);
   51030                           return;
   51031                         }
   51032                         Alignment align =
   51033                             Align_align_4_Decode((instr >> 4) & 0x3);
   51034                         if (dt.Is(kDataTypeValueInvalid) ||
   51035                             align.Is(kBadAlignment)) {
   51036                           UnallocatedA32(instr);
   51037                           return;
   51038                         }
   51039                         unsigned first = ExtractDRegister(instr, 22, 12);
   51040                         unsigned length;
   51041                         SpacingType spacing;
   51042                         switch ((instr >> 8) & 0xf) {
   51043                           default:
   51044                             VIXL_UNREACHABLE_OR_FALLTHROUGH();
   51045                           case 0x0:
   51046                             length = 4;
   51047                             spacing = kSingle;
   51048                             break;
   51049                           case 0x1:
   51050                             length = 4;
   51051                             spacing = kDouble;
   51052                             break;
   51053                         }
   51054                         unsigned last =
   51055                             first + (length - 1) * (spacing == kSingle ? 1 : 2);
   51056                         TransferType transfer = kMultipleLanes;
   51057                         unsigned rn = (instr >> 16) & 0xf;
   51058                         unsigned rm = instr & 0xf;
   51059                         // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
   51060                         vst4(al,
   51061                              dt,
   51062                              NeonRegisterList(DRegister(first),
   51063                                               DRegister(last),
   51064                                               spacing,
   51065                                               transfer),
   51066                              AlignedMemOperand(Register(rn),
   51067                                                align,
   51068                                                Register(rm),
   51069                                                PostIndex));
   51070                         break;
   51071                       }
   51072                       case 0x00000200: {
   51073                         // 0xf4000200
   51074                         if (((instr & 0xd) == 0xd) ||
   51075                             ((instr & 0xe20) == 0x620) ||
   51076                             ((instr & 0xf30) == 0xa30)) {
   51077                           UnallocatedA32(instr);
   51078                           return;
   51079                         }
   51080                         DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
   51081                         if (dt.Is(kDataTypeValueInvalid)) {
   51082                           UnallocatedA32(instr);
   51083                           return;
   51084                         }
   51085                         Alignment align =
   51086                             Align_align_5_Decode((instr >> 4) & 0x3);
   51087                         if (dt.Is(kDataTypeValueInvalid) ||
   51088                             align.Is(kBadAlignment)) {
   51089                           UnallocatedA32(instr);
   51090                           return;
   51091                         }
   51092                         unsigned first = ExtractDRegister(instr, 22, 12);
   51093                         unsigned length;
   51094                         SpacingType spacing = kSingle;
   51095                         switch ((instr >> 8) & 0xf) {
   51096                           default:
   51097                             VIXL_UNREACHABLE_OR_FALLTHROUGH();
   51098                           case 0x7:
   51099                             length = 1;
   51100                             break;
   51101                           case 0xa:
   51102                             length = 2;
   51103                             break;
   51104                           case 0x6:
   51105                             length = 3;
   51106                             break;
   51107                           case 0x2:
   51108                             length = 4;
   51109                             break;
   51110                         }
   51111                         unsigned last = first + length - 1;
   51112                         TransferType transfer = kMultipleLanes;
   51113                         unsigned rn = (instr >> 16) & 0xf;
   51114                         unsigned rm = instr & 0xf;
   51115                         // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
   51116                         vst1(al,
   51117                              dt,
   51118                              NeonRegisterList(DRegister(first),
   51119                                               DRegister(last),
   51120                                               spacing,
   51121                                               transfer),
   51122                              AlignedMemOperand(Register(rn),
   51123                                                align,
   51124                                                Register(rm),
   51125                                                PostIndex));
   51126                         break;
   51127                       }
   51128                       case 0x00000300: {
   51129                         // 0xf4000300
   51130                         if (((instr & 0xd) == 0xd) ||
   51131                             ((instr & 0xe30) == 0x830)) {
   51132                           UnallocatedA32(instr);
   51133                           return;
   51134                         }
   51135                         DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
   51136                         if (dt.Is(kDataTypeValueInvalid)) {
   51137                           UnallocatedA32(instr);
   51138                           return;
   51139                         }
   51140                         Alignment align =
   51141                             Align_align_2_Decode((instr >> 4) & 0x3);
   51142                         if (dt.Is(kDataTypeValueInvalid) ||
   51143                             align.Is(kBadAlignment)) {
   51144                           UnallocatedA32(instr);
   51145                           return;
   51146                         }
   51147                         unsigned first = ExtractDRegister(instr, 22, 12);
   51148                         unsigned length;
   51149                         SpacingType spacing;
   51150                         switch ((instr >> 8) & 0xf) {
   51151                           default:
   51152                             VIXL_UNREACHABLE_OR_FALLTHROUGH();
   51153                           case 0x8:
   51154                             length = 2;
   51155                             spacing = kSingle;
   51156                             break;
   51157                           case 0x9:
   51158                             length = 2;
   51159                             spacing = kDouble;
   51160                             break;
   51161                           case 0x3:
   51162                             length = 4;
   51163                             spacing = kSingle;
   51164                             break;
   51165                         }
   51166                         unsigned last =
   51167                             first + (length - 1) * (spacing == kSingle ? 1 : 2);
   51168                         TransferType transfer = kMultipleLanes;
   51169                         unsigned rn = (instr >> 16) & 0xf;
   51170                         unsigned rm = instr & 0xf;
   51171                         // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
   51172                         vst2(al,
   51173                              dt,
   51174                              NeonRegisterList(DRegister(first),
   51175                                               DRegister(last),
   51176                                               spacing,
   51177                                               transfer),
   51178                              AlignedMemOperand(Register(rn),
   51179                                                align,
   51180                                                Register(rm),
   51181                                                PostIndex));
   51182                         break;
   51183                       }
   51184                       case 0x00000400: {
   51185                         // 0xf4000400
   51186                         if (((instr & 0xd) == 0xd) ||
   51187                             ((instr & 0x20) == 0x20)) {
   51188                           UnallocatedA32(instr);
   51189                           return;
   51190                         }
   51191                         DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
   51192                         if (dt.Is(kDataTypeValueInvalid)) {
   51193                           UnallocatedA32(instr);
   51194                           return;
   51195                         }
   51196                         Alignment align =
   51197                             Align_align_3_Decode((instr >> 4) & 0x3);
   51198                         if (dt.Is(kDataTypeValueInvalid) ||
   51199                             align.Is(kBadAlignment)) {
   51200                           UnallocatedA32(instr);
   51201                           return;
   51202                         }
   51203                         unsigned first = ExtractDRegister(instr, 22, 12);
   51204                         unsigned length;
   51205                         SpacingType spacing;
   51206                         switch ((instr >> 8) & 0xf) {
   51207                           default:
   51208                             VIXL_UNREACHABLE_OR_FALLTHROUGH();
   51209                           case 0x4:
   51210                             length = 3;
   51211                             spacing = kSingle;
   51212                             break;
   51213                           case 0x5:
   51214                             length = 3;
   51215                             spacing = kDouble;
   51216                             break;
   51217                         }
   51218                         unsigned last =
   51219                             first + (length - 1) * (spacing == kSingle ? 1 : 2);
   51220                         TransferType transfer = kMultipleLanes;
   51221                         unsigned rn = (instr >> 16) & 0xf;
   51222                         unsigned rm = instr & 0xf;
   51223                         // VST3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
   51224                         vst3(al,
   51225                              dt,
   51226                              NeonRegisterList(DRegister(first),
   51227                                               DRegister(last),
   51228                                               spacing,
   51229                                               transfer),
   51230                              AlignedMemOperand(Register(rn),
   51231                                                align,
   51232                                                Register(rm),
   51233                                                PostIndex));
   51234                         break;
   51235                       }
   51236                       case 0x00000500: {
   51237                         // 0xf4000500
   51238                         if (((instr & 0xd) == 0xd) ||
   51239                             ((instr & 0x20) == 0x20)) {
   51240                           UnallocatedA32(instr);
   51241                           return;
   51242                         }
   51243                         DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
   51244                         if (dt.Is(kDataTypeValueInvalid)) {
   51245                           UnallocatedA32(instr);
   51246                           return;
   51247                         }
   51248                         Alignment align =
   51249                             Align_align_3_Decode((instr >> 4) & 0x3);
   51250                         if (dt.Is(kDataTypeValueInvalid) ||
   51251                             align.Is(kBadAlignment)) {
   51252                           UnallocatedA32(instr);
   51253                           return;
   51254                         }
   51255                         unsigned first = ExtractDRegister(instr, 22, 12);
   51256                         unsigned length;
   51257                         SpacingType spacing;
   51258                         switch ((instr >> 8) & 0xf) {
   51259                           default:
   51260                             VIXL_UNREACHABLE_OR_FALLTHROUGH();
   51261                           case 0x4:
   51262                             length = 3;
   51263                             spacing = kSingle;
   51264                             break;
   51265                           case 0x5:
   51266                             length = 3;
   51267                             spacing = kDouble;
   51268                             break;
   51269                         }
   51270                         unsigned last =
   51271                             first + (length - 1) * (spacing == kSingle ? 1 : 2);
   51272                         TransferType transfer = kMultipleLanes;
   51273                         unsigned rn = (instr >> 16) & 0xf;
   51274                         unsigned rm = instr & 0xf;
   51275                         // VST3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
   51276                         vst3(al,
   51277                              dt,
   51278                              NeonRegisterList(DRegister(first),
   51279                                               DRegister(last),
   51280                                               spacing,
   51281                                               transfer),
   51282                              AlignedMemOperand(Register(rn),
   51283                                                align,
   51284                                                Register(rm),
   51285                                                PostIndex));
   51286                         break;
   51287                       }
   51288                       case 0x00000600: {
   51289                         // 0xf4000600
   51290                         if (((instr & 0xd) == 0xd) ||
   51291                             ((instr & 0xe20) == 0x620) ||
   51292                             ((instr & 0xf30) == 0xa30)) {
   51293                           UnallocatedA32(instr);
   51294                           return;
   51295                         }
   51296                         DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
   51297                         if (dt.Is(kDataTypeValueInvalid)) {
   51298                           UnallocatedA32(instr);
   51299                           return;
   51300                         }
   51301                         Alignment align =
   51302                             Align_align_5_Decode((instr >> 4) & 0x3);
   51303                         if (dt.Is(kDataTypeValueInvalid) ||
   51304                             align.Is(kBadAlignment)) {
   51305                           UnallocatedA32(instr);
   51306                           return;
   51307                         }
   51308                         unsigned first = ExtractDRegister(instr, 22, 12);
   51309                         unsigned length;
   51310                         SpacingType spacing = kSingle;
   51311                         switch ((instr >> 8) & 0xf) {
   51312                           default:
   51313                             VIXL_UNREACHABLE_OR_FALLTHROUGH();
   51314                           case 0x7:
   51315                             length = 1;
   51316                             break;
   51317                           case 0xa:
   51318                             length = 2;
   51319                             break;
   51320                           case 0x6:
   51321                             length = 3;
   51322                             break;
   51323                           case 0x2:
   51324                             length = 4;
   51325                             break;
   51326                         }
   51327                         unsigned last = first + length - 1;
   51328                         TransferType transfer = kMultipleLanes;
   51329                         unsigned rn = (instr >> 16) & 0xf;
   51330                         unsigned rm = instr & 0xf;
   51331                         // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
   51332                         vst1(al,
   51333                              dt,
   51334                              NeonRegisterList(DRegister(first),
   51335                                               DRegister(last),
   51336                                               spacing,
   51337                                               transfer),
   51338                              AlignedMemOperand(Register(rn),
   51339                                                align,
   51340                                                Register(rm),
   51341                                                PostIndex));
   51342                         break;
   51343                       }
   51344                       case 0x00000700: {
   51345                         // 0xf4000700
   51346                         if (((instr & 0xd) == 0xd) ||
   51347                             ((instr & 0xe20) == 0x620) ||
   51348                             ((instr & 0xf30) == 0xa30)) {
   51349                           UnallocatedA32(instr);
   51350                           return;
   51351                         }
   51352                         DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
   51353                         if (dt.Is(kDataTypeValueInvalid)) {
   51354                           UnallocatedA32(instr);
   51355                           return;
   51356                         }
   51357                         Alignment align =
   51358                             Align_align_5_Decode((instr >> 4) & 0x3);
   51359                         if (dt.Is(kDataTypeValueInvalid) ||
   51360                             align.Is(kBadAlignment)) {
   51361                           UnallocatedA32(instr);
   51362                           return;
   51363                         }
   51364                         unsigned first = ExtractDRegister(instr, 22, 12);
   51365                         unsigned length;
   51366                         SpacingType spacing = kSingle;
   51367                         switch ((instr >> 8) & 0xf) {
   51368                           default:
   51369                             VIXL_UNREACHABLE_OR_FALLTHROUGH();
   51370                           case 0x7:
   51371                             length = 1;
   51372                             break;
   51373                           case 0xa:
   51374                             length = 2;
   51375                             break;
   51376                           case 0x6:
   51377                             length = 3;
   51378                             break;
   51379                           case 0x2:
   51380                             length = 4;
   51381                             break;
   51382                         }
   51383                         unsigned last = first + length - 1;
   51384                         TransferType transfer = kMultipleLanes;
   51385                         unsigned rn = (instr >> 16) & 0xf;
   51386                         unsigned rm = instr & 0xf;
   51387                         // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
   51388                         vst1(al,
   51389                              dt,
   51390                              NeonRegisterList(DRegister(first),
   51391                                               DRegister(last),
   51392                                               spacing,
   51393                                               transfer),
   51394                              AlignedMemOperand(Register(rn),
   51395                                                align,
   51396                                                Register(rm),
   51397                                                PostIndex));
   51398                         break;
   51399                       }
   51400                       case 0x00000800: {
   51401                         // 0xf4000800
   51402                         if (((instr & 0xd) == 0xd) ||
   51403                             ((instr & 0xe30) == 0x830)) {
   51404                           UnallocatedA32(instr);
   51405                           return;
   51406                         }
   51407                         DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
   51408                         if (dt.Is(kDataTypeValueInvalid)) {
   51409                           UnallocatedA32(instr);
   51410                           return;
   51411                         }
   51412                         Alignment align =
   51413                             Align_align_2_Decode((instr >> 4) & 0x3);
   51414                         if (dt.Is(kDataTypeValueInvalid) ||
   51415                             align.Is(kBadAlignment)) {
   51416                           UnallocatedA32(instr);
   51417                           return;
   51418                         }
   51419                         unsigned first = ExtractDRegister(instr, 22, 12);
   51420                         unsigned length;
   51421                         SpacingType spacing;
   51422                         switch ((instr >> 8) & 0xf) {
   51423                           default:
   51424                             VIXL_UNREACHABLE_OR_FALLTHROUGH();
   51425                           case 0x8:
   51426                             length = 2;
   51427                             spacing = kSingle;
   51428                             break;
   51429                           case 0x9:
   51430                             length = 2;
   51431                             spacing = kDouble;
   51432                             break;
   51433                           case 0x3:
   51434                             length = 4;
   51435                             spacing = kSingle;
   51436                             break;
   51437                         }
   51438                         unsigned last =
   51439                             first + (length - 1) * (spacing == kSingle ? 1 : 2);
   51440                         TransferType transfer = kMultipleLanes;
   51441                         unsigned rn = (instr >> 16) & 0xf;
   51442                         unsigned rm = instr & 0xf;
   51443                         // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
   51444                         vst2(al,
   51445                              dt,
   51446                              NeonRegisterList(DRegister(first),
   51447                                               DRegister(last),
   51448                                               spacing,
   51449                                               transfer),
   51450                              AlignedMemOperand(Register(rn),
   51451                                                align,
   51452                                                Register(rm),
   51453                                                PostIndex));
   51454                         break;
   51455                       }
   51456                       case 0x00000900: {
   51457                         // 0xf4000900
   51458                         if (((instr & 0xd) == 0xd) ||
   51459                             ((instr & 0xe30) == 0x830)) {
   51460                           UnallocatedA32(instr);
   51461                           return;
   51462                         }
   51463                         DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
   51464                         if (dt.Is(kDataTypeValueInvalid)) {
   51465                           UnallocatedA32(instr);
   51466                           return;
   51467                         }
   51468                         Alignment align =
   51469                             Align_align_2_Decode((instr >> 4) & 0x3);
   51470                         if (dt.Is(kDataTypeValueInvalid) ||
   51471                             align.Is(kBadAlignment)) {
   51472                           UnallocatedA32(instr);
   51473                           return;
   51474                         }
   51475                         unsigned first = ExtractDRegister(instr, 22, 12);
   51476                         unsigned length;
   51477                         SpacingType spacing;
   51478                         switch ((instr >> 8) & 0xf) {
   51479                           default:
   51480                             VIXL_UNREACHABLE_OR_FALLTHROUGH();
   51481                           case 0x8:
   51482                             length = 2;
   51483                             spacing = kSingle;
   51484                             break;
   51485                           case 0x9:
   51486                             length = 2;
   51487                             spacing = kDouble;
   51488                             break;
   51489                           case 0x3:
   51490                             length = 4;
   51491                             spacing = kSingle;
   51492                             break;
   51493                         }
   51494                         unsigned last =
   51495                             first + (length - 1) * (spacing == kSingle ? 1 : 2);
   51496                         TransferType transfer = kMultipleLanes;
   51497                         unsigned rn = (instr >> 16) & 0xf;
   51498                         unsigned rm = instr & 0xf;
   51499                         // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
   51500                         vst2(al,
   51501                              dt,
   51502                              NeonRegisterList(DRegister(first),
   51503                                               DRegister(last),
   51504                                               spacing,
   51505                                               transfer),
   51506                              AlignedMemOperand(Register(rn),
   51507                                                align,
   51508                                                Register(rm),
   51509                                                PostIndex));
   51510                         break;
   51511                       }
   51512                       case 0x00000a00: {
   51513                         // 0xf4000a00
   51514                         if (((instr & 0xd) == 0xd) ||
   51515                             ((instr & 0xe20) == 0x620) ||
   51516                             ((instr & 0xf30) == 0xa30)) {
   51517                           UnallocatedA32(instr);
   51518                           return;
   51519                         }
   51520                         DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
   51521                         if (dt.Is(kDataTypeValueInvalid)) {
   51522                           UnallocatedA32(instr);
   51523                           return;
   51524                         }
   51525                         Alignment align =
   51526                             Align_align_5_Decode((instr >> 4) & 0x3);
   51527                         if (dt.Is(kDataTypeValueInvalid) ||
   51528                             align.Is(kBadAlignment)) {
   51529                           UnallocatedA32(instr);
   51530                           return;
   51531                         }
   51532                         unsigned first = ExtractDRegister(instr, 22, 12);
   51533                         unsigned length;
   51534                         SpacingType spacing = kSingle;
   51535                         switch ((instr >> 8) & 0xf) {
   51536                           default:
   51537                             VIXL_UNREACHABLE_OR_FALLTHROUGH();
   51538                           case 0x7:
   51539                             length = 1;
   51540                             break;
   51541                           case 0xa:
   51542                             length = 2;
   51543                             break;
   51544                           case 0x6:
   51545                             length = 3;
   51546                             break;
   51547                           case 0x2:
   51548                             length = 4;
   51549                             break;
   51550                         }
   51551                         unsigned last = first + length - 1;
   51552                         TransferType transfer = kMultipleLanes;
   51553                         unsigned rn = (instr >> 16) & 0xf;
   51554                         unsigned rm = instr & 0xf;
   51555                         // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
   51556                         vst1(al,
   51557                              dt,
   51558                              NeonRegisterList(DRegister(first),
   51559                                               DRegister(last),
   51560                                               spacing,
   51561                                               transfer),
   51562                              AlignedMemOperand(Register(rn),
   51563                                                align,
   51564                                                Register(rm),
   51565                                                PostIndex));
   51566                         break;
   51567                       }
   51568                       default:
   51569                         UnallocatedA32(instr);
   51570                         break;
   51571                     }
   51572                     break;
   51573                   }
   51574                 }
   51575                 break;
   51576               }
   51577               case 0x00800000: {
   51578                 // 0xf4800000
   51579                 switch (instr & 0x00000300) {
   51580                   case 0x00000000: {
   51581                     // 0xf4800000
   51582                     switch (instr & 0x00000c00) {
   51583                       case 0x00000c00: {
   51584                         // 0xf4800c00
   51585                         UnallocatedA32(instr);
   51586                         break;
   51587                       }
   51588                       default: {
   51589                         switch (instr & 0x0000000d) {
   51590                           case 0x0000000d: {
   51591                             // 0xf480000d
   51592                             switch (instr & 0x00000002) {
   51593                               case 0x00000000: {
   51594                                 // 0xf480000d
   51595                                 if (((instr & 0xc00) == 0xc00)) {
   51596                                   UnallocatedA32(instr);
   51597                                   return;
   51598                                 }
   51599                                 DataType dt =
   51600                                     Dt_size_7_Decode((instr >> 10) & 0x3);
   51601                                 if (dt.Is(kDataTypeValueInvalid)) {
   51602                                   UnallocatedA32(instr);
   51603                                   return;
   51604                                 }
   51605                                 DecodeNeonAndAlign decode_neon =
   51606                                     Align_index_align_1_Decode((instr >> 4) &
   51607                                                                    0xf,
   51608                                                                dt);
   51609                                 if (!decode_neon.IsValid()) {
   51610                                   UnallocatedA32(instr);
   51611                                   return;
   51612                                 }
   51613                                 Alignment align = decode_neon.GetAlign();
   51614                                 int lane = decode_neon.GetLane();
   51615                                 SpacingType spacing = decode_neon.GetSpacing();
   51616                                 unsigned first =
   51617                                     ExtractDRegister(instr, 22, 12);
   51618                                 unsigned length = 1;
   51619                                 unsigned last = first + length - 1;
   51620                                 unsigned rn = (instr >> 16) & 0xf;
   51621                                 // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
   51622                                 vst1(al,
   51623                                      dt,
   51624                                      NeonRegisterList(DRegister(first),
   51625                                                       DRegister(last),
   51626                                                       spacing,
   51627                                                       lane),
   51628                                      AlignedMemOperand(Register(rn),
   51629                                                        align,
   51630                                                        PostIndex));
   51631                                 break;
   51632                               }
   51633                               case 0x00000002: {
   51634                                 // 0xf480000f
   51635                                 if (((instr & 0xc00) == 0xc00)) {
   51636                                   UnallocatedA32(instr);
   51637                                   return;
   51638                                 }
   51639                                 DataType dt =
   51640                                     Dt_size_7_Decode((instr >> 10) & 0x3);
   51641                                 if (dt.Is(kDataTypeValueInvalid)) {
   51642                                   UnallocatedA32(instr);
   51643                                   return;
   51644                                 }
   51645                                 DecodeNeonAndAlign decode_neon =
   51646                                     Align_index_align_1_Decode((instr >> 4) &
   51647                                                                    0xf,
   51648                                                                dt);
   51649                                 if (!decode_neon.IsValid()) {
   51650                                   UnallocatedA32(instr);
   51651                                   return;
   51652                                 }
   51653                                 Alignment align = decode_neon.GetAlign();
   51654                                 int lane = decode_neon.GetLane();
   51655                                 SpacingType spacing = decode_neon.GetSpacing();
   51656                                 unsigned first =
   51657                                     ExtractDRegister(instr, 22, 12);
   51658                                 unsigned length = 1;
   51659                                 unsigned last = first + length - 1;
   51660                                 unsigned rn = (instr >> 16) & 0xf;
   51661                                 // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1 NOLINT(whitespace/line_length)
   51662                                 vst1(al,
   51663                                      dt,
   51664                                      NeonRegisterList(DRegister(first),
   51665                                                       DRegister(last),
   51666                                                       spacing,
   51667                                                       lane),
   51668                                      AlignedMemOperand(Register(rn),
   51669                                                        align,
   51670                                                        Offset));
   51671                                 break;
   51672                               }
   51673                             }
   51674                             break;
   51675                           }
   51676                           default: {
   51677                             if (((instr & 0xc00) == 0xc00) ||
   51678                                 ((instr & 0xd) == 0xd)) {
   51679                               UnallocatedA32(instr);
   51680                               return;
   51681                             }
   51682                             DataType dt = Dt_size_7_Decode((instr >> 10) & 0x3);
   51683                             if (dt.Is(kDataTypeValueInvalid)) {
   51684                               UnallocatedA32(instr);
   51685                               return;
   51686                             }
   51687                             DecodeNeonAndAlign decode_neon =
   51688                                 Align_index_align_1_Decode((instr >> 4) & 0xf,
   51689                                                            dt);
   51690                             if (!decode_neon.IsValid()) {
   51691                               UnallocatedA32(instr);
   51692                               return;
   51693                             }
   51694                             Alignment align = decode_neon.GetAlign();
   51695                             int lane = decode_neon.GetLane();
   51696                             SpacingType spacing = decode_neon.GetSpacing();
   51697                             unsigned first = ExtractDRegister(instr, 22, 12);
   51698                             unsigned length = 1;
   51699                             unsigned last = first + length - 1;
   51700                             unsigned rn = (instr >> 16) & 0xf;
   51701                             unsigned rm = instr & 0xf;
   51702                             // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
   51703                             vst1(al,
   51704                                  dt,
   51705                                  NeonRegisterList(DRegister(first),
   51706                                                   DRegister(last),
   51707                                                   spacing,
   51708                                                   lane),
   51709                                  AlignedMemOperand(Register(rn),
   51710                                                    align,
   51711                                                    Register(rm),
   51712                                                    PostIndex));
   51713                             break;
   51714                           }
   51715                         }
   51716                         break;
   51717                       }
   51718                     }
   51719                     break;
   51720                   }
   51721                   case 0x00000100: {
   51722                     // 0xf4800100
   51723                     switch (instr & 0x00000c00) {
   51724                       case 0x00000c00: {
   51725                         // 0xf4800d00
   51726                         UnallocatedA32(instr);
   51727                         break;
   51728                       }
   51729                       default: {
   51730                         switch (instr & 0x0000000d) {
   51731                           case 0x0000000d: {
   51732                             // 0xf480010d
   51733                             switch (instr & 0x00000002) {
   51734                               case 0x00000000: {
   51735                                 // 0xf480010d
   51736                                 if (((instr & 0xc00) == 0xc00)) {
   51737                                   UnallocatedA32(instr);
   51738                                   return;
   51739                                 }
   51740                                 DataType dt =
   51741                                     Dt_size_7_Decode((instr >> 10) & 0x3);
   51742                                 if (dt.Is(kDataTypeValueInvalid)) {
   51743                                   UnallocatedA32(instr);
   51744                                   return;
   51745                                 }
   51746                                 DecodeNeonAndAlign decode_neon =
   51747                                     Align_index_align_2_Decode((instr >> 4) &
   51748                                                                    0xf,
   51749                                                                dt);
   51750                                 if (!decode_neon.IsValid()) {
   51751                                   UnallocatedA32(instr);
   51752                                   return;
   51753                                 }
   51754                                 Alignment align = decode_neon.GetAlign();
   51755                                 int lane = decode_neon.GetLane();
   51756                                 SpacingType spacing = decode_neon.GetSpacing();
   51757                                 unsigned first =
   51758                                     ExtractDRegister(instr, 22, 12);
   51759                                 unsigned length = 2;
   51760                                 unsigned last =
   51761                                     first +
   51762                                     (length - 1) * (spacing == kSingle ? 1 : 2);
   51763                                 unsigned rn = (instr >> 16) & 0xf;
   51764                                 // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
   51765                                 vst2(al,
   51766                                      dt,
   51767                                      NeonRegisterList(DRegister(first),
   51768                                                       DRegister(last),
   51769                                                       spacing,
   51770                                                       lane),
   51771                                      AlignedMemOperand(Register(rn),
   51772                                                        align,
   51773                                                        PostIndex));
   51774                                 break;
   51775                               }
   51776                               case 0x00000002: {
   51777                                 // 0xf480010f
   51778                                 if (((instr & 0xc00) == 0xc00)) {
   51779                                   UnallocatedA32(instr);
   51780                                   return;
   51781                                 }
   51782                                 DataType dt =
   51783                                     Dt_size_7_Decode((instr >> 10) & 0x3);
   51784                                 if (dt.Is(kDataTypeValueInvalid)) {
   51785                                   UnallocatedA32(instr);
   51786                                   return;
   51787                                 }
   51788                                 DecodeNeonAndAlign decode_neon =
   51789                                     Align_index_align_2_Decode((instr >> 4) &
   51790                                                                    0xf,
   51791                                                                dt);
   51792                                 if (!decode_neon.IsValid()) {
   51793                                   UnallocatedA32(instr);
   51794                                   return;
   51795                                 }
   51796                                 Alignment align = decode_neon.GetAlign();
   51797                                 int lane = decode_neon.GetLane();
   51798                                 SpacingType spacing = decode_neon.GetSpacing();
   51799                                 unsigned first =
   51800                                     ExtractDRegister(instr, 22, 12);
   51801                                 unsigned length = 2;
   51802                                 unsigned last =
   51803                                     first +
   51804                                     (length - 1) * (spacing == kSingle ? 1 : 2);
   51805                                 unsigned rn = (instr >> 16) & 0xf;
   51806                                 // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1 NOLINT(whitespace/line_length)
   51807                                 vst2(al,
   51808                                      dt,
   51809                                      NeonRegisterList(DRegister(first),
   51810                                                       DRegister(last),
   51811                                                       spacing,
   51812                                                       lane),
   51813                                      AlignedMemOperand(Register(rn),
   51814                                                        align,
   51815                                                        Offset));
   51816                                 break;
   51817                               }
   51818                             }
   51819                             break;
   51820                           }
   51821                           default: {
   51822                             if (((instr & 0xc00) == 0xc00) ||
   51823                                 ((instr & 0xd) == 0xd)) {
   51824                               UnallocatedA32(instr);
   51825                               return;
   51826                             }
   51827                             DataType dt = Dt_size_7_Decode((instr >> 10) & 0x3);
   51828                             if (dt.Is(kDataTypeValueInvalid)) {
   51829                               UnallocatedA32(instr);
   51830                               return;
   51831                             }
   51832                             DecodeNeonAndAlign decode_neon =
   51833                                 Align_index_align_2_Decode((instr >> 4) & 0xf,
   51834                                                            dt);
   51835                             if (!decode_neon.IsValid()) {
   51836                               UnallocatedA32(instr);
   51837                               return;
   51838                             }
   51839                             Alignment align = decode_neon.GetAlign();
   51840                             int lane = decode_neon.GetLane();
   51841                             SpacingType spacing = decode_neon.GetSpacing();
   51842                             unsigned first = ExtractDRegister(instr, 22, 12);
   51843                             unsigned length = 2;
   51844                             unsigned last =
   51845                                 first +
   51846                                 (length - 1) * (spacing == kSingle ? 1 : 2);
   51847                             unsigned rn = (instr >> 16) & 0xf;
   51848                             unsigned rm = instr & 0xf;
   51849                             // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
   51850                             vst2(al,
   51851                                  dt,
   51852                                  NeonRegisterList(DRegister(first),
   51853                                                   DRegister(last),
   51854                                                   spacing,
   51855                                                   lane),
   51856                                  AlignedMemOperand(Register(rn),
   51857                                                    align,
   51858                                                    Register(rm),
   51859                                                    PostIndex));
   51860                             break;
   51861                           }
   51862                         }
   51863                         break;
   51864                       }
   51865                     }
   51866                     break;
   51867                   }
   51868                   case 0x00000200: {
   51869                     // 0xf4800200
   51870                     switch (instr & 0x00000c30) {
   51871                       case 0x00000010: {
   51872                         // 0xf4800210
   51873                         UnallocatedA32(instr);
   51874                         break;
   51875                       }
   51876                       case 0x00000030: {
   51877                         // 0xf4800230
   51878                         UnallocatedA32(instr);
   51879                         break;
   51880                       }
   51881                       case 0x00000410: {
   51882                         // 0xf4800610
   51883                         UnallocatedA32(instr);
   51884                         break;
   51885                       }
   51886                       case 0x00000430: {
   51887                         // 0xf4800630
   51888                         UnallocatedA32(instr);
   51889                         break;
   51890                       }
   51891                       case 0x00000810: {
   51892                         // 0xf4800a10
   51893                         UnallocatedA32(instr);
   51894                         break;
   51895                       }
   51896                       case 0x00000820: {
   51897                         // 0xf4800a20
   51898                         UnallocatedA32(instr);
   51899                         break;
   51900                       }
   51901                       case 0x00000830: {
   51902                         // 0xf4800a30
   51903                         UnallocatedA32(instr);
   51904                         break;
   51905                       }
   51906                       case 0x00000c00: {
   51907                         // 0xf4800e00
   51908                         UnallocatedA32(instr);
   51909                         break;
   51910                       }
   51911                       case 0x00000c10: {
   51912                         // 0xf4800e10
   51913                         UnallocatedA32(instr);
   51914                         break;
   51915                       }
   51916                       case 0x00000c20: {
   51917                         // 0xf4800e20
   51918                         UnallocatedA32(instr);
   51919                         break;
   51920                       }
   51921                       case 0x00000c30: {
   51922                         // 0xf4800e30
   51923                         UnallocatedA32(instr);
   51924                         break;
   51925                       }
   51926                       default: {
   51927                         switch (instr & 0x0000000d) {
   51928                           case 0x0000000d: {
   51929                             // 0xf480020d
   51930                             switch (instr & 0x00000002) {
   51931                               case 0x00000000: {
   51932                                 // 0xf480020d
   51933                                 if (((instr & 0xc00) == 0xc00) ||
   51934                                     ((instr & 0x810) == 0x10) ||
   51935                                     ((instr & 0xc30) == 0x810) ||
   51936                                     ((instr & 0xc30) == 0x820) ||
   51937                                     ((instr & 0xc30) == 0x830)) {
   51938                                   UnallocatedA32(instr);
   51939                                   return;
   51940                                 }
   51941                                 DataType dt =
   51942                                     Dt_size_7_Decode((instr >> 10) & 0x3);
   51943                                 if (dt.Is(kDataTypeValueInvalid)) {
   51944                                   UnallocatedA32(instr);
   51945                                   return;
   51946                                 }
   51947                                 DecodeNeon decode_neon =
   51948                                     Index_1_Decode((instr >> 4) & 0xf, dt);
   51949                                 if (!decode_neon.IsValid()) {
   51950                                   UnallocatedA32(instr);
   51951                                   return;
   51952                                 }
   51953                                 int lane = decode_neon.GetLane();
   51954                                 SpacingType spacing = decode_neon.GetSpacing();
   51955                                 unsigned first =
   51956                                     ExtractDRegister(instr, 22, 12);
   51957                                 unsigned length = 3;
   51958                                 unsigned last =
   51959                                     first +
   51960                                     (length - 1) * (spacing == kSingle ? 1 : 2);
   51961                                 unsigned rn = (instr >> 16) & 0xf;
   51962                                 // VST3{<c>}{<q>}.<dt> <list>, [<Rn>]! ; A1
   51963                                 vst3(al,
   51964                                      dt,
   51965                                      NeonRegisterList(DRegister(first),
   51966                                                       DRegister(last),
   51967                                                       spacing,
   51968                                                       lane),
   51969                                      MemOperand(Register(rn), PreIndex));
   51970                                 break;
   51971                               }
   51972                               case 0x00000002: {
   51973                                 // 0xf480020f
   51974                                 if (((instr & 0xc00) == 0xc00) ||
   51975                                     ((instr & 0x810) == 0x10) ||
   51976                                     ((instr & 0xc30) == 0x810) ||
   51977                                     ((instr & 0xc30) == 0x820) ||
   51978                                     ((instr & 0xc30) == 0x830)) {
   51979                                   UnallocatedA32(instr);
   51980                                   return;
   51981                                 }
   51982                                 DataType dt =
   51983                                     Dt_size_7_Decode((instr >> 10) & 0x3);
   51984                                 if (dt.Is(kDataTypeValueInvalid)) {
   51985                                   UnallocatedA32(instr);
   51986                                   return;
   51987                                 }
   51988                                 DecodeNeon decode_neon =
   51989                                     Index_1_Decode((instr >> 4) & 0xf, dt);
   51990                                 if (!decode_neon.IsValid()) {
   51991                                   UnallocatedA32(instr);
   51992                                   return;
   51993                                 }
   51994                                 int lane = decode_neon.GetLane();
   51995                                 SpacingType spacing = decode_neon.GetSpacing();
   51996                                 unsigned first =
   51997                                     ExtractDRegister(instr, 22, 12);
   51998                                 unsigned length = 3;
   51999                                 unsigned last =
   52000                                     first +
   52001                                     (length - 1) * (spacing == kSingle ? 1 : 2);
   52002                                 unsigned rn = (instr >> 16) & 0xf;
   52003                                 // VST3{<c>}{<q>}.<dt> <list>, [<Rn>] ; A1
   52004                                 vst3(al,
   52005                                      dt,
   52006                                      NeonRegisterList(DRegister(first),
   52007                                                       DRegister(last),
   52008                                                       spacing,
   52009                                                       lane),
   52010                                      MemOperand(Register(rn), Offset));
   52011                                 break;
   52012                               }
   52013                             }
   52014                             break;
   52015                           }
   52016                           default: {
   52017                             if (((instr & 0xc00) == 0xc00) ||
   52018                                 ((instr & 0xd) == 0xd) ||
   52019                                 ((instr & 0x810) == 0x10) ||
   52020                                 ((instr & 0xc30) == 0x810) ||
   52021                                 ((instr & 0xc30) == 0x820) ||
   52022                                 ((instr & 0xc30) == 0x830)) {
   52023                               UnallocatedA32(instr);
   52024                               return;
   52025                             }
   52026                             DataType dt = Dt_size_7_Decode((instr >> 10) & 0x3);
   52027                             if (dt.Is(kDataTypeValueInvalid)) {
   52028                               UnallocatedA32(instr);
   52029                               return;
   52030                             }
   52031                             DecodeNeon decode_neon =
   52032                                 Index_1_Decode((instr >> 4) & 0xf, dt);
   52033                             if (!decode_neon.IsValid()) {
   52034                               UnallocatedA32(instr);
   52035                               return;
   52036                             }
   52037                             int lane = decode_neon.GetLane();
   52038                             SpacingType spacing = decode_neon.GetSpacing();
   52039                             unsigned first = ExtractDRegister(instr, 22, 12);
   52040                             unsigned length = 3;
   52041                             unsigned last =
   52042                                 first +
   52043                                 (length - 1) * (spacing == kSingle ? 1 : 2);
   52044                             unsigned rn = (instr >> 16) & 0xf;
   52045                             Sign sign(plus);
   52046                             unsigned rm = instr & 0xf;
   52047                             // VST3{<c>}{<q>}.<dt> <list>, [<Rn>], #<Rm> ; A1
   52048                             vst3(al,
   52049                                  dt,
   52050                                  NeonRegisterList(DRegister(first),
   52051                                                   DRegister(last),
   52052                                                   spacing,
   52053                                                   lane),
   52054                                  MemOperand(Register(rn),
   52055                                             sign,
   52056                                             Register(rm),
   52057                                             PostIndex));
   52058                             break;
   52059                           }
   52060                         }
   52061                         break;
   52062                       }
   52063                     }
   52064                     break;
   52065                   }
   52066                   case 0x00000300: {
   52067                     // 0xf4800300
   52068                     switch (instr & 0x00000c00) {
   52069                       case 0x00000c00: {
   52070                         // 0xf4800f00
   52071                         UnallocatedA32(instr);
   52072                         break;
   52073                       }
   52074                       default: {
   52075                         switch (instr & 0x0000000d) {
   52076                           case 0x0000000d: {
   52077                             // 0xf480030d
   52078                             switch (instr & 0x00000002) {
   52079                               case 0x00000000: {
   52080                                 // 0xf480030d
   52081                                 if (((instr & 0xc00) == 0xc00)) {
   52082                                   UnallocatedA32(instr);
   52083                                   return;
   52084                                 }
   52085                                 DataType dt =
   52086                                     Dt_size_7_Decode((instr >> 10) & 0x3);
   52087                                 if (dt.Is(kDataTypeValueInvalid)) {
   52088                                   UnallocatedA32(instr);
   52089                                   return;
   52090                                 }
   52091                                 DecodeNeonAndAlign decode_neon =
   52092                                     Align_index_align_3_Decode((instr >> 4) &
   52093                                                                    0xf,
   52094                                                                dt);
   52095                                 if (!decode_neon.IsValid()) {
   52096                                   UnallocatedA32(instr);
   52097                                   return;
   52098                                 }
   52099                                 Alignment align = decode_neon.GetAlign();
   52100                                 int lane = decode_neon.GetLane();
   52101                                 SpacingType spacing = decode_neon.GetSpacing();
   52102                                 unsigned first =
   52103                                     ExtractDRegister(instr, 22, 12);
   52104                                 unsigned length = 4;
   52105                                 unsigned last =
   52106                                     first +
   52107                                     (length - 1) * (spacing == kSingle ? 1 : 2);
   52108                                 unsigned rn = (instr >> 16) & 0xf;
   52109                                 // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
   52110                                 vst4(al,
   52111                                      dt,
   52112                                      NeonRegisterList(DRegister(first),
   52113                                                       DRegister(last),
   52114                                                       spacing,
   52115                                                       lane),
   52116                                      AlignedMemOperand(Register(rn),
   52117                                                        align,
   52118                                                        PostIndex));
   52119                                 break;
   52120                               }
   52121                               case 0x00000002: {
   52122                                 // 0xf480030f
   52123                                 if (((instr & 0xc00) == 0xc00)) {
   52124                                   UnallocatedA32(instr);
   52125                                   return;
   52126                                 }
   52127                                 DataType dt =
   52128                                     Dt_size_7_Decode((instr >> 10) & 0x3);
   52129                                 if (dt.Is(kDataTypeValueInvalid)) {
   52130                                   UnallocatedA32(instr);
   52131                                   return;
   52132                                 }
   52133                                 DecodeNeonAndAlign decode_neon =
   52134                                     Align_index_align_3_Decode((instr >> 4) &
   52135                                                                    0xf,
   52136                                                                dt);
   52137                                 if (!decode_neon.IsValid()) {
   52138                                   UnallocatedA32(instr);
   52139                                   return;
   52140                                 }
   52141                                 Alignment align = decode_neon.GetAlign();
   52142                                 int lane = decode_neon.GetLane();
   52143                                 SpacingType spacing = decode_neon.GetSpacing();
   52144                                 unsigned first =
   52145                                     ExtractDRegister(instr, 22, 12);
   52146                                 unsigned length = 4;
   52147                                 unsigned last =
   52148                                     first +
   52149                                     (length - 1) * (spacing == kSingle ? 1 : 2);
   52150                                 unsigned rn = (instr >> 16) & 0xf;
   52151                                 // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1 NOLINT(whitespace/line_length)
   52152                                 vst4(al,
   52153                                      dt,
   52154                                      NeonRegisterList(DRegister(first),
   52155                                                       DRegister(last),
   52156                                                       spacing,
   52157                                                       lane),
   52158                                      AlignedMemOperand(Register(rn),
   52159                                                        align,
   52160                                                        Offset));
   52161                                 break;
   52162                               }
   52163                             }
   52164                             break;
   52165                           }
   52166                           default: {
   52167                             if (((instr & 0xc00) == 0xc00) ||
   52168                                 ((instr & 0xd) == 0xd)) {
   52169                               UnallocatedA32(instr);
   52170                               return;
   52171                             }
   52172                             DataType dt = Dt_size_7_Decode((instr >> 10) & 0x3);
   52173                             if (dt.Is(kDataTypeValueInvalid)) {
   52174                               UnallocatedA32(instr);
   52175                               return;
   52176                             }
   52177                             DecodeNeonAndAlign decode_neon =
   52178                                 Align_index_align_3_Decode((instr >> 4) & 0xf,
   52179                                                            dt);
   52180                             if (!decode_neon.IsValid()) {
   52181                               UnallocatedA32(instr);
   52182                               return;
   52183                             }
   52184                             Alignment align = decode_neon.GetAlign();
   52185                             int lane = decode_neon.GetLane();
   52186                             SpacingType spacing = decode_neon.GetSpacing();
   52187                             unsigned first = ExtractDRegister(instr, 22, 12);
   52188                             unsigned length = 4;
   52189                             unsigned last =
   52190                                 first +
   52191                                 (length - 1) * (spacing == kSingle ? 1 : 2);
   52192                             unsigned rn = (instr >> 16) & 0xf;
   52193                             unsigned rm = instr & 0xf;
   52194                             // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
   52195                             vst4(al,
   52196                                  dt,
   52197                                  NeonRegisterList(DRegister(first),
   52198                                                   DRegister(last),
   52199                                                   spacing,
   52200                                                   lane),
   52201                                  AlignedMemOperand(Register(rn),
   52202                                                    align,
   52203                                                    Register(rm),
   52204                                                    PostIndex));
   52205                             break;
   52206                           }
   52207                         }
   52208                         break;
   52209                       }
   52210                     }
   52211                     break;
   52212                   }
   52213                 }
   52214                 break;
   52215               }
   52216             }
   52217             break;
   52218           }
   52219           case 0x00100000: {
   52220             // 0xf4100000
   52221             switch (instr & 0x00400000) {
   52222               case 0x00400000: {
   52223                 // 0xf4500000
   52224                 switch (instr & 0x000f0000) {
   52225                   case 0x000f0000: {
   52226                     // 0xf45f0000
   52227                     uint32_t U = (instr >> 23) & 0x1;
   52228                     int32_t imm = instr & 0xfff;
   52229                     if (U == 0) imm = -imm;
   52230                     bool minus_zero = (imm == 0) && (U == 0);
   52231                     Label label(imm, kA32PcDelta, minus_zero);
   52232                     // PLI{<c>}{<q>} <label> ; A1
   52233                     pli(al, &label);
   52234                     if (((instr & 0xff7ff000) != 0xf45ff000)) {
   52235                       UnpredictableA32(instr);
   52236                     }
   52237                     break;
   52238                   }
   52239                   default: {
   52240                     if (((instr & 0xf0000) == 0xf0000)) {
   52241                       UnallocatedA32(instr);
   52242                       return;
   52243                     }
   52244                     unsigned rn = (instr >> 16) & 0xf;
   52245                     Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
   52246                     int32_t offset = instr & 0xfff;
   52247                     // PLI{<c>}{<q>} [<Rn>{, #{+/-}<imm_3>}] ; A1
   52248                     pli(al, MemOperand(Register(rn), sign, offset, Offset));
   52249                     if (((instr & 0xff70f000) != 0xf450f000)) {
   52250                       UnpredictableA32(instr);
   52251                     }
   52252                     break;
   52253                   }
   52254                 }
   52255                 break;
   52256               }
   52257               default:
   52258                 UnallocatedA32(instr);
   52259                 break;
   52260             }
   52261             break;
   52262           }
   52263           case 0x00200000: {
   52264             // 0xf4200000
   52265             switch (instr & 0x00800000) {
   52266               case 0x00000000: {
   52267                 // 0xf4200000
   52268                 switch (instr & 0x0000000d) {
   52269                   case 0x0000000d: {
   52270                     // 0xf420000d
   52271                     switch (instr & 0x00000002) {
   52272                       case 0x00000000: {
   52273                         // 0xf420000d
   52274                         switch (instr & 0x00000f00) {
   52275                           case 0x00000000: {
   52276                             // 0xf420000d
   52277                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
   52278                             if (dt.Is(kDataTypeValueInvalid)) {
   52279                               UnallocatedA32(instr);
   52280                               return;
   52281                             }
   52282                             Alignment align =
   52283                                 Align_align_4_Decode((instr >> 4) & 0x3);
   52284                             if (dt.Is(kDataTypeValueInvalid) ||
   52285                                 align.Is(kBadAlignment)) {
   52286                               UnallocatedA32(instr);
   52287                               return;
   52288                             }
   52289                             unsigned first = ExtractDRegister(instr, 22, 12);
   52290                             unsigned length;
   52291                             SpacingType spacing;
   52292                             switch ((instr >> 8) & 0xf) {
   52293                               default:
   52294                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
   52295                               case 0x0:
   52296                                 length = 4;
   52297                                 spacing = kSingle;
   52298                                 break;
   52299                               case 0x1:
   52300                                 length = 4;
   52301                                 spacing = kDouble;
   52302                                 break;
   52303                             }
   52304                             unsigned last =
   52305                                 first +
   52306                                 (length - 1) * (spacing == kSingle ? 1 : 2);
   52307                             TransferType transfer = kMultipleLanes;
   52308                             unsigned rn = (instr >> 16) & 0xf;
   52309                             // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
   52310                             vld4(al,
   52311                                  dt,
   52312                                  NeonRegisterList(DRegister(first),
   52313                                                   DRegister(last),
   52314                                                   spacing,
   52315                                                   transfer),
   52316                                  AlignedMemOperand(Register(rn),
   52317                                                    align,
   52318                                                    PostIndex));
   52319                             break;
   52320                           }
   52321                           case 0x00000100: {
   52322                             // 0xf420010d
   52323                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
   52324                             if (dt.Is(kDataTypeValueInvalid)) {
   52325                               UnallocatedA32(instr);
   52326                               return;
   52327                             }
   52328                             Alignment align =
   52329                                 Align_align_4_Decode((instr >> 4) & 0x3);
   52330                             if (dt.Is(kDataTypeValueInvalid) ||
   52331                                 align.Is(kBadAlignment)) {
   52332                               UnallocatedA32(instr);
   52333                               return;
   52334                             }
   52335                             unsigned first = ExtractDRegister(instr, 22, 12);
   52336                             unsigned length;
   52337                             SpacingType spacing;
   52338                             switch ((instr >> 8) & 0xf) {
   52339                               default:
   52340                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
   52341                               case 0x0:
   52342                                 length = 4;
   52343                                 spacing = kSingle;
   52344                                 break;
   52345                               case 0x1:
   52346                                 length = 4;
   52347                                 spacing = kDouble;
   52348                                 break;
   52349                             }
   52350                             unsigned last =
   52351                                 first +
   52352                                 (length - 1) * (spacing == kSingle ? 1 : 2);
   52353                             TransferType transfer = kMultipleLanes;
   52354                             unsigned rn = (instr >> 16) & 0xf;
   52355                             // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
   52356                             vld4(al,
   52357                                  dt,
   52358                                  NeonRegisterList(DRegister(first),
   52359                                                   DRegister(last),
   52360                                                   spacing,
   52361                                                   transfer),
   52362                                  AlignedMemOperand(Register(rn),
   52363                                                    align,
   52364                                                    PostIndex));
   52365                             break;
   52366                           }
   52367                           case 0x00000200: {
   52368                             // 0xf420020d
   52369                             if (((instr & 0xe20) == 0x620) ||
   52370                                 ((instr & 0xf30) == 0xa30)) {
   52371                               UnallocatedA32(instr);
   52372                               return;
   52373                             }
   52374                             DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
   52375                             if (dt.Is(kDataTypeValueInvalid)) {
   52376                               UnallocatedA32(instr);
   52377                               return;
   52378                             }
   52379                             Alignment align =
   52380                                 Align_align_1_Decode((instr >> 4) & 0x3);
   52381                             if (dt.Is(kDataTypeValueInvalid) ||
   52382                                 align.Is(kBadAlignment)) {
   52383                               UnallocatedA32(instr);
   52384                               return;
   52385                             }
   52386                             unsigned first = ExtractDRegister(instr, 22, 12);
   52387                             unsigned length;
   52388                             SpacingType spacing = kSingle;
   52389                             switch ((instr >> 8) & 0xf) {
   52390                               default:
   52391                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
   52392                               case 0x7:
   52393                                 length = 1;
   52394                                 break;
   52395                               case 0xa:
   52396                                 length = 2;
   52397                                 break;
   52398                               case 0x6:
   52399                                 length = 3;
   52400                                 break;
   52401                               case 0x2:
   52402                                 length = 4;
   52403                                 break;
   52404                             }
   52405                             unsigned last = first + length - 1;
   52406                             TransferType transfer = kMultipleLanes;
   52407                             unsigned rn = (instr >> 16) & 0xf;
   52408                             // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
   52409                             vld1(al,
   52410                                  dt,
   52411                                  NeonRegisterList(DRegister(first),
   52412                                                   DRegister(last),
   52413                                                   spacing,
   52414                                                   transfer),
   52415                                  AlignedMemOperand(Register(rn),
   52416                                                    align,
   52417                                                    PostIndex));
   52418                             break;
   52419                           }
   52420                           case 0x00000300: {
   52421                             // 0xf420030d
   52422                             if (((instr & 0xe30) == 0x830)) {
   52423                               UnallocatedA32(instr);
   52424                               return;
   52425                             }
   52426                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
   52427                             if (dt.Is(kDataTypeValueInvalid)) {
   52428                               UnallocatedA32(instr);
   52429                               return;
   52430                             }
   52431                             Alignment align =
   52432                                 Align_align_2_Decode((instr >> 4) & 0x3);
   52433                             if (dt.Is(kDataTypeValueInvalid) ||
   52434                                 align.Is(kBadAlignment)) {
   52435                               UnallocatedA32(instr);
   52436                               return;
   52437                             }
   52438                             unsigned first = ExtractDRegister(instr, 22, 12);
   52439                             unsigned length;
   52440                             SpacingType spacing;
   52441                             switch ((instr >> 8) & 0xf) {
   52442                               default:
   52443                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
   52444                               case 0x8:
   52445                                 length = 2;
   52446                                 spacing = kSingle;
   52447                                 break;
   52448                               case 0x9:
   52449                                 length = 2;
   52450                                 spacing = kDouble;
   52451                                 break;
   52452                               case 0x3:
   52453                                 length = 4;
   52454                                 spacing = kSingle;
   52455                                 break;
   52456                             }
   52457                             unsigned last =
   52458                                 first +
   52459                                 (length - 1) * (spacing == kSingle ? 1 : 2);
   52460                             TransferType transfer = kMultipleLanes;
   52461                             unsigned rn = (instr >> 16) & 0xf;
   52462                             // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
   52463                             vld2(al,
   52464                                  dt,
   52465                                  NeonRegisterList(DRegister(first),
   52466                                                   DRegister(last),
   52467                                                   spacing,
   52468                                                   transfer),
   52469                                  AlignedMemOperand(Register(rn),
   52470                                                    align,
   52471                                                    PostIndex));
   52472                             break;
   52473                           }
   52474                           case 0x00000400: {
   52475                             // 0xf420040d
   52476                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
   52477                             if (dt.Is(kDataTypeValueInvalid)) {
   52478                               UnallocatedA32(instr);
   52479                               return;
   52480                             }
   52481                             Alignment align =
   52482                                 Align_align_3_Decode((instr >> 4) & 0x3);
   52483                             if (dt.Is(kDataTypeValueInvalid) ||
   52484                                 align.Is(kBadAlignment)) {
   52485                               UnallocatedA32(instr);
   52486                               return;
   52487                             }
   52488                             unsigned first = ExtractDRegister(instr, 22, 12);
   52489                             unsigned length;
   52490                             SpacingType spacing;
   52491                             switch ((instr >> 8) & 0xf) {
   52492                               default:
   52493                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
   52494                               case 0x4:
   52495                                 length = 3;
   52496                                 spacing = kSingle;
   52497                                 break;
   52498                               case 0x5:
   52499                                 length = 3;
   52500                                 spacing = kDouble;
   52501                                 break;
   52502                             }
   52503                             unsigned last =
   52504                                 first +
   52505                                 (length - 1) * (spacing == kSingle ? 1 : 2);
   52506                             TransferType transfer = kMultipleLanes;
   52507                             unsigned rn = (instr >> 16) & 0xf;
   52508                             // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
   52509                             vld3(al,
   52510                                  dt,
   52511                                  NeonRegisterList(DRegister(first),
   52512                                                   DRegister(last),
   52513                                                   spacing,
   52514                                                   transfer),
   52515                                  AlignedMemOperand(Register(rn),
   52516                                                    align,
   52517                                                    PostIndex));
   52518                             break;
   52519                           }
   52520                           case 0x00000500: {
   52521                             // 0xf420050d
   52522                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
   52523                             if (dt.Is(kDataTypeValueInvalid)) {
   52524                               UnallocatedA32(instr);
   52525                               return;
   52526                             }
   52527                             Alignment align =
   52528                                 Align_align_3_Decode((instr >> 4) & 0x3);
   52529                             if (dt.Is(kDataTypeValueInvalid) ||
   52530                                 align.Is(kBadAlignment)) {
   52531                               UnallocatedA32(instr);
   52532                               return;
   52533                             }
   52534                             unsigned first = ExtractDRegister(instr, 22, 12);
   52535                             unsigned length;
   52536                             SpacingType spacing;
   52537                             switch ((instr >> 8) & 0xf) {
   52538                               default:
   52539                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
   52540                               case 0x4:
   52541                                 length = 3;
   52542                                 spacing = kSingle;
   52543                                 break;
   52544                               case 0x5:
   52545                                 length = 3;
   52546                                 spacing = kDouble;
   52547                                 break;
   52548                             }
   52549                             unsigned last =
   52550                                 first +
   52551                                 (length - 1) * (spacing == kSingle ? 1 : 2);
   52552                             TransferType transfer = kMultipleLanes;
   52553                             unsigned rn = (instr >> 16) & 0xf;
   52554                             // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
   52555                             vld3(al,
   52556                                  dt,
   52557                                  NeonRegisterList(DRegister(first),
   52558                                                   DRegister(last),
   52559                                                   spacing,
   52560                                                   transfer),
   52561                                  AlignedMemOperand(Register(rn),
   52562                                                    align,
   52563                                                    PostIndex));
   52564                             break;
   52565                           }
   52566                           case 0x00000600: {
   52567                             // 0xf420060d
   52568                             if (((instr & 0xe20) == 0x620) ||
   52569                                 ((instr & 0xf30) == 0xa30)) {
   52570                               UnallocatedA32(instr);
   52571                               return;
   52572                             }
   52573                             DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
   52574                             if (dt.Is(kDataTypeValueInvalid)) {
   52575                               UnallocatedA32(instr);
   52576                               return;
   52577                             }
   52578                             Alignment align =
   52579                                 Align_align_1_Decode((instr >> 4) & 0x3);
   52580                             if (dt.Is(kDataTypeValueInvalid) ||
   52581                                 align.Is(kBadAlignment)) {
   52582                               UnallocatedA32(instr);
   52583                               return;
   52584                             }
   52585                             unsigned first = ExtractDRegister(instr, 22, 12);
   52586                             unsigned length;
   52587                             SpacingType spacing = kSingle;
   52588                             switch ((instr >> 8) & 0xf) {
   52589                               default:
   52590                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
   52591                               case 0x7:
   52592                                 length = 1;
   52593                                 break;
   52594                               case 0xa:
   52595                                 length = 2;
   52596                                 break;
   52597                               case 0x6:
   52598                                 length = 3;
   52599                                 break;
   52600                               case 0x2:
   52601                                 length = 4;
   52602                                 break;
   52603                             }
   52604                             unsigned last = first + length - 1;
   52605                             TransferType transfer = kMultipleLanes;
   52606                             unsigned rn = (instr >> 16) & 0xf;
   52607                             // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
   52608                             vld1(al,
   52609                                  dt,
   52610                                  NeonRegisterList(DRegister(first),
   52611                                                   DRegister(last),
   52612                                                   spacing,
   52613                                                   transfer),
   52614                                  AlignedMemOperand(Register(rn),
   52615                                                    align,
   52616                                                    PostIndex));
   52617                             break;
   52618                           }
   52619                           case 0x00000700: {
   52620                             // 0xf420070d
   52621                             if (((instr & 0xe20) == 0x620) ||
   52622                                 ((instr & 0xf30) == 0xa30)) {
   52623                               UnallocatedA32(instr);
   52624                               return;
   52625                             }
   52626                             DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
   52627                             if (dt.Is(kDataTypeValueInvalid)) {
   52628                               UnallocatedA32(instr);
   52629                               return;
   52630                             }
   52631                             Alignment align =
   52632                                 Align_align_1_Decode((instr >> 4) & 0x3);
   52633                             if (dt.Is(kDataTypeValueInvalid) ||
   52634                                 align.Is(kBadAlignment)) {
   52635                               UnallocatedA32(instr);
   52636                               return;
   52637                             }
   52638                             unsigned first = ExtractDRegister(instr, 22, 12);
   52639                             unsigned length;
   52640                             SpacingType spacing = kSingle;
   52641                             switch ((instr >> 8) & 0xf) {
   52642                               default:
   52643                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
   52644                               case 0x7:
   52645                                 length = 1;
   52646                                 break;
   52647                               case 0xa:
   52648                                 length = 2;
   52649                                 break;
   52650                               case 0x6:
   52651                                 length = 3;
   52652                                 break;
   52653                               case 0x2:
   52654                                 length = 4;
   52655                                 break;
   52656                             }
   52657                             unsigned last = first + length - 1;
   52658                             TransferType transfer = kMultipleLanes;
   52659                             unsigned rn = (instr >> 16) & 0xf;
   52660                             // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
   52661                             vld1(al,
   52662                                  dt,
   52663                                  NeonRegisterList(DRegister(first),
   52664                                                   DRegister(last),
   52665                                                   spacing,
   52666                                                   transfer),
   52667                                  AlignedMemOperand(Register(rn),
   52668                                                    align,
   52669                                                    PostIndex));
   52670                             break;
   52671                           }
   52672                           case 0x00000800: {
   52673                             // 0xf420080d
   52674                             if (((instr & 0xe30) == 0x830)) {
   52675                               UnallocatedA32(instr);
   52676                               return;
   52677                             }
   52678                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
   52679                             if (dt.Is(kDataTypeValueInvalid)) {
   52680                               UnallocatedA32(instr);
   52681                               return;
   52682                             }
   52683                             Alignment align =
   52684                                 Align_align_2_Decode((instr >> 4) & 0x3);
   52685                             if (dt.Is(kDataTypeValueInvalid) ||
   52686                                 align.Is(kBadAlignment)) {
   52687                               UnallocatedA32(instr);
   52688                               return;
   52689                             }
   52690                             unsigned first = ExtractDRegister(instr, 22, 12);
   52691                             unsigned length;
   52692                             SpacingType spacing;
   52693                             switch ((instr >> 8) & 0xf) {
   52694                               default:
   52695                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
   52696                               case 0x8:
   52697                                 length = 2;
   52698                                 spacing = kSingle;
   52699                                 break;
   52700                               case 0x9:
   52701                                 length = 2;
   52702                                 spacing = kDouble;
   52703                                 break;
   52704                               case 0x3:
   52705                                 length = 4;
   52706                                 spacing = kSingle;
   52707                                 break;
   52708                             }
   52709                             unsigned last =
   52710                                 first +
   52711                                 (length - 1) * (spacing == kSingle ? 1 : 2);
   52712                             TransferType transfer = kMultipleLanes;
   52713                             unsigned rn = (instr >> 16) & 0xf;
   52714                             // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
   52715                             vld2(al,
   52716                                  dt,
   52717                                  NeonRegisterList(DRegister(first),
   52718                                                   DRegister(last),
   52719                                                   spacing,
   52720                                                   transfer),
   52721                                  AlignedMemOperand(Register(rn),
   52722                                                    align,
   52723                                                    PostIndex));
   52724                             break;
   52725                           }
   52726                           case 0x00000900: {
   52727                             // 0xf420090d
   52728                             if (((instr & 0xe30) == 0x830)) {
   52729                               UnallocatedA32(instr);
   52730                               return;
   52731                             }
   52732                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
   52733                             if (dt.Is(kDataTypeValueInvalid)) {
   52734                               UnallocatedA32(instr);
   52735                               return;
   52736                             }
   52737                             Alignment align =
   52738                                 Align_align_2_Decode((instr >> 4) & 0x3);
   52739                             if (dt.Is(kDataTypeValueInvalid) ||
   52740                                 align.Is(kBadAlignment)) {
   52741                               UnallocatedA32(instr);
   52742                               return;
   52743                             }
   52744                             unsigned first = ExtractDRegister(instr, 22, 12);
   52745                             unsigned length;
   52746                             SpacingType spacing;
   52747                             switch ((instr >> 8) & 0xf) {
   52748                               default:
   52749                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
   52750                               case 0x8:
   52751                                 length = 2;
   52752                                 spacing = kSingle;
   52753                                 break;
   52754                               case 0x9:
   52755                                 length = 2;
   52756                                 spacing = kDouble;
   52757                                 break;
   52758                               case 0x3:
   52759                                 length = 4;
   52760                                 spacing = kSingle;
   52761                                 break;
   52762                             }
   52763                             unsigned last =
   52764                                 first +
   52765                                 (length - 1) * (spacing == kSingle ? 1 : 2);
   52766                             TransferType transfer = kMultipleLanes;
   52767                             unsigned rn = (instr >> 16) & 0xf;
   52768                             // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
   52769                             vld2(al,
   52770                                  dt,
   52771                                  NeonRegisterList(DRegister(first),
   52772                                                   DRegister(last),
   52773                                                   spacing,
   52774                                                   transfer),
   52775                                  AlignedMemOperand(Register(rn),
   52776                                                    align,
   52777                                                    PostIndex));
   52778                             break;
   52779                           }
   52780                           case 0x00000a00: {
   52781                             // 0xf4200a0d
   52782                             if (((instr & 0xe20) == 0x620) ||
   52783                                 ((instr & 0xf30) == 0xa30)) {
   52784                               UnallocatedA32(instr);
   52785                               return;
   52786                             }
   52787                             DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
   52788                             if (dt.Is(kDataTypeValueInvalid)) {
   52789                               UnallocatedA32(instr);
   52790                               return;
   52791                             }
   52792                             Alignment align =
   52793                                 Align_align_1_Decode((instr >> 4) & 0x3);
   52794                             if (dt.Is(kDataTypeValueInvalid) ||
   52795                                 align.Is(kBadAlignment)) {
   52796                               UnallocatedA32(instr);
   52797                               return;
   52798                             }
   52799                             unsigned first = ExtractDRegister(instr, 22, 12);
   52800                             unsigned length;
   52801                             SpacingType spacing = kSingle;
   52802                             switch ((instr >> 8) & 0xf) {
   52803                               default:
   52804                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
   52805                               case 0x7:
   52806                                 length = 1;
   52807                                 break;
   52808                               case 0xa:
   52809                                 length = 2;
   52810                                 break;
   52811                               case 0x6:
   52812                                 length = 3;
   52813                                 break;
   52814                               case 0x2:
   52815                                 length = 4;
   52816                                 break;
   52817                             }
   52818                             unsigned last = first + length - 1;
   52819                             TransferType transfer = kMultipleLanes;
   52820                             unsigned rn = (instr >> 16) & 0xf;
   52821                             // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
   52822                             vld1(al,
   52823                                  dt,
   52824                                  NeonRegisterList(DRegister(first),
   52825                                                   DRegister(last),
   52826                                                   spacing,
   52827                                                   transfer),
   52828                                  AlignedMemOperand(Register(rn),
   52829                                                    align,
   52830                                                    PostIndex));
   52831                             break;
   52832                           }
   52833                           default:
   52834                             UnallocatedA32(instr);
   52835                             break;
   52836                         }
   52837                         break;
   52838                       }
   52839                       case 0x00000002: {
   52840                         // 0xf420000f
   52841                         switch (instr & 0x00000f00) {
   52842                           case 0x00000000: {
   52843                             // 0xf420000d
   52844                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
   52845                             if (dt.Is(kDataTypeValueInvalid)) {
   52846                               UnallocatedA32(instr);
   52847                               return;
   52848                             }
   52849                             Alignment align =
   52850                                 Align_align_4_Decode((instr >> 4) & 0x3);
   52851                             if (dt.Is(kDataTypeValueInvalid) ||
   52852                                 align.Is(kBadAlignment)) {
   52853                               UnallocatedA32(instr);
   52854                               return;
   52855                             }
   52856                             unsigned first = ExtractDRegister(instr, 22, 12);
   52857                             unsigned length;
   52858                             SpacingType spacing;
   52859                             switch ((instr >> 8) & 0xf) {
   52860                               default:
   52861                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
   52862                               case 0x0:
   52863                                 length = 4;
   52864                                 spacing = kSingle;
   52865                                 break;
   52866                               case 0x1:
   52867                                 length = 4;
   52868                                 spacing = kDouble;
   52869                                 break;
   52870                             }
   52871                             unsigned last =
   52872                                 first +
   52873                                 (length - 1) * (spacing == kSingle ? 1 : 2);
   52874                             TransferType transfer = kMultipleLanes;
   52875                             unsigned rn = (instr >> 16) & 0xf;
   52876                             // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
   52877                             vld4(al,
   52878                                  dt,
   52879                                  NeonRegisterList(DRegister(first),
   52880                                                   DRegister(last),
   52881                                                   spacing,
   52882                                                   transfer),
   52883                                  AlignedMemOperand(Register(rn),
   52884                                                    align,
   52885                                                    Offset));
   52886                             break;
   52887                           }
   52888                           case 0x00000100: {
   52889                             // 0xf420010d
   52890                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
   52891                             if (dt.Is(kDataTypeValueInvalid)) {
   52892                               UnallocatedA32(instr);
   52893                               return;
   52894                             }
   52895                             Alignment align =
   52896                                 Align_align_4_Decode((instr >> 4) & 0x3);
   52897                             if (dt.Is(kDataTypeValueInvalid) ||
   52898                                 align.Is(kBadAlignment)) {
   52899                               UnallocatedA32(instr);
   52900                               return;
   52901                             }
   52902                             unsigned first = ExtractDRegister(instr, 22, 12);
   52903                             unsigned length;
   52904                             SpacingType spacing;
   52905                             switch ((instr >> 8) & 0xf) {
   52906                               default:
   52907                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
   52908                               case 0x0:
   52909                                 length = 4;
   52910                                 spacing = kSingle;
   52911                                 break;
   52912                               case 0x1:
   52913                                 length = 4;
   52914                                 spacing = kDouble;
   52915                                 break;
   52916                             }
   52917                             unsigned last =
   52918                                 first +
   52919                                 (length - 1) * (spacing == kSingle ? 1 : 2);
   52920                             TransferType transfer = kMultipleLanes;
   52921                             unsigned rn = (instr >> 16) & 0xf;
   52922                             // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
   52923                             vld4(al,
   52924                                  dt,
   52925                                  NeonRegisterList(DRegister(first),
   52926                                                   DRegister(last),
   52927                                                   spacing,
   52928                                                   transfer),
   52929                                  AlignedMemOperand(Register(rn),
   52930                                                    align,
   52931                                                    Offset));
   52932                             break;
   52933                           }
   52934                           case 0x00000200: {
   52935                             // 0xf420020d
   52936                             if (((instr & 0xe20) == 0x620) ||
   52937                                 ((instr & 0xf30) == 0xa30)) {
   52938                               UnallocatedA32(instr);
   52939                               return;
   52940                             }
   52941                             DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
   52942                             if (dt.Is(kDataTypeValueInvalid)) {
   52943                               UnallocatedA32(instr);
   52944                               return;
   52945                             }
   52946                             Alignment align =
   52947                                 Align_align_1_Decode((instr >> 4) & 0x3);
   52948                             if (dt.Is(kDataTypeValueInvalid) ||
   52949                                 align.Is(kBadAlignment)) {
   52950                               UnallocatedA32(instr);
   52951                               return;
   52952                             }
   52953                             unsigned first = ExtractDRegister(instr, 22, 12);
   52954                             unsigned length;
   52955                             SpacingType spacing = kSingle;
   52956                             switch ((instr >> 8) & 0xf) {
   52957                               default:
   52958                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
   52959                               case 0x7:
   52960                                 length = 1;
   52961                                 break;
   52962                               case 0xa:
   52963                                 length = 2;
   52964                                 break;
   52965                               case 0x6:
   52966                                 length = 3;
   52967                                 break;
   52968                               case 0x2:
   52969                                 length = 4;
   52970                                 break;
   52971                             }
   52972                             unsigned last = first + length - 1;
   52973                             TransferType transfer = kMultipleLanes;
   52974                             unsigned rn = (instr >> 16) & 0xf;
   52975                             // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
   52976                             vld1(al,
   52977                                  dt,
   52978                                  NeonRegisterList(DRegister(first),
   52979                                                   DRegister(last),
   52980                                                   spacing,
   52981                                                   transfer),
   52982                                  AlignedMemOperand(Register(rn),
   52983                                                    align,
   52984                                                    Offset));
   52985                             break;
   52986                           }
   52987                           case 0x00000300: {
   52988                             // 0xf420030d
   52989                             if (((instr & 0xe30) == 0x830)) {
   52990                               UnallocatedA32(instr);
   52991                               return;
   52992                             }
   52993                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
   52994                             if (dt.Is(kDataTypeValueInvalid)) {
   52995                               UnallocatedA32(instr);
   52996                               return;
   52997                             }
   52998                             Alignment align =
   52999                                 Align_align_2_Decode((instr >> 4) & 0x3);
   53000                             if (dt.Is(kDataTypeValueInvalid) ||
   53001                                 align.Is(kBadAlignment)) {
   53002                               UnallocatedA32(instr);
   53003                               return;
   53004                             }
   53005                             unsigned first = ExtractDRegister(instr, 22, 12);
   53006                             unsigned length;
   53007                             SpacingType spacing;
   53008                             switch ((instr >> 8) & 0xf) {
   53009                               default:
   53010                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
   53011                               case 0x8:
   53012                                 length = 2;
   53013                                 spacing = kSingle;
   53014                                 break;
   53015                               case 0x9:
   53016                                 length = 2;
   53017                                 spacing = kDouble;
   53018                                 break;
   53019                               case 0x3:
   53020                                 length = 4;
   53021                                 spacing = kSingle;
   53022                                 break;
   53023                             }
   53024                             unsigned last =
   53025                                 first +
   53026                                 (length - 1) * (spacing == kSingle ? 1 : 2);
   53027                             TransferType transfer = kMultipleLanes;
   53028                             unsigned rn = (instr >> 16) & 0xf;
   53029                             // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
   53030                             vld2(al,
   53031                                  dt,
   53032                                  NeonRegisterList(DRegister(first),
   53033                                                   DRegister(last),
   53034                                                   spacing,
   53035                                                   transfer),
   53036                                  AlignedMemOperand(Register(rn),
   53037                                                    align,
   53038                                                    Offset));
   53039                             break;
   53040                           }
   53041                           case 0x00000400: {
   53042                             // 0xf420040d
   53043                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
   53044                             if (dt.Is(kDataTypeValueInvalid)) {
   53045                               UnallocatedA32(instr);
   53046                               return;
   53047                             }
   53048                             Alignment align =
   53049                                 Align_align_3_Decode((instr >> 4) & 0x3);
   53050                             if (dt.Is(kDataTypeValueInvalid) ||
   53051                                 align.Is(kBadAlignment)) {
   53052                               UnallocatedA32(instr);
   53053                               return;
   53054                             }
   53055                             unsigned first = ExtractDRegister(instr, 22, 12);
   53056                             unsigned length;
   53057                             SpacingType spacing;
   53058                             switch ((instr >> 8) & 0xf) {
   53059                               default:
   53060                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
   53061                               case 0x4:
   53062                                 length = 3;
   53063                                 spacing = kSingle;
   53064                                 break;
   53065                               case 0x5:
   53066                                 length = 3;
   53067                                 spacing = kDouble;
   53068                                 break;
   53069                             }
   53070                             unsigned last =
   53071                                 first +
   53072                                 (length - 1) * (spacing == kSingle ? 1 : 2);
   53073                             TransferType transfer = kMultipleLanes;
   53074                             unsigned rn = (instr >> 16) & 0xf;
   53075                             // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
   53076                             vld3(al,
   53077                                  dt,
   53078                                  NeonRegisterList(DRegister(first),
   53079                                                   DRegister(last),
   53080                                                   spacing,
   53081                                                   transfer),
   53082                                  AlignedMemOperand(Register(rn),
   53083                                                    align,
   53084                                                    Offset));
   53085                             break;
   53086                           }
   53087                           case 0x00000500: {
   53088                             // 0xf420050d
   53089                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
   53090                             if (dt.Is(kDataTypeValueInvalid)) {
   53091                               UnallocatedA32(instr);
   53092                               return;
   53093                             }
   53094                             Alignment align =
   53095                                 Align_align_3_Decode((instr >> 4) & 0x3);
   53096                             if (dt.Is(kDataTypeValueInvalid) ||
   53097                                 align.Is(kBadAlignment)) {
   53098                               UnallocatedA32(instr);
   53099                               return;
   53100                             }
   53101                             unsigned first = ExtractDRegister(instr, 22, 12);
   53102                             unsigned length;
   53103                             SpacingType spacing;
   53104                             switch ((instr >> 8) & 0xf) {
   53105                               default:
   53106                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
   53107                               case 0x4:
   53108                                 length = 3;
   53109                                 spacing = kSingle;
   53110                                 break;
   53111                               case 0x5:
   53112                                 length = 3;
   53113                                 spacing = kDouble;
   53114                                 break;
   53115                             }
   53116                             unsigned last =
   53117                                 first +
   53118                                 (length - 1) * (spacing == kSingle ? 1 : 2);
   53119                             TransferType transfer = kMultipleLanes;
   53120                             unsigned rn = (instr >> 16) & 0xf;
   53121                             // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
   53122                             vld3(al,
   53123                                  dt,
   53124                                  NeonRegisterList(DRegister(first),
   53125                                                   DRegister(last),
   53126                                                   spacing,
   53127                                                   transfer),
   53128                                  AlignedMemOperand(Register(rn),
   53129                                                    align,
   53130                                                    Offset));
   53131                             break;
   53132                           }
   53133                           case 0x00000600: {
   53134                             // 0xf420060d
   53135                             if (((instr & 0xe20) == 0x620) ||
   53136                                 ((instr & 0xf30) == 0xa30)) {
   53137                               UnallocatedA32(instr);
   53138                               return;
   53139                             }
   53140                             DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
   53141                             if (dt.Is(kDataTypeValueInvalid)) {
   53142                               UnallocatedA32(instr);
   53143                               return;
   53144                             }
   53145                             Alignment align =
   53146                                 Align_align_1_Decode((instr >> 4) & 0x3);
   53147                             if (dt.Is(kDataTypeValueInvalid) ||
   53148                                 align.Is(kBadAlignment)) {
   53149                               UnallocatedA32(instr);
   53150                               return;
   53151                             }
   53152                             unsigned first = ExtractDRegister(instr, 22, 12);
   53153                             unsigned length;
   53154                             SpacingType spacing = kSingle;
   53155                             switch ((instr >> 8) & 0xf) {
   53156                               default:
   53157                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
   53158                               case 0x7:
   53159                                 length = 1;
   53160                                 break;
   53161                               case 0xa:
   53162                                 length = 2;
   53163                                 break;
   53164                               case 0x6:
   53165                                 length = 3;
   53166                                 break;
   53167                               case 0x2:
   53168                                 length = 4;
   53169                                 break;
   53170                             }
   53171                             unsigned last = first + length - 1;
   53172                             TransferType transfer = kMultipleLanes;
   53173                             unsigned rn = (instr >> 16) & 0xf;
   53174                             // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
   53175                             vld1(al,
   53176                                  dt,
   53177                                  NeonRegisterList(DRegister(first),
   53178                                                   DRegister(last),
   53179                                                   spacing,
   53180                                                   transfer),
   53181                                  AlignedMemOperand(Register(rn),
   53182                                                    align,
   53183                                                    Offset));
   53184                             break;
   53185                           }
   53186                           case 0x00000700: {
   53187                             // 0xf420070d
   53188                             if (((instr & 0xe20) == 0x620) ||
   53189                                 ((instr & 0xf30) == 0xa30)) {
   53190                               UnallocatedA32(instr);
   53191                               return;
   53192                             }
   53193                             DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
   53194                             if (dt.Is(kDataTypeValueInvalid)) {
   53195                               UnallocatedA32(instr);
   53196                               return;
   53197                             }
   53198                             Alignment align =
   53199                                 Align_align_1_Decode((instr >> 4) & 0x3);
   53200                             if (dt.Is(kDataTypeValueInvalid) ||
   53201                                 align.Is(kBadAlignment)) {
   53202                               UnallocatedA32(instr);
   53203                               return;
   53204                             }
   53205                             unsigned first = ExtractDRegister(instr, 22, 12);
   53206                             unsigned length;
   53207                             SpacingType spacing = kSingle;
   53208                             switch ((instr >> 8) & 0xf) {
   53209                               default:
   53210                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
   53211                               case 0x7:
   53212                                 length = 1;
   53213                                 break;
   53214                               case 0xa:
   53215                                 length = 2;
   53216                                 break;
   53217                               case 0x6:
   53218                                 length = 3;
   53219                                 break;
   53220                               case 0x2:
   53221                                 length = 4;
   53222                                 break;
   53223                             }
   53224                             unsigned last = first + length - 1;
   53225                             TransferType transfer = kMultipleLanes;
   53226                             unsigned rn = (instr >> 16) & 0xf;
   53227                             // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
   53228                             vld1(al,
   53229                                  dt,
   53230                                  NeonRegisterList(DRegister(first),
   53231                                                   DRegister(last),
   53232                                                   spacing,
   53233                                                   transfer),
   53234                                  AlignedMemOperand(Register(rn),
   53235                                                    align,
   53236                                                    Offset));
   53237                             break;
   53238                           }
   53239                           case 0x00000800: {
   53240                             // 0xf420080d
   53241                             if (((instr & 0xe30) == 0x830)) {
   53242                               UnallocatedA32(instr);
   53243                               return;
   53244                             }
   53245                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
   53246                             if (dt.Is(kDataTypeValueInvalid)) {
   53247                               UnallocatedA32(instr);
   53248                               return;
   53249                             }
   53250                             Alignment align =
   53251                                 Align_align_2_Decode((instr >> 4) & 0x3);
   53252                             if (dt.Is(kDataTypeValueInvalid) ||
   53253                                 align.Is(kBadAlignment)) {
   53254                               UnallocatedA32(instr);
   53255                               return;
   53256                             }
   53257                             unsigned first = ExtractDRegister(instr, 22, 12);
   53258                             unsigned length;
   53259                             SpacingType spacing;
   53260                             switch ((instr >> 8) & 0xf) {
   53261                               default:
   53262                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
   53263                               case 0x8:
   53264                                 length = 2;
   53265                                 spacing = kSingle;
   53266                                 break;
   53267                               case 0x9:
   53268                                 length = 2;
   53269                                 spacing = kDouble;
   53270                                 break;
   53271                               case 0x3:
   53272                                 length = 4;
   53273                                 spacing = kSingle;
   53274                                 break;
   53275                             }
   53276                             unsigned last =
   53277                                 first +
   53278                                 (length - 1) * (spacing == kSingle ? 1 : 2);
   53279                             TransferType transfer = kMultipleLanes;
   53280                             unsigned rn = (instr >> 16) & 0xf;
   53281                             // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
   53282                             vld2(al,
   53283                                  dt,
   53284                                  NeonRegisterList(DRegister(first),
   53285                                                   DRegister(last),
   53286                                                   spacing,
   53287                                                   transfer),
   53288                                  AlignedMemOperand(Register(rn),
   53289                                                    align,
   53290                                                    Offset));
   53291                             break;
   53292                           }
   53293                           case 0x00000900: {
   53294                             // 0xf420090d
   53295                             if (((instr & 0xe30) == 0x830)) {
   53296                               UnallocatedA32(instr);
   53297                               return;
   53298                             }
   53299                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
   53300                             if (dt.Is(kDataTypeValueInvalid)) {
   53301                               UnallocatedA32(instr);
   53302                               return;
   53303                             }
   53304                             Alignment align =
   53305                                 Align_align_2_Decode((instr >> 4) & 0x3);
   53306                             if (dt.Is(kDataTypeValueInvalid) ||
   53307                                 align.Is(kBadAlignment)) {
   53308                               UnallocatedA32(instr);
   53309                               return;
   53310                             }
   53311                             unsigned first = ExtractDRegister(instr, 22, 12);
   53312                             unsigned length;
   53313                             SpacingType spacing;
   53314                             switch ((instr >> 8) & 0xf) {
   53315                               default:
   53316                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
   53317                               case 0x8:
   53318                                 length = 2;
   53319                                 spacing = kSingle;
   53320                                 break;
   53321                               case 0x9:
   53322                                 length = 2;
   53323                                 spacing = kDouble;
   53324                                 break;
   53325                               case 0x3:
   53326                                 length = 4;
   53327                                 spacing = kSingle;
   53328                                 break;
   53329                             }
   53330                             unsigned last =
   53331                                 first +
   53332                                 (length - 1) * (spacing == kSingle ? 1 : 2);
   53333                             TransferType transfer = kMultipleLanes;
   53334                             unsigned rn = (instr >> 16) & 0xf;
   53335                             // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
   53336                             vld2(al,
   53337                                  dt,
   53338                                  NeonRegisterList(DRegister(first),
   53339                                                   DRegister(last),
   53340                                                   spacing,
   53341                                                   transfer),
   53342                                  AlignedMemOperand(Register(rn),
   53343                                                    align,
   53344                                                    Offset));
   53345                             break;
   53346                           }
   53347                           case 0x00000a00: {
   53348                             // 0xf4200a0d
   53349                             if (((instr & 0xe20) == 0x620) ||
   53350                                 ((instr & 0xf30) == 0xa30)) {
   53351                               UnallocatedA32(instr);
   53352                               return;
   53353                             }
   53354                             DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
   53355                             if (dt.Is(kDataTypeValueInvalid)) {
   53356                               UnallocatedA32(instr);
   53357                               return;
   53358                             }
   53359                             Alignment align =
   53360                                 Align_align_1_Decode((instr >> 4) & 0x3);
   53361                             if (dt.Is(kDataTypeValueInvalid) ||
   53362                                 align.Is(kBadAlignment)) {
   53363                               UnallocatedA32(instr);
   53364                               return;
   53365                             }
   53366                             unsigned first = ExtractDRegister(instr, 22, 12);
   53367                             unsigned length;
   53368                             SpacingType spacing = kSingle;
   53369                             switch ((instr >> 8) & 0xf) {
   53370                               default:
   53371                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
   53372                               case 0x7:
   53373                                 length = 1;
   53374                                 break;
   53375                               case 0xa:
   53376                                 length = 2;
   53377                                 break;
   53378                               case 0x6:
   53379                                 length = 3;
   53380                                 break;
   53381                               case 0x2:
   53382                                 length = 4;
   53383                                 break;
   53384                             }
   53385                             unsigned last = first + length - 1;
   53386                             TransferType transfer = kMultipleLanes;
   53387                             unsigned rn = (instr >> 16) & 0xf;
   53388                             // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
   53389                             vld1(al,
   53390                                  dt,
   53391                                  NeonRegisterList(DRegister(first),
   53392                                                   DRegister(last),
   53393                                                   spacing,
   53394                                                   transfer),
   53395                                  AlignedMemOperand(Register(rn),
   53396                                                    align,
   53397                                                    Offset));
   53398                             break;
   53399                           }
   53400                           default:
   53401                             UnallocatedA32(instr);
   53402                             break;
   53403                         }
   53404                         break;
   53405                       }
   53406                     }
   53407                     break;
   53408                   }
   53409                   default: {
   53410                     switch (instr & 0x00000f00) {
   53411                       case 0x00000000: {
   53412                         // 0xf4200000
   53413                         if (((instr & 0xd) == 0xd)) {
   53414                           UnallocatedA32(instr);
   53415                           return;
   53416                         }
   53417                         DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
   53418                         if (dt.Is(kDataTypeValueInvalid)) {
   53419                           UnallocatedA32(instr);
   53420                           return;
   53421                         }
   53422                         Alignment align =
   53423                             Align_align_4_Decode((instr >> 4) & 0x3);
   53424                         if (dt.Is(kDataTypeValueInvalid) ||
   53425                             align.Is(kBadAlignment)) {
   53426                           UnallocatedA32(instr);
   53427                           return;
   53428                         }
   53429                         unsigned first = ExtractDRegister(instr, 22, 12);
   53430                         unsigned length;
   53431                         SpacingType spacing;
   53432                         switch ((instr >> 8) & 0xf) {
   53433                           default:
   53434                             VIXL_UNREACHABLE_OR_FALLTHROUGH();
   53435                           case 0x0:
   53436                             length = 4;
   53437                             spacing = kSingle;
   53438                             break;
   53439                           case 0x1:
   53440                             length = 4;
   53441                             spacing = kDouble;
   53442                             break;
   53443                         }
   53444                         unsigned last =
   53445                             first + (length - 1) * (spacing == kSingle ? 1 : 2);
   53446                         TransferType transfer = kMultipleLanes;
   53447                         unsigned rn = (instr >> 16) & 0xf;
   53448                         unsigned rm = instr & 0xf;
   53449                         // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
   53450                         vld4(al,
   53451                              dt,
   53452                              NeonRegisterList(DRegister(first),
   53453                                               DRegister(last),
   53454                                               spacing,
   53455                                               transfer),
   53456                              AlignedMemOperand(Register(rn),
   53457                                                align,
   53458                                                Register(rm),
   53459                                                PostIndex));
   53460                         break;
   53461                       }
   53462                       case 0x00000100: {
   53463                         // 0xf4200100
   53464                         if (((instr & 0xd) == 0xd)) {
   53465                           UnallocatedA32(instr);
   53466                           return;
   53467                         }
   53468                         DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
   53469                         if (dt.Is(kDataTypeValueInvalid)) {
   53470                           UnallocatedA32(instr);
   53471                           return;
   53472                         }
   53473                         Alignment align =
   53474                             Align_align_4_Decode((instr >> 4) & 0x3);
   53475                         if (dt.Is(kDataTypeValueInvalid) ||
   53476                             align.Is(kBadAlignment)) {
   53477                           UnallocatedA32(instr);
   53478                           return;
   53479                         }
   53480                         unsigned first = ExtractDRegister(instr, 22, 12);
   53481                         unsigned length;
   53482                         SpacingType spacing;
   53483                         switch ((instr >> 8) & 0xf) {
   53484                           default:
   53485                             VIXL_UNREACHABLE_OR_FALLTHROUGH();
   53486                           case 0x0:
   53487                             length = 4;
   53488                             spacing = kSingle;
   53489                             break;
   53490                           case 0x1:
   53491                             length = 4;
   53492                             spacing = kDouble;
   53493                             break;
   53494                         }
   53495                         unsigned last =
   53496                             first + (length - 1) * (spacing == kSingle ? 1 : 2);
   53497                         TransferType transfer = kMultipleLanes;
   53498                         unsigned rn = (instr >> 16) & 0xf;
   53499                         unsigned rm = instr & 0xf;
   53500                         // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
   53501                         vld4(al,
   53502                              dt,
   53503                              NeonRegisterList(DRegister(first),
   53504                                               DRegister(last),
   53505                                               spacing,
   53506                                               transfer),
   53507                              AlignedMemOperand(Register(rn),
   53508                                                align,
   53509                                                Register(rm),
   53510                                                PostIndex));
   53511                         break;
   53512                       }
   53513                       case 0x00000200: {
   53514                         // 0xf4200200
   53515                         if (((instr & 0xd) == 0xd) ||
   53516                             ((instr & 0xe20) == 0x620) ||
   53517                             ((instr & 0xf30) == 0xa30)) {
   53518                           UnallocatedA32(instr);
   53519                           return;
   53520                         }
   53521                         DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
   53522                         if (dt.Is(kDataTypeValueInvalid)) {
   53523                           UnallocatedA32(instr);
   53524                           return;
   53525                         }
   53526                         Alignment align =
   53527                             Align_align_1_Decode((instr >> 4) & 0x3);
   53528                         if (dt.Is(kDataTypeValueInvalid) ||
   53529                             align.Is(kBadAlignment)) {
   53530                           UnallocatedA32(instr);
   53531                           return;
   53532                         }
   53533                         unsigned first = ExtractDRegister(instr, 22, 12);
   53534                         unsigned length;
   53535                         SpacingType spacing = kSingle;
   53536                         switch ((instr >> 8) & 0xf) {
   53537                           default:
   53538                             VIXL_UNREACHABLE_OR_FALLTHROUGH();
   53539                           case 0x7:
   53540                             length = 1;
   53541                             break;
   53542                           case 0xa:
   53543                             length = 2;
   53544                             break;
   53545                           case 0x6:
   53546                             length = 3;
   53547                             break;
   53548                           case 0x2:
   53549                             length = 4;
   53550                             break;
   53551                         }
   53552                         unsigned last = first + length - 1;
   53553                         TransferType transfer = kMultipleLanes;
   53554                         unsigned rn = (instr >> 16) & 0xf;
   53555                         unsigned rm = instr & 0xf;
   53556                         // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
   53557                         vld1(al,
   53558                              dt,
   53559                              NeonRegisterList(DRegister(first),
   53560                                               DRegister(last),
   53561                                               spacing,
   53562                                               transfer),
   53563                              AlignedMemOperand(Register(rn),
   53564                                                align,
   53565                                                Register(rm),
   53566                                                PostIndex));
   53567                         break;
   53568                       }
   53569                       case 0x00000300: {
   53570                         // 0xf4200300
   53571                         if (((instr & 0xd) == 0xd) ||
   53572                             ((instr & 0xe30) == 0x830)) {
   53573                           UnallocatedA32(instr);
   53574                           return;
   53575                         }
   53576                         DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
   53577                         if (dt.Is(kDataTypeValueInvalid)) {
   53578                           UnallocatedA32(instr);
   53579                           return;
   53580                         }
   53581                         Alignment align =
   53582                             Align_align_2_Decode((instr >> 4) & 0x3);
   53583                         if (dt.Is(kDataTypeValueInvalid) ||
   53584                             align.Is(kBadAlignment)) {
   53585                           UnallocatedA32(instr);
   53586                           return;
   53587                         }
   53588                         unsigned first = ExtractDRegister(instr, 22, 12);
   53589                         unsigned length;
   53590                         SpacingType spacing;
   53591                         switch ((instr >> 8) & 0xf) {
   53592                           default:
   53593                             VIXL_UNREACHABLE_OR_FALLTHROUGH();
   53594                           case 0x8:
   53595                             length = 2;
   53596                             spacing = kSingle;
   53597                             break;
   53598                           case 0x9:
   53599                             length = 2;
   53600                             spacing = kDouble;
   53601                             break;
   53602                           case 0x3:
   53603                             length = 4;
   53604                             spacing = kSingle;
   53605                             break;
   53606                         }
   53607                         unsigned last =
   53608                             first + (length - 1) * (spacing == kSingle ? 1 : 2);
   53609                         TransferType transfer = kMultipleLanes;
   53610                         unsigned rn = (instr >> 16) & 0xf;
   53611                         unsigned rm = instr & 0xf;
   53612                         // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
   53613                         vld2(al,
   53614                              dt,
   53615                              NeonRegisterList(DRegister(first),
   53616                                               DRegister(last),
   53617                                               spacing,
   53618                                               transfer),
   53619                              AlignedMemOperand(Register(rn),
   53620                                                align,
   53621                                                Register(rm),
   53622                                                PostIndex));
   53623                         break;
   53624                       }
   53625                       case 0x00000400: {
   53626                         // 0xf4200400
   53627                         if (((instr & 0xd) == 0xd)) {
   53628                           UnallocatedA32(instr);
   53629                           return;
   53630                         }
   53631                         DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
   53632                         if (dt.Is(kDataTypeValueInvalid)) {
   53633                           UnallocatedA32(instr);
   53634                           return;
   53635                         }
   53636                         Alignment align =
   53637                             Align_align_3_Decode((instr >> 4) & 0x3);
   53638                         if (dt.Is(kDataTypeValueInvalid) ||
   53639                             align.Is(kBadAlignment)) {
   53640                           UnallocatedA32(instr);
   53641                           return;
   53642                         }
   53643                         unsigned first = ExtractDRegister(instr, 22, 12);
   53644                         unsigned length;
   53645                         SpacingType spacing;
   53646                         switch ((instr >> 8) & 0xf) {
   53647                           default:
   53648                             VIXL_UNREACHABLE_OR_FALLTHROUGH();
   53649                           case 0x4:
   53650                             length = 3;
   53651                             spacing = kSingle;
   53652                             break;
   53653                           case 0x5:
   53654                             length = 3;
   53655                             spacing = kDouble;
   53656                             break;
   53657                         }
   53658                         unsigned last =
   53659                             first + (length - 1) * (spacing == kSingle ? 1 : 2);
   53660                         TransferType transfer = kMultipleLanes;
   53661                         unsigned rn = (instr >> 16) & 0xf;
   53662                         unsigned rm = instr & 0xf;
   53663                         // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
   53664                         vld3(al,
   53665                              dt,
   53666                              NeonRegisterList(DRegister(first),
   53667                                               DRegister(last),
   53668                                               spacing,
   53669                                               transfer),
   53670                              AlignedMemOperand(Register(rn),
   53671                                                align,
   53672                                                Register(rm),
   53673                                                PostIndex));
   53674                         break;
   53675                       }
   53676                       case 0x00000500: {
   53677                         // 0xf4200500
   53678                         if (((instr & 0xd) == 0xd)) {
   53679                           UnallocatedA32(instr);
   53680                           return;
   53681                         }
   53682                         DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
   53683                         if (dt.Is(kDataTypeValueInvalid)) {
   53684                           UnallocatedA32(instr);
   53685                           return;
   53686                         }
   53687                         Alignment align =
   53688                             Align_align_3_Decode((instr >> 4) & 0x3);
   53689                         if (dt.Is(kDataTypeValueInvalid) ||
   53690                             align.Is(kBadAlignment)) {
   53691                           UnallocatedA32(instr);
   53692                           return;
   53693                         }
   53694                         unsigned first = ExtractDRegister(instr, 22, 12);
   53695                         unsigned length;
   53696                         SpacingType spacing;
   53697                         switch ((instr >> 8) & 0xf) {
   53698                           default:
   53699                             VIXL_UNREACHABLE_OR_FALLTHROUGH();
   53700                           case 0x4:
   53701                             length = 3;
   53702                             spacing = kSingle;
   53703                             break;
   53704                           case 0x5:
   53705                             length = 3;
   53706                             spacing = kDouble;
   53707                             break;
   53708                         }
   53709                         unsigned last =
   53710                             first + (length - 1) * (spacing == kSingle ? 1 : 2);
   53711                         TransferType transfer = kMultipleLanes;
   53712                         unsigned rn = (instr >> 16) & 0xf;
   53713                         unsigned rm = instr & 0xf;
   53714                         // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
   53715                         vld3(al,
   53716                              dt,
   53717                              NeonRegisterList(DRegister(first),
   53718                                               DRegister(last),
   53719                                               spacing,
   53720                                               transfer),
   53721                              AlignedMemOperand(Register(rn),
   53722                                                align,
   53723                                                Register(rm),
   53724                                                PostIndex));
   53725                         break;
   53726                       }
   53727                       case 0x00000600: {
   53728                         // 0xf4200600
   53729                         if (((instr & 0xd) == 0xd) ||
   53730                             ((instr & 0xe20) == 0x620) ||
   53731                             ((instr & 0xf30) == 0xa30)) {
   53732                           UnallocatedA32(instr);
   53733                           return;
   53734                         }
   53735                         DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
   53736                         if (dt.Is(kDataTypeValueInvalid)) {
   53737                           UnallocatedA32(instr);
   53738                           return;
   53739                         }
   53740                         Alignment align =
   53741                             Align_align_1_Decode((instr >> 4) & 0x3);
   53742                         if (dt.Is(kDataTypeValueInvalid) ||
   53743                             align.Is(kBadAlignment)) {
   53744                           UnallocatedA32(instr);
   53745                           return;
   53746                         }
   53747                         unsigned first = ExtractDRegister(instr, 22, 12);
   53748                         unsigned length;
   53749                         SpacingType spacing = kSingle;
   53750                         switch ((instr >> 8) & 0xf) {
   53751                           default:
   53752                             VIXL_UNREACHABLE_OR_FALLTHROUGH();
   53753                           case 0x7:
   53754                             length = 1;
   53755                             break;
   53756                           case 0xa:
   53757                             length = 2;
   53758                             break;
   53759                           case 0x6:
   53760                             length = 3;
   53761                             break;
   53762                           case 0x2:
   53763                             length = 4;
   53764                             break;
   53765                         }
   53766                         unsigned last = first + length - 1;
   53767                         TransferType transfer = kMultipleLanes;
   53768                         unsigned rn = (instr >> 16) & 0xf;
   53769                         unsigned rm = instr & 0xf;
   53770                         // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
   53771                         vld1(al,
   53772                              dt,
   53773                              NeonRegisterList(DRegister(first),
   53774                                               DRegister(last),
   53775                                               spacing,
   53776                                               transfer),
   53777                              AlignedMemOperand(Register(rn),
   53778                                                align,
   53779                                                Register(rm),
   53780                                                PostIndex));
   53781                         break;
   53782                       }
   53783                       case 0x00000700: {
   53784                         // 0xf4200700
   53785                         if (((instr & 0xd) == 0xd) ||
   53786                             ((instr & 0xe20) == 0x620) ||
   53787                             ((instr & 0xf30) == 0xa30)) {
   53788                           UnallocatedA32(instr);
   53789                           return;
   53790                         }
   53791                         DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
   53792                         if (dt.Is(kDataTypeValueInvalid)) {
   53793                           UnallocatedA32(instr);
   53794                           return;
   53795                         }
   53796                         Alignment align =
   53797                             Align_align_1_Decode((instr >> 4) & 0x3);
   53798                         if (dt.Is(kDataTypeValueInvalid) ||
   53799                             align.Is(kBadAlignment)) {
   53800                           UnallocatedA32(instr);
   53801                           return;
   53802                         }
   53803                         unsigned first = ExtractDRegister(instr, 22, 12);
   53804                         unsigned length;
   53805                         SpacingType spacing = kSingle;
   53806                         switch ((instr >> 8) & 0xf) {
   53807                           default:
   53808                             VIXL_UNREACHABLE_OR_FALLTHROUGH();
   53809                           case 0x7:
   53810                             length = 1;
   53811                             break;
   53812                           case 0xa:
   53813                             length = 2;
   53814                             break;
   53815                           case 0x6:
   53816                             length = 3;
   53817                             break;
   53818                           case 0x2:
   53819                             length = 4;
   53820                             break;
   53821                         }
   53822                         unsigned last = first + length - 1;
   53823                         TransferType transfer = kMultipleLanes;
   53824                         unsigned rn = (instr >> 16) & 0xf;
   53825                         unsigned rm = instr & 0xf;
   53826                         // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
   53827                         vld1(al,
   53828                              dt,
   53829                              NeonRegisterList(DRegister(first),
   53830                                               DRegister(last),
   53831                                               spacing,
   53832                                               transfer),
   53833                              AlignedMemOperand(Register(rn),
   53834                                                align,
   53835                                                Register(rm),
   53836                                                PostIndex));
   53837                         break;
   53838                       }
   53839                       case 0x00000800: {
   53840                         // 0xf4200800
   53841                         if (((instr & 0xd) == 0xd) ||
   53842                             ((instr & 0xe30) == 0x830)) {
   53843                           UnallocatedA32(instr);
   53844                           return;
   53845                         }
   53846                         DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
   53847                         if (dt.Is(kDataTypeValueInvalid)) {
   53848                           UnallocatedA32(instr);
   53849                           return;
   53850                         }
   53851                         Alignment align =
   53852                             Align_align_2_Decode((instr >> 4) & 0x3);
   53853                         if (dt.Is(kDataTypeValueInvalid) ||
   53854                             align.Is(kBadAlignment)) {
   53855                           UnallocatedA32(instr);
   53856                           return;
   53857                         }
   53858                         unsigned first = ExtractDRegister(instr, 22, 12);
   53859                         unsigned length;
   53860                         SpacingType spacing;
   53861                         switch ((instr >> 8) & 0xf) {
   53862                           default:
   53863                             VIXL_UNREACHABLE_OR_FALLTHROUGH();
   53864                           case 0x8:
   53865                             length = 2;
   53866                             spacing = kSingle;
   53867                             break;
   53868                           case 0x9:
   53869                             length = 2;
   53870                             spacing = kDouble;
   53871                             break;
   53872                           case 0x3:
   53873                             length = 4;
   53874                             spacing = kSingle;
   53875                             break;
   53876                         }
   53877                         unsigned last =
   53878                             first + (length - 1) * (spacing == kSingle ? 1 : 2);
   53879                         TransferType transfer = kMultipleLanes;
   53880                         unsigned rn = (instr >> 16) & 0xf;
   53881                         unsigned rm = instr & 0xf;
   53882                         // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
   53883                         vld2(al,
   53884                              dt,
   53885                              NeonRegisterList(DRegister(first),
   53886                                               DRegister(last),
   53887                                               spacing,
   53888                                               transfer),
   53889                              AlignedMemOperand(Register(rn),
   53890                                                align,
   53891                                                Register(rm),
   53892                                                PostIndex));
   53893                         break;
   53894                       }
   53895                       case 0x00000900: {
   53896                         // 0xf4200900
   53897                         if (((instr & 0xd) == 0xd) ||
   53898                             ((instr & 0xe30) == 0x830)) {
   53899                           UnallocatedA32(instr);
   53900                           return;
   53901                         }
   53902                         DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
   53903                         if (dt.Is(kDataTypeValueInvalid)) {
   53904                           UnallocatedA32(instr);
   53905                           return;
   53906                         }
   53907                         Alignment align =
   53908                             Align_align_2_Decode((instr >> 4) & 0x3);
   53909                         if (dt.Is(kDataTypeValueInvalid) ||
   53910                             align.Is(kBadAlignment)) {
   53911                           UnallocatedA32(instr);
   53912                           return;
   53913                         }
   53914                         unsigned first = ExtractDRegister(instr, 22, 12);
   53915                         unsigned length;
   53916                         SpacingType spacing;
   53917                         switch ((instr >> 8) & 0xf) {
   53918                           default:
   53919                             VIXL_UNREACHABLE_OR_FALLTHROUGH();
   53920                           case 0x8:
   53921                             length = 2;
   53922                             spacing = kSingle;
   53923                             break;
   53924                           case 0x9:
   53925                             length = 2;
   53926                             spacing = kDouble;
   53927                             break;
   53928                           case 0x3:
   53929                             length = 4;
   53930                             spacing = kSingle;
   53931                             break;
   53932                         }
   53933                         unsigned last =
   53934                             first + (length - 1) * (spacing == kSingle ? 1 : 2);
   53935                         TransferType transfer = kMultipleLanes;
   53936                         unsigned rn = (instr >> 16) & 0xf;
   53937                         unsigned rm = instr & 0xf;
   53938                         // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
   53939                         vld2(al,
   53940                              dt,
   53941                              NeonRegisterList(DRegister(first),
   53942                                               DRegister(last),
   53943                                               spacing,
   53944                                               transfer),
   53945                              AlignedMemOperand(Register(rn),
   53946                                                align,
   53947                                                Register(rm),
   53948                                                PostIndex));
   53949                         break;
   53950                       }
   53951                       case 0x00000a00: {
   53952                         // 0xf4200a00
   53953                         if (((instr & 0xd) == 0xd) ||
   53954                             ((instr & 0xe20) == 0x620) ||
   53955                             ((instr & 0xf30) == 0xa30)) {
   53956                           UnallocatedA32(instr);
   53957                           return;
   53958                         }
   53959                         DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
   53960                         if (dt.Is(kDataTypeValueInvalid)) {
   53961                           UnallocatedA32(instr);
   53962                           return;
   53963                         }
   53964                         Alignment align =
   53965                             Align_align_1_Decode((instr >> 4) & 0x3);
   53966                         if (dt.Is(kDataTypeValueInvalid) ||
   53967                             align.Is(kBadAlignment)) {
   53968                           UnallocatedA32(instr);
   53969                           return;
   53970                         }
   53971                         unsigned first = ExtractDRegister(instr, 22, 12);
   53972                         unsigned length;
   53973                         SpacingType spacing = kSingle;
   53974                         switch ((instr >> 8) & 0xf) {
   53975                           default:
   53976                             VIXL_UNREACHABLE_OR_FALLTHROUGH();
   53977                           case 0x7:
   53978                             length = 1;
   53979                             break;
   53980                           case 0xa:
   53981                             length = 2;
   53982                             break;
   53983                           case 0x6:
   53984                             length = 3;
   53985                             break;
   53986                           case 0x2:
   53987                             length = 4;
   53988                             break;
   53989                         }
   53990                         unsigned last = first + length - 1;
   53991                         TransferType transfer = kMultipleLanes;
   53992                         unsigned rn = (instr >> 16) & 0xf;
   53993                         unsigned rm = instr & 0xf;
   53994                         // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
   53995                         vld1(al,
   53996                              dt,
   53997                              NeonRegisterList(DRegister(first),
   53998                                               DRegister(last),
   53999                                               spacing,
   54000                                               transfer),
   54001                              AlignedMemOperand(Register(rn),
   54002                                                align,
   54003                                                Register(rm),
   54004                                                PostIndex));
   54005                         break;
   54006                       }
   54007                       default:
   54008                         UnallocatedA32(instr);
   54009                         break;
   54010                     }
   54011                     break;
   54012                   }
   54013                 }
   54014                 break;
   54015               }
   54016               case 0x00800000: {
   54017                 // 0xf4a00000
   54018                 switch (instr & 0x00000300) {
   54019                   case 0x00000000: {
   54020                     // 0xf4a00000
   54021                     switch (instr & 0x00000c00) {
   54022                       case 0x00000c00: {
   54023                         // 0xf4a00c00
   54024                         switch (instr & 0x0000000d) {
   54025                           case 0x0000000d: {
   54026                             // 0xf4a00c0d
   54027                             switch (instr & 0x00000002) {
   54028                               case 0x00000000: {
   54029                                 // 0xf4a00c0d
   54030                                 DataType dt =
   54031                                     Dt_size_7_Decode((instr >> 6) & 0x3);
   54032                                 if (dt.Is(kDataTypeValueInvalid)) {
   54033                                   UnallocatedA32(instr);
   54034                                   return;
   54035                                 }
   54036                                 Alignment align =
   54037                                     Align_a_1_Decode((instr >> 4) & 0x1, dt);
   54038                                 if (dt.Is(kDataTypeValueInvalid) ||
   54039                                     align.Is(kBadAlignment)) {
   54040                                   UnallocatedA32(instr);
   54041                                   return;
   54042                                 }
   54043                                 unsigned first =
   54044                                     ExtractDRegister(instr, 22, 12);
   54045                                 unsigned length;
   54046                                 SpacingType spacing = kSingle;
   54047                                 switch ((instr >> 5) & 0x1) {
   54048                                   default:
   54049                                     VIXL_UNREACHABLE_OR_FALLTHROUGH();
   54050                                   case 0x0:
   54051                                     length = 1;
   54052                                     break;
   54053                                   case 0x1:
   54054                                     length = 2;
   54055                                     break;
   54056                                 }
   54057                                 unsigned last = first + length - 1;
   54058                                 TransferType transfer = kAllLanes;
   54059                                 unsigned rn = (instr >> 16) & 0xf;
   54060                                 // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
   54061                                 vld1(al,
   54062                                      dt,
   54063                                      NeonRegisterList(DRegister(first),
   54064                                                       DRegister(last),
   54065                                                       spacing,
   54066                                                       transfer),
   54067                                      AlignedMemOperand(Register(rn),
   54068                                                        align,
   54069                                                        PostIndex));
   54070                                 break;
   54071                               }
   54072                               case 0x00000002: {
   54073                                 // 0xf4a00c0f
   54074                                 DataType dt =
   54075                                     Dt_size_7_Decode((instr >> 6) & 0x3);
   54076                                 if (dt.Is(kDataTypeValueInvalid)) {
   54077                                   UnallocatedA32(instr);
   54078                                   return;
   54079                                 }
   54080                                 Alignment align =
   54081                                     Align_a_1_Decode((instr >> 4) & 0x1, dt);
   54082                                 if (dt.Is(kDataTypeValueInvalid) ||
   54083                                     align.Is(kBadAlignment)) {
   54084                                   UnallocatedA32(instr);
   54085                                   return;
   54086                                 }
   54087                                 unsigned first =
   54088                                     ExtractDRegister(instr, 22, 12);
   54089                                 unsigned length;
   54090                                 SpacingType spacing = kSingle;
   54091                                 switch ((instr >> 5) & 0x1) {
   54092                                   default:
   54093                                     VIXL_UNREACHABLE_OR_FALLTHROUGH();
   54094                                   case 0x0:
   54095                                     length = 1;
   54096                                     break;
   54097                                   case 0x1:
   54098                                     length = 2;
   54099                                     break;
   54100                                 }
   54101                                 unsigned last = first + length - 1;
   54102                                 TransferType transfer = kAllLanes;
   54103                                 unsigned rn = (instr >> 16) & 0xf;
   54104                                 // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1 NOLINT(whitespace/line_length)
   54105                                 vld1(al,
   54106                                      dt,
   54107                                      NeonRegisterList(DRegister(first),
   54108                                                       DRegister(last),
   54109                                                       spacing,
   54110                                                       transfer),
   54111                                      AlignedMemOperand(Register(rn),
   54112                                                        align,
   54113                                                        Offset));
   54114                                 break;
   54115                               }
   54116                             }
   54117                             break;
   54118                           }
   54119                           default: {
   54120                             if (((instr & 0xd) == 0xd)) {
   54121                               UnallocatedA32(instr);
   54122                               return;
   54123                             }
   54124                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
   54125                             if (dt.Is(kDataTypeValueInvalid)) {
   54126                               UnallocatedA32(instr);
   54127                               return;
   54128                             }
   54129                             Alignment align =
   54130                                 Align_a_1_Decode((instr >> 4) & 0x1, dt);
   54131                             if (dt.Is(kDataTypeValueInvalid) ||
   54132                                 align.Is(kBadAlignment)) {
   54133                               UnallocatedA32(instr);
   54134                               return;
   54135                             }
   54136                             unsigned first = ExtractDRegister(instr, 22, 12);
   54137                             unsigned length;
   54138                             SpacingType spacing = kSingle;
   54139                             switch ((instr >> 5) & 0x1) {
   54140                               default:
   54141                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
   54142                               case 0x0:
   54143                                 length = 1;
   54144                                 break;
   54145                               case 0x1:
   54146                                 length = 2;
   54147                                 break;
   54148                             }
   54149                             unsigned last = first + length - 1;
   54150                             TransferType transfer = kAllLanes;
   54151                             unsigned rn = (instr >> 16) & 0xf;
   54152                             unsigned rm = instr & 0xf;
   54153                             // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
   54154                             vld1(al,
   54155                                  dt,
   54156                                  NeonRegisterList(DRegister(first),
   54157                                                   DRegister(last),
   54158                                                   spacing,
   54159                                                   transfer),
   54160                                  AlignedMemOperand(Register(rn),
   54161                                                    align,
   54162                                                    Register(rm),
   54163                                                    PostIndex));
   54164                             break;
   54165                           }
   54166                         }
   54167                         break;
   54168                       }
   54169                       default: {
   54170                         switch (instr & 0x0000000d) {
   54171                           case 0x0000000d: {
   54172                             // 0xf4a0000d
   54173                             switch (instr & 0x00000002) {
   54174                               case 0x00000000: {
   54175                                 // 0xf4a0000d
   54176                                 if (((instr & 0xc00) == 0xc00)) {
   54177                                   UnallocatedA32(instr);
   54178                                   return;
   54179                                 }
   54180                                 DataType dt =
   54181                                     Dt_size_7_Decode((instr >> 10) & 0x3);
   54182                                 if (dt.Is(kDataTypeValueInvalid)) {
   54183                                   UnallocatedA32(instr);
   54184                                   return;
   54185                                 }
   54186                                 DecodeNeonAndAlign decode_neon =
   54187                                     Align_index_align_1_Decode((instr >> 4) &
   54188                                                                    0xf,
   54189                                                                dt);
   54190                                 if (!decode_neon.IsValid()) {
   54191                                   UnallocatedA32(instr);
   54192                                   return;
   54193                                 }
   54194                                 Alignment align = decode_neon.GetAlign();
   54195                                 int lane = decode_neon.GetLane();
   54196                                 SpacingType spacing = decode_neon.GetSpacing();
   54197                                 unsigned first =
   54198                                     ExtractDRegister(instr, 22, 12);
   54199                                 unsigned length = 1;
   54200                                 unsigned last = first + length - 1;
   54201                                 unsigned rn = (instr >> 16) & 0xf;
   54202                                 // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
   54203                                 vld1(al,
   54204                                      dt,
   54205                                      NeonRegisterList(DRegister(first),
   54206                                                       DRegister(last),
   54207                                                       spacing,
   54208                                                       lane),
   54209                                      AlignedMemOperand(Register(rn),
   54210                                                        align,
   54211                                                        PostIndex));
   54212                                 break;
   54213                               }
   54214                               case 0x00000002: {
   54215                                 // 0xf4a0000f
   54216                                 if (((instr & 0xc00) == 0xc00)) {
   54217                                   UnallocatedA32(instr);
   54218                                   return;
   54219                                 }
   54220                                 DataType dt =
   54221                                     Dt_size_7_Decode((instr >> 10) & 0x3);
   54222                                 if (dt.Is(kDataTypeValueInvalid)) {
   54223                                   UnallocatedA32(instr);
   54224                                   return;
   54225                                 }
   54226                                 DecodeNeonAndAlign decode_neon =
   54227                                     Align_index_align_1_Decode((instr >> 4) &
   54228                                                                    0xf,
   54229                                                                dt);
   54230                                 if (!decode_neon.IsValid()) {
   54231                                   UnallocatedA32(instr);
   54232                                   return;
   54233                                 }
   54234                                 Alignment align = decode_neon.GetAlign();
   54235                                 int lane = decode_neon.GetLane();
   54236                                 SpacingType spacing = decode_neon.GetSpacing();
   54237                                 unsigned first =
   54238                                     ExtractDRegister(instr, 22, 12);
   54239                                 unsigned length = 1;
   54240                                 unsigned last = first + length - 1;
   54241                                 unsigned rn = (instr >> 16) & 0xf;
   54242                                 // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1 NOLINT(whitespace/line_length)
   54243                                 vld1(al,
   54244                                      dt,
   54245                                      NeonRegisterList(DRegister(first),
   54246                                                       DRegister(last),
   54247                                                       spacing,
   54248                                                       lane),
   54249                                      AlignedMemOperand(Register(rn),
   54250                                                        align,
   54251                                                        Offset));
   54252                                 break;
   54253                               }
   54254                             }
   54255                             break;
   54256                           }
   54257                           default: {
   54258                             if (((instr & 0xc00) == 0xc00) ||
   54259                                 ((instr & 0xd) == 0xd)) {
   54260                               UnallocatedA32(instr);
   54261                               return;
   54262                             }
   54263                             DataType dt = Dt_size_7_Decode((instr >> 10) & 0x3);
   54264                             if (dt.Is(kDataTypeValueInvalid)) {
   54265                               UnallocatedA32(instr);
   54266                               return;
   54267                             }
   54268                             DecodeNeonAndAlign decode_neon =
   54269                                 Align_index_align_1_Decode((instr >> 4) & 0xf,
   54270                                                            dt);
   54271                             if (!decode_neon.IsValid()) {
   54272                               UnallocatedA32(instr);
   54273                               return;
   54274                             }
   54275                             Alignment align = decode_neon.GetAlign();
   54276                             int lane = decode_neon.GetLane();
   54277                             SpacingType spacing = decode_neon.GetSpacing();
   54278                             unsigned first = ExtractDRegister(instr, 22, 12);
   54279                             unsigned length = 1;
   54280                             unsigned last = first + length - 1;
   54281                             unsigned rn = (instr >> 16) & 0xf;
   54282                             unsigned rm = instr & 0xf;
   54283                             // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
   54284                             vld1(al,
   54285                                  dt,
   54286                                  NeonRegisterList(DRegister(first),
   54287                                                   DRegister(last),
   54288                                                   spacing,
   54289                                                   lane),
   54290                                  AlignedMemOperand(Register(rn),
   54291                                                    align,
   54292                                                    Register(rm),
   54293                                                    PostIndex));
   54294                             break;
   54295                           }
   54296                         }
   54297                         break;
   54298                       }
   54299                     }
   54300                     break;
   54301                   }
   54302                   case 0x00000100: {
   54303                     // 0xf4a00100
   54304                     switch (instr & 0x00000c00) {
   54305                       case 0x00000c00: {
   54306                         // 0xf4a00d00
   54307                         switch (instr & 0x0000000d) {
   54308                           case 0x0000000d: {
   54309                             // 0xf4a00d0d
   54310                             switch (instr & 0x00000002) {
   54311                               case 0x00000000: {
   54312                                 // 0xf4a00d0d
   54313                                 DataType dt =
   54314                                     Dt_size_7_Decode((instr >> 6) & 0x3);
   54315                                 if (dt.Is(kDataTypeValueInvalid)) {
   54316                                   UnallocatedA32(instr);
   54317                                   return;
   54318                                 }
   54319                                 Alignment align =
   54320                                     Align_a_2_Decode((instr >> 4) & 0x1, dt);
   54321                                 if (dt.Is(kDataTypeValueInvalid) ||
   54322                                     align.Is(kBadAlignment)) {
   54323                                   UnallocatedA32(instr);
   54324                                   return;
   54325                                 }
   54326                                 unsigned first =
   54327                                     ExtractDRegister(instr, 22, 12);
   54328                                 unsigned length;
   54329                                 SpacingType spacing;
   54330                                 switch ((instr >> 5) & 0x1) {
   54331                                   default:
   54332                                     VIXL_UNREACHABLE_OR_FALLTHROUGH();
   54333                                   case 0x0:
   54334                                     length = 2;
   54335                                     spacing = kSingle;
   54336                                     break;
   54337                                   case 0x1:
   54338                                     length = 2;
   54339                                     spacing = kDouble;
   54340                                     break;
   54341                                 }
   54342                                 unsigned last =
   54343                                     first +
   54344                                     (length - 1) * (spacing == kSingle ? 1 : 2);
   54345                                 TransferType transfer = kAllLanes;
   54346                                 unsigned rn = (instr >> 16) & 0xf;
   54347                                 // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
   54348                                 vld2(al,
   54349                                      dt,
   54350                                      NeonRegisterList(DRegister(first),
   54351                                                       DRegister(last),
   54352                                                       spacing,
   54353                                                       transfer),
   54354                                      AlignedMemOperand(Register(rn),
   54355                                                        align,
   54356                                                        PostIndex));
   54357                                 break;
   54358                               }
   54359                               case 0x00000002: {
   54360                                 // 0xf4a00d0f
   54361                                 DataType dt =
   54362                                     Dt_size_7_Decode((instr >> 6) & 0x3);
   54363                                 if (dt.Is(kDataTypeValueInvalid)) {
   54364                                   UnallocatedA32(instr);
   54365                                   return;
   54366                                 }
   54367                                 Alignment align =
   54368                                     Align_a_2_Decode((instr >> 4) & 0x1, dt);
   54369                                 if (dt.Is(kDataTypeValueInvalid) ||
   54370                                     align.Is(kBadAlignment)) {
   54371                                   UnallocatedA32(instr);
   54372                                   return;
   54373                                 }
   54374                                 unsigned first =
   54375                                     ExtractDRegister(instr, 22, 12);
   54376                                 unsigned length;
   54377                                 SpacingType spacing;
   54378                                 switch ((instr >> 5) & 0x1) {
   54379                                   default:
   54380                                     VIXL_UNREACHABLE_OR_FALLTHROUGH();
   54381                                   case 0x0:
   54382                                     length = 2;
   54383                                     spacing = kSingle;
   54384                                     break;
   54385                                   case 0x1:
   54386                                     length = 2;
   54387                                     spacing = kDouble;
   54388                                     break;
   54389                                 }
   54390                                 unsigned last =
   54391                                     first +
   54392                                     (length - 1) * (spacing == kSingle ? 1 : 2);
   54393                                 TransferType transfer = kAllLanes;
   54394                                 unsigned rn = (instr >> 16) & 0xf;
   54395                                 // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1 NOLINT(whitespace/line_length)
   54396                                 vld2(al,
   54397                                      dt,
   54398                                      NeonRegisterList(DRegister(first),
   54399                                                       DRegister(last),
   54400                                                       spacing,
   54401                                                       transfer),
   54402                                      AlignedMemOperand(Register(rn),
   54403                                                        align,
   54404                                                        Offset));
   54405                                 break;
   54406                               }
   54407                             }
   54408                             break;
   54409                           }
   54410                           default: {
   54411                             if (((instr & 0xd) == 0xd)) {
   54412                               UnallocatedA32(instr);
   54413                               return;
   54414                             }
   54415                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
   54416                             if (dt.Is(kDataTypeValueInvalid)) {
   54417                               UnallocatedA32(instr);
   54418                               return;
   54419                             }
   54420                             Alignment align =
   54421                                 Align_a_2_Decode((instr >> 4) & 0x1, dt);
   54422                             if (dt.Is(kDataTypeValueInvalid) ||
   54423                                 align.Is(kBadAlignment)) {
   54424                               UnallocatedA32(instr);
   54425                               return;
   54426                             }
   54427                             unsigned first = ExtractDRegister(instr, 22, 12);
   54428                             unsigned length;
   54429                             SpacingType spacing;
   54430                             switch ((instr >> 5) & 0x1) {
   54431                               default:
   54432                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
   54433                               case 0x0:
   54434                                 length = 2;
   54435                                 spacing = kSingle;
   54436                                 break;
   54437                               case 0x1:
   54438                                 length = 2;
   54439                                 spacing = kDouble;
   54440                                 break;
   54441                             }
   54442                             unsigned last =
   54443                                 first +
   54444                                 (length - 1) * (spacing == kSingle ? 1 : 2);
   54445                             TransferType transfer = kAllLanes;
   54446                             unsigned rn = (instr >> 16) & 0xf;
   54447                             unsigned rm = instr & 0xf;
   54448                             // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
   54449                             vld2(al,
   54450                                  dt,
   54451                                  NeonRegisterList(DRegister(first),
   54452                                                   DRegister(last),
   54453                                                   spacing,
   54454                                                   transfer),
   54455                                  AlignedMemOperand(Register(rn),
   54456                                                    align,
   54457                                                    Register(rm),
   54458                                                    PostIndex));
   54459                             break;
   54460                           }
   54461                         }
   54462                         break;
   54463                       }
   54464                       default: {
   54465                         switch (instr & 0x0000000d) {
   54466                           case 0x0000000d: {
   54467                             // 0xf4a0010d
   54468                             switch (instr & 0x00000002) {
   54469                               case 0x00000000: {
   54470                                 // 0xf4a0010d
   54471                                 if (((instr & 0xc00) == 0xc00)) {
   54472                                   UnallocatedA32(instr);
   54473                                   return;
   54474                                 }
   54475                                 DataType dt =
   54476                                     Dt_size_7_Decode((instr >> 10) & 0x3);
   54477                                 if (dt.Is(kDataTypeValueInvalid)) {
   54478                                   UnallocatedA32(instr);
   54479                                   return;
   54480                                 }
   54481                                 DecodeNeonAndAlign decode_neon =
   54482                                     Align_index_align_2_Decode((instr >> 4) &
   54483                                                                    0xf,
   54484                                                                dt);
   54485                                 if (!decode_neon.IsValid()) {
   54486                                   UnallocatedA32(instr);
   54487                                   return;
   54488                                 }
   54489                                 Alignment align = decode_neon.GetAlign();
   54490                                 int lane = decode_neon.GetLane();
   54491                                 SpacingType spacing = decode_neon.GetSpacing();
   54492                                 unsigned first =
   54493                                     ExtractDRegister(instr, 22, 12);
   54494                                 unsigned length = 2;
   54495                                 unsigned last =
   54496                                     first +
   54497                                     (length - 1) * (spacing == kSingle ? 1 : 2);
   54498                                 unsigned rn = (instr >> 16) & 0xf;
   54499                                 // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
   54500                                 vld2(al,
   54501                                      dt,
   54502                                      NeonRegisterList(DRegister(first),
   54503                                                       DRegister(last),
   54504                                                       spacing,
   54505                                                       lane),
   54506                                      AlignedMemOperand(Register(rn),
   54507                                                        align,
   54508                                                        PostIndex));
   54509                                 break;
   54510                               }
   54511                               case 0x00000002: {
   54512                                 // 0xf4a0010f
   54513                                 if (((instr & 0xc00) == 0xc00)) {
   54514                                   UnallocatedA32(instr);
   54515                                   return;
   54516                                 }
   54517                                 DataType dt =
   54518                                     Dt_size_7_Decode((instr >> 10) & 0x3);
   54519                                 if (dt.Is(kDataTypeValueInvalid)) {
   54520                                   UnallocatedA32(instr);
   54521                                   return;
   54522                                 }
   54523                                 DecodeNeonAndAlign decode_neon =
   54524                                     Align_index_align_2_Decode((instr >> 4) &
   54525                                                                    0xf,
   54526                                                                dt);
   54527                                 if (!decode_neon.IsValid()) {
   54528                                   UnallocatedA32(instr);
   54529                                   return;
   54530                                 }
   54531                                 Alignment align = decode_neon.GetAlign();
   54532                                 int lane = decode_neon.GetLane();
   54533                                 SpacingType spacing = decode_neon.GetSpacing();
   54534                                 unsigned first =
   54535                                     ExtractDRegister(instr, 22, 12);
   54536                                 unsigned length = 2;
   54537                                 unsigned last =
   54538                                     first +
   54539                                     (length - 1) * (spacing == kSingle ? 1 : 2);
   54540                                 unsigned rn = (instr >> 16) & 0xf;
   54541                                 // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1 NOLINT(whitespace/line_length)
   54542                                 vld2(al,
   54543                                      dt,
   54544                                      NeonRegisterList(DRegister(first),
   54545                                                       DRegister(last),
   54546                                                       spacing,
   54547                                                       lane),
   54548                                      AlignedMemOperand(Register(rn),
   54549                                                        align,
   54550                                                        Offset));
   54551                                 break;
   54552                               }
   54553                             }
   54554                             break;
   54555                           }
   54556                           default: {
   54557                             if (((instr & 0xc00) == 0xc00) ||
   54558                                 ((instr & 0xd) == 0xd)) {
   54559                               UnallocatedA32(instr);
   54560                               return;
   54561                             }
   54562                             DataType dt = Dt_size_7_Decode((instr >> 10) & 0x3);
   54563                             if (dt.Is(kDataTypeValueInvalid)) {
   54564                               UnallocatedA32(instr);
   54565                               return;
   54566                             }
   54567                             DecodeNeonAndAlign decode_neon =
   54568                                 Align_index_align_2_Decode((instr >> 4) & 0xf,
   54569                                                            dt);
   54570                             if (!decode_neon.IsValid()) {
   54571                               UnallocatedA32(instr);
   54572                               return;
   54573                             }
   54574                             Alignment align = decode_neon.GetAlign();
   54575                             int lane = decode_neon.GetLane();
   54576                             SpacingType spacing = decode_neon.GetSpacing();
   54577                             unsigned first = ExtractDRegister(instr, 22, 12);
   54578                             unsigned length = 2;
   54579                             unsigned last =
   54580                                 first +
   54581                                 (length - 1) * (spacing == kSingle ? 1 : 2);
   54582                             unsigned rn = (instr >> 16) & 0xf;
   54583                             unsigned rm = instr & 0xf;
   54584                             // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
   54585                             vld2(al,
   54586                                  dt,
   54587                                  NeonRegisterList(DRegister(first),
   54588                                                   DRegister(last),
   54589                                                   spacing,
   54590                                                   lane),
   54591                                  AlignedMemOperand(Register(rn),
   54592                                                    align,
   54593                                                    Register(rm),
   54594                                                    PostIndex));
   54595                             break;
   54596                           }
   54597                         }
   54598                         break;
   54599                       }
   54600                     }
   54601                     break;
   54602                   }
   54603                   case 0x00000200: {
   54604                     // 0xf4a00200
   54605                     switch (instr & 0x00000c00) {
   54606                       case 0x00000c00: {
   54607                         // 0xf4a00e00
   54608                         switch (instr & 0x00000010) {
   54609                           case 0x00000000: {
   54610                             // 0xf4a00e00
   54611                             switch (instr & 0x0000000d) {
   54612                               case 0x0000000d: {
   54613                                 // 0xf4a00e0d
   54614                                 switch (instr & 0x00000002) {
   54615                                   case 0x00000000: {
   54616                                     // 0xf4a00e0d
   54617                                     DataType dt =
   54618                                         Dt_size_7_Decode((instr >> 6) & 0x3);
   54619                                     if (dt.Is(kDataTypeValueInvalid)) {
   54620                                       UnallocatedA32(instr);
   54621                                       return;
   54622                                     }
   54623                                     unsigned first =
   54624                                         ExtractDRegister(instr, 22, 12);
   54625                                     unsigned length;
   54626                                     SpacingType spacing;
   54627                                     switch ((instr >> 5) & 0x1) {
   54628                                       default:
   54629                                         VIXL_UNREACHABLE_OR_FALLTHROUGH();
   54630                                       case 0x0:
   54631                                         length = 3;
   54632                                         spacing = kSingle;
   54633                                         break;
   54634                                       case 0x1:
   54635                                         length = 3;
   54636                                         spacing = kDouble;
   54637                                         break;
   54638                                     }
   54639                                     unsigned last =
   54640                                         first +
   54641                                         (length - 1) *
   54642                                             (spacing == kSingle ? 1 : 2);
   54643                                     TransferType transfer = kAllLanes;
   54644                                     unsigned rn = (instr >> 16) & 0xf;
   54645                                     // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>]! ; A1
   54646                                     vld3(al,
   54647                                          dt,
   54648                                          NeonRegisterList(DRegister(first),
   54649                                                           DRegister(last),
   54650                                                           spacing,
   54651                                                           transfer),
   54652                                          MemOperand(Register(rn), PreIndex));
   54653                                     break;
   54654                                   }
   54655                                   case 0x00000002: {
   54656                                     // 0xf4a00e0f
   54657                                     DataType dt =
   54658                                         Dt_size_7_Decode((instr >> 6) & 0x3);
   54659                                     if (dt.Is(kDataTypeValueInvalid)) {
   54660                                       UnallocatedA32(instr);
   54661                                       return;
   54662                                     }
   54663                                     unsigned first =
   54664                                         ExtractDRegister(instr, 22, 12);
   54665                                     unsigned length;
   54666                                     SpacingType spacing;
   54667                                     switch ((instr >> 5) & 0x1) {
   54668                                       default:
   54669                                         VIXL_UNREACHABLE_OR_FALLTHROUGH();
   54670                                       case 0x0:
   54671                                         length = 3;
   54672                                         spacing = kSingle;
   54673                                         break;
   54674                                       case 0x1:
   54675                                         length = 3;
   54676                                         spacing = kDouble;
   54677                                         break;
   54678                                     }
   54679                                     unsigned last =
   54680                                         first +
   54681                                         (length - 1) *
   54682                                             (spacing == kSingle ? 1 : 2);
   54683                                     TransferType transfer = kAllLanes;
   54684                                     unsigned rn = (instr >> 16) & 0xf;
   54685                                     // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>] ; A1
   54686                                     vld3(al,
   54687                                          dt,
   54688                                          NeonRegisterList(DRegister(first),
   54689                                                           DRegister(last),
   54690                                                           spacing,
   54691                                                           transfer),
   54692                                          MemOperand(Register(rn), Offset));
   54693                                     break;
   54694                                   }
   54695                                 }
   54696                                 break;
   54697                               }
   54698                               default: {
   54699                                 if (((instr & 0xd) == 0xd)) {
   54700                                   UnallocatedA32(instr);
   54701                                   return;
   54702                                 }
   54703                                 DataType dt =
   54704                                     Dt_size_7_Decode((instr >> 6) & 0x3);
   54705                                 if (dt.Is(kDataTypeValueInvalid)) {
   54706                                   UnallocatedA32(instr);
   54707                                   return;
   54708                                 }
   54709                                 unsigned first =
   54710                                     ExtractDRegister(instr, 22, 12);
   54711                                 unsigned length;
   54712                                 SpacingType spacing;
   54713                                 switch ((instr >> 5) & 0x1) {
   54714                                   default:
   54715                                     VIXL_UNREACHABLE_OR_FALLTHROUGH();
   54716                                   case 0x0:
   54717                                     length = 3;
   54718                                     spacing = kSingle;
   54719                                     break;
   54720                                   case 0x1:
   54721                                     length = 3;
   54722                                     spacing = kDouble;
   54723                                     break;
   54724                                 }
   54725                                 unsigned last =
   54726                                     first +
   54727                                     (length - 1) * (spacing == kSingle ? 1 : 2);
   54728                                 TransferType transfer = kAllLanes;
   54729                                 unsigned rn = (instr >> 16) & 0xf;
   54730                                 Sign sign(plus);
   54731                                 unsigned rm = instr & 0xf;
   54732                                 // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>], #<Rm> ; A1 NOLINT(whitespace/line_length)
   54733                                 vld3(al,
   54734                                      dt,
   54735                                      NeonRegisterList(DRegister(first),
   54736                                                       DRegister(last),
   54737                                                       spacing,
   54738                                                       transfer),
   54739                                      MemOperand(Register(rn),
   54740                                                 sign,
   54741                                                 Register(rm),
   54742                                                 PostIndex));
   54743                                 break;
   54744                               }
   54745                             }
   54746                             break;
   54747                           }
   54748                           default:
   54749                             UnallocatedA32(instr);
   54750                             break;
   54751                         }
   54752                         break;
   54753                       }
   54754                       default: {
   54755                         switch (instr & 0x0000000d) {
   54756                           case 0x0000000d: {
   54757                             // 0xf4a0020d
   54758                             switch (instr & 0x00000002) {
   54759                               case 0x00000000: {
   54760                                 // 0xf4a0020d
   54761                                 if (((instr & 0xc00) == 0xc00)) {
   54762                                   UnallocatedA32(instr);
   54763                                   return;
   54764                                 }
   54765                                 DataType dt =
   54766                                     Dt_size_7_Decode((instr >> 10) & 0x3);
   54767                                 if (dt.Is(kDataTypeValueInvalid)) {
   54768                                   UnallocatedA32(instr);
   54769                                   return;
   54770                                 }
   54771                                 DecodeNeon decode_neon =
   54772                                     Index_1_Decode((instr >> 4) & 0xf, dt);
   54773                                 if (!decode_neon.IsValid()) {
   54774                                   UnallocatedA32(instr);
   54775                                   return;
   54776                                 }
   54777                                 int lane = decode_neon.GetLane();
   54778                                 SpacingType spacing = decode_neon.GetSpacing();
   54779                                 unsigned first =
   54780                                     ExtractDRegister(instr, 22, 12);
   54781                                 unsigned length = 3;
   54782                                 unsigned last =
   54783                                     first +
   54784                                     (length - 1) * (spacing == kSingle ? 1 : 2);
   54785                                 unsigned rn = (instr >> 16) & 0xf;
   54786                                 // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>]! ; A1
   54787                                 vld3(al,
   54788                                      dt,
   54789                                      NeonRegisterList(DRegister(first),
   54790                                                       DRegister(last),
   54791                                                       spacing,
   54792                                                       lane),
   54793                                      MemOperand(Register(rn), PreIndex));
   54794                                 break;
   54795                               }
   54796                               case 0x00000002: {
   54797                                 // 0xf4a0020f
   54798                                 if (((instr & 0xc00) == 0xc00)) {
   54799                                   UnallocatedA32(instr);
   54800                                   return;
   54801                                 }
   54802                                 DataType dt =
   54803                                     Dt_size_7_Decode((instr >> 10) & 0x3);
   54804                                 if (dt.Is(kDataTypeValueInvalid)) {
   54805                                   UnallocatedA32(instr);
   54806                                   return;
   54807                                 }
   54808                                 DecodeNeon decode_neon =
   54809                                     Index_1_Decode((instr >> 4) & 0xf, dt);
   54810                                 if (!decode_neon.IsValid()) {
   54811                                   UnallocatedA32(instr);
   54812                                   return;
   54813                                 }
   54814                                 int lane = decode_neon.GetLane();
   54815                                 SpacingType spacing = decode_neon.GetSpacing();
   54816                                 unsigned first =
   54817                                     ExtractDRegister(instr, 22, 12);
   54818                                 unsigned length = 3;
   54819                                 unsigned last =
   54820                                     first +
   54821                                     (length - 1) * (spacing == kSingle ? 1 : 2);
   54822                                 unsigned rn = (instr >> 16) & 0xf;
   54823                                 // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>] ; A1
   54824                                 vld3(al,
   54825                                      dt,
   54826                                      NeonRegisterList(DRegister(first),
   54827                                                       DRegister(last),
   54828                                                       spacing,
   54829                                                       lane),
   54830                                      MemOperand(Register(rn), Offset));
   54831                                 break;
   54832                               }
   54833                             }
   54834                             break;
   54835                           }
   54836                           default: {
   54837                             if (((instr & 0xc00) == 0xc00) ||
   54838                                 ((instr & 0xd) == 0xd)) {
   54839                               UnallocatedA32(instr);
   54840                               return;
   54841                             }
   54842                             DataType dt = Dt_size_7_Decode((instr >> 10) & 0x3);
   54843                             if (dt.Is(kDataTypeValueInvalid)) {
   54844                               UnallocatedA32(instr);
   54845                               return;
   54846                             }
   54847                             DecodeNeon decode_neon =
   54848                                 Index_1_Decode((instr >> 4) & 0xf, dt);
   54849                             if (!decode_neon.IsValid()) {
   54850                               UnallocatedA32(instr);
   54851                               return;
   54852                             }
   54853                             int lane = decode_neon.GetLane();
   54854                             SpacingType spacing = decode_neon.GetSpacing();
   54855                             unsigned first = ExtractDRegister(instr, 22, 12);
   54856                             unsigned length = 3;
   54857                             unsigned last =
   54858                                 first +
   54859                                 (length - 1) * (spacing == kSingle ? 1 : 2);
   54860                             unsigned rn = (instr >> 16) & 0xf;
   54861                             Sign sign(plus);
   54862                             unsigned rm = instr & 0xf;
   54863                             // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>], #<Rm> ; A1
   54864                             vld3(al,
   54865                                  dt,
   54866                                  NeonRegisterList(DRegister(first),
   54867                                                   DRegister(last),
   54868                                                   spacing,
   54869                                                   lane),
   54870                                  MemOperand(Register(rn),
   54871                                             sign,
   54872                                             Register(rm),
   54873                                             PostIndex));
   54874                             break;
   54875                           }
   54876                         }
   54877                         break;
   54878                       }
   54879                     }
   54880                     break;
   54881                   }
   54882                   case 0x00000300: {
   54883                     // 0xf4a00300
   54884                     switch (instr & 0x00000c00) {
   54885                       case 0x00000c00: {
   54886                         // 0xf4a00f00
   54887                         switch (instr & 0x0000000d) {
   54888                           case 0x0000000d: {
   54889                             // 0xf4a00f0d
   54890                             switch (instr & 0x00000002) {
   54891                               case 0x00000000: {
   54892                                 // 0xf4a00f0d
   54893                                 DataType dt =
   54894                                     Dt_size_8_Decode((instr >> 6) & 0x3);
   54895                                 if (dt.Is(kDataTypeValueInvalid)) {
   54896                                   UnallocatedA32(instr);
   54897                                   return;
   54898                                 }
   54899                                 Alignment align =
   54900                                     Align_a_3_Decode((instr >> 4) & 0x1,
   54901                                                      dt,
   54902                                                      (instr >> 6) & 0x3);
   54903                                 if (dt.Is(kDataTypeValueInvalid) ||
   54904                                     align.Is(kBadAlignment)) {
   54905                                   UnallocatedA32(instr);
   54906                                   return;
   54907                                 }
   54908                                 unsigned first =
   54909                                     ExtractDRegister(instr, 22, 12);
   54910                                 unsigned length;
   54911                                 SpacingType spacing;
   54912                                 switch ((instr >> 5) & 0x1) {
   54913                                   default:
   54914                                     VIXL_UNREACHABLE_OR_FALLTHROUGH();
   54915                                   case 0x0:
   54916                                     length = 4;
   54917                                     spacing = kSingle;
   54918                                     break;
   54919                                   case 0x1:
   54920                                     length = 4;
   54921                                     spacing = kDouble;
   54922                                     break;
   54923                                 }
   54924                                 unsigned last =
   54925                                     first +
   54926                                     (length - 1) * (spacing == kSingle ? 1 : 2);
   54927                                 TransferType transfer = kAllLanes;
   54928                                 unsigned rn = (instr >> 16) & 0xf;
   54929                                 // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
   54930                                 vld4(al,
   54931                                      dt,
   54932                                      NeonRegisterList(DRegister(first),
   54933                                                       DRegister(last),
   54934                                                       spacing,
   54935                                                       transfer),
   54936                                      AlignedMemOperand(Register(rn),
   54937                                                        align,
   54938                                                        PostIndex));
   54939                                 break;
   54940                               }
   54941                               case 0x00000002: {
   54942                                 // 0xf4a00f0f
   54943                                 DataType dt =
   54944                                     Dt_size_8_Decode((instr >> 6) & 0x3);
   54945                                 if (dt.Is(kDataTypeValueInvalid)) {
   54946                                   UnallocatedA32(instr);
   54947                                   return;
   54948                                 }
   54949                                 Alignment align =
   54950                                     Align_a_3_Decode((instr >> 4) & 0x1,
   54951                                                      dt,
   54952                                                      (instr >> 6) & 0x3);
   54953                                 if (dt.Is(kDataTypeValueInvalid) ||
   54954                                     align.Is(kBadAlignment)) {
   54955                                   UnallocatedA32(instr);
   54956                                   return;
   54957                                 }
   54958                                 unsigned first =
   54959                                     ExtractDRegister(instr, 22, 12);
   54960                                 unsigned length;
   54961                                 SpacingType spacing;
   54962                                 switch ((instr >> 5) & 0x1) {
   54963                                   default:
   54964                                     VIXL_UNREACHABLE_OR_FALLTHROUGH();
   54965                                   case 0x0:
   54966                                     length = 4;
   54967                                     spacing = kSingle;
   54968                                     break;
   54969                                   case 0x1:
   54970                                     length = 4;
   54971                                     spacing = kDouble;
   54972                                     break;
   54973                                 }
   54974                                 unsigned last =
   54975                                     first +
   54976                                     (length - 1) * (spacing == kSingle ? 1 : 2);
   54977                                 TransferType transfer = kAllLanes;
   54978                                 unsigned rn = (instr >> 16) & 0xf;
   54979                                 // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1 NOLINT(whitespace/line_length)
   54980                                 vld4(al,
   54981                                      dt,
   54982                                      NeonRegisterList(DRegister(first),
   54983                                                       DRegister(last),
   54984                                                       spacing,
   54985                                                       transfer),
   54986                                      AlignedMemOperand(Register(rn),
   54987                                                        align,
   54988                                                        Offset));
   54989                                 break;
   54990                               }
   54991                             }
   54992                             break;
   54993                           }
   54994                           default: {
   54995                             if (((instr & 0xd) == 0xd)) {
   54996                               UnallocatedA32(instr);
   54997                               return;
   54998                             }
   54999                             DataType dt = Dt_size_8_Decode((instr >> 6) & 0x3);
   55000                             if (dt.Is(kDataTypeValueInvalid)) {
   55001                               UnallocatedA32(instr);
   55002                               return;
   55003                             }
   55004                             Alignment align =
   55005                                 Align_a_3_Decode((instr >> 4) & 0x1,
   55006                                                  dt,
   55007                                                  (instr >> 6) & 0x3);
   55008                             if (dt.Is(kDataTypeValueInvalid) ||
   55009                                 align.Is(kBadAlignment)) {
   55010                               UnallocatedA32(instr);
   55011                               return;
   55012                             }
   55013                             unsigned first = ExtractDRegister(instr, 22, 12);
   55014                             unsigned length;
   55015                             SpacingType spacing;
   55016                             switch ((instr >> 5) & 0x1) {
   55017                               default:
   55018                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
   55019                               case 0x0:
   55020                                 length = 4;
   55021                                 spacing = kSingle;
   55022                                 break;
   55023                               case 0x1:
   55024                                 length = 4;
   55025                                 spacing = kDouble;
   55026                                 break;
   55027                             }
   55028                             unsigned last =
   55029                                 first +
   55030                                 (length - 1) * (spacing == kSingle ? 1 : 2);
   55031                             TransferType transfer = kAllLanes;
   55032                             unsigned rn = (instr >> 16) & 0xf;
   55033                             unsigned rm = instr & 0xf;
   55034                             // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
   55035                             vld4(al,
   55036                                  dt,
   55037                                  NeonRegisterList(DRegister(first),
   55038                                                   DRegister(last),
   55039                                                   spacing,
   55040                                                   transfer),
   55041                                  AlignedMemOperand(Register(rn),
   55042                                                    align,
   55043                                                    Register(rm),
   55044                                                    PostIndex));
   55045                             break;
   55046                           }
   55047                         }
   55048                         break;
   55049                       }
   55050                       default: {
   55051                         switch (instr & 0x0000000d) {
   55052                           case 0x0000000d: {
   55053                             // 0xf4a0030d
   55054                             switch (instr & 0x00000002) {
   55055                               case 0x00000000: {
   55056                                 // 0xf4a0030d
   55057                                 if (((instr & 0xc00) == 0xc00)) {
   55058                                   UnallocatedA32(instr);
   55059                                   return;
   55060                                 }
   55061                                 DataType dt =
   55062                                     Dt_size_7_Decode((instr >> 10) & 0x3);
   55063                                 if (dt.Is(kDataTypeValueInvalid)) {
   55064                                   UnallocatedA32(instr);
   55065                                   return;
   55066                                 }
   55067                                 DecodeNeonAndAlign decode_neon =
   55068                                     Align_index_align_3_Decode((instr >> 4) &
   55069                                                                    0xf,
   55070                                                                dt);
   55071                                 if (!decode_neon.IsValid()) {
   55072                                   UnallocatedA32(instr);
   55073                                   return;
   55074                                 }
   55075                                 Alignment align = decode_neon.GetAlign();
   55076                                 int lane = decode_neon.GetLane();
   55077                                 SpacingType spacing = decode_neon.GetSpacing();
   55078                                 unsigned first =
   55079                                     ExtractDRegister(instr, 22, 12);
   55080                                 unsigned length = 4;
   55081                                 unsigned last =
   55082                                     first +
   55083                                     (length - 1) * (spacing == kSingle ? 1 : 2);
   55084                                 unsigned rn = (instr >> 16) & 0xf;
   55085                                 // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
   55086                                 vld4(al,
   55087                                      dt,
   55088                                      NeonRegisterList(DRegister(first),
   55089                                                       DRegister(last),
   55090                                                       spacing,
   55091                                                       lane),
   55092                                      AlignedMemOperand(Register(rn),
   55093                                                        align,
   55094                                                        PostIndex));
   55095                                 break;
   55096                               }
   55097                               case 0x00000002: {
   55098                                 // 0xf4a0030f
   55099                                 if (((instr & 0xc00) == 0xc00)) {
   55100                                   UnallocatedA32(instr);
   55101                                   return;
   55102                                 }
   55103                                 DataType dt =
   55104                                     Dt_size_7_Decode((instr >> 10) & 0x3);
   55105                                 if (dt.Is(kDataTypeValueInvalid)) {
   55106                                   UnallocatedA32(instr);
   55107                                   return;
   55108                                 }
   55109                                 DecodeNeonAndAlign decode_neon =
   55110                                     Align_index_align_3_Decode((instr >> 4) &
   55111                                                                    0xf,
   55112                                                                dt);
   55113                                 if (!decode_neon.IsValid()) {
   55114                                   UnallocatedA32(instr);
   55115                                   return;
   55116                                 }
   55117                                 Alignment align = decode_neon.GetAlign();
   55118                                 int lane = decode_neon.GetLane();
   55119                                 SpacingType spacing = decode_neon.GetSpacing();
   55120                                 unsigned first =
   55121                                     ExtractDRegister(instr, 22, 12);
   55122                                 unsigned length = 4;
   55123                                 unsigned last =
   55124                                     first +
   55125                                     (length - 1) * (spacing == kSingle ? 1 : 2);
   55126                                 unsigned rn = (instr >> 16) & 0xf;
   55127                                 // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1 NOLINT(whitespace/line_length)
   55128                                 vld4(al,
   55129                                      dt,
   55130                                      NeonRegisterList(DRegister(first),
   55131                                                       DRegister(last),
   55132                                                       spacing,
   55133                                                       lane),
   55134                                      AlignedMemOperand(Register(rn),
   55135                                                        align,
   55136                                                        Offset));
   55137                                 break;
   55138                               }
   55139                             }
   55140                             break;
   55141                           }
   55142                           default: {
   55143                             if (((instr & 0xc00) == 0xc00) ||
   55144                                 ((instr & 0xd) == 0xd)) {
   55145                               UnallocatedA32(instr);
   55146                               return;
   55147                             }
   55148                             DataType dt = Dt_size_7_Decode((instr >> 10) & 0x3);
   55149                             if (dt.Is(kDataTypeValueInvalid)) {
   55150                               UnallocatedA32(instr);
   55151                               return;
   55152                             }
   55153                             DecodeNeonAndAlign decode_neon =
   55154                                 Align_index_align_3_Decode((instr >> 4) & 0xf,
   55155                                                            dt);
   55156                             if (!decode_neon.IsValid()) {
   55157                               UnallocatedA32(instr);
   55158                               return;
   55159                             }
   55160                             Alignment align = decode_neon.GetAlign();
   55161                             int lane = decode_neon.GetLane();
   55162                             SpacingType spacing = decode_neon.GetSpacing();
   55163                             unsigned first = ExtractDRegister(instr, 22, 12);
   55164                             unsigned length = 4;
   55165                             unsigned last =
   55166                                 first +
   55167                                 (length - 1) * (spacing == kSingle ? 1 : 2);
   55168                             unsigned rn = (instr >> 16) & 0xf;
   55169                             unsigned rm = instr & 0xf;
   55170                             // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
   55171                             vld4(al,
   55172                                  dt,
   55173                                  NeonRegisterList(DRegister(first),
   55174                                                   DRegister(last),
   55175                                                   spacing,
   55176                                                   lane),
   55177                                  AlignedMemOperand(Register(rn),
   55178                                                    align,
   55179                                                    Register(rm),
   55180                                                    PostIndex));
   55181                             break;
   55182                           }
   55183                         }
   55184                         break;
   55185                       }
   55186                     }
   55187                     break;
   55188                   }
   55189                 }
   55190                 break;
   55191               }
   55192             }
   55193             break;
   55194           }
   55195           case 0x01100000: {
   55196             // 0xf5100000
   55197             switch (instr & 0x000f0000) {
   55198               case 0x000f0000: {
   55199                 // 0xf51f0000
   55200                 uint32_t U = (instr >> 23) & 0x1;
   55201                 int32_t imm = instr & 0xfff;
   55202                 if (U == 0) imm = -imm;
   55203                 bool minus_zero = (imm == 0) && (U == 0);
   55204                 Label label(imm, kA32PcDelta, minus_zero);
   55205                 // PLD{<c>}{<q>} <label> ; A1
   55206                 pld(al, &label);
   55207                 if (((instr & 0xff7ff000) != 0xf55ff000)) {
   55208                   UnpredictableA32(instr);
   55209                 }
   55210                 break;
   55211               }
   55212               default: {
   55213                 switch (instr & 0x00400000) {
   55214                   case 0x00000000: {
   55215                     // 0xf5100000
   55216                     if (((instr & 0xf0000) == 0xf0000)) {
   55217                       UnallocatedA32(instr);
   55218                       return;
   55219                     }
   55220                     unsigned rn = (instr >> 16) & 0xf;
   55221                     Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
   55222                     int32_t offset = instr & 0xfff;
   55223                     // PLDW{<c>}{<q>} [<Rn>{, #{+/-}<imm_2>}] ; A1
   55224                     pldw(al, MemOperand(Register(rn), sign, offset, Offset));
   55225                     if (((instr & 0xff70f000) != 0xf510f000)) {
   55226                       UnpredictableA32(instr);
   55227                     }
   55228                     break;
   55229                   }
   55230                   case 0x00400000: {
   55231                     // 0xf5500000
   55232                     if (((instr & 0xf0000) == 0xf0000)) {
   55233                       UnallocatedA32(instr);
   55234                       return;
   55235                     }
   55236                     unsigned rn = (instr >> 16) & 0xf;
   55237                     Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
   55238                     int32_t offset = instr & 0xfff;
   55239                     // PLD{<c>}{<q>} [<Rn>{, #{+/-}<imm_2>}] ; A1
   55240                     pld(al, MemOperand(Register(rn), sign, offset, Offset));
   55241                     if (((instr & 0xff70f000) != 0xf550f000)) {
   55242                       UnpredictableA32(instr);
   55243                     }
   55244                     break;
   55245                   }
   55246                 }
   55247                 break;
   55248               }
   55249             }
   55250             break;
   55251           }
   55252           case 0x01300000: {
   55253             // 0xf5300000
   55254             switch (instr & 0x00c000f0) {
   55255               case 0x00400010: {
   55256                 // 0xf5700010
   55257                 // CLREX{<c>}{<q>} ; A1
   55258                 clrex(al);
   55259                 if (((instr & 0xffffffff) != 0xf57ff01f)) {
   55260                   UnpredictableA32(instr);
   55261                 }
   55262                 break;
   55263               }
   55264               case 0x00400040: {
   55265                 // 0xf5700040
   55266                 MemoryBarrier option(instr & 0xf);
   55267                 // DSB{<c>}{<q>} {<option>} ; A1
   55268                 dsb(al, option);
   55269                 if (((instr & 0xfffffff0) != 0xf57ff040)) {
   55270                   UnpredictableA32(instr);
   55271                 }
   55272                 break;
   55273               }
   55274               case 0x00400050: {
   55275                 // 0xf5700050
   55276                 MemoryBarrier option(instr & 0xf);
   55277                 // DMB{<c>}{<q>} {<option>} ; A1
   55278                 dmb(al, option);
   55279                 if (((instr & 0xfffffff0) != 0xf57ff050)) {
   55280                   UnpredictableA32(instr);
   55281                 }
   55282                 break;
   55283               }
   55284               case 0x00400060: {
   55285                 // 0xf5700060
   55286                 MemoryBarrier option(instr & 0xf);
   55287                 // ISB{<c>}{<q>} {<option>} ; A1
   55288                 isb(al, option);
   55289                 if (((instr & 0xfffffff0) != 0xf57ff060)) {
   55290                   UnpredictableA32(instr);
   55291                 }
   55292                 break;
   55293               }
   55294               default:
   55295                 UnallocatedA32(instr);
   55296                 break;
   55297             }
   55298             break;
   55299           }
   55300           default:
   55301             UnallocatedA32(instr);
   55302             break;
   55303         }
   55304         break;
   55305       }
   55306       case 0x06000000: {
   55307         // 0xf6000000
   55308         switch (instr & 0x01700010) {
   55309           case 0x00500000: {
   55310             // 0xf6500000
   55311             switch (instr & 0x00000fe0) {
   55312               case 0x00000060: {
   55313                 // 0xf6500060
   55314                 unsigned rn = (instr >> 16) & 0xf;
   55315                 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
   55316                 unsigned rm = instr & 0xf;
   55317                 Shift shift = RRX;
   55318                 uint32_t amount = 0;
   55319                 AddrMode addrmode = Offset;
   55320                 // PLI{<c>}{<q>} [<Rn>, {+/-}<Rm>, RRX] ; A1
   55321                 pli(al,
   55322                     MemOperand(Register(rn),
   55323                                sign,
   55324                                Register(rm),
   55325                                shift,
   55326                                amount,
   55327                                addrmode));
   55328                 if (((instr & 0xff70fff0) != 0xf650f060)) {
   55329                   UnpredictableA32(instr);
   55330                 }
   55331                 break;
   55332               }
   55333               default: {
   55334                 if (((instr & 0xfe0) == 0x60)) {
   55335                   UnallocatedA32(instr);
   55336                   return;
   55337                 }
   55338                 unsigned rn = (instr >> 16) & 0xf;
   55339                 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
   55340                 unsigned rm = instr & 0xf;
   55341                 ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
   55342                                                     (instr >> 7) & 0x1f);
   55343                 Shift shift = shift_operand.GetShift();
   55344                 uint32_t amount = shift_operand.GetAmount();
   55345                 AddrMode addrmode = Offset;
   55346                 // PLI{<c>}{<q>} [<Rn>, {+/-}<Rm>{, <shift> #<amount_1>}] ; A1
   55347                 pli(al,
   55348                     MemOperand(Register(rn),
   55349                                sign,
   55350                                Register(rm),
   55351                                shift,
   55352                                amount,
   55353                                addrmode));
   55354                 if (((instr & 0xff70f010) != 0xf650f000)) {
   55355                   UnpredictableA32(instr);
   55356                 }
   55357                 break;
   55358               }
   55359             }
   55360             break;
   55361           }
   55362           case 0x01100000: {
   55363             // 0xf7100000
   55364             switch (instr & 0x00000fe0) {
   55365               case 0x00000060: {
   55366                 // 0xf7100060
   55367                 unsigned rn = (instr >> 16) & 0xf;
   55368                 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
   55369                 unsigned rm = instr & 0xf;
   55370                 Shift shift = RRX;
   55371                 uint32_t amount = 0;
   55372                 AddrMode addrmode = Offset;
   55373                 // PLDW{<c>}{<q>} [<Rn>, {+/-}<Rm>, RRX] ; A1
   55374                 pldw(al,
   55375                      MemOperand(Register(rn),
   55376                                 sign,
   55377                                 Register(rm),
   55378                                 shift,
   55379                                 amount,
   55380                                 addrmode));
   55381                 if (((instr & 0xff70fff0) != 0xf710f060)) {
   55382                   UnpredictableA32(instr);
   55383                 }
   55384                 break;
   55385               }
   55386               default: {
   55387                 if (((instr & 0xfe0) == 0x60)) {
   55388                   UnallocatedA32(instr);
   55389                   return;
   55390                 }
   55391                 unsigned rn = (instr >> 16) & 0xf;
   55392                 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
   55393                 unsigned rm = instr & 0xf;
   55394                 ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
   55395                                                     (instr >> 7) & 0x1f);
   55396                 Shift shift = shift_operand.GetShift();
   55397                 uint32_t amount = shift_operand.GetAmount();
   55398                 AddrMode addrmode = Offset;
   55399                 // PLDW{<c>}{<q>} [<Rn>, {+/-}<Rm>{, <shift> #<amount_1>}] ; A1
   55400                 pldw(al,
   55401                      MemOperand(Register(rn),
   55402                                 sign,
   55403                                 Register(rm),
   55404                                 shift,
   55405                                 amount,
   55406                                 addrmode));
   55407                 if (((instr & 0xff70f010) != 0xf710f000)) {
   55408                   UnpredictableA32(instr);
   55409                 }
   55410                 break;
   55411               }
   55412             }
   55413             break;
   55414           }
   55415           case 0x01500000: {
   55416             // 0xf7500000
   55417             switch (instr & 0x00000fe0) {
   55418               case 0x00000060: {
   55419                 // 0xf7500060
   55420                 unsigned rn = (instr >> 16) & 0xf;
   55421                 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
   55422                 unsigned rm = instr & 0xf;
   55423                 Shift shift = RRX;
   55424                 uint32_t amount = 0;
   55425                 AddrMode addrmode = Offset;
   55426                 // PLD{<c>}{<q>} [<Rn>, {+/-}<Rm>, RRX] ; A1
   55427                 pld(al,
   55428                     MemOperand(Register(rn),
   55429                                sign,
   55430                                Register(rm),
   55431                                shift,
   55432                                amount,
   55433                                addrmode));
   55434                 if (((instr & 0xff70fff0) != 0xf750f060)) {
   55435                   UnpredictableA32(instr);
   55436                 }
   55437                 break;
   55438               }
   55439               default: {
   55440                 if (((instr & 0xfe0) == 0x60)) {
   55441                   UnallocatedA32(instr);
   55442                   return;
   55443                 }
   55444                 unsigned rn = (instr >> 16) & 0xf;
   55445                 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
   55446                 unsigned rm = instr & 0xf;
   55447                 ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
   55448                                                     (instr >> 7) & 0x1f);
   55449                 Shift shift = shift_operand.GetShift();
   55450                 uint32_t amount = shift_operand.GetAmount();
   55451                 AddrMode addrmode = Offset;
   55452                 // PLD{<c>}{<q>} [<Rn>, {+/-}<Rm>{, <shift> #<amount_1>}] ; A1
   55453                 pld(al,
   55454                     MemOperand(Register(rn),
   55455                                sign,
   55456                                Register(rm),
   55457                                shift,
   55458                                amount,
   55459                                addrmode));
   55460                 if (((instr & 0xff70f010) != 0xf750f000)) {
   55461                   UnpredictableA32(instr);
   55462                 }
   55463                 break;
   55464               }
   55465             }
   55466             break;
   55467           }
   55468           default:
   55469             UnallocatedA32(instr);
   55470             break;
   55471         }
   55472         break;
   55473       }
   55474       case 0x08000000: {
   55475         // 0xf8000000
   55476         switch (instr & 0x01d00000) {
   55477           case 0x00100000: {
   55478             // 0xf8100000
   55479             UnimplementedA32("RFEDA", instr);
   55480             break;
   55481           }
   55482           case 0x00400000: {
   55483             // 0xf8400000
   55484             UnimplementedA32("SRSDA", instr);
   55485             break;
   55486           }
   55487           case 0x00900000: {
   55488             // 0xf8900000
   55489             UnimplementedA32("RFE{IA}", instr);
   55490             break;
   55491           }
   55492           case 0x00c00000: {
   55493             // 0xf8c00000
   55494             UnimplementedA32("SRS{IA}", instr);
   55495             break;
   55496           }
   55497           case 0x01100000: {
   55498             // 0xf9100000
   55499             UnimplementedA32("RFEDB", instr);
   55500             break;
   55501           }
   55502           case 0x01400000: {
   55503             // 0xf9400000
   55504             UnimplementedA32("SRSDB", instr);
   55505             break;
   55506           }
   55507           case 0x01900000: {
   55508             // 0xf9900000
   55509             UnimplementedA32("RFEIB", instr);
   55510             break;
   55511           }
   55512           case 0x01c00000: {
   55513             // 0xf9c00000
   55514             UnimplementedA32("SRSIB", instr);
   55515             break;
   55516           }
   55517           default:
   55518             UnallocatedA32(instr);
   55519             break;
   55520         }
   55521         break;
   55522       }
   55523       case 0x0a000000: {
   55524         // 0xfa000000
   55525         int32_t imm = SignExtend<int32_t>(((instr >> 24) & 0x1) |
   55526                                               ((instr << 1) & 0x1fffffe),
   55527                                           25)
   55528                       << 1;
   55529         Label label(imm, kA32PcDelta);
   55530         // BLX{<c>}{<q>} <label> ; A2
   55531         blx(al, &label);
   55532         break;
   55533       }
   55534       case 0x0c000000: {
   55535         // 0xfc000000
   55536         switch (instr & 0x01300000) {
   55537           case 0x00000000: {
   55538             // 0xfc000000
   55539             switch (instr & 0x00800000) {
   55540               case 0x00000000: {
   55541                 // 0xfc000000
   55542                 if ((instr & 0x00400000) == 0x00400000) {
   55543                   if (((instr & 0xe00) == 0xa00)) {
   55544                     UnallocatedA32(instr);
   55545                     return;
   55546                   }
   55547                   UnimplementedA32("MCRR2", instr);
   55548                 } else {
   55549                   UnallocatedA32(instr);
   55550                 }
   55551                 break;
   55552               }
   55553               case 0x00800000: {
   55554                 // 0xfc800000
   55555                 if (((instr & 0xe00) == 0xa00)) {
   55556                   UnallocatedA32(instr);
   55557                   return;
   55558                 }
   55559                 UnimplementedA32("STC2", instr);
   55560                 break;
   55561               }
   55562             }
   55563             break;
   55564           }
   55565           case 0x00100000: {
   55566             // 0xfc100000
   55567             switch (instr & 0x00800000) {
   55568               case 0x00000000: {
   55569                 // 0xfc100000
   55570                 if ((instr & 0x00400000) == 0x00400000) {
   55571                   if (((instr & 0xe00) == 0xa00)) {
   55572                     UnallocatedA32(instr);
   55573                     return;
   55574                   }
   55575                   UnimplementedA32("MRRC2", instr);
   55576                 } else {
   55577                   UnallocatedA32(instr);
   55578                 }
   55579                 break;
   55580               }
   55581               case 0x00800000: {
   55582                 // 0xfc900000
   55583                 switch (instr & 0x00000e00) {
   55584                   case 0x00000a00: {
   55585                     // 0xfc900a00
   55586                     UnallocatedA32(instr);
   55587                     break;
   55588                   }
   55589                   default: {
   55590                     switch (instr & 0x000f0000) {
   55591                       case 0x000f0000: {
   55592                         // 0xfc9f0000
   55593                         if (((instr & 0xe00) == 0xa00)) {
   55594                           UnallocatedA32(instr);
   55595                           return;
   55596                         }
   55597                         UnimplementedA32("LDC2", instr);
   55598                         break;
   55599                       }
   55600                       default: {
   55601                         if (((instr & 0xf0000) == 0xf0000) ||
   55602                             ((instr & 0xe00) == 0xa00)) {
   55603                           UnallocatedA32(instr);
   55604                           return;
   55605                         }
   55606                         UnimplementedA32("LDC2", instr);
   55607                         break;
   55608                       }
   55609                     }
   55610                     break;
   55611                   }
   55612                 }
   55613                 break;
   55614               }
   55615             }
   55616             break;
   55617           }
   55618           case 0x00200000: {
   55619             // 0xfc200000
   55620             if (((instr & 0xe00) == 0xa00)) {
   55621               UnallocatedA32(instr);
   55622               return;
   55623             }
   55624             UnimplementedA32("STC2", instr);
   55625             break;
   55626           }
   55627           case 0x00300000: {
   55628             // 0xfc300000
   55629             if (((instr & 0xf0000) == 0xf0000) || ((instr & 0xe00) == 0xa00)) {
   55630               UnallocatedA32(instr);
   55631               return;
   55632             }
   55633             UnimplementedA32("LDC2", instr);
   55634             break;
   55635           }
   55636           case 0x01000000: {
   55637             // 0xfd000000
   55638             if (((instr & 0xe00) == 0xa00)) {
   55639               UnallocatedA32(instr);
   55640               return;
   55641             }
   55642             UnimplementedA32("STC2", instr);
   55643             break;
   55644           }
   55645           case 0x01100000: {
   55646             // 0xfd100000
   55647             switch (instr & 0x00000e00) {
   55648               case 0x00000a00: {
   55649                 // 0xfd100a00
   55650                 UnallocatedA32(instr);
   55651                 break;
   55652               }
   55653               default: {
   55654                 switch (instr & 0x000f0000) {
   55655                   case 0x000f0000: {
   55656                     // 0xfd1f0000
   55657                     if (((instr & 0xe00) == 0xa00)) {
   55658                       UnallocatedA32(instr);
   55659                       return;
   55660                     }
   55661                     UnimplementedA32("LDC2", instr);
   55662                     break;
   55663                   }
   55664                   default: {
   55665                     if (((instr & 0xf0000) == 0xf0000) ||
   55666                         ((instr & 0xe00) == 0xa00)) {
   55667                       UnallocatedA32(instr);
   55668                       return;
   55669                     }
   55670                     UnimplementedA32("LDC2", instr);
   55671                     break;
   55672                   }
   55673                 }
   55674                 break;
   55675               }
   55676             }
   55677             break;
   55678           }
   55679           case 0x01200000: {
   55680             // 0xfd200000
   55681             if (((instr & 0xe00) == 0xa00)) {
   55682               UnallocatedA32(instr);
   55683               return;
   55684             }
   55685             UnimplementedA32("STC2", instr);
   55686             break;
   55687           }
   55688           case 0x01300000: {
   55689             // 0xfd300000
   55690             if (((instr & 0xf0000) == 0xf0000) || ((instr & 0xe00) == 0xa00)) {
   55691               UnallocatedA32(instr);
   55692               return;
   55693             }
   55694             UnimplementedA32("LDC2", instr);
   55695             break;
   55696           }
   55697         }
   55698         break;
   55699       }
   55700       case 0x0e000000: {
   55701         // 0xfe000000
   55702         switch (instr & 0x01000010) {
   55703           case 0x00000000: {
   55704             // 0xfe000000
   55705             switch (instr & 0x00000e00) {
   55706               case 0x00000a00: {
   55707                 // 0xfe000a00
   55708                 switch (instr & 0x00b00140) {
   55709                   case 0x00000000: {
   55710                     // 0xfe000a00
   55711                     unsigned rd = ExtractSRegister(instr, 22, 12);
   55712                     unsigned rn = ExtractSRegister(instr, 7, 16);
   55713                     unsigned rm = ExtractSRegister(instr, 5, 0);
   55714                     // VSELEQ.F32 <Sd>, <Sn>, <Sm> ; A1
   55715                     vseleq(F32, SRegister(rd), SRegister(rn), SRegister(rm));
   55716                     break;
   55717                   }
   55718                   case 0x00000100: {
   55719                     // 0xfe000b00
   55720                     unsigned rd = ExtractDRegister(instr, 22, 12);
   55721                     unsigned rn = ExtractDRegister(instr, 7, 16);
   55722                     unsigned rm = ExtractDRegister(instr, 5, 0);
   55723                     // VSELEQ.F64 <Dd>, <Dn>, <Dm> ; A1
   55724                     vseleq(F64, DRegister(rd), DRegister(rn), DRegister(rm));
   55725                     break;
   55726                   }
   55727                   case 0x00100000: {
   55728                     // 0xfe100a00
   55729                     unsigned rd = ExtractSRegister(instr, 22, 12);
   55730                     unsigned rn = ExtractSRegister(instr, 7, 16);
   55731                     unsigned rm = ExtractSRegister(instr, 5, 0);
   55732                     // VSELVS.F32 <Sd>, <Sn>, <Sm> ; A1
   55733                     vselvs(F32, SRegister(rd), SRegister(rn), SRegister(rm));
   55734                     break;
   55735                   }
   55736                   case 0x00100100: {
   55737                     // 0xfe100b00
   55738                     unsigned rd = ExtractDRegister(instr, 22, 12);
   55739                     unsigned rn = ExtractDRegister(instr, 7, 16);
   55740                     unsigned rm = ExtractDRegister(instr, 5, 0);
   55741                     // VSELVS.F64 <Dd>, <Dn>, <Dm> ; A1
   55742                     vselvs(F64, DRegister(rd), DRegister(rn), DRegister(rm));
   55743                     break;
   55744                   }
   55745                   case 0x00200000: {
   55746                     // 0xfe200a00
   55747                     unsigned rd = ExtractSRegister(instr, 22, 12);
   55748                     unsigned rn = ExtractSRegister(instr, 7, 16);
   55749                     unsigned rm = ExtractSRegister(instr, 5, 0);
   55750                     // VSELGE.F32 <Sd>, <Sn>, <Sm> ; A1
   55751                     vselge(F32, SRegister(rd), SRegister(rn), SRegister(rm));
   55752                     break;
   55753                   }
   55754                   case 0x00200100: {
   55755                     // 0xfe200b00
   55756                     unsigned rd = ExtractDRegister(instr, 22, 12);
   55757                     unsigned rn = ExtractDRegister(instr, 7, 16);
   55758                     unsigned rm = ExtractDRegister(instr, 5, 0);
   55759                     // VSELGE.F64 <Dd>, <Dn>, <Dm> ; A1
   55760                     vselge(F64, DRegister(rd), DRegister(rn), DRegister(rm));
   55761                     break;
   55762                   }
   55763                   case 0x00300000: {
   55764                     // 0xfe300a00
   55765                     unsigned rd = ExtractSRegister(instr, 22, 12);
   55766                     unsigned rn = ExtractSRegister(instr, 7, 16);
   55767                     unsigned rm = ExtractSRegister(instr, 5, 0);
   55768                     // VSELGT.F32 <Sd>, <Sn>, <Sm> ; A1
   55769                     vselgt(F32, SRegister(rd), SRegister(rn), SRegister(rm));
   55770                     break;
   55771                   }
   55772                   case 0x00300100: {
   55773                     // 0xfe300b00
   55774                     unsigned rd = ExtractDRegister(instr, 22, 12);
   55775                     unsigned rn = ExtractDRegister(instr, 7, 16);
   55776                     unsigned rm = ExtractDRegister(instr, 5, 0);
   55777                     // VSELGT.F64 <Dd>, <Dn>, <Dm> ; A1
   55778                     vselgt(F64, DRegister(rd), DRegister(rn), DRegister(rm));
   55779                     break;
   55780                   }
   55781                   case 0x00800000: {
   55782                     // 0xfe800a00
   55783                     unsigned rd = ExtractSRegister(instr, 22, 12);
   55784                     unsigned rn = ExtractSRegister(instr, 7, 16);
   55785                     unsigned rm = ExtractSRegister(instr, 5, 0);
   55786                     // VMAXNM{<q>}.F32 <Sd>, <Sn>, <Sm> ; A2
   55787                     vmaxnm(F32, SRegister(rd), SRegister(rn), SRegister(rm));
   55788                     break;
   55789                   }
   55790                   case 0x00800040: {
   55791                     // 0xfe800a40
   55792                     unsigned rd = ExtractSRegister(instr, 22, 12);
   55793                     unsigned rn = ExtractSRegister(instr, 7, 16);
   55794                     unsigned rm = ExtractSRegister(instr, 5, 0);
   55795                     // VMINNM{<q>}.F32 <Sd>, <Sn>, <Sm> ; A2
   55796                     vminnm(F32, SRegister(rd), SRegister(rn), SRegister(rm));
   55797                     break;
   55798                   }
   55799                   case 0x00800100: {
   55800                     // 0xfe800b00
   55801                     unsigned rd = ExtractDRegister(instr, 22, 12);
   55802                     unsigned rn = ExtractDRegister(instr, 7, 16);
   55803                     unsigned rm = ExtractDRegister(instr, 5, 0);
   55804                     // VMAXNM{<q>}.F64 <Dd>, <Dn>, <Dm> ; A2
   55805                     vmaxnm(F64, DRegister(rd), DRegister(rn), DRegister(rm));
   55806                     break;
   55807                   }
   55808                   case 0x00800140: {
   55809                     // 0xfe800b40
   55810                     unsigned rd = ExtractDRegister(instr, 22, 12);
   55811                     unsigned rn = ExtractDRegister(instr, 7, 16);
   55812                     unsigned rm = ExtractDRegister(instr, 5, 0);
   55813                     // VMINNM{<q>}.F64 <Dd>, <Dn>, <Dm> ; A2
   55814                     vminnm(F64, DRegister(rd), DRegister(rn), DRegister(rm));
   55815                     break;
   55816                   }
   55817                   case 0x00b00040: {
   55818                     // 0xfeb00a40
   55819                     switch (instr & 0x000f0000) {
   55820                       case 0x00080000: {
   55821                         // 0xfeb80a40
   55822                         if ((instr & 0x00000080) == 0x00000000) {
   55823                           unsigned rd = ExtractSRegister(instr, 22, 12);
   55824                           unsigned rm = ExtractSRegister(instr, 5, 0);
   55825                           // VRINTA{<q>}.F32.F32 <Sd>, <Sm> ; A1
   55826                           vrinta(F32, F32, SRegister(rd), SRegister(rm));
   55827                         } else {
   55828                           UnallocatedA32(instr);
   55829                         }
   55830                         break;
   55831                       }
   55832                       case 0x00090000: {
   55833                         // 0xfeb90a40
   55834                         if ((instr & 0x00000080) == 0x00000000) {
   55835                           unsigned rd = ExtractSRegister(instr, 22, 12);
   55836                           unsigned rm = ExtractSRegister(instr, 5, 0);
   55837                           // VRINTN{<q>}.F32.F32 <Sd>, <Sm> ; A1
   55838                           vrintn(F32, F32, SRegister(rd), SRegister(rm));
   55839                         } else {
   55840                           UnallocatedA32(instr);
   55841                         }
   55842                         break;
   55843                       }
   55844                       case 0x000a0000: {
   55845                         // 0xfeba0a40
   55846                         if ((instr & 0x00000080) == 0x00000000) {
   55847                           unsigned rd = ExtractSRegister(instr, 22, 12);
   55848                           unsigned rm = ExtractSRegister(instr, 5, 0);
   55849                           // VRINTP{<q>}.F32.F32 <Sd>, <Sm> ; A1
   55850                           vrintp(F32, F32, SRegister(rd), SRegister(rm));
   55851                         } else {
   55852                           UnallocatedA32(instr);
   55853                         }
   55854                         break;
   55855                       }
   55856                       case 0x000b0000: {
   55857                         // 0xfebb0a40
   55858                         if ((instr & 0x00000080) == 0x00000000) {
   55859                           unsigned rd = ExtractSRegister(instr, 22, 12);
   55860                           unsigned rm = ExtractSRegister(instr, 5, 0);
   55861                           // VRINTM{<q>}.F32.F32 <Sd>, <Sm> ; A1
   55862                           vrintm(F32, F32, SRegister(rd), SRegister(rm));
   55863                         } else {
   55864                           UnallocatedA32(instr);
   55865                         }
   55866                         break;
   55867                       }
   55868                       case 0x000c0000: {
   55869                         // 0xfebc0a40
   55870                         DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
   55871                         if (dt.Is(kDataTypeValueInvalid)) {
   55872                           UnallocatedA32(instr);
   55873                           return;
   55874                         }
   55875                         unsigned rd = ExtractSRegister(instr, 22, 12);
   55876                         unsigned rm = ExtractSRegister(instr, 5, 0);
   55877                         // VCVTA{<q>}.<dt>.F32 <Sd>, <Sm> ; A1
   55878                         vcvta(dt, F32, SRegister(rd), SRegister(rm));
   55879                         break;
   55880                       }
   55881                       case 0x000d0000: {
   55882                         // 0xfebd0a40
   55883                         DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
   55884                         if (dt.Is(kDataTypeValueInvalid)) {
   55885                           UnallocatedA32(instr);
   55886                           return;
   55887                         }
   55888                         unsigned rd = ExtractSRegister(instr, 22, 12);
   55889                         unsigned rm = ExtractSRegister(instr, 5, 0);
   55890                         // VCVTN{<q>}.<dt>.F32 <Sd>, <Sm> ; A1
   55891                         vcvtn(dt, F32, SRegister(rd), SRegister(rm));
   55892                         break;
   55893                       }
   55894                       case 0x000e0000: {
   55895                         // 0xfebe0a40
   55896                         DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
   55897                         if (dt.Is(kDataTypeValueInvalid)) {
   55898                           UnallocatedA32(instr);
   55899                           return;
   55900                         }
   55901                         unsigned rd = ExtractSRegister(instr, 22, 12);
   55902                         unsigned rm = ExtractSRegister(instr, 5, 0);
   55903                         // VCVTP{<q>}.<dt>.F32 <Sd>, <Sm> ; A1
   55904                         vcvtp(dt, F32, SRegister(rd), SRegister(rm));
   55905                         break;
   55906                       }
   55907                       case 0x000f0000: {
   55908                         // 0xfebf0a40
   55909                         DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
   55910                         if (dt.Is(kDataTypeValueInvalid)) {
   55911                           UnallocatedA32(instr);
   55912                           return;
   55913                         }
   55914                         unsigned rd = ExtractSRegister(instr, 22, 12);
   55915                         unsigned rm = ExtractSRegister(instr, 5, 0);
   55916                         // VCVTM{<q>}.<dt>.F32 <Sd>, <Sm> ; A1
   55917                         vcvtm(dt, F32, SRegister(rd), SRegister(rm));
   55918                         break;
   55919                       }
   55920                       default:
   55921                         UnallocatedA32(instr);
   55922                         break;
   55923                     }
   55924                     break;
   55925                   }
   55926                   case 0x00b00140: {
   55927                     // 0xfeb00b40
   55928                     switch (instr & 0x000f0000) {
   55929                       case 0x00080000: {
   55930                         // 0xfeb80b40
   55931                         if ((instr & 0x00000080) == 0x00000000) {
   55932                           unsigned rd = ExtractDRegister(instr, 22, 12);
   55933                           unsigned rm = ExtractDRegister(instr, 5, 0);
   55934                           // VRINTA{<q>}.F64.F64 <Dd>, <Dm> ; A1
   55935                           vrinta(F64, F64, DRegister(rd), DRegister(rm));
   55936                         } else {
   55937                           UnallocatedA32(instr);
   55938                         }
   55939                         break;
   55940                       }
   55941                       case 0x00090000: {
   55942                         // 0xfeb90b40
   55943                         if ((instr & 0x00000080) == 0x00000000) {
   55944                           unsigned rd = ExtractDRegister(instr, 22, 12);
   55945                           unsigned rm = ExtractDRegister(instr, 5, 0);
   55946                           // VRINTN{<q>}.F64.F64 <Dd>, <Dm> ; A1
   55947                           vrintn(F64, F64, DRegister(rd), DRegister(rm));
   55948                         } else {
   55949                           UnallocatedA32(instr);
   55950                         }
   55951                         break;
   55952                       }
   55953                       case 0x000a0000: {
   55954                         // 0xfeba0b40
   55955                         if ((instr & 0x00000080) == 0x00000000) {
   55956                           unsigned rd = ExtractDRegister(instr, 22, 12);
   55957                           unsigned rm = ExtractDRegister(instr, 5, 0);
   55958                           // VRINTP{<q>}.F64.F64 <Dd>, <Dm> ; A1
   55959                           vrintp(F64, F64, DRegister(rd), DRegister(rm));
   55960                         } else {
   55961                           UnallocatedA32(instr);
   55962                         }
   55963                         break;
   55964                       }
   55965                       case 0x000b0000: {
   55966                         // 0xfebb0b40
   55967                         if ((instr & 0x00000080) == 0x00000000) {
   55968                           unsigned rd = ExtractDRegister(instr, 22, 12);
   55969                           unsigned rm = ExtractDRegister(instr, 5, 0);
   55970                           // VRINTM{<q>}.F64.F64 <Dd>, <Dm> ; A1
   55971                           vrintm(F64, F64, DRegister(rd), DRegister(rm));
   55972                         } else {
   55973                           UnallocatedA32(instr);
   55974                         }
   55975                         break;
   55976                       }
   55977                       case 0x000c0000: {
   55978                         // 0xfebc0b40
   55979                         DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
   55980                         if (dt.Is(kDataTypeValueInvalid)) {
   55981                           UnallocatedA32(instr);
   55982                           return;
   55983                         }
   55984                         unsigned rd = ExtractSRegister(instr, 22, 12);
   55985                         unsigned rm = ExtractDRegister(instr, 5, 0);
   55986                         // VCVTA{<q>}.<dt>.F64 <Sd>, <Dm> ; A1
   55987                         vcvta(dt, F64, SRegister(rd), DRegister(rm));
   55988                         break;
   55989                       }
   55990                       case 0x000d0000: {
   55991                         // 0xfebd0b40
   55992                         DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
   55993                         if (dt.Is(kDataTypeValueInvalid)) {
   55994                           UnallocatedA32(instr);
   55995                           return;
   55996                         }
   55997                         unsigned rd = ExtractSRegister(instr, 22, 12);
   55998                         unsigned rm = ExtractDRegister(instr, 5, 0);
   55999                         // VCVTN{<q>}.<dt>.F64 <Sd>, <Dm> ; A1
   56000                         vcvtn(dt, F64, SRegister(rd), DRegister(rm));
   56001                         break;
   56002                       }
   56003                       case 0x000e0000: {
   56004                         // 0xfebe0b40
   56005                         DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
   56006                         if (dt.Is(kDataTypeValueInvalid)) {
   56007                           UnallocatedA32(instr);
   56008                           return;
   56009                         }
   56010                         unsigned rd = ExtractSRegister(instr, 22, 12);
   56011                         unsigned rm = ExtractDRegister(instr, 5, 0);
   56012                         // VCVTP{<q>}.<dt>.F64 <Sd>, <Dm> ; A1
   56013                         vcvtp(dt, F64, SRegister(rd), DRegister(rm));
   56014                         break;
   56015                       }
   56016                       case 0x000f0000: {
   56017                         // 0xfebf0b40
   56018                         DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
   56019                         if (dt.Is(kDataTypeValueInvalid)) {
   56020                           UnallocatedA32(instr);
   56021                           return;
   56022                         }
   56023                         unsigned rd = ExtractSRegister(instr, 22, 12);
   56024                         unsigned rm = ExtractDRegister(instr, 5, 0);
   56025                         // VCVTM{<q>}.<dt>.F64 <Sd>, <Dm> ; A1
   56026                         vcvtm(dt, F64, SRegister(rd), DRegister(rm));
   56027                         break;
   56028                       }
   56029                       default:
   56030                         UnallocatedA32(instr);
   56031                         break;
   56032                     }
   56033                     break;
   56034                   }
   56035                   default:
   56036                     UnallocatedA32(instr);
   56037                     break;
   56038                 }
   56039                 break;
   56040               }
   56041               default: {
   56042                 if (((instr & 0xe00) == 0xa00)) {
   56043                   UnallocatedA32(instr);
   56044                   return;
   56045                 }
   56046                 UnimplementedA32("CDP2", instr);
   56047                 break;
   56048               }
   56049             }
   56050             break;
   56051           }
   56052           case 0x00000010: {
   56053             // 0xfe000010
   56054             switch (instr & 0x00100000) {
   56055               case 0x00000000: {
   56056                 // 0xfe000010
   56057                 if (((instr & 0xe00) == 0xa00)) {
   56058                   UnallocatedA32(instr);
   56059                   return;
   56060                 }
   56061                 UnimplementedA32("MCR2", instr);
   56062                 break;
   56063               }
   56064               case 0x00100000: {
   56065                 // 0xfe100010
   56066                 if (((instr & 0xe00) == 0xa00)) {
   56067                   UnallocatedA32(instr);
   56068                   return;
   56069                 }
   56070                 UnimplementedA32("MRC2", instr);
   56071                 break;
   56072               }
   56073             }
   56074             break;
   56075           }
   56076           default:
   56077             UnallocatedA32(instr);
   56078             break;
   56079         }
   56080         break;
   56081       }
   56082     }
   56083   } else {
   56084     switch (instr & 0x0e000000) {
   56085       case 0x00000000: {
   56086         // 0x00000000
   56087         switch (instr & 0x00100010) {
   56088           case 0x00000000: {
   56089             // 0x00000000
   56090             switch (instr & 0x01a00000) {
   56091               case 0x00000000: {
   56092                 // 0x00000000
   56093                 switch (instr & 0x00400000) {
   56094                   case 0x00000000: {
   56095                     // 0x00000000
   56096                     switch (instr & 0x00000fe0) {
   56097                       case 0x00000060: {
   56098                         // 0x00000060
   56099                         if (((instr & 0xf0000000) == 0xf0000000)) {
   56100                           UnallocatedA32(instr);
   56101                           return;
   56102                         }
   56103                         Condition condition((instr >> 28) & 0xf);
   56104                         unsigned rd = (instr >> 12) & 0xf;
   56105                         unsigned rn = (instr >> 16) & 0xf;
   56106                         unsigned rm = instr & 0xf;
   56107                         // AND{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
   56108                         and_(condition,
   56109                              Best,
   56110                              Register(rd),
   56111                              Register(rn),
   56112                              Operand(Register(rm), RRX));
   56113                         break;
   56114                       }
   56115                       default: {
   56116                         if (((instr & 0xf0000000) == 0xf0000000) ||
   56117                             ((instr & 0xfe0) == 0x60)) {
   56118                           UnallocatedA32(instr);
   56119                           return;
   56120                         }
   56121                         Condition condition((instr >> 28) & 0xf);
   56122                         unsigned rd = (instr >> 12) & 0xf;
   56123                         unsigned rn = (instr >> 16) & 0xf;
   56124                         unsigned rm = instr & 0xf;
   56125                         ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
   56126                                                             (instr >> 7) &
   56127                                                                 0x1f);
   56128                         // AND{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
   56129                         and_(condition,
   56130                              Best,
   56131                              Register(rd),
   56132                              Register(rn),
   56133                              Operand(Register(rm),
   56134                                      shift_operand.GetType(),
   56135                                      shift_operand.GetAmount()));
   56136                         break;
   56137                       }
   56138                     }
   56139                     break;
   56140                   }
   56141                   case 0x00400000: {
   56142                     // 0x00400000
   56143                     switch (instr & 0x000f0000) {
   56144                       case 0x000d0000: {
   56145                         // 0x004d0000
   56146                         switch (instr & 0x00000fe0) {
   56147                           case 0x00000060: {
   56148                             // 0x004d0060
   56149                             if (((instr & 0xf0000000) == 0xf0000000)) {
   56150                               UnallocatedA32(instr);
   56151                               return;
   56152                             }
   56153                             Condition condition((instr >> 28) & 0xf);
   56154                             unsigned rd = (instr >> 12) & 0xf;
   56155                             unsigned rm = instr & 0xf;
   56156                             // SUB{<c>}{<q>} {<Rd>}, SP, <Rm>, RRX ; A1
   56157                             sub(condition,
   56158                                 Best,
   56159                                 Register(rd),
   56160                                 sp,
   56161                                 Operand(Register(rm), RRX));
   56162                             break;
   56163                           }
   56164                           default: {
   56165                             if (((instr & 0xf0000000) == 0xf0000000) ||
   56166                                 ((instr & 0xfe0) == 0x60)) {
   56167                               UnallocatedA32(instr);
   56168                               return;
   56169                             }
   56170                             Condition condition((instr >> 28) & 0xf);
   56171                             unsigned rd = (instr >> 12) & 0xf;
   56172                             unsigned rm = instr & 0xf;
   56173                             ImmediateShiftOperand shift_operand((instr >> 5) &
   56174                                                                     0x3,
   56175                                                                 (instr >> 7) &
   56176                                                                     0x1f);
   56177                             // SUB{<c>}{<q>} {<Rd>}, SP, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
   56178                             sub(condition,
   56179                                 Best,
   56180                                 Register(rd),
   56181                                 sp,
   56182                                 Operand(Register(rm),
   56183                                         shift_operand.GetType(),
   56184                                         shift_operand.GetAmount()));
   56185                             break;
   56186                           }
   56187                         }
   56188                         break;
   56189                       }
   56190                       default: {
   56191                         switch (instr & 0x00000fe0) {
   56192                           case 0x00000060: {
   56193                             // 0x00400060
   56194                             if (((instr & 0xf0000000) == 0xf0000000) ||
   56195                                 ((instr & 0xf0000) == 0xd0000)) {
   56196                               UnallocatedA32(instr);
   56197                               return;
   56198                             }
   56199                             Condition condition((instr >> 28) & 0xf);
   56200                             unsigned rd = (instr >> 12) & 0xf;
   56201                             unsigned rn = (instr >> 16) & 0xf;
   56202                             unsigned rm = instr & 0xf;
   56203                             // SUB{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
   56204                             sub(condition,
   56205                                 Best,
   56206                                 Register(rd),
   56207                                 Register(rn),
   56208                                 Operand(Register(rm), RRX));
   56209                             break;
   56210                           }
   56211                           default: {
   56212                             if (((instr & 0xf0000000) == 0xf0000000) ||
   56213                                 ((instr & 0xf0000) == 0xd0000) ||
   56214                                 ((instr & 0xfe0) == 0x60)) {
   56215                               UnallocatedA32(instr);
   56216                               return;
   56217                             }
   56218                             Condition condition((instr >> 28) & 0xf);
   56219                             unsigned rd = (instr >> 12) & 0xf;
   56220                             unsigned rn = (instr >> 16) & 0xf;
   56221                             unsigned rm = instr & 0xf;
   56222                             ImmediateShiftOperand shift_operand((instr >> 5) &
   56223                                                                     0x3,
   56224                                                                 (instr >> 7) &
   56225                                                                     0x1f);
   56226                             // SUB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
   56227                             sub(condition,
   56228                                 Best,
   56229                                 Register(rd),
   56230                                 Register(rn),
   56231                                 Operand(Register(rm),
   56232                                         shift_operand.GetType(),
   56233                                         shift_operand.GetAmount()));
   56234                             break;
   56235                           }
   56236                         }
   56237                         break;
   56238                       }
   56239                     }
   56240                     break;
   56241                   }
   56242                 }
   56243                 break;
   56244               }
   56245               case 0x00200000: {
   56246                 // 0x00200000
   56247                 switch (instr & 0x00400000) {
   56248                   case 0x00000000: {
   56249                     // 0x00200000
   56250                     switch (instr & 0x00000fe0) {
   56251                       case 0x00000060: {
   56252                         // 0x00200060
   56253                         if (((instr & 0xf0000000) == 0xf0000000)) {
   56254                           UnallocatedA32(instr);
   56255                           return;
   56256                         }
   56257                         Condition condition((instr >> 28) & 0xf);
   56258                         unsigned rd = (instr >> 12) & 0xf;
   56259                         unsigned rn = (instr >> 16) & 0xf;
   56260                         unsigned rm = instr & 0xf;
   56261                         // EOR{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
   56262                         eor(condition,
   56263                             Best,
   56264                             Register(rd),
   56265                             Register(rn),
   56266                             Operand(Register(rm), RRX));
   56267                         break;
   56268                       }
   56269                       default: {
   56270                         if (((instr & 0xf0000000) == 0xf0000000) ||
   56271                             ((instr & 0xfe0) == 0x60)) {
   56272                           UnallocatedA32(instr);
   56273                           return;
   56274                         }
   56275                         Condition condition((instr >> 28) & 0xf);
   56276                         unsigned rd = (instr >> 12) & 0xf;
   56277                         unsigned rn = (instr >> 16) & 0xf;
   56278                         unsigned rm = instr & 0xf;
   56279                         ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
   56280                                                             (instr >> 7) &
   56281                                                                 0x1f);
   56282                         // EOR{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
   56283                         eor(condition,
   56284                             Best,
   56285                             Register(rd),
   56286                             Register(rn),
   56287                             Operand(Register(rm),
   56288                                     shift_operand.GetType(),
   56289                                     shift_operand.GetAmount()));
   56290                         break;
   56291                       }
   56292                     }
   56293                     break;
   56294                   }
   56295                   case 0x00400000: {
   56296                     // 0x00600000
   56297                     switch (instr & 0x00000fe0) {
   56298                       case 0x00000060: {
   56299                         // 0x00600060
   56300                         if (((instr & 0xf0000000) == 0xf0000000)) {
   56301                           UnallocatedA32(instr);
   56302                           return;
   56303                         }
   56304                         Condition condition((instr >> 28) & 0xf);
   56305                         unsigned rd = (instr >> 12) & 0xf;
   56306                         unsigned rn = (instr >> 16) & 0xf;
   56307                         unsigned rm = instr & 0xf;
   56308                         // RSB{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
   56309                         rsb(condition,
   56310                             Best,
   56311                             Register(rd),
   56312                             Register(rn),
   56313                             Operand(Register(rm), RRX));
   56314                         break;
   56315                       }
   56316                       default: {
   56317                         if (((instr & 0xf0000000) == 0xf0000000) ||
   56318                             ((instr & 0xfe0) == 0x60)) {
   56319                           UnallocatedA32(instr);
   56320                           return;
   56321                         }
   56322                         Condition condition((instr >> 28) & 0xf);
   56323                         unsigned rd = (instr >> 12) & 0xf;
   56324                         unsigned rn = (instr >> 16) & 0xf;
   56325                         unsigned rm = instr & 0xf;
   56326                         ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
   56327                                                             (instr >> 7) &
   56328                                                                 0x1f);
   56329                         // RSB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
   56330                         rsb(condition,
   56331                             Best,
   56332                             Register(rd),
   56333                             Register(rn),
   56334                             Operand(Register(rm),
   56335                                     shift_operand.GetType(),
   56336                                     shift_operand.GetAmount()));
   56337                         break;
   56338                       }
   56339                     }
   56340                     break;
   56341                   }
   56342                 }
   56343                 break;
   56344               }
   56345               case 0x00800000: {
   56346                 // 0x00800000
   56347                 switch (instr & 0x00400000) {
   56348                   case 0x00000000: {
   56349                     // 0x00800000
   56350                     switch (instr & 0x000f0000) {
   56351                       case 0x000d0000: {
   56352                         // 0x008d0000
   56353                         switch (instr & 0x00000fe0) {
   56354                           case 0x00000060: {
   56355                             // 0x008d0060
   56356                             if (((instr & 0xf0000000) == 0xf0000000)) {
   56357                               UnallocatedA32(instr);
   56358                               return;
   56359                             }
   56360                             Condition condition((instr >> 28) & 0xf);
   56361                             unsigned rd = (instr >> 12) & 0xf;
   56362                             unsigned rm = instr & 0xf;
   56363                             // ADD{<c>}{<q>} {<Rd>}, SP, <Rm>, RRX ; A1
   56364                             add(condition,
   56365                                 Best,
   56366                                 Register(rd),
   56367                                 sp,
   56368                                 Operand(Register(rm), RRX));
   56369                             break;
   56370                           }
   56371                           default: {
   56372                             if (((instr & 0xf0000000) == 0xf0000000) ||
   56373                                 ((instr & 0xfe0) == 0x60)) {
   56374                               UnallocatedA32(instr);
   56375                               return;
   56376                             }
   56377                             Condition condition((instr >> 28) & 0xf);
   56378                             unsigned rd = (instr >> 12) & 0xf;
   56379                             unsigned rm = instr & 0xf;
   56380                             ImmediateShiftOperand shift_operand((instr >> 5) &
   56381                                                                     0x3,
   56382                                                                 (instr >> 7) &
   56383                                                                     0x1f);
   56384                             // ADD{<c>}{<q>} {<Rd>}, SP, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
   56385                             add(condition,
   56386                                 Best,
   56387                                 Register(rd),
   56388                                 sp,
   56389                                 Operand(Register(rm),
   56390                                         shift_operand.GetType(),
   56391                                         shift_operand.GetAmount()));
   56392                             break;
   56393                           }
   56394                         }
   56395                         break;
   56396                       }
   56397                       default: {
   56398                         switch (instr & 0x00000fe0) {
   56399                           case 0x00000060: {
   56400                             // 0x00800060
   56401                             if (((instr & 0xf0000000) == 0xf0000000) ||
   56402                                 ((instr & 0xf0000) == 0xd0000)) {
   56403                               UnallocatedA32(instr);
   56404                               return;
   56405                             }
   56406                             Condition condition((instr >> 28) & 0xf);
   56407                             unsigned rd = (instr >> 12) & 0xf;
   56408                             unsigned rn = (instr >> 16) & 0xf;
   56409                             unsigned rm = instr & 0xf;
   56410                             // ADD{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
   56411                             add(condition,
   56412                                 Best,
   56413                                 Register(rd),
   56414                                 Register(rn),
   56415                                 Operand(Register(rm), RRX));
   56416                             break;
   56417                           }
   56418                           default: {
   56419                             if (((instr & 0xf0000000) == 0xf0000000) ||
   56420                                 ((instr & 0xf0000) == 0xd0000) ||
   56421                                 ((instr & 0xfe0) == 0x60)) {
   56422                               UnallocatedA32(instr);
   56423                               return;
   56424                             }
   56425                             Condition condition((instr >> 28) & 0xf);
   56426                             unsigned rd = (instr >> 12) & 0xf;
   56427                             unsigned rn = (instr >> 16) & 0xf;
   56428                             unsigned rm = instr & 0xf;
   56429                             ImmediateShiftOperand shift_operand((instr >> 5) &
   56430                                                                     0x3,
   56431                                                                 (instr >> 7) &
   56432                                                                     0x1f);
   56433                             // ADD{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
   56434                             add(condition,
   56435                                 Best,
   56436                                 Register(rd),
   56437                                 Register(rn),
   56438                                 Operand(Register(rm),
   56439                                         shift_operand.GetType(),
   56440                                         shift_operand.GetAmount()));
   56441                             break;
   56442                           }
   56443                         }
   56444                         break;
   56445                       }
   56446                     }
   56447                     break;
   56448                   }
   56449                   case 0x00400000: {
   56450                     // 0x00c00000
   56451                     switch (instr & 0x00000fe0) {
   56452                       case 0x00000060: {
   56453                         // 0x00c00060
   56454                         if (((instr & 0xf0000000) == 0xf0000000)) {
   56455                           UnallocatedA32(instr);
   56456                           return;
   56457                         }
   56458                         Condition condition((instr >> 28) & 0xf);
   56459                         unsigned rd = (instr >> 12) & 0xf;
   56460                         unsigned rn = (instr >> 16) & 0xf;
   56461                         unsigned rm = instr & 0xf;
   56462                         // SBC{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
   56463                         sbc(condition,
   56464                             Best,
   56465                             Register(rd),
   56466                             Register(rn),
   56467                             Operand(Register(rm), RRX));
   56468                         break;
   56469                       }
   56470                       default: {
   56471                         if (((instr & 0xf0000000) == 0xf0000000) ||
   56472                             ((instr & 0xfe0) == 0x60)) {
   56473                           UnallocatedA32(instr);
   56474                           return;
   56475                         }
   56476                         Condition condition((instr >> 28) & 0xf);
   56477                         unsigned rd = (instr >> 12) & 0xf;
   56478                         unsigned rn = (instr >> 16) & 0xf;
   56479                         unsigned rm = instr & 0xf;
   56480                         ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
   56481                                                             (instr >> 7) &
   56482                                                                 0x1f);
   56483                         // SBC{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
   56484                         sbc(condition,
   56485                             Best,
   56486                             Register(rd),
   56487                             Register(rn),
   56488                             Operand(Register(rm),
   56489                                     shift_operand.GetType(),
   56490                                     shift_operand.GetAmount()));
   56491                         break;
   56492                       }
   56493                     }
   56494                     break;
   56495                   }
   56496                 }
   56497                 break;
   56498               }
   56499               case 0x00a00000: {
   56500                 // 0x00a00000
   56501                 switch (instr & 0x00400000) {
   56502                   case 0x00000000: {
   56503                     // 0x00a00000
   56504                     switch (instr & 0x00000fe0) {
   56505                       case 0x00000060: {
   56506                         // 0x00a00060
   56507                         if (((instr & 0xf0000000) == 0xf0000000)) {
   56508                           UnallocatedA32(instr);
   56509                           return;
   56510                         }
   56511                         Condition condition((instr >> 28) & 0xf);
   56512                         unsigned rd = (instr >> 12) & 0xf;
   56513                         unsigned rn = (instr >> 16) & 0xf;
   56514                         unsigned rm = instr & 0xf;
   56515                         // ADC{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
   56516                         adc(condition,
   56517                             Best,
   56518                             Register(rd),
   56519                             Register(rn),
   56520                             Operand(Register(rm), RRX));
   56521                         break;
   56522                       }
   56523                       default: {
   56524                         if (((instr & 0xf0000000) == 0xf0000000) ||
   56525                             ((instr & 0xfe0) == 0x60)) {
   56526                           UnallocatedA32(instr);
   56527                           return;
   56528                         }
   56529                         Condition condition((instr >> 28) & 0xf);
   56530                         unsigned rd = (instr >> 12) & 0xf;
   56531                         unsigned rn = (instr >> 16) & 0xf;
   56532                         unsigned rm = instr & 0xf;
   56533                         ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
   56534                                                             (instr >> 7) &
   56535                                                                 0x1f);
   56536                         // ADC{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
   56537                         adc(condition,
   56538                             Best,
   56539                             Register(rd),
   56540                             Register(rn),
   56541                             Operand(Register(rm),
   56542                                     shift_operand.GetType(),
   56543                                     shift_operand.GetAmount()));
   56544                         break;
   56545                       }
   56546                     }
   56547                     break;
   56548                   }
   56549                   case 0x00400000: {
   56550                     // 0x00e00000
   56551                     switch (instr & 0x00000fe0) {
   56552                       case 0x00000060: {
   56553                         // 0x00e00060
   56554                         if (((instr & 0xf0000000) == 0xf0000000)) {
   56555                           UnallocatedA32(instr);
   56556                           return;
   56557                         }
   56558                         Condition condition((instr >> 28) & 0xf);
   56559                         unsigned rd = (instr >> 12) & 0xf;
   56560                         unsigned rn = (instr >> 16) & 0xf;
   56561                         unsigned rm = instr & 0xf;
   56562                         // RSC{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
   56563                         rsc(condition,
   56564                             Register(rd),
   56565                             Register(rn),
   56566                             Operand(Register(rm), RRX));
   56567                         break;
   56568                       }
   56569                       default: {
   56570                         if (((instr & 0xf0000000) == 0xf0000000) ||
   56571                             ((instr & 0xfe0) == 0x60)) {
   56572                           UnallocatedA32(instr);
   56573                           return;
   56574                         }
   56575                         Condition condition((instr >> 28) & 0xf);
   56576                         unsigned rd = (instr >> 12) & 0xf;
   56577                         unsigned rn = (instr >> 16) & 0xf;
   56578                         unsigned rm = instr & 0xf;
   56579                         ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
   56580                                                             (instr >> 7) &
   56581                                                                 0x1f);
   56582                         // RSC{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
   56583                         rsc(condition,
   56584                             Register(rd),
   56585                             Register(rn),
   56586                             Operand(Register(rm),
   56587                                     shift_operand.GetType(),
   56588                                     shift_operand.GetAmount()));
   56589                         break;
   56590                       }
   56591                     }
   56592                     break;
   56593                   }
   56594                 }
   56595                 break;
   56596               }
   56597               case 0x01000000: {
   56598                 // 0x01000000
   56599                 switch (instr & 0x000000e0) {
   56600                   case 0x00000000: {
   56601                     // 0x01000000
   56602                     switch (instr & 0x00000200) {
   56603                       case 0x00000000: {
   56604                         // 0x01000000
   56605                         if (((instr & 0xf0000000) == 0xf0000000)) {
   56606                           UnallocatedA32(instr);
   56607                           return;
   56608                         }
   56609                         Condition condition((instr >> 28) & 0xf);
   56610                         unsigned rd = (instr >> 12) & 0xf;
   56611                         unsigned spec_reg = (instr >> 22) & 0x1;
   56612                         // MRS{<c>}{<q>} <Rd>, <spec_reg> ; A1
   56613                         mrs(condition, Register(rd), SpecialRegister(spec_reg));
   56614                         if (((instr & 0xfbf0fff) != 0x10f0000)) {
   56615                           UnpredictableA32(instr);
   56616                         }
   56617                         break;
   56618                       }
   56619                       case 0x00000200: {
   56620                         // 0x01000200
   56621                         if (((instr & 0xf0000000) == 0xf0000000)) {
   56622                           UnallocatedA32(instr);
   56623                           return;
   56624                         }
   56625                         UnimplementedA32("MRS", instr);
   56626                         break;
   56627                       }
   56628                     }
   56629                     break;
   56630                   }
   56631                   case 0x00000040: {
   56632                     // 0x01000040
   56633                     switch (instr & 0x00400200) {
   56634                       case 0x00000000: {
   56635                         // 0x01000040
   56636                         if (((instr & 0xf0000000) == 0xf0000000)) {
   56637                           UnallocatedA32(instr);
   56638                           return;
   56639                         }
   56640                         unsigned rd = (instr >> 12) & 0xf;
   56641                         unsigned rn = (instr >> 16) & 0xf;
   56642                         unsigned rm = instr & 0xf;
   56643                         // CRC32B{<q>} <Rd>, <Rn>, <Rm> ; A1
   56644                         crc32b(al, Register(rd), Register(rn), Register(rm));
   56645                         if (((instr & 0xff00ff0) != 0x1000040)) {
   56646                           UnpredictableA32(instr);
   56647                         }
   56648                         break;
   56649                       }
   56650                       case 0x00000200: {
   56651                         // 0x01000240
   56652                         if (((instr & 0xf0000000) == 0xf0000000)) {
   56653                           UnallocatedA32(instr);
   56654                           return;
   56655                         }
   56656                         unsigned rd = (instr >> 12) & 0xf;
   56657                         unsigned rn = (instr >> 16) & 0xf;
   56658                         unsigned rm = instr & 0xf;
   56659                         // CRC32CB{<q>} <Rd>, <Rn>, <Rm> ; A1
   56660                         crc32cb(al, Register(rd), Register(rn), Register(rm));
   56661                         if (((instr & 0xff00ff0) != 0x1000240)) {
   56662                           UnpredictableA32(instr);
   56663                         }
   56664                         break;
   56665                       }
   56666                       case 0x00400000: {
   56667                         // 0x01400040
   56668                         if (((instr & 0xf0000000) == 0xf0000000)) {
   56669                           UnallocatedA32(instr);
   56670                           return;
   56671                         }
   56672                         unsigned rd = (instr >> 12) & 0xf;
   56673                         unsigned rn = (instr >> 16) & 0xf;
   56674                         unsigned rm = instr & 0xf;
   56675                         // CRC32W{<q>} <Rd>, <Rn>, <Rm> ; A1
   56676                         crc32w(al, Register(rd), Register(rn), Register(rm));
   56677                         if (((instr & 0xff00ff0) != 0x1400040)) {
   56678                           UnpredictableA32(instr);
   56679                         }
   56680                         break;
   56681                       }
   56682                       case 0x00400200: {
   56683                         // 0x01400240
   56684                         if (((instr & 0xf0000000) == 0xf0000000)) {
   56685                           UnallocatedA32(instr);
   56686                           return;
   56687                         }
   56688                         unsigned rd = (instr >> 12) & 0xf;
   56689                         unsigned rn = (instr >> 16) & 0xf;
   56690                         unsigned rm = instr & 0xf;
   56691                         // CRC32CW{<q>} <Rd>, <Rn>, <Rm> ; A1
   56692                         crc32cw(al, Register(rd), Register(rn), Register(rm));
   56693                         if (((instr & 0xff00ff0) != 0x1400240)) {
   56694                           UnpredictableA32(instr);
   56695                         }
   56696                         break;
   56697                       }
   56698                     }
   56699                     break;
   56700                   }
   56701                   case 0x00000080: {
   56702                     // 0x01000080
   56703                     switch (instr & 0x00400000) {
   56704                       case 0x00000000: {
   56705                         // 0x01000080
   56706                         if (((instr & 0xf0000000) == 0xf0000000)) {
   56707                           UnallocatedA32(instr);
   56708                           return;
   56709                         }
   56710                         Condition condition((instr >> 28) & 0xf);
   56711                         unsigned rd = (instr >> 16) & 0xf;
   56712                         unsigned rn = instr & 0xf;
   56713                         unsigned rm = (instr >> 8) & 0xf;
   56714                         unsigned ra = (instr >> 12) & 0xf;
   56715                         // SMLABB{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
   56716                         smlabb(condition,
   56717                                Register(rd),
   56718                                Register(rn),
   56719                                Register(rm),
   56720                                Register(ra));
   56721                         break;
   56722                       }
   56723                       case 0x00400000: {
   56724                         // 0x01400080
   56725                         if (((instr & 0xf0000000) == 0xf0000000)) {
   56726                           UnallocatedA32(instr);
   56727                           return;
   56728                         }
   56729                         Condition condition((instr >> 28) & 0xf);
   56730                         unsigned rdlo = (instr >> 12) & 0xf;
   56731                         unsigned rdhi = (instr >> 16) & 0xf;
   56732                         unsigned rn = instr & 0xf;
   56733                         unsigned rm = (instr >> 8) & 0xf;
   56734                         // SMLALBB{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
   56735                         smlalbb(condition,
   56736                                 Register(rdlo),
   56737                                 Register(rdhi),
   56738                                 Register(rn),
   56739                                 Register(rm));
   56740                         break;
   56741                       }
   56742                     }
   56743                     break;
   56744                   }
   56745                   case 0x000000a0: {
   56746                     // 0x010000a0
   56747                     switch (instr & 0x00400000) {
   56748                       case 0x00000000: {
   56749                         // 0x010000a0
   56750                         if (((instr & 0xf0000000) == 0xf0000000)) {
   56751                           UnallocatedA32(instr);
   56752                           return;
   56753                         }
   56754                         Condition condition((instr >> 28) & 0xf);
   56755                         unsigned rd = (instr >> 16) & 0xf;
   56756                         unsigned rn = instr & 0xf;
   56757                         unsigned rm = (instr >> 8) & 0xf;
   56758                         unsigned ra = (instr >> 12) & 0xf;
   56759                         // SMLATB{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
   56760                         smlatb(condition,
   56761                                Register(rd),
   56762                                Register(rn),
   56763                                Register(rm),
   56764                                Register(ra));
   56765                         break;
   56766                       }
   56767                       case 0x00400000: {
   56768                         // 0x014000a0
   56769                         if (((instr & 0xf0000000) == 0xf0000000)) {
   56770                           UnallocatedA32(instr);
   56771                           return;
   56772                         }
   56773                         Condition condition((instr >> 28) & 0xf);
   56774                         unsigned rdlo = (instr >> 12) & 0xf;
   56775                         unsigned rdhi = (instr >> 16) & 0xf;
   56776                         unsigned rn = instr & 0xf;
   56777                         unsigned rm = (instr >> 8) & 0xf;
   56778                         // SMLALTB{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
   56779                         smlaltb(condition,
   56780                                 Register(rdlo),
   56781                                 Register(rdhi),
   56782                                 Register(rn),
   56783                                 Register(rm));
   56784                         break;
   56785                       }
   56786                     }
   56787                     break;
   56788                   }
   56789                   case 0x000000c0: {
   56790                     // 0x010000c0
   56791                     switch (instr & 0x00400000) {
   56792                       case 0x00000000: {
   56793                         // 0x010000c0
   56794                         if (((instr & 0xf0000000) == 0xf0000000)) {
   56795                           UnallocatedA32(instr);
   56796                           return;
   56797                         }
   56798                         Condition condition((instr >> 28) & 0xf);
   56799                         unsigned rd = (instr >> 16) & 0xf;
   56800                         unsigned rn = instr & 0xf;
   56801                         unsigned rm = (instr >> 8) & 0xf;
   56802                         unsigned ra = (instr >> 12) & 0xf;
   56803                         // SMLABT{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
   56804                         smlabt(condition,
   56805                                Register(rd),
   56806                                Register(rn),
   56807                                Register(rm),
   56808                                Register(ra));
   56809                         break;
   56810                       }
   56811                       case 0x00400000: {
   56812                         // 0x014000c0
   56813                         if (((instr & 0xf0000000) == 0xf0000000)) {
   56814                           UnallocatedA32(instr);
   56815                           return;
   56816                         }
   56817                         Condition condition((instr >> 28) & 0xf);
   56818                         unsigned rdlo = (instr >> 12) & 0xf;
   56819                         unsigned rdhi = (instr >> 16) & 0xf;
   56820                         unsigned rn = instr & 0xf;
   56821                         unsigned rm = (instr >> 8) & 0xf;
   56822                         // SMLALBT{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
   56823                         smlalbt(condition,
   56824                                 Register(rdlo),
   56825                                 Register(rdhi),
   56826                                 Register(rn),
   56827                                 Register(rm));
   56828                         break;
   56829                       }
   56830                     }
   56831                     break;
   56832                   }
   56833                   case 0x000000e0: {
   56834                     // 0x010000e0
   56835                     switch (instr & 0x00400000) {
   56836                       case 0x00000000: {
   56837                         // 0x010000e0
   56838                         if (((instr & 0xf0000000) == 0xf0000000)) {
   56839                           UnallocatedA32(instr);
   56840                           return;
   56841                         }
   56842                         Condition condition((instr >> 28) & 0xf);
   56843                         unsigned rd = (instr >> 16) & 0xf;
   56844                         unsigned rn = instr & 0xf;
   56845                         unsigned rm = (instr >> 8) & 0xf;
   56846                         unsigned ra = (instr >> 12) & 0xf;
   56847                         // SMLATT{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
   56848                         smlatt(condition,
   56849                                Register(rd),
   56850                                Register(rn),
   56851                                Register(rm),
   56852                                Register(ra));
   56853                         break;
   56854                       }
   56855                       case 0x00400000: {
   56856                         // 0x014000e0
   56857                         if (((instr & 0xf0000000) == 0xf0000000)) {
   56858                           UnallocatedA32(instr);
   56859                           return;
   56860                         }
   56861                         Condition condition((instr >> 28) & 0xf);
   56862                         unsigned rdlo = (instr >> 12) & 0xf;
   56863                         unsigned rdhi = (instr >> 16) & 0xf;
   56864                         unsigned rn = instr & 0xf;
   56865                         unsigned rm = (instr >> 8) & 0xf;
   56866                         // SMLALTT{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
   56867                         smlaltt(condition,
   56868                                 Register(rdlo),
   56869                                 Register(rdhi),
   56870                                 Register(rn),
   56871                                 Register(rm));
   56872                         break;
   56873                       }
   56874                     }
   56875                     break;
   56876                   }
   56877                   default:
   56878                     UnallocatedA32(instr);
   56879                     break;
   56880                 }
   56881                 break;
   56882               }
   56883               case 0x01200000: {
   56884                 // 0x01200000
   56885                 switch (instr & 0x000000e0) {
   56886                   case 0x00000000: {
   56887                     // 0x01200000
   56888                     switch (instr & 0x00000200) {
   56889                       case 0x00000000: {
   56890                         // 0x01200000
   56891                         if (((instr & 0xf0000000) == 0xf0000000)) {
   56892                           UnallocatedA32(instr);
   56893                           return;
   56894                         }
   56895                         Condition condition((instr >> 28) & 0xf);
   56896                         unsigned spec_reg =
   56897                             ((instr >> 16) & 0xf) | ((instr >> 18) & 0x10);
   56898                         unsigned rn = instr & 0xf;
   56899                         // MSR{<c>}{<q>} <spec_reg>, <Rn> ; A1
   56900                         msr(condition,
   56901                             MaskedSpecialRegister(spec_reg),
   56902                             Register(rn));
   56903                         if (((instr & 0xfb0fff0) != 0x120f000)) {
   56904                           UnpredictableA32(instr);
   56905                         }
   56906                         break;
   56907                       }
   56908                       case 0x00000200: {
   56909                         // 0x01200200
   56910                         if (((instr & 0xf0000000) == 0xf0000000)) {
   56911                           UnallocatedA32(instr);
   56912                           return;
   56913                         }
   56914                         UnimplementedA32("MSR", instr);
   56915                         break;
   56916                       }
   56917                     }
   56918                     break;
   56919                   }
   56920                   case 0x00000020: {
   56921                     // 0x01200020
   56922                     if ((instr & 0x00400000) == 0x00000000) {
   56923                       if (((instr & 0xf0000000) == 0xf0000000)) {
   56924                         UnallocatedA32(instr);
   56925                         return;
   56926                       }
   56927                       Condition condition((instr >> 28) & 0xf);
   56928                       unsigned rm = instr & 0xf;
   56929                       // BXJ{<c>}{<q>} <Rm> ; A1
   56930                       bxj(condition, Register(rm));
   56931                       if (((instr & 0xffffff0) != 0x12fff20)) {
   56932                         UnpredictableA32(instr);
   56933                       }
   56934                     } else {
   56935                       UnallocatedA32(instr);
   56936                     }
   56937                     break;
   56938                   }
   56939                   case 0x00000040: {
   56940                     // 0x01200040
   56941                     switch (instr & 0x00400200) {
   56942                       case 0x00000000: {
   56943                         // 0x01200040
   56944                         if (((instr & 0xf0000000) == 0xf0000000)) {
   56945                           UnallocatedA32(instr);
   56946                           return;
   56947                         }
   56948                         unsigned rd = (instr >> 12) & 0xf;
   56949                         unsigned rn = (instr >> 16) & 0xf;
   56950                         unsigned rm = instr & 0xf;
   56951                         // CRC32H{<q>} <Rd>, <Rn>, <Rm> ; A1
   56952                         crc32h(al, Register(rd), Register(rn), Register(rm));
   56953                         if (((instr & 0xff00ff0) != 0x1200040)) {
   56954                           UnpredictableA32(instr);
   56955                         }
   56956                         break;
   56957                       }
   56958                       case 0x00000200: {
   56959                         // 0x01200240
   56960                         if (((instr & 0xf0000000) == 0xf0000000)) {
   56961                           UnallocatedA32(instr);
   56962                           return;
   56963                         }
   56964                         unsigned rd = (instr >> 12) & 0xf;
   56965                         unsigned rn = (instr >> 16) & 0xf;
   56966                         unsigned rm = instr & 0xf;
   56967                         // CRC32CH{<q>} <Rd>, <Rn>, <Rm> ; A1
   56968                         crc32ch(al, Register(rd), Register(rn), Register(rm));
   56969                         if (((instr & 0xff00ff0) != 0x1200240)) {
   56970                           UnpredictableA32(instr);
   56971                         }
   56972                         break;
   56973                       }
   56974                       default:
   56975                         UnallocatedA32(instr);
   56976                         break;
   56977                     }
   56978                     break;
   56979                   }
   56980                   case 0x00000060: {
   56981                     // 0x01200060
   56982                     if ((instr & 0x00400000) == 0x00400000) {
   56983                       if (((instr & 0xf0000000) == 0xf0000000)) {
   56984                         UnallocatedA32(instr);
   56985                         return;
   56986                       }
   56987                       UnimplementedA32("ERET", instr);
   56988                     } else {
   56989                       UnallocatedA32(instr);
   56990                     }
   56991                     break;
   56992                   }
   56993                   case 0x00000080: {
   56994                     // 0x01200080
   56995                     switch (instr & 0x00400000) {
   56996                       case 0x00000000: {
   56997                         // 0x01200080
   56998                         if (((instr & 0xf0000000) == 0xf0000000)) {
   56999                           UnallocatedA32(instr);
   57000                           return;
   57001                         }
   57002                         Condition condition((instr >> 28) & 0xf);
   57003                         unsigned rd = (instr >> 16) & 0xf;
   57004                         unsigned rn = instr & 0xf;
   57005                         unsigned rm = (instr >> 8) & 0xf;
   57006                         unsigned ra = (instr >> 12) & 0xf;
   57007                         // SMLAWB{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
   57008                         smlawb(condition,
   57009                                Register(rd),
   57010                                Register(rn),
   57011                                Register(rm),
   57012                                Register(ra));
   57013                         break;
   57014                       }
   57015                       case 0x00400000: {
   57016                         // 0x01600080
   57017                         if (((instr & 0xf0000000) == 0xf0000000)) {
   57018                           UnallocatedA32(instr);
   57019                           return;
   57020                         }
   57021                         Condition condition((instr >> 28) & 0xf);
   57022                         unsigned rd = (instr >> 16) & 0xf;
   57023                         unsigned rn = instr & 0xf;
   57024                         unsigned rm = (instr >> 8) & 0xf;
   57025                         // SMULBB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
   57026                         smulbb(condition,
   57027                                Register(rd),
   57028                                Register(rn),
   57029                                Register(rm));
   57030                         if (((instr & 0xff0f0f0) != 0x1600080)) {
   57031                           UnpredictableA32(instr);
   57032                         }
   57033                         break;
   57034                       }
   57035                     }
   57036                     break;
   57037                   }
   57038                   case 0x000000a0: {
   57039                     // 0x012000a0
   57040                     switch (instr & 0x00400000) {
   57041                       case 0x00000000: {
   57042                         // 0x012000a0
   57043                         if (((instr & 0xf0000000) == 0xf0000000)) {
   57044                           UnallocatedA32(instr);
   57045                           return;
   57046                         }
   57047                         Condition condition((instr >> 28) & 0xf);
   57048                         unsigned rd = (instr >> 16) & 0xf;
   57049                         unsigned rn = instr & 0xf;
   57050                         unsigned rm = (instr >> 8) & 0xf;
   57051                         // SMULWB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
   57052                         smulwb(condition,
   57053                                Register(rd),
   57054                                Register(rn),
   57055                                Register(rm));
   57056                         if (((instr & 0xff0f0f0) != 0x12000a0)) {
   57057                           UnpredictableA32(instr);
   57058                         }
   57059                         break;
   57060                       }
   57061                       case 0x00400000: {
   57062                         // 0x016000a0
   57063                         if (((instr & 0xf0000000) == 0xf0000000)) {
   57064                           UnallocatedA32(instr);
   57065                           return;
   57066                         }
   57067                         Condition condition((instr >> 28) & 0xf);
   57068                         unsigned rd = (instr >> 16) & 0xf;
   57069                         unsigned rn = instr & 0xf;
   57070                         unsigned rm = (instr >> 8) & 0xf;
   57071                         // SMULTB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
   57072                         smultb(condition,
   57073                                Register(rd),
   57074                                Register(rn),
   57075                                Register(rm));
   57076                         if (((instr & 0xff0f0f0) != 0x16000a0)) {
   57077                           UnpredictableA32(instr);
   57078                         }
   57079                         break;
   57080                       }
   57081                     }
   57082                     break;
   57083                   }
   57084                   case 0x000000c0: {
   57085                     // 0x012000c0
   57086                     switch (instr & 0x00400000) {
   57087                       case 0x00000000: {
   57088                         // 0x012000c0
   57089                         if (((instr & 0xf0000000) == 0xf0000000)) {
   57090                           UnallocatedA32(instr);
   57091                           return;
   57092                         }
   57093                         Condition condition((instr >> 28) & 0xf);
   57094                         unsigned rd = (instr >> 16) & 0xf;
   57095                         unsigned rn = instr & 0xf;
   57096                         unsigned rm = (instr >> 8) & 0xf;
   57097                         unsigned ra = (instr >> 12) & 0xf;
   57098                         // SMLAWT{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
   57099                         smlawt(condition,
   57100                                Register(rd),
   57101                                Register(rn),
   57102                                Register(rm),
   57103                                Register(ra));
   57104                         break;
   57105                       }
   57106                       case 0x00400000: {
   57107                         // 0x016000c0
   57108                         if (((instr & 0xf0000000) == 0xf0000000)) {
   57109                           UnallocatedA32(instr);
   57110                           return;
   57111                         }
   57112                         Condition condition((instr >> 28) & 0xf);
   57113                         unsigned rd = (instr >> 16) & 0xf;
   57114                         unsigned rn = instr & 0xf;
   57115                         unsigned rm = (instr >> 8) & 0xf;
   57116                         // SMULBT{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
   57117                         smulbt(condition,
   57118                                Register(rd),
   57119                                Register(rn),
   57120                                Register(rm));
   57121                         if (((instr & 0xff0f0f0) != 0x16000c0)) {
   57122                           UnpredictableA32(instr);
   57123                         }
   57124                         break;
   57125                       }
   57126                     }
   57127                     break;
   57128                   }
   57129                   case 0x000000e0: {
   57130                     // 0x012000e0
   57131                     switch (instr & 0x00400000) {
   57132                       case 0x00000000: {
   57133                         // 0x012000e0
   57134                         if (((instr & 0xf0000000) == 0xf0000000)) {
   57135                           UnallocatedA32(instr);
   57136                           return;
   57137                         }
   57138                         Condition condition((instr >> 28) & 0xf);
   57139                         unsigned rd = (instr >> 16) & 0xf;
   57140                         unsigned rn = instr & 0xf;
   57141                         unsigned rm = (instr >> 8) & 0xf;
   57142                         // SMULWT{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
   57143                         smulwt(condition,
   57144                                Register(rd),
   57145                                Register(rn),
   57146                                Register(rm));
   57147                         if (((instr & 0xff0f0f0) != 0x12000e0)) {
   57148                           UnpredictableA32(instr);
   57149                         }
   57150                         break;
   57151                       }
   57152                       case 0x00400000: {
   57153                         // 0x016000e0
   57154                         if (((instr & 0xf0000000) == 0xf0000000)) {
   57155                           UnallocatedA32(instr);
   57156                           return;
   57157                         }
   57158                         Condition condition((instr >> 28) & 0xf);
   57159                         unsigned rd = (instr >> 16) & 0xf;
   57160                         unsigned rn = instr & 0xf;
   57161                         unsigned rm = (instr >> 8) & 0xf;
   57162                         // SMULTT{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
   57163                         smultt(condition,
   57164                                Register(rd),
   57165                                Register(rn),
   57166                                Register(rm));
   57167                         if (((instr & 0xff0f0f0) != 0x16000e0)) {
   57168                           UnpredictableA32(instr);
   57169                         }
   57170                         break;
   57171                       }
   57172                     }
   57173                     break;
   57174                   }
   57175                 }
   57176                 break;
   57177               }
   57178               case 0x01800000: {
   57179                 // 0x01800000
   57180                 switch (instr & 0x00400000) {
   57181                   case 0x00000000: {
   57182                     // 0x01800000
   57183                     switch (instr & 0x00000fe0) {
   57184                       case 0x00000060: {
   57185                         // 0x01800060
   57186                         if (((instr & 0xf0000000) == 0xf0000000)) {
   57187                           UnallocatedA32(instr);
   57188                           return;
   57189                         }
   57190                         Condition condition((instr >> 28) & 0xf);
   57191                         unsigned rd = (instr >> 12) & 0xf;
   57192                         unsigned rn = (instr >> 16) & 0xf;
   57193                         unsigned rm = instr & 0xf;
   57194                         // ORR{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
   57195                         orr(condition,
   57196                             Best,
   57197                             Register(rd),
   57198                             Register(rn),
   57199                             Operand(Register(rm), RRX));
   57200                         break;
   57201                       }
   57202                       default: {
   57203                         if (((instr & 0xf0000000) == 0xf0000000) ||
   57204                             ((instr & 0xfe0) == 0x60)) {
   57205                           UnallocatedA32(instr);
   57206                           return;
   57207                         }
   57208                         Condition condition((instr >> 28) & 0xf);
   57209                         unsigned rd = (instr >> 12) & 0xf;
   57210                         unsigned rn = (instr >> 16) & 0xf;
   57211                         unsigned rm = instr & 0xf;
   57212                         ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
   57213                                                             (instr >> 7) &
   57214                                                                 0x1f);
   57215                         // ORR{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
   57216                         orr(condition,
   57217                             Best,
   57218                             Register(rd),
   57219                             Register(rn),
   57220                             Operand(Register(rm),
   57221                                     shift_operand.GetType(),
   57222                                     shift_operand.GetAmount()));
   57223                         break;
   57224                       }
   57225                     }
   57226                     break;
   57227                   }
   57228                   case 0x00400000: {
   57229                     // 0x01c00000
   57230                     switch (instr & 0x00000fe0) {
   57231                       case 0x00000060: {
   57232                         // 0x01c00060
   57233                         if (((instr & 0xf0000000) == 0xf0000000)) {
   57234                           UnallocatedA32(instr);
   57235                           return;
   57236                         }
   57237                         Condition condition((instr >> 28) & 0xf);
   57238                         unsigned rd = (instr >> 12) & 0xf;
   57239                         unsigned rn = (instr >> 16) & 0xf;
   57240                         unsigned rm = instr & 0xf;
   57241                         // BIC{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
   57242                         bic(condition,
   57243                             Best,
   57244                             Register(rd),
   57245                             Register(rn),
   57246                             Operand(Register(rm), RRX));
   57247                         break;
   57248                       }
   57249                       default: {
   57250                         if (((instr & 0xf0000000) == 0xf0000000) ||
   57251                             ((instr & 0xfe0) == 0x60)) {
   57252                           UnallocatedA32(instr);
   57253                           return;
   57254                         }
   57255                         Condition condition((instr >> 28) & 0xf);
   57256                         unsigned rd = (instr >> 12) & 0xf;
   57257                         unsigned rn = (instr >> 16) & 0xf;
   57258                         unsigned rm = instr & 0xf;
   57259                         ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
   57260                                                             (instr >> 7) &
   57261                                                                 0x1f);
   57262                         // BIC{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
   57263                         bic(condition,
   57264                             Best,
   57265                             Register(rd),
   57266                             Register(rn),
   57267                             Operand(Register(rm),
   57268                                     shift_operand.GetType(),
   57269                                     shift_operand.GetAmount()));
   57270                         break;
   57271                       }
   57272                     }
   57273                     break;
   57274                   }
   57275                 }
   57276                 break;
   57277               }
   57278               case 0x01a00000: {
   57279                 // 0x01a00000
   57280                 switch (instr & 0x00400000) {
   57281                   case 0x00000000: {
   57282                     // 0x01a00000
   57283                     switch (instr & 0x00000fe0) {
   57284                       case 0x00000060: {
   57285                         // 0x01a00060
   57286                         if (((instr & 0xf0000000) == 0xf0000000)) {
   57287                           UnallocatedA32(instr);
   57288                           return;
   57289                         }
   57290                         if (((instr & 0xf0000000) != 0xf0000000)) {
   57291                           Condition condition((instr >> 28) & 0xf);
   57292                           unsigned rd = (instr >> 12) & 0xf;
   57293                           unsigned rm = instr & 0xf;
   57294                           // RRX{<c>}{<q>} {<Rd>}, <Rm> ; A1
   57295                           rrx(condition, Register(rd), Register(rm));
   57296                           if (((instr & 0xfff0ff0) != 0x1a00060)) {
   57297                             UnpredictableA32(instr);
   57298                           }
   57299                           return;
   57300                         }
   57301                         Condition condition((instr >> 28) & 0xf);
   57302                         unsigned rd = (instr >> 12) & 0xf;
   57303                         unsigned rm = instr & 0xf;
   57304                         // MOV{<c>}{<q>} <Rd>, <Rm>, RRX ; A1
   57305                         mov(condition,
   57306                             Best,
   57307                             Register(rd),
   57308                             Operand(Register(rm), RRX));
   57309                         if (((instr & 0xfff0ff0) != 0x1a00060)) {
   57310                           UnpredictableA32(instr);
   57311                         }
   57312                         break;
   57313                       }
   57314                       default: {
   57315                         if (((instr & 0xf0000000) == 0xf0000000) ||
   57316                             ((instr & 0xfe0) == 0x60)) {
   57317                           UnallocatedA32(instr);
   57318                           return;
   57319                         }
   57320                         if (((Uint32((instr >> 5)) & Uint32(0x3)) ==
   57321                              Uint32(0x2)) &&
   57322                             ((instr & 0xf0000000) != 0xf0000000)) {
   57323                           Condition condition((instr >> 28) & 0xf);
   57324                           unsigned rd = (instr >> 12) & 0xf;
   57325                           unsigned rm = instr & 0xf;
   57326                           uint32_t amount = (instr >> 7) & 0x1f;
   57327                           if (amount == 0) amount = 32;
   57328                           // ASR{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; A1
   57329                           asr(condition,
   57330                               Best,
   57331                               Register(rd),
   57332                               Register(rm),
   57333                               amount);
   57334                           if (((instr & 0xfff0070) != 0x1a00040)) {
   57335                             UnpredictableA32(instr);
   57336                           }
   57337                           return;
   57338                         }
   57339                         if (((Uint32((instr >> 5)) & Uint32(0x3)) ==
   57340                              Uint32(0x0)) &&
   57341                             ((instr & 0xf0000000) != 0xf0000000) &&
   57342                             ((instr & 0x00000f80) != 0x00000000)) {
   57343                           Condition condition((instr >> 28) & 0xf);
   57344                           unsigned rd = (instr >> 12) & 0xf;
   57345                           unsigned rm = instr & 0xf;
   57346                           uint32_t amount = (instr >> 7) & 0x1f;
   57347                           // LSL{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; A1
   57348                           lsl(condition,
   57349                               Best,
   57350                               Register(rd),
   57351                               Register(rm),
   57352                               amount);
   57353                           if (((instr & 0xfff0070) != 0x1a00000)) {
   57354                             UnpredictableA32(instr);
   57355                           }
   57356                           return;
   57357                         }
   57358                         if (((Uint32((instr >> 5)) & Uint32(0x3)) ==
   57359                              Uint32(0x1)) &&
   57360                             ((instr & 0xf0000000) != 0xf0000000)) {
   57361                           Condition condition((instr >> 28) & 0xf);
   57362                           unsigned rd = (instr >> 12) & 0xf;
   57363                           unsigned rm = instr & 0xf;
   57364                           uint32_t amount = (instr >> 7) & 0x1f;
   57365                           if (amount == 0) amount = 32;
   57366                           // LSR{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; A1
   57367                           lsr(condition,
   57368                               Best,
   57369                               Register(rd),
   57370                               Register(rm),
   57371                               amount);
   57372                           if (((instr & 0xfff0070) != 0x1a00020)) {
   57373                             UnpredictableA32(instr);
   57374                           }
   57375                           return;
   57376                         }
   57377                         if (((Uint32((instr >> 5)) & Uint32(0x3)) ==
   57378                              Uint32(0x3)) &&
   57379                             ((instr & 0xf0000000) != 0xf0000000) &&
   57380                             ((instr & 0x00000f80) != 0x00000000)) {
   57381                           Condition condition((instr >> 28) & 0xf);
   57382                           unsigned rd = (instr >> 12) & 0xf;
   57383                           unsigned rm = instr & 0xf;
   57384                           uint32_t amount = (instr >> 7) & 0x1f;
   57385                           // ROR{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; A1
   57386                           ror(condition,
   57387                               Best,
   57388                               Register(rd),
   57389                               Register(rm),
   57390                               amount);
   57391                           if (((instr & 0xfff0070) != 0x1a00060)) {
   57392                             UnpredictableA32(instr);
   57393                           }
   57394                           return;
   57395                         }
   57396                         Condition condition((instr >> 28) & 0xf);
   57397                         unsigned rd = (instr >> 12) & 0xf;
   57398                         unsigned rm = instr & 0xf;
   57399                         ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
   57400                                                             (instr >> 7) &
   57401                                                                 0x1f);
   57402                         // MOV{<c>}{<q>} <Rd>, <Rm> {, <shift> #<amount> } ; A1
   57403                         mov(condition,
   57404                             Best,
   57405                             Register(rd),
   57406                             Operand(Register(rm),
   57407                                     shift_operand.GetType(),
   57408                                     shift_operand.GetAmount()));
   57409                         if (((instr & 0xfff0010) != 0x1a00000)) {
   57410                           UnpredictableA32(instr);
   57411                         }
   57412                         break;
   57413                       }
   57414                     }
   57415                     break;
   57416                   }
   57417                   case 0x00400000: {
   57418                     // 0x01e00000
   57419                     switch (instr & 0x00000fe0) {
   57420                       case 0x00000060: {
   57421                         // 0x01e00060
   57422                         if (((instr & 0xf0000000) == 0xf0000000)) {
   57423                           UnallocatedA32(instr);
   57424                           return;
   57425                         }
   57426                         Condition condition((instr >> 28) & 0xf);
   57427                         unsigned rd = (instr >> 12) & 0xf;
   57428                         unsigned rm = instr & 0xf;
   57429                         // MVN{<c>}{<q>} <Rd>, <Rm>, RRX ; A1
   57430                         mvn(condition,
   57431                             Best,
   57432                             Register(rd),
   57433                             Operand(Register(rm), RRX));
   57434                         if (((instr & 0xfff0ff0) != 0x1e00060)) {
   57435                           UnpredictableA32(instr);
   57436                         }
   57437                         break;
   57438                       }
   57439                       default: {
   57440                         if (((instr & 0xf0000000) == 0xf0000000) ||
   57441                             ((instr & 0xfe0) == 0x60)) {
   57442                           UnallocatedA32(instr);
   57443                           return;
   57444                         }
   57445                         Condition condition((instr >> 28) & 0xf);
   57446                         unsigned rd = (instr >> 12) & 0xf;
   57447                         unsigned rm = instr & 0xf;
   57448                         ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
   57449                                                             (instr >> 7) &
   57450                                                                 0x1f);
   57451                         // MVN{<c>}{<q>} <Rd>, <Rm> {, <shift> #<amount> } ; A1
   57452                         mvn(condition,
   57453                             Best,
   57454                             Register(rd),
   57455                             Operand(Register(rm),
   57456                                     shift_operand.GetType(),
   57457                                     shift_operand.GetAmount()));
   57458                         if (((instr & 0xfff0010) != 0x1e00000)) {
   57459                           UnpredictableA32(instr);
   57460                         }
   57461                         break;
   57462                       }
   57463                     }
   57464                     break;
   57465                   }
   57466                 }
   57467                 break;
   57468               }
   57469             }
   57470             break;
   57471           }
   57472           case 0x00000010: {
   57473             // 0x00000010
   57474             switch (instr & 0x00400080) {
   57475               case 0x00000000: {
   57476                 // 0x00000010
   57477                 switch (instr & 0x01a00000) {
   57478                   case 0x00000000: {
   57479                     // 0x00000010
   57480                     if (((instr & 0xf0000000) == 0xf0000000)) {
   57481                       UnallocatedA32(instr);
   57482                       return;
   57483                     }
   57484                     Condition condition((instr >> 28) & 0xf);
   57485                     unsigned rd = (instr >> 12) & 0xf;
   57486                     unsigned rn = (instr >> 16) & 0xf;
   57487                     unsigned rm = instr & 0xf;
   57488                     Shift shift((instr >> 5) & 0x3);
   57489                     unsigned rs = (instr >> 8) & 0xf;
   57490                     // AND{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
   57491                     and_(condition,
   57492                          Best,
   57493                          Register(rd),
   57494                          Register(rn),
   57495                          Operand(Register(rm), shift.GetType(), Register(rs)));
   57496                     break;
   57497                   }
   57498                   case 0x00200000: {
   57499                     // 0x00200010
   57500                     if (((instr & 0xf0000000) == 0xf0000000)) {
   57501                       UnallocatedA32(instr);
   57502                       return;
   57503                     }
   57504                     Condition condition((instr >> 28) & 0xf);
   57505                     unsigned rd = (instr >> 12) & 0xf;
   57506                     unsigned rn = (instr >> 16) & 0xf;
   57507                     unsigned rm = instr & 0xf;
   57508                     Shift shift((instr >> 5) & 0x3);
   57509                     unsigned rs = (instr >> 8) & 0xf;
   57510                     // EOR{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
   57511                     eor(condition,
   57512                         Best,
   57513                         Register(rd),
   57514                         Register(rn),
   57515                         Operand(Register(rm), shift.GetType(), Register(rs)));
   57516                     break;
   57517                   }
   57518                   case 0x00800000: {
   57519                     // 0x00800010
   57520                     if (((instr & 0xf0000000) == 0xf0000000)) {
   57521                       UnallocatedA32(instr);
   57522                       return;
   57523                     }
   57524                     Condition condition((instr >> 28) & 0xf);
   57525                     unsigned rd = (instr >> 12) & 0xf;
   57526                     unsigned rn = (instr >> 16) & 0xf;
   57527                     unsigned rm = instr & 0xf;
   57528                     Shift shift((instr >> 5) & 0x3);
   57529                     unsigned rs = (instr >> 8) & 0xf;
   57530                     // ADD{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
   57531                     add(condition,
   57532                         Best,
   57533                         Register(rd),
   57534                         Register(rn),
   57535                         Operand(Register(rm), shift.GetType(), Register(rs)));
   57536                     break;
   57537                   }
   57538                   case 0x00a00000: {
   57539                     // 0x00a00010
   57540                     if (((instr & 0xf0000000) == 0xf0000000)) {
   57541                       UnallocatedA32(instr);
   57542                       return;
   57543                     }
   57544                     Condition condition((instr >> 28) & 0xf);
   57545                     unsigned rd = (instr >> 12) & 0xf;
   57546                     unsigned rn = (instr >> 16) & 0xf;
   57547                     unsigned rm = instr & 0xf;
   57548                     Shift shift((instr >> 5) & 0x3);
   57549                     unsigned rs = (instr >> 8) & 0xf;
   57550                     // ADC{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
   57551                     adc(condition,
   57552                         Best,
   57553                         Register(rd),
   57554                         Register(rn),
   57555                         Operand(Register(rm), shift.GetType(), Register(rs)));
   57556                     break;
   57557                   }
   57558                   case 0x01000000: {
   57559                     // 0x01000010
   57560                     switch (instr & 0x00000060) {
   57561                       case 0x00000040: {
   57562                         // 0x01000050
   57563                         if (((instr & 0xf0000000) == 0xf0000000)) {
   57564                           UnallocatedA32(instr);
   57565                           return;
   57566                         }
   57567                         Condition condition((instr >> 28) & 0xf);
   57568                         unsigned rd = (instr >> 12) & 0xf;
   57569                         unsigned rm = instr & 0xf;
   57570                         unsigned rn = (instr >> 16) & 0xf;
   57571                         // QADD{<c>}{<q>} {<Rd>}, <Rm>, <Rn> ; A1
   57572                         qadd(condition,
   57573                              Register(rd),
   57574                              Register(rm),
   57575                              Register(rn));
   57576                         if (((instr & 0xff00ff0) != 0x1000050)) {
   57577                           UnpredictableA32(instr);
   57578                         }
   57579                         break;
   57580                       }
   57581                       case 0x00000060: {
   57582                         // 0x01000070
   57583                         if (((instr & 0xf0000000) == 0xf0000000)) {
   57584                           UnallocatedA32(instr);
   57585                           return;
   57586                         }
   57587                         uint32_t imm = (instr & 0xf) | ((instr >> 4) & 0xfff0);
   57588                         // HLT{<q>} {#}<imm> ; A1
   57589                         hlt(al, imm);
   57590                         break;
   57591                       }
   57592                       default:
   57593                         UnallocatedA32(instr);
   57594                         break;
   57595                     }
   57596                     break;
   57597                   }
   57598                   case 0x01200000: {
   57599                     // 0x01200010
   57600                     switch (instr & 0x00000060) {
   57601                       case 0x00000000: {
   57602                         // 0x01200010
   57603                         if (((instr & 0xf0000000) == 0xf0000000)) {
   57604                           UnallocatedA32(instr);
   57605                           return;
   57606                         }
   57607                         Condition condition((instr >> 28) & 0xf);
   57608                         unsigned rm = instr & 0xf;
   57609                         // BX{<c>}{<q>} <Rm> ; A1
   57610                         bx(condition, Register(rm));
   57611                         if (((instr & 0xffffff0) != 0x12fff10)) {
   57612                           UnpredictableA32(instr);
   57613                         }
   57614                         break;
   57615                       }
   57616                       case 0x00000020: {
   57617                         // 0x01200030
   57618                         if (((instr & 0xf0000000) == 0xf0000000)) {
   57619                           UnallocatedA32(instr);
   57620                           return;
   57621                         }
   57622                         Condition condition((instr >> 28) & 0xf);
   57623                         unsigned rm = instr & 0xf;
   57624                         // BLX{<c>}{<q>} <Rm> ; A1
   57625                         blx(condition, Register(rm));
   57626                         if (((instr & 0xffffff0) != 0x12fff30)) {
   57627                           UnpredictableA32(instr);
   57628                         }
   57629                         break;
   57630                       }
   57631                       case 0x00000040: {
   57632                         // 0x01200050
   57633                         if (((instr & 0xf0000000) == 0xf0000000)) {
   57634                           UnallocatedA32(instr);
   57635                           return;
   57636                         }
   57637                         Condition condition((instr >> 28) & 0xf);
   57638                         unsigned rd = (instr >> 12) & 0xf;
   57639                         unsigned rm = instr & 0xf;
   57640                         unsigned rn = (instr >> 16) & 0xf;
   57641                         // QSUB{<c>}{<q>} {<Rd>}, <Rm>, <Rn> ; A1
   57642                         qsub(condition,
   57643                              Register(rd),
   57644                              Register(rm),
   57645                              Register(rn));
   57646                         if (((instr & 0xff00ff0) != 0x1200050)) {
   57647                           UnpredictableA32(instr);
   57648                         }
   57649                         break;
   57650                       }
   57651                       case 0x00000060: {
   57652                         // 0x01200070
   57653                         if (((instr & 0xf0000000) == 0xf0000000)) {
   57654                           UnallocatedA32(instr);
   57655                           return;
   57656                         }
   57657                         uint32_t imm = (instr & 0xf) | ((instr >> 4) & 0xfff0);
   57658                         // BKPT{<q>} {#}<imm> ; A1
   57659                         bkpt(al, imm);
   57660                         break;
   57661                       }
   57662                     }
   57663                     break;
   57664                   }
   57665                   case 0x01800000: {
   57666                     // 0x01800010
   57667                     if (((instr & 0xf0000000) == 0xf0000000)) {
   57668                       UnallocatedA32(instr);
   57669                       return;
   57670                     }
   57671                     Condition condition((instr >> 28) & 0xf);
   57672                     unsigned rd = (instr >> 12) & 0xf;
   57673                     unsigned rn = (instr >> 16) & 0xf;
   57674                     unsigned rm = instr & 0xf;
   57675                     Shift shift((instr >> 5) & 0x3);
   57676                     unsigned rs = (instr >> 8) & 0xf;
   57677                     // ORR{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
   57678                     orr(condition,
   57679                         Best,
   57680                         Register(rd),
   57681                         Register(rn),
   57682                         Operand(Register(rm), shift.GetType(), Register(rs)));
   57683                     break;
   57684                   }
   57685                   case 0x01a00000: {
   57686                     // 0x01a00010
   57687                     if (((instr & 0xf0000000) == 0xf0000000)) {
   57688                       UnallocatedA32(instr);
   57689                       return;
   57690                     }
   57691                     if (((Uint32((instr >> 5)) & Uint32(0x3)) == Uint32(0x2)) &&
   57692                         ((instr & 0xf0000000) != 0xf0000000)) {
   57693                       Condition condition((instr >> 28) & 0xf);
   57694                       unsigned rd = (instr >> 12) & 0xf;
   57695                       unsigned rm = instr & 0xf;
   57696                       unsigned rs = (instr >> 8) & 0xf;
   57697                       // ASR{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; A1
   57698                       asr(condition,
   57699                           Best,
   57700                           Register(rd),
   57701                           Register(rm),
   57702                           Register(rs));
   57703                       if (((instr & 0xfff00f0) != 0x1a00050)) {
   57704                         UnpredictableA32(instr);
   57705                       }
   57706                       return;
   57707                     }
   57708                     if (((Uint32((instr >> 5)) & Uint32(0x3)) == Uint32(0x0)) &&
   57709                         ((instr & 0xf0000000) != 0xf0000000)) {
   57710                       Condition condition((instr >> 28) & 0xf);
   57711                       unsigned rd = (instr >> 12) & 0xf;
   57712                       unsigned rm = instr & 0xf;
   57713                       unsigned rs = (instr >> 8) & 0xf;
   57714                       // LSL{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; A1
   57715                       lsl(condition,
   57716                           Best,
   57717                           Register(rd),
   57718                           Register(rm),
   57719                           Register(rs));
   57720                       if (((instr & 0xfff00f0) != 0x1a00010)) {
   57721                         UnpredictableA32(instr);
   57722                       }
   57723                       return;
   57724                     }
   57725                     if (((Uint32((instr >> 5)) & Uint32(0x3)) == Uint32(0x1)) &&
   57726                         ((instr & 0xf0000000) != 0xf0000000)) {
   57727                       Condition condition((instr >> 28) & 0xf);
   57728                       unsigned rd = (instr >> 12) & 0xf;
   57729                       unsigned rm = instr & 0xf;
   57730                       unsigned rs = (instr >> 8) & 0xf;
   57731                       // LSR{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; A1
   57732                       lsr(condition,
   57733                           Best,
   57734                           Register(rd),
   57735                           Register(rm),
   57736                           Register(rs));
   57737                       if (((instr & 0xfff00f0) != 0x1a00030)) {
   57738                         UnpredictableA32(instr);
   57739                       }
   57740                       return;
   57741                     }
   57742                     if (((Uint32((instr >> 5)) & Uint32(0x3)) == Uint32(0x3)) &&
   57743                         ((instr & 0xf0000000) != 0xf0000000)) {
   57744                       Condition condition((instr >> 28) & 0xf);
   57745                       unsigned rd = (instr >> 12) & 0xf;
   57746                       unsigned rm = instr & 0xf;
   57747                       unsigned rs = (instr >> 8) & 0xf;
   57748                       // ROR{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; A1
   57749                       ror(condition,
   57750                           Best,
   57751                           Register(rd),
   57752                           Register(rm),
   57753                           Register(rs));
   57754                       if (((instr & 0xfff00f0) != 0x1a00070)) {
   57755                         UnpredictableA32(instr);
   57756                       }
   57757                       return;
   57758                     }
   57759                     Condition condition((instr >> 28) & 0xf);
   57760                     unsigned rd = (instr >> 12) & 0xf;
   57761                     unsigned rm = instr & 0xf;
   57762                     Shift shift((instr >> 5) & 0x3);
   57763                     unsigned rs = (instr >> 8) & 0xf;
   57764                     // MOV{<c>}{<q>} <Rd>, <Rm>, <shift> <Rs> ; A1
   57765                     mov(condition,
   57766                         Best,
   57767                         Register(rd),
   57768                         Operand(Register(rm), shift.GetType(), Register(rs)));
   57769                     if (((instr & 0xfff0090) != 0x1a00010)) {
   57770                       UnpredictableA32(instr);
   57771                     }
   57772                     break;
   57773                   }
   57774                 }
   57775                 break;
   57776               }
   57777               case 0x00000080: {
   57778                 // 0x00000090
   57779                 switch (instr & 0x01200060) {
   57780                   case 0x00000000: {
   57781                     // 0x00000090
   57782                     switch (instr & 0x00800000) {
   57783                       case 0x00000000: {
   57784                         // 0x00000090
   57785                         if (((instr & 0xf0000000) == 0xf0000000)) {
   57786                           UnallocatedA32(instr);
   57787                           return;
   57788                         }
   57789                         Condition condition((instr >> 28) & 0xf);
   57790                         unsigned rd = (instr >> 16) & 0xf;
   57791                         unsigned rn = instr & 0xf;
   57792                         unsigned rm = (instr >> 8) & 0xf;
   57793                         // MUL{<c>}{<q>} <Rd>, <Rn>, {<Rm>} ; A1
   57794                         mul(condition,
   57795                             Best,
   57796                             Register(rd),
   57797                             Register(rn),
   57798                             Register(rm));
   57799                         if (((instr & 0xff0f0f0) != 0x90)) {
   57800                           UnpredictableA32(instr);
   57801                         }
   57802                         break;
   57803                       }
   57804                       case 0x00800000: {
   57805                         // 0x00800090
   57806                         if (((instr & 0xf0000000) == 0xf0000000)) {
   57807                           UnallocatedA32(instr);
   57808                           return;
   57809                         }
   57810                         Condition condition((instr >> 28) & 0xf);
   57811                         unsigned rdlo = (instr >> 12) & 0xf;
   57812                         unsigned rdhi = (instr >> 16) & 0xf;
   57813                         unsigned rn = instr & 0xf;
   57814                         unsigned rm = (instr >> 8) & 0xf;
   57815                         // UMULL{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
   57816                         umull(condition,
   57817                               Register(rdlo),
   57818                               Register(rdhi),
   57819                               Register(rn),
   57820                               Register(rm));
   57821                         break;
   57822                       }
   57823                     }
   57824                     break;
   57825                   }
   57826                   case 0x00000020: {
   57827                     // 0x000000b0
   57828                     if (((instr & 0xf0000000) == 0xf0000000)) {
   57829                       UnallocatedA32(instr);
   57830                       return;
   57831                     }
   57832                     Condition condition((instr >> 28) & 0xf);
   57833                     unsigned rt = (instr >> 12) & 0xf;
   57834                     unsigned rn = (instr >> 16) & 0xf;
   57835                     Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
   57836                     unsigned rm = instr & 0xf;
   57837                     // STRH{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<Rm> ; A1
   57838                     strh(condition,
   57839                          Best,
   57840                          Register(rt),
   57841                          MemOperand(Register(rn),
   57842                                     sign,
   57843                                     Register(rm),
   57844                                     PostIndex));
   57845                     if (((instr & 0xf700ff0) != 0xb0)) {
   57846                       UnpredictableA32(instr);
   57847                     }
   57848                     break;
   57849                   }
   57850                   case 0x00000040: {
   57851                     // 0x000000d0
   57852                     if (((instr & 0xf0000000) == 0xf0000000)) {
   57853                       UnallocatedA32(instr);
   57854                       return;
   57855                     }
   57856                     Condition condition((instr >> 28) & 0xf);
   57857                     unsigned rt = (instr >> 12) & 0xf;
   57858                     unsigned rn = (instr >> 16) & 0xf;
   57859                     Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
   57860                     unsigned rm = instr & 0xf;
   57861                     // LDRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>], #{+/-}<Rm> ; A1
   57862                     ldrd(condition,
   57863                          Register(rt),
   57864                          Register(rt + 1),
   57865                          MemOperand(Register(rn),
   57866                                     sign,
   57867                                     Register(rm),
   57868                                     PostIndex));
   57869                     if (((instr & 0xf700ff0) != 0xd0)) {
   57870                       UnpredictableA32(instr);
   57871                     }
   57872                     break;
   57873                   }
   57874                   case 0x00000060: {
   57875                     // 0x000000f0
   57876                     if (((instr & 0xf0000000) == 0xf0000000)) {
   57877                       UnallocatedA32(instr);
   57878                       return;
   57879                     }
   57880                     Condition condition((instr >> 28) & 0xf);
   57881                     unsigned rt = (instr >> 12) & 0xf;
   57882                     unsigned rn = (instr >> 16) & 0xf;
   57883                     Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
   57884                     unsigned rm = instr & 0xf;
   57885                     // STRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>], #{+/-}<Rm> ; A1
   57886                     strd(condition,
   57887                          Register(rt),
   57888                          Register(rt + 1),
   57889                          MemOperand(Register(rn),
   57890                                     sign,
   57891                                     Register(rm),
   57892                                     PostIndex));
   57893                     if (((instr & 0xf700ff0) != 0xf0)) {
   57894                       UnpredictableA32(instr);
   57895                     }
   57896                     break;
   57897                   }
   57898                   case 0x00200000: {
   57899                     // 0x00200090
   57900                     switch (instr & 0x00800000) {
   57901                       case 0x00000000: {
   57902                         // 0x00200090
   57903                         if (((instr & 0xf0000000) == 0xf0000000)) {
   57904                           UnallocatedA32(instr);
   57905                           return;
   57906                         }
   57907                         Condition condition((instr >> 28) & 0xf);
   57908                         unsigned rd = (instr >> 16) & 0xf;
   57909                         unsigned rn = instr & 0xf;
   57910                         unsigned rm = (instr >> 8) & 0xf;
   57911                         unsigned ra = (instr >> 12) & 0xf;
   57912                         // MLA{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
   57913                         mla(condition,
   57914                             Register(rd),
   57915                             Register(rn),
   57916                             Register(rm),
   57917                             Register(ra));
   57918                         break;
   57919                       }
   57920                       case 0x00800000: {
   57921                         // 0x00a00090
   57922                         if (((instr & 0xf0000000) == 0xf0000000)) {
   57923                           UnallocatedA32(instr);
   57924                           return;
   57925                         }
   57926                         Condition condition((instr >> 28) & 0xf);
   57927                         unsigned rdlo = (instr >> 12) & 0xf;
   57928                         unsigned rdhi = (instr >> 16) & 0xf;
   57929                         unsigned rn = instr & 0xf;
   57930                         unsigned rm = (instr >> 8) & 0xf;
   57931                         // UMLAL{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
   57932                         umlal(condition,
   57933                               Register(rdlo),
   57934                               Register(rdhi),
   57935                               Register(rn),
   57936                               Register(rm));
   57937                         break;
   57938                       }
   57939                     }
   57940                     break;
   57941                   }
   57942                   case 0x00200020: {
   57943                     // 0x002000b0
   57944                     if (((instr & 0xf0000000) == 0xf0000000)) {
   57945                       UnallocatedA32(instr);
   57946                       return;
   57947                     }
   57948                     UnimplementedA32("STRHT", instr);
   57949                     break;
   57950                   }
   57951                   case 0x01000000: {
   57952                     // 0x01000090
   57953                     switch (instr & 0x00800300) {
   57954                       case 0x00800000: {
   57955                         // 0x01800090
   57956                         if (((instr & 0xf0000000) == 0xf0000000)) {
   57957                           UnallocatedA32(instr);
   57958                           return;
   57959                         }
   57960                         Condition condition((instr >> 28) & 0xf);
   57961                         unsigned rt = instr & 0xf;
   57962                         unsigned rn = (instr >> 16) & 0xf;
   57963                         // STL{<c>}{<q>} <Rt>, [<Rn>] ; A1
   57964                         stl(condition,
   57965                             Register(rt),
   57966                             MemOperand(Register(rn), Offset));
   57967                         if (((instr & 0xff0fff0) != 0x180fc90)) {
   57968                           UnpredictableA32(instr);
   57969                         }
   57970                         break;
   57971                       }
   57972                       case 0x00800200: {
   57973                         // 0x01800290
   57974                         if (((instr & 0xf0000000) == 0xf0000000)) {
   57975                           UnallocatedA32(instr);
   57976                           return;
   57977                         }
   57978                         Condition condition((instr >> 28) & 0xf);
   57979                         unsigned rd = (instr >> 12) & 0xf;
   57980                         unsigned rt = instr & 0xf;
   57981                         unsigned rn = (instr >> 16) & 0xf;
   57982                         // STLEX{<c>}{<q>} <Rd>, <Rt>, [<Rn>] ; A1
   57983                         stlex(condition,
   57984                               Register(rd),
   57985                               Register(rt),
   57986                               MemOperand(Register(rn), Offset));
   57987                         if (((instr & 0xff00ff0) != 0x1800e90)) {
   57988                           UnpredictableA32(instr);
   57989                         }
   57990                         break;
   57991                       }
   57992                       case 0x00800300: {
   57993                         // 0x01800390
   57994                         if (((instr & 0xf0000000) == 0xf0000000)) {
   57995                           UnallocatedA32(instr);
   57996                           return;
   57997                         }
   57998                         Condition condition((instr >> 28) & 0xf);
   57999                         unsigned rd = (instr >> 12) & 0xf;
   58000                         unsigned rt = instr & 0xf;
   58001                         unsigned rn = (instr >> 16) & 0xf;
   58002                         // STREX{<c>}{<q>} <Rd>, <Rt>, [<Rn>{, #<imm_1>}] ; A1
   58003                         strex(condition,
   58004                               Register(rd),
   58005                               Register(rt),
   58006                               MemOperand(Register(rn), plus, 0, Offset));
   58007                         if (((instr & 0xff00ff0) != 0x1800f90)) {
   58008                           UnpredictableA32(instr);
   58009                         }
   58010                         break;
   58011                       }
   58012                       default:
   58013                         UnallocatedA32(instr);
   58014                         break;
   58015                     }
   58016                     break;
   58017                   }
   58018                   case 0x01000020: {
   58019                     // 0x010000b0
   58020                     if (((instr & 0xf0000000) == 0xf0000000)) {
   58021                       UnallocatedA32(instr);
   58022                       return;
   58023                     }
   58024                     Condition condition((instr >> 28) & 0xf);
   58025                     unsigned rt = (instr >> 12) & 0xf;
   58026                     unsigned rn = (instr >> 16) & 0xf;
   58027                     Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
   58028                     unsigned rm = instr & 0xf;
   58029                     AddrMode addrmode = Offset;
   58030                     // STRH{<c>}{<q>} <Rt>, [<Rn>, #{+/-}<Rm>] ; A1
   58031                     strh(condition,
   58032                          Best,
   58033                          Register(rt),
   58034                          MemOperand(Register(rn),
   58035                                     sign,
   58036                                     Register(rm),
   58037                                     addrmode));
   58038                     if (((instr & 0xf700ff0) != 0x10000b0)) {
   58039                       UnpredictableA32(instr);
   58040                     }
   58041                     break;
   58042                   }
   58043                   case 0x01000040: {
   58044                     // 0x010000d0
   58045                     if (((instr & 0xf0000000) == 0xf0000000)) {
   58046                       UnallocatedA32(instr);
   58047                       return;
   58048                     }
   58049                     Condition condition((instr >> 28) & 0xf);
   58050                     unsigned rt = (instr >> 12) & 0xf;
   58051                     unsigned rn = (instr >> 16) & 0xf;
   58052                     Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
   58053                     unsigned rm = instr & 0xf;
   58054                     AddrMode addrmode = Offset;
   58055                     // LDRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>, #{+/-}<Rm>] ; A1
   58056                     ldrd(condition,
   58057                          Register(rt),
   58058                          Register(rt + 1),
   58059                          MemOperand(Register(rn),
   58060                                     sign,
   58061                                     Register(rm),
   58062                                     addrmode));
   58063                     if (((instr & 0xf700ff0) != 0x10000d0)) {
   58064                       UnpredictableA32(instr);
   58065                     }
   58066                     break;
   58067                   }
   58068                   case 0x01000060: {
   58069                     // 0x010000f0
   58070                     if (((instr & 0xf0000000) == 0xf0000000)) {
   58071                       UnallocatedA32(instr);
   58072                       return;
   58073                     }
   58074                     Condition condition((instr >> 28) & 0xf);
   58075                     unsigned rt = (instr >> 12) & 0xf;
   58076                     unsigned rn = (instr >> 16) & 0xf;
   58077                     Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
   58078                     unsigned rm = instr & 0xf;
   58079                     AddrMode addrmode = Offset;
   58080                     // STRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>, #{+/-}<Rm>] ; A1
   58081                     strd(condition,
   58082                          Register(rt),
   58083                          Register(rt + 1),
   58084                          MemOperand(Register(rn),
   58085                                     sign,
   58086                                     Register(rm),
   58087                                     addrmode));
   58088                     if (((instr & 0xf700ff0) != 0x10000f0)) {
   58089                       UnpredictableA32(instr);
   58090                     }
   58091                     break;
   58092                   }
   58093                   case 0x01200000: {
   58094                     // 0x01200090
   58095                     switch (instr & 0x00800300) {
   58096                       case 0x00800200: {
   58097                         // 0x01a00290
   58098                         if (((instr & 0xf0000000) == 0xf0000000)) {
   58099                           UnallocatedA32(instr);
   58100                           return;
   58101                         }
   58102                         Condition condition((instr >> 28) & 0xf);
   58103                         unsigned rd = (instr >> 12) & 0xf;
   58104                         unsigned rt = instr & 0xf;
   58105                         unsigned rn = (instr >> 16) & 0xf;
   58106                         // STLEXD{<c>}{<q>} <Rd>, <Rt>, <Rt2>, [<Rn>] ; A1
   58107                         stlexd(condition,
   58108                                Register(rd),
   58109                                Register(rt),
   58110                                Register(rt + 1),
   58111                                MemOperand(Register(rn), Offset));
   58112                         if (((instr & 0xff00ff0) != 0x1a00e90)) {
   58113                           UnpredictableA32(instr);
   58114                         }
   58115                         break;
   58116                       }
   58117                       case 0x00800300: {
   58118                         // 0x01a00390
   58119                         if (((instr & 0xf0000000) == 0xf0000000)) {
   58120                           UnallocatedA32(instr);
   58121                           return;
   58122                         }
   58123                         Condition condition((instr >> 28) & 0xf);
   58124                         unsigned rd = (instr >> 12) & 0xf;
   58125                         unsigned rt = instr & 0xf;
   58126                         unsigned rn = (instr >> 16) & 0xf;
   58127                         // STREXD{<c>}{<q>} <Rd>, <Rt>, <Rt2>, [<Rn>] ; A1
   58128                         strexd(condition,
   58129                                Register(rd),
   58130                                Register(rt),
   58131                                Register(rt + 1),
   58132                                MemOperand(Register(rn), Offset));
   58133                         if (((instr & 0xff00ff0) != 0x1a00f90)) {
   58134                           UnpredictableA32(instr);
   58135                         }
   58136                         break;
   58137                       }
   58138                       default:
   58139                         UnallocatedA32(instr);
   58140                         break;
   58141                     }
   58142                     break;
   58143                   }
   58144                   case 0x01200020: {
   58145                     // 0x012000b0
   58146                     if (((instr & 0xf0000000) == 0xf0000000)) {
   58147                       UnallocatedA32(instr);
   58148                       return;
   58149                     }
   58150                     Condition condition((instr >> 28) & 0xf);
   58151                     unsigned rt = (instr >> 12) & 0xf;
   58152                     unsigned rn = (instr >> 16) & 0xf;
   58153                     Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
   58154                     unsigned rm = instr & 0xf;
   58155                     AddrMode addrmode = PreIndex;
   58156                     // STRH{<c>}{<q>} <Rt>, [<Rn>, #{+/-}<Rm>]! ; A1
   58157                     strh(condition,
   58158                          Best,
   58159                          Register(rt),
   58160                          MemOperand(Register(rn),
   58161                                     sign,
   58162                                     Register(rm),
   58163                                     addrmode));
   58164                     if (((instr & 0xf700ff0) != 0x12000b0)) {
   58165                       UnpredictableA32(instr);
   58166                     }
   58167                     break;
   58168                   }
   58169                   case 0x01200040: {
   58170                     // 0x012000d0
   58171                     if (((instr & 0xf0000000) == 0xf0000000)) {
   58172                       UnallocatedA32(instr);
   58173                       return;
   58174                     }
   58175                     Condition condition((instr >> 28) & 0xf);
   58176                     unsigned rt = (instr >> 12) & 0xf;
   58177                     unsigned rn = (instr >> 16) & 0xf;
   58178                     Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
   58179                     unsigned rm = instr & 0xf;
   58180                     AddrMode addrmode = PreIndex;
   58181                     // LDRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>, #{+/-}<Rm>]! ; A1
   58182                     ldrd(condition,
   58183                          Register(rt),
   58184                          Register(rt + 1),
   58185                          MemOperand(Register(rn),
   58186                                     sign,
   58187                                     Register(rm),
   58188                                     addrmode));
   58189                     if (((instr & 0xf700ff0) != 0x12000d0)) {
   58190                       UnpredictableA32(instr);
   58191                     }
   58192                     break;
   58193                   }
   58194                   case 0x01200060: {
   58195                     // 0x012000f0
   58196                     if (((instr & 0xf0000000) == 0xf0000000)) {
   58197                       UnallocatedA32(instr);
   58198                       return;
   58199                     }
   58200                     Condition condition((instr >> 28) & 0xf);
   58201                     unsigned rt = (instr >> 12) & 0xf;
   58202                     unsigned rn = (instr >> 16) & 0xf;
   58203                     Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
   58204                     unsigned rm = instr & 0xf;
   58205                     AddrMode addrmode = PreIndex;
   58206                     // STRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>, #{+/-}<Rm>]! ; A1
   58207                     strd(condition,
   58208                          Register(rt),
   58209                          Register(rt + 1),
   58210                          MemOperand(Register(rn),
   58211                                     sign,
   58212                                     Register(rm),
   58213                                     addrmode));
   58214                     if (((instr & 0xf700ff0) != 0x12000f0)) {
   58215                       UnpredictableA32(instr);
   58216                     }
   58217                     break;
   58218                   }
   58219                   default:
   58220                     UnallocatedA32(instr);
   58221                     break;
   58222                 }
   58223                 break;
   58224               }
   58225               case 0x00400000: {
   58226                 // 0x00400010
   58227                 switch (instr & 0x01a00000) {
   58228                   case 0x00000000: {
   58229                     // 0x00400010
   58230                     if (((instr & 0xf0000000) == 0xf0000000)) {
   58231                       UnallocatedA32(instr);
   58232                       return;
   58233                     }
   58234                     Condition condition((instr >> 28) & 0xf);
   58235                     unsigned rd = (instr >> 12) & 0xf;
   58236                     unsigned rn = (instr >> 16) & 0xf;
   58237                     unsigned rm = instr & 0xf;
   58238                     Shift shift((instr >> 5) & 0x3);
   58239                     unsigned rs = (instr >> 8) & 0xf;
   58240                     // SUB{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
   58241                     sub(condition,
   58242                         Best,
   58243                         Register(rd),
   58244                         Register(rn),
   58245                         Operand(Register(rm), shift.GetType(), Register(rs)));
   58246                     break;
   58247                   }
   58248                   case 0x00200000: {
   58249                     // 0x00600010
   58250                     if (((instr & 0xf0000000) == 0xf0000000)) {
   58251                       UnallocatedA32(instr);
   58252                       return;
   58253                     }
   58254                     Condition condition((instr >> 28) & 0xf);
   58255                     unsigned rd = (instr >> 12) & 0xf;
   58256                     unsigned rn = (instr >> 16) & 0xf;
   58257                     unsigned rm = instr & 0xf;
   58258                     Shift shift((instr >> 5) & 0x3);
   58259                     unsigned rs = (instr >> 8) & 0xf;
   58260                     // RSB{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
   58261                     rsb(condition,
   58262                         Best,
   58263                         Register(rd),
   58264                         Register(rn),
   58265                         Operand(Register(rm), shift.GetType(), Register(rs)));
   58266                     break;
   58267                   }
   58268                   case 0x00800000: {
   58269                     // 0x00c00010
   58270                     if (((instr & 0xf0000000) == 0xf0000000)) {
   58271                       UnallocatedA32(instr);
   58272                       return;
   58273                     }
   58274                     Condition condition((instr >> 28) & 0xf);
   58275                     unsigned rd = (instr >> 12) & 0xf;
   58276                     unsigned rn = (instr >> 16) & 0xf;
   58277                     unsigned rm = instr & 0xf;
   58278                     Shift shift((instr >> 5) & 0x3);
   58279                     unsigned rs = (instr >> 8) & 0xf;
   58280                     // SBC{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
   58281                     sbc(condition,
   58282                         Best,
   58283                         Register(rd),
   58284                         Register(rn),
   58285                         Operand(Register(rm), shift.GetType(), Register(rs)));
   58286                     break;
   58287                   }
   58288                   case 0x00a00000: {
   58289                     // 0x00e00010
   58290                     if (((instr & 0xf0000000) == 0xf0000000)) {
   58291                       UnallocatedA32(instr);
   58292                       return;
   58293                     }
   58294                     Condition condition((instr >> 28) & 0xf);
   58295                     unsigned rd = (instr >> 12) & 0xf;
   58296                     unsigned rn = (instr >> 16) & 0xf;
   58297                     unsigned rm = instr & 0xf;
   58298                     Shift shift((instr >> 5) & 0x3);
   58299                     unsigned rs = (instr >> 8) & 0xf;
   58300                     // RSC{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
   58301                     rsc(condition,
   58302                         Register(rd),
   58303                         Register(rn),
   58304                         Operand(Register(rm), shift.GetType(), Register(rs)));
   58305                     break;
   58306                   }
   58307                   case 0x01000000: {
   58308                     // 0x01400010
   58309                     switch (instr & 0x00000060) {
   58310                       case 0x00000040: {
   58311                         // 0x01400050
   58312                         if (((instr & 0xf0000000) == 0xf0000000)) {
   58313                           UnallocatedA32(instr);
   58314                           return;
   58315                         }
   58316                         Condition condition((instr >> 28) & 0xf);
   58317                         unsigned rd = (instr >> 12) & 0xf;
   58318                         unsigned rm = instr & 0xf;
   58319                         unsigned rn = (instr >> 16) & 0xf;
   58320                         // QDADD{<c>}{<q>} {<Rd>}, <Rm>, <Rn> ; A1
   58321                         qdadd(condition,
   58322                               Register(rd),
   58323                               Register(rm),
   58324                               Register(rn));
   58325                         if (((instr & 0xff00ff0) != 0x1400050)) {
   58326                           UnpredictableA32(instr);
   58327                         }
   58328                         break;
   58329                       }
   58330                       case 0x00000060: {
   58331                         // 0x01400070
   58332                         if (((instr & 0xf0000000) == 0xf0000000)) {
   58333                           UnallocatedA32(instr);
   58334                           return;
   58335                         }
   58336                         uint32_t imm = (instr & 0xf) | ((instr >> 4) & 0xfff0);
   58337                         // HVC{<q>} {#}<imm16> ; A1
   58338                         hvc(al, imm);
   58339                         break;
   58340                       }
   58341                       default:
   58342                         UnallocatedA32(instr);
   58343                         break;
   58344                     }
   58345                     break;
   58346                   }
   58347                   case 0x01200000: {
   58348                     // 0x01600010
   58349                     switch (instr & 0x00000060) {
   58350                       case 0x00000000: {
   58351                         // 0x01600010
   58352                         if (((instr & 0xf0000000) == 0xf0000000)) {
   58353                           UnallocatedA32(instr);
   58354                           return;
   58355                         }
   58356                         Condition condition((instr >> 28) & 0xf);
   58357                         unsigned rd = (instr >> 12) & 0xf;
   58358                         unsigned rm = instr & 0xf;
   58359                         // CLZ{<c>}{<q>} <Rd>, <Rm> ; A1
   58360                         clz(condition, Register(rd), Register(rm));
   58361                         if (((instr & 0xfff0ff0) != 0x16f0f10)) {
   58362                           UnpredictableA32(instr);
   58363                         }
   58364                         break;
   58365                       }
   58366                       case 0x00000040: {
   58367                         // 0x01600050
   58368                         if (((instr & 0xf0000000) == 0xf0000000)) {
   58369                           UnallocatedA32(instr);
   58370                           return;
   58371                         }
   58372                         Condition condition((instr >> 28) & 0xf);
   58373                         unsigned rd = (instr >> 12) & 0xf;
   58374                         unsigned rm = instr & 0xf;
   58375                         unsigned rn = (instr >> 16) & 0xf;
   58376                         // QDSUB{<c>}{<q>} {<Rd>}, <Rm>, <Rn> ; A1
   58377                         qdsub(condition,
   58378                               Register(rd),
   58379                               Register(rm),
   58380                               Register(rn));
   58381                         if (((instr & 0xff00ff0) != 0x1600050)) {
   58382                           UnpredictableA32(instr);
   58383                         }
   58384                         break;
   58385                       }
   58386                       case 0x00000060: {
   58387                         // 0x01600070
   58388                         if (((instr & 0xf0000000) == 0xf0000000)) {
   58389                           UnallocatedA32(instr);
   58390                           return;
   58391                         }
   58392                         UnimplementedA32("SMC", instr);
   58393                         break;
   58394                       }
   58395                       default:
   58396                         UnallocatedA32(instr);
   58397                         break;
   58398                     }
   58399                     break;
   58400                   }
   58401                   case 0x01800000: {
   58402                     // 0x01c00010
   58403                     if (((instr & 0xf0000000) == 0xf0000000)) {
   58404                       UnallocatedA32(instr);
   58405                       return;
   58406                     }
   58407                     Condition condition((instr >> 28) & 0xf);
   58408                     unsigned rd = (instr >> 12) & 0xf;
   58409                     unsigned rn = (instr >> 16) & 0xf;
   58410                     unsigned rm = instr & 0xf;
   58411                     Shift shift((instr >> 5) & 0x3);
   58412                     unsigned rs = (instr >> 8) & 0xf;
   58413                     // BIC{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
   58414                     bic(condition,
   58415                         Best,
   58416                         Register(rd),
   58417                         Register(rn),
   58418                         Operand(Register(rm), shift.GetType(), Register(rs)));
   58419                     break;
   58420                   }
   58421                   case 0x01a00000: {
   58422                     // 0x01e00010
   58423                     if (((instr & 0xf0000000) == 0xf0000000)) {
   58424                       UnallocatedA32(instr);
   58425                       return;
   58426                     }
   58427                     Condition condition((instr >> 28) & 0xf);
   58428                     unsigned rd = (instr >> 12) & 0xf;
   58429                     unsigned rm = instr & 0xf;
   58430                     Shift shift((instr >> 5) & 0x3);
   58431                     unsigned rs = (instr >> 8) & 0xf;
   58432                     // MVN{<c>}{<q>} <Rd>, <Rm>, <shift> <Rs> ; A1
   58433                     mvn(condition,
   58434                         Best,
   58435                         Register(rd),
   58436                         Operand(Register(rm), shift.GetType(), Register(rs)));
   58437                     if (((instr & 0xfff0090) != 0x1e00010)) {
   58438                       UnpredictableA32(instr);
   58439                     }
   58440                     break;
   58441                   }
   58442                 }
   58443                 break;
   58444               }
   58445               case 0x00400080: {
   58446                 // 0x00400090
   58447                 switch (instr & 0x00000060) {
   58448                   case 0x00000000: {
   58449                     // 0x00400090
   58450                     switch (instr & 0x01a00000) {
   58451                       case 0x00000000: {
   58452                         // 0x00400090
   58453                         if (((instr & 0xf0000000) == 0xf0000000)) {
   58454                           UnallocatedA32(instr);
   58455                           return;
   58456                         }
   58457                         Condition condition((instr >> 28) & 0xf);
   58458                         unsigned rdlo = (instr >> 12) & 0xf;
   58459                         unsigned rdhi = (instr >> 16) & 0xf;
   58460                         unsigned rn = instr & 0xf;
   58461                         unsigned rm = (instr >> 8) & 0xf;
   58462                         // UMAAL{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
   58463                         umaal(condition,
   58464                               Register(rdlo),
   58465                               Register(rdhi),
   58466                               Register(rn),
   58467                               Register(rm));
   58468                         break;
   58469                       }
   58470                       case 0x00200000: {
   58471                         // 0x00600090
   58472                         if (((instr & 0xf0000000) == 0xf0000000)) {
   58473                           UnallocatedA32(instr);
   58474                           return;
   58475                         }
   58476                         Condition condition((instr >> 28) & 0xf);
   58477                         unsigned rd = (instr >> 16) & 0xf;
   58478                         unsigned rn = instr & 0xf;
   58479                         unsigned rm = (instr >> 8) & 0xf;
   58480                         unsigned ra = (instr >> 12) & 0xf;
   58481                         // MLS{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
   58482                         mls(condition,
   58483                             Register(rd),
   58484                             Register(rn),
   58485                             Register(rm),
   58486                             Register(ra));
   58487                         break;
   58488                       }
   58489                       case 0x00800000: {
   58490                         // 0x00c00090
   58491                         if (((instr & 0xf0000000) == 0xf0000000)) {
   58492                           UnallocatedA32(instr);
   58493                           return;
   58494                         }
   58495                         Condition condition((instr >> 28) & 0xf);
   58496                         unsigned rdlo = (instr >> 12) & 0xf;
   58497                         unsigned rdhi = (instr >> 16) & 0xf;
   58498                         unsigned rn = instr & 0xf;
   58499                         unsigned rm = (instr >> 8) & 0xf;
   58500                         // SMULL{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
   58501                         smull(condition,
   58502                               Register(rdlo),
   58503                               Register(rdhi),
   58504                               Register(rn),
   58505                               Register(rm));
   58506                         break;
   58507                       }
   58508                       case 0x00a00000: {
   58509                         // 0x00e00090
   58510                         if (((instr & 0xf0000000) == 0xf0000000)) {
   58511                           UnallocatedA32(instr);
   58512                           return;
   58513                         }
   58514                         Condition condition((instr >> 28) & 0xf);
   58515                         unsigned rdlo = (instr >> 12) & 0xf;
   58516                         unsigned rdhi = (instr >> 16) & 0xf;
   58517                         unsigned rn = instr & 0xf;
   58518                         unsigned rm = (instr >> 8) & 0xf;
   58519                         // SMLAL{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
   58520                         smlal(condition,
   58521                               Register(rdlo),
   58522                               Register(rdhi),
   58523                               Register(rn),
   58524                               Register(rm));
   58525                         break;
   58526                       }
   58527                       case 0x01800000: {
   58528                         // 0x01c00090
   58529                         switch (instr & 0x00000300) {
   58530                           case 0x00000000: {
   58531                             // 0x01c00090
   58532                             if (((instr & 0xf0000000) == 0xf0000000)) {
   58533                               UnallocatedA32(instr);
   58534                               return;
   58535                             }
   58536                             Condition condition((instr >> 28) & 0xf);
   58537                             unsigned rt = instr & 0xf;
   58538                             unsigned rn = (instr >> 16) & 0xf;
   58539                             // STLB{<c>}{<q>} <Rt>, [<Rn>] ; A1
   58540                             stlb(condition,
   58541                                  Register(rt),
   58542                                  MemOperand(Register(rn), Offset));
   58543                             if (((instr & 0xff0fff0) != 0x1c0fc90)) {
   58544                               UnpredictableA32(instr);
   58545                             }
   58546                             break;
   58547                           }
   58548                           case 0x00000200: {
   58549                             // 0x01c00290
   58550                             if (((instr & 0xf0000000) == 0xf0000000)) {
   58551                               UnallocatedA32(instr);
   58552                               return;
   58553                             }
   58554                             Condition condition((instr >> 28) & 0xf);
   58555                             unsigned rd = (instr >> 12) & 0xf;
   58556                             unsigned rt = instr & 0xf;
   58557                             unsigned rn = (instr >> 16) & 0xf;
   58558                             // STLEXB{<c>}{<q>} <Rd>, <Rt>, [<Rn>] ; A1
   58559                             stlexb(condition,
   58560                                    Register(rd),
   58561                                    Register(rt),
   58562                                    MemOperand(Register(rn), Offset));
   58563                             if (((instr & 0xff00ff0) != 0x1c00e90)) {
   58564                               UnpredictableA32(instr);
   58565                             }
   58566                             break;
   58567                           }
   58568                           case 0x00000300: {
   58569                             // 0x01c00390
   58570                             if (((instr & 0xf0000000) == 0xf0000000)) {
   58571                               UnallocatedA32(instr);
   58572                               return;
   58573                             }
   58574                             Condition condition((instr >> 28) & 0xf);
   58575                             unsigned rd = (instr >> 12) & 0xf;
   58576                             unsigned rt = instr & 0xf;
   58577                             unsigned rn = (instr >> 16) & 0xf;
   58578                             // STREXB{<c>}{<q>} <Rd>, <Rt>, [<Rn>] ; A1
   58579                             strexb(condition,
   58580                                    Register(rd),
   58581                                    Register(rt),
   58582                                    MemOperand(Register(rn), Offset));
   58583                             if (((instr & 0xff00ff0) != 0x1c00f90)) {
   58584                               UnpredictableA32(instr);
   58585                             }
   58586                             break;
   58587                           }
   58588                           default:
   58589                             UnallocatedA32(instr);
   58590                             break;
   58591                         }
   58592                         break;
   58593                       }
   58594                       case 0x01a00000: {
   58595                         // 0x01e00090
   58596                         switch (instr & 0x00000300) {
   58597                           case 0x00000000: {
   58598                             // 0x01e00090
   58599                             if (((instr & 0xf0000000) == 0xf0000000)) {
   58600                               UnallocatedA32(instr);
   58601                               return;
   58602                             }
   58603                             Condition condition((instr >> 28) & 0xf);
   58604                             unsigned rt = instr & 0xf;
   58605                             unsigned rn = (instr >> 16) & 0xf;
   58606                             // STLH{<c>}{<q>} <Rt>, [<Rn>] ; A1
   58607                             stlh(condition,
   58608                                  Register(rt),
   58609                                  MemOperand(Register(rn), Offset));
   58610                             if (((instr & 0xff0fff0) != 0x1e0fc90)) {
   58611                               UnpredictableA32(instr);
   58612                             }
   58613                             break;
   58614                           }
   58615                           case 0x00000200: {
   58616                             // 0x01e00290
   58617                             if (((instr & 0xf0000000) == 0xf0000000)) {
   58618                               UnallocatedA32(instr);
   58619                               return;
   58620                             }
   58621                             Condition condition((instr >> 28) & 0xf);
   58622                             unsigned rd = (instr >> 12) & 0xf;
   58623                             unsigned rt = instr & 0xf;
   58624                             unsigned rn = (instr >> 16) & 0xf;
   58625                             // STLEXH{<c>}{<q>} <Rd>, <Rt>, [<Rn>] ; A1
   58626                             stlexh(condition,
   58627                                    Register(rd),
   58628                                    Register(rt),
   58629                                    MemOperand(Register(rn), Offset));
   58630                             if (((instr & 0xff00ff0) != 0x1e00e90)) {
   58631                               UnpredictableA32(instr);
   58632                             }
   58633                             break;
   58634                           }
   58635                           case 0x00000300: {
   58636                             // 0x01e00390
   58637                             if (((instr & 0xf0000000) == 0xf0000000)) {
   58638                               UnallocatedA32(instr);
   58639                               return;
   58640                             }
   58641                             Condition condition((instr >> 28) & 0xf);
   58642                             unsigned rd = (instr >> 12) & 0xf;
   58643                             unsigned rt = instr & 0xf;
   58644                             unsigned rn = (instr >> 16) & 0xf;
   58645                             // STREXH{<c>}{<q>} <Rd>, <Rt>, [<Rn>] ; A1
   58646                             strexh(condition,
   58647                                    Register(rd),
   58648                                    Register(rt),
   58649                                    MemOperand(Register(rn), Offset));
   58650                             if (((instr & 0xff00ff0) != 0x1e00f90)) {
   58651                               UnpredictableA32(instr);
   58652                             }
   58653                             break;
   58654                           }
   58655                           default:
   58656                             UnallocatedA32(instr);
   58657                             break;
   58658                         }
   58659                         break;
   58660                       }
   58661                       default:
   58662                         UnallocatedA32(instr);
   58663                         break;
   58664                     }
   58665                     break;
   58666                   }
   58667                   case 0x00000020: {
   58668                     // 0x004000b0
   58669                     switch (instr & 0x01200000) {
   58670                       case 0x00000000: {
   58671                         // 0x004000b0
   58672                         if (((instr & 0xf0000000) == 0xf0000000)) {
   58673                           UnallocatedA32(instr);
   58674                           return;
   58675                         }
   58676                         Condition condition((instr >> 28) & 0xf);
   58677                         unsigned rt = (instr >> 12) & 0xf;
   58678                         unsigned rn = (instr >> 16) & 0xf;
   58679                         Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
   58680                         int32_t offset = (instr & 0xf) | ((instr >> 4) & 0xf0);
   58681                         // STRH{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_3> ; A1
   58682                         strh(condition,
   58683                              Best,
   58684                              Register(rt),
   58685                              MemOperand(Register(rn), sign, offset, PostIndex));
   58686                         break;
   58687                       }
   58688                       case 0x00200000: {
   58689                         // 0x006000b0
   58690                         if (((instr & 0xf0000000) == 0xf0000000)) {
   58691                           UnallocatedA32(instr);
   58692                           return;
   58693                         }
   58694                         UnimplementedA32("STRHT", instr);
   58695                         break;
   58696                       }
   58697                       case 0x01000000: {
   58698                         // 0x014000b0
   58699                         if (((instr & 0xf0000000) == 0xf0000000)) {
   58700                           UnallocatedA32(instr);
   58701                           return;
   58702                         }
   58703                         Condition condition((instr >> 28) & 0xf);
   58704                         unsigned rt = (instr >> 12) & 0xf;
   58705                         unsigned rn = (instr >> 16) & 0xf;
   58706                         Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
   58707                         int32_t offset = (instr & 0xf) | ((instr >> 4) & 0xf0);
   58708                         // STRH{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_3>}] ; A1
   58709                         strh(condition,
   58710                              Best,
   58711                              Register(rt),
   58712                              MemOperand(Register(rn), sign, offset, Offset));
   58713                         break;
   58714                       }
   58715                       case 0x01200000: {
   58716                         // 0x016000b0
   58717                         if (((instr & 0xf0000000) == 0xf0000000)) {
   58718                           UnallocatedA32(instr);
   58719                           return;
   58720                         }
   58721                         Condition condition((instr >> 28) & 0xf);
   58722                         unsigned rt = (instr >> 12) & 0xf;
   58723                         unsigned rn = (instr >> 16) & 0xf;
   58724                         Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
   58725                         int32_t offset = (instr & 0xf) | ((instr >> 4) & 0xf0);
   58726                         // STRH{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_3>}]! ; A1
   58727                         strh(condition,
   58728                              Best,
   58729                              Register(rt),
   58730                              MemOperand(Register(rn), sign, offset, PreIndex));
   58731                         break;
   58732                       }
   58733                     }
   58734                     break;
   58735                   }
   58736                   case 0x00000040: {
   58737                     // 0x004000d0
   58738                     switch (instr & 0x000f0000) {
   58739                       case 0x000f0000: {
   58740                         // 0x004f00d0
   58741                         if (((instr & 0xf0000000) == 0xf0000000)) {
   58742                           UnallocatedA32(instr);
   58743                           return;
   58744                         }
   58745                         Condition condition((instr >> 28) & 0xf);
   58746                         unsigned rt = (instr >> 12) & 0xf;
   58747                         uint32_t U = (instr >> 23) & 0x1;
   58748                         int32_t imm = (instr & 0xf) | ((instr >> 4) & 0xf0);
   58749                         if (U == 0) imm = -imm;
   58750                         bool minus_zero = (imm == 0) && (U == 0);
   58751                         Label label(imm, kA32PcDelta, minus_zero);
   58752                         // LDRD{<c>}{<q>} <Rt>, <Rt2>, <label> ; A1
   58753                         ldrd(condition, Register(rt), Register(rt + 1), &label);
   58754                         if (((instr & 0xf7f00f0) != 0x14f00d0)) {
   58755                           UnpredictableA32(instr);
   58756                         }
   58757                         break;
   58758                       }
   58759                       default: {
   58760                         switch (instr & 0x01200000) {
   58761                           case 0x00000000: {
   58762                             // 0x004000d0
   58763                             if (((instr & 0xf0000000) == 0xf0000000) ||
   58764                                 ((instr & 0xf0000) == 0xf0000)) {
   58765                               UnallocatedA32(instr);
   58766                               return;
   58767                             }
   58768                             Condition condition((instr >> 28) & 0xf);
   58769                             unsigned rt = (instr >> 12) & 0xf;
   58770                             unsigned rn = (instr >> 16) & 0xf;
   58771                             Sign sign((((instr >> 23) & 0x1) == 0) ? minus
   58772                                                                    : plus);
   58773                             int32_t offset =
   58774                                 (instr & 0xf) | ((instr >> 4) & 0xf0);
   58775                             // LDRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>], #{+/-}<imm_1> ; A1 NOLINT(whitespace/line_length)
   58776                             ldrd(condition,
   58777                                  Register(rt),
   58778                                  Register(rt + 1),
   58779                                  MemOperand(Register(rn),
   58780                                             sign,
   58781                                             offset,
   58782                                             PostIndex));
   58783                             break;
   58784                           }
   58785                           case 0x01000000: {
   58786                             // 0x014000d0
   58787                             if (((instr & 0xf0000000) == 0xf0000000) ||
   58788                                 ((instr & 0xf0000) == 0xf0000)) {
   58789                               UnallocatedA32(instr);
   58790                               return;
   58791                             }
   58792                             Condition condition((instr >> 28) & 0xf);
   58793                             unsigned rt = (instr >> 12) & 0xf;
   58794                             unsigned rn = (instr >> 16) & 0xf;
   58795                             Sign sign((((instr >> 23) & 0x1) == 0) ? minus
   58796                                                                    : plus);
   58797                             int32_t offset =
   58798                                 (instr & 0xf) | ((instr >> 4) & 0xf0);
   58799                             // LDRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>{, #{+/-}<imm_1>}] ; A1 NOLINT(whitespace/line_length)
   58800                             ldrd(condition,
   58801                                  Register(rt),
   58802                                  Register(rt + 1),
   58803                                  MemOperand(Register(rn),
   58804                                             sign,
   58805                                             offset,
   58806                                             Offset));
   58807                             break;
   58808                           }
   58809                           case 0x01200000: {
   58810                             // 0x016000d0
   58811                             if (((instr & 0xf0000000) == 0xf0000000) ||
   58812                                 ((instr & 0xf0000) == 0xf0000)) {
   58813                               UnallocatedA32(instr);
   58814                               return;
   58815                             }
   58816                             Condition condition((instr >> 28) & 0xf);
   58817                             unsigned rt = (instr >> 12) & 0xf;
   58818                             unsigned rn = (instr >> 16) & 0xf;
   58819                             Sign sign((((instr >> 23) & 0x1) == 0) ? minus
   58820                                                                    : plus);
   58821                             int32_t offset =
   58822                                 (instr & 0xf) | ((instr >> 4) & 0xf0);
   58823                             // LDRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>{, #{+/-}<imm_1>}]! ; A1 NOLINT(whitespace/line_length)
   58824                             ldrd(condition,
   58825                                  Register(rt),
   58826                                  Register(rt + 1),
   58827                                  MemOperand(Register(rn),
   58828                                             sign,
   58829                                             offset,
   58830                                             PreIndex));
   58831                             break;
   58832                           }
   58833                           default:
   58834                             UnallocatedA32(instr);
   58835                             break;
   58836                         }
   58837                         break;
   58838                       }
   58839                     }
   58840                     break;
   58841                   }
   58842                   case 0x00000060: {
   58843                     // 0x004000f0
   58844                     switch (instr & 0x01200000) {
   58845                       case 0x00000000: {
   58846                         // 0x004000f0
   58847                         if (((instr & 0xf0000000) == 0xf0000000)) {
   58848                           UnallocatedA32(instr);
   58849                           return;
   58850                         }
   58851                         Condition condition((instr >> 28) & 0xf);
   58852                         unsigned rt = (instr >> 12) & 0xf;
   58853                         unsigned rn = (instr >> 16) & 0xf;
   58854                         Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
   58855                         int32_t offset = (instr & 0xf) | ((instr >> 4) & 0xf0);
   58856                         // STRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>], #{+/-}<imm_1> ; A1 NOLINT(whitespace/line_length)
   58857                         strd(condition,
   58858                              Register(rt),
   58859                              Register(rt + 1),
   58860                              MemOperand(Register(rn), sign, offset, PostIndex));
   58861                         break;
   58862                       }
   58863                       case 0x01000000: {
   58864                         // 0x014000f0
   58865                         if (((instr & 0xf0000000) == 0xf0000000)) {
   58866                           UnallocatedA32(instr);
   58867                           return;
   58868                         }
   58869                         Condition condition((instr >> 28) & 0xf);
   58870                         unsigned rt = (instr >> 12) & 0xf;
   58871                         unsigned rn = (instr >> 16) & 0xf;
   58872                         Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
   58873                         int32_t offset = (instr & 0xf) | ((instr >> 4) & 0xf0);
   58874                         // STRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>{, #{+/-}<imm_1>}] ; A1 NOLINT(whitespace/line_length)
   58875                         strd(condition,
   58876                              Register(rt),
   58877                              Register(rt + 1),
   58878                              MemOperand(Register(rn), sign, offset, Offset));
   58879                         break;
   58880                       }
   58881                       case 0x01200000: {
   58882                         // 0x016000f0
   58883                         if (((instr & 0xf0000000) == 0xf0000000)) {
   58884                           UnallocatedA32(instr);
   58885                           return;
   58886                         }
   58887                         Condition condition((instr >> 28) & 0xf);
   58888                         unsigned rt = (instr >> 12) & 0xf;
   58889                         unsigned rn = (instr >> 16) & 0xf;
   58890                         Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
   58891                         int32_t offset = (instr & 0xf) | ((instr >> 4) & 0xf0);
   58892                         // STRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>{, #{+/-}<imm_1>}]! ; A1 NOLINT(whitespace/line_length)
   58893                         strd(condition,
   58894                              Register(rt),
   58895                              Register(rt + 1),
   58896                              MemOperand(Register(rn), sign, offset, PreIndex));
   58897                         break;
   58898                       }
   58899                       default:
   58900                         UnallocatedA32(instr);
   58901                         break;
   58902                     }
   58903                     break;
   58904                   }
   58905                 }
   58906                 break;
   58907               }
   58908             }
   58909             break;
   58910           }
   58911           case 0x00100000: {
   58912             // 0x00100000
   58913             switch (instr & 0x01e00000) {
   58914               case 0x00000000: {
   58915                 // 0x00100000
   58916                 switch (instr & 0x00000fe0) {
   58917                   case 0x00000060: {
   58918                     // 0x00100060
   58919                     if (((instr & 0xf0000000) == 0xf0000000)) {
   58920                       UnallocatedA32(instr);
   58921                       return;
   58922                     }
   58923                     Condition condition((instr >> 28) & 0xf);
   58924                     unsigned rd = (instr >> 12) & 0xf;
   58925                     unsigned rn = (instr >> 16) & 0xf;
   58926                     unsigned rm = instr & 0xf;
   58927                     // ANDS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
   58928                     ands(condition,
   58929                          Best,
   58930                          Register(rd),
   58931                          Register(rn),
   58932                          Operand(Register(rm), RRX));
   58933                     break;
   58934                   }
   58935                   default: {
   58936                     if (((instr & 0xf0000000) == 0xf0000000) ||
   58937                         ((instr & 0xfe0) == 0x60)) {
   58938                       UnallocatedA32(instr);
   58939                       return;
   58940                     }
   58941                     Condition condition((instr >> 28) & 0xf);
   58942                     unsigned rd = (instr >> 12) & 0xf;
   58943                     unsigned rn = (instr >> 16) & 0xf;
   58944                     unsigned rm = instr & 0xf;
   58945                     ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
   58946                                                         (instr >> 7) & 0x1f);
   58947                     // ANDS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
   58948                     ands(condition,
   58949                          Best,
   58950                          Register(rd),
   58951                          Register(rn),
   58952                          Operand(Register(rm),
   58953                                  shift_operand.GetType(),
   58954                                  shift_operand.GetAmount()));
   58955                     break;
   58956                   }
   58957                 }
   58958                 break;
   58959               }
   58960               case 0x00200000: {
   58961                 // 0x00300000
   58962                 switch (instr & 0x00000fe0) {
   58963                   case 0x00000060: {
   58964                     // 0x00300060
   58965                     if (((instr & 0xf0000000) == 0xf0000000)) {
   58966                       UnallocatedA32(instr);
   58967                       return;
   58968                     }
   58969                     Condition condition((instr >> 28) & 0xf);
   58970                     unsigned rd = (instr >> 12) & 0xf;
   58971                     unsigned rn = (instr >> 16) & 0xf;
   58972                     unsigned rm = instr & 0xf;
   58973                     // EORS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
   58974                     eors(condition,
   58975                          Best,
   58976                          Register(rd),
   58977                          Register(rn),
   58978                          Operand(Register(rm), RRX));
   58979                     break;
   58980                   }
   58981                   default: {
   58982                     if (((instr & 0xf0000000) == 0xf0000000) ||
   58983                         ((instr & 0xfe0) == 0x60)) {
   58984                       UnallocatedA32(instr);
   58985                       return;
   58986                     }
   58987                     Condition condition((instr >> 28) & 0xf);
   58988                     unsigned rd = (instr >> 12) & 0xf;
   58989                     unsigned rn = (instr >> 16) & 0xf;
   58990                     unsigned rm = instr & 0xf;
   58991                     ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
   58992                                                         (instr >> 7) & 0x1f);
   58993                     // EORS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
   58994                     eors(condition,
   58995                          Best,
   58996                          Register(rd),
   58997                          Register(rn),
   58998                          Operand(Register(rm),
   58999                                  shift_operand.GetType(),
   59000                                  shift_operand.GetAmount()));
   59001                     break;
   59002                   }
   59003                 }
   59004                 break;
   59005               }
   59006               case 0x00400000: {
   59007                 // 0x00500000
   59008                 switch (instr & 0x000f0000) {
   59009                   case 0x000d0000: {
   59010                     // 0x005d0000
   59011                     switch (instr & 0x00000fe0) {
   59012                       case 0x00000060: {
   59013                         // 0x005d0060
   59014                         if (((instr & 0xf0000000) == 0xf0000000)) {
   59015                           UnallocatedA32(instr);
   59016                           return;
   59017                         }
   59018                         Condition condition((instr >> 28) & 0xf);
   59019                         unsigned rd = (instr >> 12) & 0xf;
   59020                         unsigned rm = instr & 0xf;
   59021                         // SUBS{<c>}{<q>} {<Rd>}, SP, <Rm>, RRX ; A1
   59022                         subs(condition,
   59023                              Best,
   59024                              Register(rd),
   59025                              sp,
   59026                              Operand(Register(rm), RRX));
   59027                         break;
   59028                       }
   59029                       default: {
   59030                         if (((instr & 0xf0000000) == 0xf0000000) ||
   59031                             ((instr & 0xfe0) == 0x60)) {
   59032                           UnallocatedA32(instr);
   59033                           return;
   59034                         }
   59035                         Condition condition((instr >> 28) & 0xf);
   59036                         unsigned rd = (instr >> 12) & 0xf;
   59037                         unsigned rm = instr & 0xf;
   59038                         ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
   59039                                                             (instr >> 7) &
   59040                                                                 0x1f);
   59041                         // SUBS{<c>}{<q>} {<Rd>}, SP, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
   59042                         subs(condition,
   59043                              Best,
   59044                              Register(rd),
   59045                              sp,
   59046                              Operand(Register(rm),
   59047                                      shift_operand.GetType(),
   59048                                      shift_operand.GetAmount()));
   59049                         break;
   59050                       }
   59051                     }
   59052                     break;
   59053                   }
   59054                   default: {
   59055                     switch (instr & 0x00000fe0) {
   59056                       case 0x00000060: {
   59057                         // 0x00500060
   59058                         if (((instr & 0xf0000000) == 0xf0000000) ||
   59059                             ((instr & 0xf0000) == 0xd0000)) {
   59060                           UnallocatedA32(instr);
   59061                           return;
   59062                         }
   59063                         Condition condition((instr >> 28) & 0xf);
   59064                         unsigned rd = (instr >> 12) & 0xf;
   59065                         unsigned rn = (instr >> 16) & 0xf;
   59066                         unsigned rm = instr & 0xf;
   59067                         // SUBS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
   59068                         subs(condition,
   59069                              Best,
   59070                              Register(rd),
   59071                              Register(rn),
   59072                              Operand(Register(rm), RRX));
   59073                         break;
   59074                       }
   59075                       default: {
   59076                         if (((instr & 0xf0000000) == 0xf0000000) ||
   59077                             ((instr & 0xf0000) == 0xd0000) ||
   59078                             ((instr & 0xfe0) == 0x60)) {
   59079                           UnallocatedA32(instr);
   59080                           return;
   59081                         }
   59082                         Condition condition((instr >> 28) & 0xf);
   59083                         unsigned rd = (instr >> 12) & 0xf;
   59084                         unsigned rn = (instr >> 16) & 0xf;
   59085                         unsigned rm = instr & 0xf;
   59086                         ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
   59087                                                             (instr >> 7) &
   59088                                                                 0x1f);
   59089                         // SUBS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
   59090                         subs(condition,
   59091                              Best,
   59092                              Register(rd),
   59093                              Register(rn),
   59094                              Operand(Register(rm),
   59095                                      shift_operand.GetType(),
   59096                                      shift_operand.GetAmount()));
   59097                         break;
   59098                       }
   59099                     }
   59100                     break;
   59101                   }
   59102                 }
   59103                 break;
   59104               }
   59105               case 0x00600000: {
   59106                 // 0x00700000
   59107                 switch (instr & 0x00000fe0) {
   59108                   case 0x00000060: {
   59109                     // 0x00700060
   59110                     if (((instr & 0xf0000000) == 0xf0000000)) {
   59111                       UnallocatedA32(instr);
   59112                       return;
   59113                     }
   59114                     Condition condition((instr >> 28) & 0xf);
   59115                     unsigned rd = (instr >> 12) & 0xf;
   59116                     unsigned rn = (instr >> 16) & 0xf;
   59117                     unsigned rm = instr & 0xf;
   59118                     // RSBS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
   59119                     rsbs(condition,
   59120                          Best,
   59121                          Register(rd),
   59122                          Register(rn),
   59123                          Operand(Register(rm), RRX));
   59124                     break;
   59125                   }
   59126                   default: {
   59127                     if (((instr & 0xf0000000) == 0xf0000000) ||
   59128                         ((instr & 0xfe0) == 0x60)) {
   59129                       UnallocatedA32(instr);
   59130                       return;
   59131                     }
   59132                     Condition condition((instr >> 28) & 0xf);
   59133                     unsigned rd = (instr >> 12) & 0xf;
   59134                     unsigned rn = (instr >> 16) & 0xf;
   59135                     unsigned rm = instr & 0xf;
   59136                     ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
   59137                                                         (instr >> 7) & 0x1f);
   59138                     // RSBS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
   59139                     rsbs(condition,
   59140                          Best,
   59141                          Register(rd),
   59142                          Register(rn),
   59143                          Operand(Register(rm),
   59144                                  shift_operand.GetType(),
   59145                                  shift_operand.GetAmount()));
   59146                     break;
   59147                   }
   59148                 }
   59149                 break;
   59150               }
   59151               case 0x00800000: {
   59152                 // 0x00900000
   59153                 switch (instr & 0x000f0000) {
   59154                   case 0x000d0000: {
   59155                     // 0x009d0000
   59156                     switch (instr & 0x00000fe0) {
   59157                       case 0x00000060: {
   59158                         // 0x009d0060
   59159                         if (((instr & 0xf0000000) == 0xf0000000)) {
   59160                           UnallocatedA32(instr);
   59161                           return;
   59162                         }
   59163                         Condition condition((instr >> 28) & 0xf);
   59164                         unsigned rd = (instr >> 12) & 0xf;
   59165                         unsigned rm = instr & 0xf;
   59166                         // ADDS{<c>}{<q>} {<Rd>}, SP, <Rm>, RRX ; A1
   59167                         adds(condition,
   59168                              Best,
   59169                              Register(rd),
   59170                              sp,
   59171                              Operand(Register(rm), RRX));
   59172                         break;
   59173                       }
   59174                       default: {
   59175                         if (((instr & 0xf0000000) == 0xf0000000) ||
   59176                             ((instr & 0xfe0) == 0x60)) {
   59177                           UnallocatedA32(instr);
   59178                           return;
   59179                         }
   59180                         Condition condition((instr >> 28) & 0xf);
   59181                         unsigned rd = (instr >> 12) & 0xf;
   59182                         unsigned rm = instr & 0xf;
   59183                         ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
   59184                                                             (instr >> 7) &
   59185                                                                 0x1f);
   59186                         // ADDS{<c>}{<q>} {<Rd>}, SP, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
   59187                         adds(condition,
   59188                              Best,
   59189                              Register(rd),
   59190                              sp,
   59191                              Operand(Register(rm),
   59192                                      shift_operand.GetType(),
   59193                                      shift_operand.GetAmount()));
   59194                         break;
   59195                       }
   59196                     }
   59197                     break;
   59198                   }
   59199                   default: {
   59200                     switch (instr & 0x00000fe0) {
   59201                       case 0x00000060: {
   59202                         // 0x00900060
   59203                         if (((instr & 0xf0000000) == 0xf0000000) ||
   59204                             ((instr & 0xf0000) == 0xd0000)) {
   59205                           UnallocatedA32(instr);
   59206                           return;
   59207                         }
   59208                         Condition condition((instr >> 28) & 0xf);
   59209                         unsigned rd = (instr >> 12) & 0xf;
   59210                         unsigned rn = (instr >> 16) & 0xf;
   59211                         unsigned rm = instr & 0xf;
   59212                         // ADDS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
   59213                         adds(condition,
   59214                              Best,
   59215                              Register(rd),
   59216                              Register(rn),
   59217                              Operand(Register(rm), RRX));
   59218                         break;
   59219                       }
   59220                       default: {
   59221                         if (((instr & 0xf0000000) == 0xf0000000) ||
   59222                             ((instr & 0xf0000) == 0xd0000) ||
   59223                             ((instr & 0xfe0) == 0x60)) {
   59224                           UnallocatedA32(instr);
   59225                           return;
   59226                         }
   59227                         Condition condition((instr >> 28) & 0xf);
   59228                         unsigned rd = (instr >> 12) & 0xf;
   59229                         unsigned rn = (instr >> 16) & 0xf;
   59230                         unsigned rm = instr & 0xf;
   59231                         ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
   59232                                                             (instr >> 7) &
   59233                                                                 0x1f);
   59234                         // ADDS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
   59235                         adds(condition,
   59236                              Best,
   59237                              Register(rd),
   59238                              Register(rn),
   59239                              Operand(Register(rm),
   59240                                      shift_operand.GetType(),
   59241                                      shift_operand.GetAmount()));
   59242                         break;
   59243                       }
   59244                     }
   59245                     break;
   59246                   }
   59247                 }
   59248                 break;
   59249               }
   59250               case 0x00a00000: {
   59251                 // 0x00b00000
   59252                 switch (instr & 0x00000fe0) {
   59253                   case 0x00000060: {
   59254                     // 0x00b00060
   59255                     if (((instr & 0xf0000000) == 0xf0000000)) {
   59256                       UnallocatedA32(instr);
   59257                       return;
   59258                     }
   59259                     Condition condition((instr >> 28) & 0xf);
   59260                     unsigned rd = (instr >> 12) & 0xf;
   59261                     unsigned rn = (instr >> 16) & 0xf;
   59262                     unsigned rm = instr & 0xf;
   59263                     // ADCS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
   59264                     adcs(condition,
   59265                          Best,
   59266                          Register(rd),
   59267                          Register(rn),
   59268                          Operand(Register(rm), RRX));
   59269                     break;
   59270                   }
   59271                   default: {
   59272                     if (((instr & 0xf0000000) == 0xf0000000) ||
   59273                         ((instr & 0xfe0) == 0x60)) {
   59274                       UnallocatedA32(instr);
   59275                       return;
   59276                     }
   59277                     Condition condition((instr >> 28) & 0xf);
   59278                     unsigned rd = (instr >> 12) & 0xf;
   59279                     unsigned rn = (instr >> 16) & 0xf;
   59280                     unsigned rm = instr & 0xf;
   59281                     ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
   59282                                                         (instr >> 7) & 0x1f);
   59283                     // ADCS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
   59284                     adcs(condition,
   59285                          Best,
   59286                          Register(rd),
   59287                          Register(rn),
   59288                          Operand(Register(rm),
   59289                                  shift_operand.GetType(),
   59290                                  shift_operand.GetAmount()));
   59291                     break;
   59292                   }
   59293                 }
   59294                 break;
   59295               }
   59296               case 0x00c00000: {
   59297                 // 0x00d00000
   59298                 switch (instr & 0x00000fe0) {
   59299                   case 0x00000060: {
   59300                     // 0x00d00060
   59301                     if (((instr & 0xf0000000) == 0xf0000000)) {
   59302                       UnallocatedA32(instr);
   59303                       return;
   59304                     }
   59305                     Condition condition((instr >> 28) & 0xf);
   59306                     unsigned rd = (instr >> 12) & 0xf;
   59307                     unsigned rn = (instr >> 16) & 0xf;
   59308                     unsigned rm = instr & 0xf;
   59309                     // SBCS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
   59310                     sbcs(condition,
   59311                          Best,
   59312                          Register(rd),
   59313                          Register(rn),
   59314                          Operand(Register(rm), RRX));
   59315                     break;
   59316                   }
   59317                   default: {
   59318                     if (((instr & 0xf0000000) == 0xf0000000) ||
   59319                         ((instr & 0xfe0) == 0x60)) {
   59320                       UnallocatedA32(instr);
   59321                       return;
   59322                     }
   59323                     Condition condition((instr >> 28) & 0xf);
   59324                     unsigned rd = (instr >> 12) & 0xf;
   59325                     unsigned rn = (instr >> 16) & 0xf;
   59326                     unsigned rm = instr & 0xf;
   59327                     ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
   59328                                                         (instr >> 7) & 0x1f);
   59329                     // SBCS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
   59330                     sbcs(condition,
   59331                          Best,
   59332                          Register(rd),
   59333                          Register(rn),
   59334                          Operand(Register(rm),
   59335                                  shift_operand.GetType(),
   59336                                  shift_operand.GetAmount()));
   59337                     break;
   59338                   }
   59339                 }
   59340                 break;
   59341               }
   59342               case 0x00e00000: {
   59343                 // 0x00f00000
   59344                 switch (instr & 0x00000fe0) {
   59345                   case 0x00000060: {
   59346                     // 0x00f00060
   59347                     if (((instr & 0xf0000000) == 0xf0000000)) {
   59348                       UnallocatedA32(instr);
   59349                       return;
   59350                     }
   59351                     Condition condition((instr >> 28) & 0xf);
   59352                     unsigned rd = (instr >> 12) & 0xf;
   59353                     unsigned rn = (instr >> 16) & 0xf;
   59354                     unsigned rm = instr & 0xf;
   59355                     // RSCS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
   59356                     rscs(condition,
   59357                          Register(rd),
   59358                          Register(rn),
   59359                          Operand(Register(rm), RRX));
   59360                     break;
   59361                   }
   59362                   default: {
   59363                     if (((instr & 0xf0000000) == 0xf0000000) ||
   59364                         ((instr & 0xfe0) == 0x60)) {
   59365                       UnallocatedA32(instr);
   59366                       return;
   59367                     }
   59368                     Condition condition((instr >> 28) & 0xf);
   59369                     unsigned rd = (instr >> 12) & 0xf;
   59370                     unsigned rn = (instr >> 16) & 0xf;
   59371                     unsigned rm = instr & 0xf;
   59372                     ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
   59373                                                         (instr >> 7) & 0x1f);
   59374                     // RSCS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
   59375                     rscs(condition,
   59376                          Register(rd),
   59377                          Register(rn),
   59378                          Operand(Register(rm),
   59379                                  shift_operand.GetType(),
   59380                                  shift_operand.GetAmount()));
   59381                     break;
   59382                   }
   59383                 }
   59384                 break;
   59385               }
   59386               case 0x01000000: {
   59387                 // 0x01100000
   59388                 switch (instr & 0x00000fe0) {
   59389                   case 0x00000060: {
   59390                     // 0x01100060
   59391                     if (((instr & 0xf0000000) == 0xf0000000)) {
   59392                       UnallocatedA32(instr);
   59393                       return;
   59394                     }
   59395                     Condition condition((instr >> 28) & 0xf);
   59396                     unsigned rn = (instr >> 16) & 0xf;
   59397                     unsigned rm = instr & 0xf;
   59398                     // TST{<c>}{<q>} <Rn>, <Rm>, RRX ; A1
   59399                     tst(condition,
   59400                         Best,
   59401                         Register(rn),
   59402                         Operand(Register(rm), RRX));
   59403                     if (((instr & 0xff0fff0) != 0x1100060)) {
   59404                       UnpredictableA32(instr);
   59405                     }
   59406                     break;
   59407                   }
   59408                   default: {
   59409                     if (((instr & 0xf0000000) == 0xf0000000) ||
   59410                         ((instr & 0xfe0) == 0x60)) {
   59411                       UnallocatedA32(instr);
   59412                       return;
   59413                     }
   59414                     Condition condition((instr >> 28) & 0xf);
   59415                     unsigned rn = (instr >> 16) & 0xf;
   59416                     unsigned rm = instr & 0xf;
   59417                     ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
   59418                                                         (instr >> 7) & 0x1f);
   59419                     // TST{<c>}{<q>} <Rn>, <Rm> {, <shift> #<amount> } ; A1
   59420                     tst(condition,
   59421                         Best,
   59422                         Register(rn),
   59423                         Operand(Register(rm),
   59424                                 shift_operand.GetType(),
   59425                                 shift_operand.GetAmount()));
   59426                     if (((instr & 0xff0f010) != 0x1100000)) {
   59427                       UnpredictableA32(instr);
   59428                     }
   59429                     break;
   59430                   }
   59431                 }
   59432                 break;
   59433               }
   59434               case 0x01200000: {
   59435                 // 0x01300000
   59436                 switch (instr & 0x00000fe0) {
   59437                   case 0x00000060: {
   59438                     // 0x01300060
   59439                     if (((instr & 0xf0000000) == 0xf0000000)) {
   59440                       UnallocatedA32(instr);
   59441                       return;
   59442                     }
   59443                     Condition condition((instr >> 28) & 0xf);
   59444                     unsigned rn = (instr >> 16) & 0xf;
   59445                     unsigned rm = instr & 0xf;
   59446                     // TEQ{<c>}{<q>} <Rn>, <Rm>, RRX ; A1
   59447                     teq(condition, Register(rn), Operand(Register(rm), RRX));
   59448                     if (((instr & 0xff0fff0) != 0x1300060)) {
   59449                       UnpredictableA32(instr);
   59450                     }
   59451                     break;
   59452                   }
   59453                   default: {
   59454                     if (((instr & 0xf0000000) == 0xf0000000) ||
   59455                         ((instr & 0xfe0) == 0x60)) {
   59456                       UnallocatedA32(instr);
   59457                       return;
   59458                     }
   59459                     Condition condition((instr >> 28) & 0xf);
   59460                     unsigned rn = (instr >> 16) & 0xf;
   59461                     unsigned rm = instr & 0xf;
   59462                     ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
   59463                                                         (instr >> 7) & 0x1f);
   59464                     // TEQ{<c>}{<q>} <Rn>, <Rm> {, <shift> #<amount> } ; A1
   59465                     teq(condition,
   59466                         Register(rn),
   59467                         Operand(Register(rm),
   59468                                 shift_operand.GetType(),
   59469                                 shift_operand.GetAmount()));
   59470                     if (((instr & 0xff0f010) != 0x1300000)) {
   59471                       UnpredictableA32(instr);
   59472                     }
   59473                     break;
   59474                   }
   59475                 }
   59476                 break;
   59477               }
   59478               case 0x01400000: {
   59479                 // 0x01500000
   59480                 switch (instr & 0x00000fe0) {
   59481                   case 0x00000060: {
   59482                     // 0x01500060
   59483                     if (((instr & 0xf0000000) == 0xf0000000)) {
   59484                       UnallocatedA32(instr);
   59485                       return;
   59486                     }
   59487                     Condition condition((instr >> 28) & 0xf);
   59488                     unsigned rn = (instr >> 16) & 0xf;
   59489                     unsigned rm = instr & 0xf;
   59490                     // CMP{<c>}{<q>} <Rn>, <Rm>, RRX ; A1
   59491                     cmp(condition,
   59492                         Best,
   59493                         Register(rn),
   59494                         Operand(Register(rm), RRX));
   59495                     if (((instr & 0xff0fff0) != 0x1500060)) {
   59496                       UnpredictableA32(instr);
   59497                     }
   59498                     break;
   59499                   }
   59500                   default: {
   59501                     if (((instr & 0xf0000000) == 0xf0000000) ||
   59502                         ((instr & 0xfe0) == 0x60)) {
   59503                       UnallocatedA32(instr);
   59504                       return;
   59505                     }
   59506                     Condition condition((instr >> 28) & 0xf);
   59507                     unsigned rn = (instr >> 16) & 0xf;
   59508                     unsigned rm = instr & 0xf;
   59509                     ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
   59510                                                         (instr >> 7) & 0x1f);
   59511                     // CMP{<c>}{<q>} <Rn>, <Rm> {, <shift> #<amount> } ; A1
   59512                     cmp(condition,
   59513                         Best,
   59514                         Register(rn),
   59515                         Operand(Register(rm),
   59516                                 shift_operand.GetType(),
   59517                                 shift_operand.GetAmount()));
   59518                     if (((instr & 0xff0f010) != 0x1500000)) {
   59519                       UnpredictableA32(instr);
   59520                     }
   59521                     break;
   59522                   }
   59523                 }
   59524                 break;
   59525               }
   59526               case 0x01600000: {
   59527                 // 0x01700000
   59528                 switch (instr & 0x00000fe0) {
   59529                   case 0x00000060: {
   59530                     // 0x01700060
   59531                     if (((instr & 0xf0000000) == 0xf0000000)) {
   59532                       UnallocatedA32(instr);
   59533                       return;
   59534                     }
   59535                     Condition condition((instr >> 28) & 0xf);
   59536                     unsigned rn = (instr >> 16) & 0xf;
   59537                     unsigned rm = instr & 0xf;
   59538                     // CMN{<c>}{<q>} <Rn>, <Rm>, RRX ; A1
   59539                     cmn(condition,
   59540                         Best,
   59541                         Register(rn),
   59542                         Operand(Register(rm), RRX));
   59543                     if (((instr & 0xff0fff0) != 0x1700060)) {
   59544                       UnpredictableA32(instr);
   59545                     }
   59546                     break;
   59547                   }
   59548                   default: {
   59549                     if (((instr & 0xf0000000) == 0xf0000000) ||
   59550                         ((instr & 0xfe0) == 0x60)) {
   59551                       UnallocatedA32(instr);
   59552                       return;
   59553                     }
   59554                     Condition condition((instr >> 28) & 0xf);
   59555                     unsigned rn = (instr >> 16) & 0xf;
   59556                     unsigned rm = instr & 0xf;
   59557                     ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
   59558                                                         (instr >> 7) & 0x1f);
   59559                     // CMN{<c>}{<q>} <Rn>, <Rm> {, <shift> #<amount> } ; A1
   59560                     cmn(condition,
   59561                         Best,
   59562                         Register(rn),
   59563                         Operand(Register(rm),
   59564                                 shift_operand.GetType(),
   59565                                 shift_operand.GetAmount()));
   59566                     if (((instr & 0xff0f010) != 0x1700000)) {
   59567                       UnpredictableA32(instr);
   59568                     }
   59569                     break;
   59570                   }
   59571                 }
   59572                 break;
   59573               }
   59574               case 0x01800000: {
   59575                 // 0x01900000
   59576                 switch (instr & 0x00000fe0) {
   59577                   case 0x00000060: {
   59578                     // 0x01900060
   59579                     if (((instr & 0xf0000000) == 0xf0000000)) {
   59580                       UnallocatedA32(instr);
   59581                       return;
   59582                     }
   59583                     Condition condition((instr >> 28) & 0xf);
   59584                     unsigned rd = (instr >> 12) & 0xf;
   59585                     unsigned rn = (instr >> 16) & 0xf;
   59586                     unsigned rm = instr & 0xf;
   59587                     // ORRS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
   59588                     orrs(condition,
   59589                          Best,
   59590                          Register(rd),
   59591                          Register(rn),
   59592                          Operand(Register(rm), RRX));
   59593                     break;
   59594                   }
   59595                   default: {
   59596                     if (((instr & 0xf0000000) == 0xf0000000) ||
   59597                         ((instr & 0xfe0) == 0x60)) {
   59598                       UnallocatedA32(instr);
   59599                       return;
   59600                     }
   59601                     Condition condition((instr >> 28) & 0xf);
   59602                     unsigned rd = (instr >> 12) & 0xf;
   59603                     unsigned rn = (instr >> 16) & 0xf;
   59604                     unsigned rm = instr & 0xf;
   59605                     ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
   59606                                                         (instr >> 7) & 0x1f);
   59607                     // ORRS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
   59608                     orrs(condition,
   59609                          Best,
   59610                          Register(rd),
   59611                          Register(rn),
   59612                          Operand(Register(rm),
   59613                                  shift_operand.GetType(),
   59614                                  shift_operand.GetAmount()));
   59615                     break;
   59616                   }
   59617                 }
   59618                 break;
   59619               }
   59620               case 0x01a00000: {
   59621                 // 0x01b00000
   59622                 switch (instr & 0x00000fe0) {
   59623                   case 0x00000060: {
   59624                     // 0x01b00060
   59625                     if (((instr & 0xf0000000) == 0xf0000000)) {
   59626                       UnallocatedA32(instr);
   59627                       return;
   59628                     }
   59629                     if (((instr & 0xf0000000) != 0xf0000000)) {
   59630                       Condition condition((instr >> 28) & 0xf);
   59631                       unsigned rd = (instr >> 12) & 0xf;
   59632                       unsigned rm = instr & 0xf;
   59633                       // RRXS{<c>}{<q>} {<Rd>}, <Rm> ; A1
   59634                       rrxs(condition, Register(rd), Register(rm));
   59635                       if (((instr & 0xfff0ff0) != 0x1b00060)) {
   59636                         UnpredictableA32(instr);
   59637                       }
   59638                       return;
   59639                     }
   59640                     Condition condition((instr >> 28) & 0xf);
   59641                     unsigned rd = (instr >> 12) & 0xf;
   59642                     unsigned rm = instr & 0xf;
   59643                     // MOVS{<c>}{<q>} <Rd>, <Rm>, RRX ; A1
   59644                     movs(condition,
   59645                          Best,
   59646                          Register(rd),
   59647                          Operand(Register(rm), RRX));
   59648                     if (((instr & 0xfff0ff0) != 0x1b00060)) {
   59649                       UnpredictableA32(instr);
   59650                     }
   59651                     break;
   59652                   }
   59653                   default: {
   59654                     if (((instr & 0xf0000000) == 0xf0000000) ||
   59655                         ((instr & 0xfe0) == 0x60)) {
   59656                       UnallocatedA32(instr);
   59657                       return;
   59658                     }
   59659                     if (((Uint32((instr >> 5)) & Uint32(0x3)) == Uint32(0x2)) &&
   59660                         ((instr & 0xf0000000) != 0xf0000000)) {
   59661                       Condition condition((instr >> 28) & 0xf);
   59662                       unsigned rd = (instr >> 12) & 0xf;
   59663                       unsigned rm = instr & 0xf;
   59664                       uint32_t amount = (instr >> 7) & 0x1f;
   59665                       if (amount == 0) amount = 32;
   59666                       // ASRS{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; A1
   59667                       asrs(condition, Best, Register(rd), Register(rm), amount);
   59668                       if (((instr & 0xfff0070) != 0x1b00040)) {
   59669                         UnpredictableA32(instr);
   59670                       }
   59671                       return;
   59672                     }
   59673                     if (((Uint32((instr >> 5)) & Uint32(0x3)) == Uint32(0x0)) &&
   59674                         ((instr & 0xf0000000) != 0xf0000000) &&
   59675                         ((instr & 0x00000f80) != 0x00000000)) {
   59676                       Condition condition((instr >> 28) & 0xf);
   59677                       unsigned rd = (instr >> 12) & 0xf;
   59678                       unsigned rm = instr & 0xf;
   59679                       uint32_t amount = (instr >> 7) & 0x1f;
   59680                       // LSLS{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; A1
   59681                       lsls(condition, Best, Register(rd), Register(rm), amount);
   59682                       if (((instr & 0xfff0070) != 0x1b00000)) {
   59683                         UnpredictableA32(instr);
   59684                       }
   59685                       return;
   59686                     }
   59687                     if (((Uint32((instr >> 5)) & Uint32(0x3)) == Uint32(0x1)) &&
   59688                         ((instr & 0xf0000000) != 0xf0000000)) {
   59689                       Condition condition((instr >> 28) & 0xf);
   59690                       unsigned rd = (instr >> 12) & 0xf;
   59691                       unsigned rm = instr & 0xf;
   59692                       uint32_t amount = (instr >> 7) & 0x1f;
   59693                       if (amount == 0) amount = 32;
   59694                       // LSRS{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; A1
   59695                       lsrs(condition, Best, Register(rd), Register(rm), amount);
   59696                       if (((instr & 0xfff0070) != 0x1b00020)) {
   59697                         UnpredictableA32(instr);
   59698                       }
   59699                       return;
   59700                     }
   59701                     if (((Uint32((instr >> 5)) & Uint32(0x3)) == Uint32(0x3)) &&
   59702                         ((instr & 0xf0000000) != 0xf0000000) &&
   59703                         ((instr & 0x00000f80) != 0x00000000)) {
   59704                       Condition condition((instr >> 28) & 0xf);
   59705                       unsigned rd = (instr >> 12) & 0xf;
   59706                       unsigned rm = instr & 0xf;
   59707                       uint32_t amount = (instr >> 7) & 0x1f;
   59708                       // RORS{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; A1
   59709                       rors(condition, Best, Register(rd), Register(rm), amount);
   59710                       if (((instr & 0xfff0070) != 0x1b00060)) {
   59711                         UnpredictableA32(instr);
   59712                       }
   59713                       return;
   59714                     }
   59715                     Condition condition((instr >> 28) & 0xf);
   59716                     unsigned rd = (instr >> 12) & 0xf;
   59717                     unsigned rm = instr & 0xf;
   59718                     ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
   59719                                                         (instr >> 7) & 0x1f);
   59720                     // MOVS{<c>}{<q>} <Rd>, <Rm> {, <shift> #<amount> } ; A1
   59721                     movs(condition,
   59722                          Best,
   59723                          Register(rd),
   59724                          Operand(Register(rm),
   59725                                  shift_operand.GetType(),
   59726                                  shift_operand.GetAmount()));
   59727                     if (((instr & 0xfff0010) != 0x1b00000)) {
   59728                       UnpredictableA32(instr);
   59729                     }
   59730                     break;
   59731                   }
   59732                 }
   59733                 break;
   59734               }
   59735               case 0x01c00000: {
   59736                 // 0x01d00000
   59737                 switch (instr & 0x00000fe0) {
   59738                   case 0x00000060: {
   59739                     // 0x01d00060
   59740                     if (((instr & 0xf0000000) == 0xf0000000)) {
   59741                       UnallocatedA32(instr);
   59742                       return;
   59743                     }
   59744                     Condition condition((instr >> 28) & 0xf);
   59745                     unsigned rd = (instr >> 12) & 0xf;
   59746                     unsigned rn = (instr >> 16) & 0xf;
   59747                     unsigned rm = instr & 0xf;
   59748                     // BICS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
   59749                     bics(condition,
   59750                          Best,
   59751                          Register(rd),
   59752                          Register(rn),
   59753                          Operand(Register(rm), RRX));
   59754                     break;
   59755                   }
   59756                   default: {
   59757                     if (((instr & 0xf0000000) == 0xf0000000) ||
   59758                         ((instr & 0xfe0) == 0x60)) {
   59759                       UnallocatedA32(instr);
   59760                       return;
   59761                     }
   59762                     Condition condition((instr >> 28) & 0xf);
   59763                     unsigned rd = (instr >> 12) & 0xf;
   59764                     unsigned rn = (instr >> 16) & 0xf;
   59765                     unsigned rm = instr & 0xf;
   59766                     ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
   59767                                                         (instr >> 7) & 0x1f);
   59768                     // BICS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
   59769                     bics(condition,
   59770                          Best,
   59771                          Register(rd),
   59772                          Register(rn),
   59773                          Operand(Register(rm),
   59774                                  shift_operand.GetType(),
   59775                                  shift_operand.GetAmount()));
   59776                     break;
   59777                   }
   59778                 }
   59779                 break;
   59780               }
   59781               case 0x01e00000: {
   59782                 // 0x01f00000
   59783                 switch (instr & 0x00000fe0) {
   59784                   case 0x00000060: {
   59785                     // 0x01f00060
   59786                     if (((instr & 0xf0000000) == 0xf0000000)) {
   59787                       UnallocatedA32(instr);
   59788                       return;
   59789                     }
   59790                     Condition condition((instr >> 28) & 0xf);
   59791                     unsigned rd = (instr >> 12) & 0xf;
   59792                     unsigned rm = instr & 0xf;
   59793                     // MVNS{<c>}{<q>} <Rd>, <Rm>, RRX ; A1
   59794                     mvns(condition,
   59795                          Best,
   59796                          Register(rd),
   59797                          Operand(Register(rm), RRX));
   59798                     if (((instr & 0xfff0ff0) != 0x1f00060)) {
   59799                       UnpredictableA32(instr);
   59800                     }
   59801                     break;
   59802                   }
   59803                   default: {
   59804                     if (((instr & 0xf0000000) == 0xf0000000) ||
   59805                         ((instr & 0xfe0) == 0x60)) {
   59806                       UnallocatedA32(instr);
   59807                       return;
   59808                     }
   59809                     Condition condition((instr >> 28) & 0xf);
   59810                     unsigned rd = (instr >> 12) & 0xf;
   59811                     unsigned rm = instr & 0xf;
   59812                     ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
   59813                                                         (instr >> 7) & 0x1f);
   59814                     // MVNS{<c>}{<q>} <Rd>, <Rm> {, <shift> #<amount> } ; A1
   59815                     mvns(condition,
   59816                          Best,
   59817                          Register(rd),
   59818                          Operand(Register(rm),
   59819                                  shift_operand.GetType(),
   59820                                  shift_operand.GetAmount()));
   59821                     if (((instr & 0xfff0010) != 0x1f00000)) {
   59822                       UnpredictableA32(instr);
   59823                     }
   59824                     break;
   59825                   }
   59826                 }
   59827                 break;
   59828               }
   59829             }
   59830             break;
   59831           }
   59832           case 0x00100010: {
   59833             // 0x00100010
   59834             switch (instr & 0x00400080) {
   59835               case 0x00000000: {
   59836                 // 0x00100010
   59837                 switch (instr & 0x01a00000) {
   59838                   case 0x00000000: {
   59839                     // 0x00100010
   59840                     if (((instr & 0xf0000000) == 0xf0000000)) {
   59841                       UnallocatedA32(instr);
   59842                       return;
   59843                     }
   59844                     Condition condition((instr >> 28) & 0xf);
   59845                     unsigned rd = (instr >> 12) & 0xf;
   59846                     unsigned rn = (instr >> 16) & 0xf;
   59847                     unsigned rm = instr & 0xf;
   59848                     Shift shift((instr >> 5) & 0x3);
   59849                     unsigned rs = (instr >> 8) & 0xf;
   59850                     // ANDS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
   59851                     ands(condition,
   59852                          Best,
   59853                          Register(rd),
   59854                          Register(rn),
   59855                          Operand(Register(rm), shift.GetType(), Register(rs)));
   59856                     break;
   59857                   }
   59858                   case 0x00200000: {
   59859                     // 0x00300010
   59860                     if (((instr & 0xf0000000) == 0xf0000000)) {
   59861                       UnallocatedA32(instr);
   59862                       return;
   59863                     }
   59864                     Condition condition((instr >> 28) & 0xf);
   59865                     unsigned rd = (instr >> 12) & 0xf;
   59866                     unsigned rn = (instr >> 16) & 0xf;
   59867                     unsigned rm = instr & 0xf;
   59868                     Shift shift((instr >> 5) & 0x3);
   59869                     unsigned rs = (instr >> 8) & 0xf;
   59870                     // EORS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
   59871                     eors(condition,
   59872                          Best,
   59873                          Register(rd),
   59874                          Register(rn),
   59875                          Operand(Register(rm), shift.GetType(), Register(rs)));
   59876                     break;
   59877                   }
   59878                   case 0x00800000: {
   59879                     // 0x00900010
   59880                     if (((instr & 0xf0000000) == 0xf0000000)) {
   59881                       UnallocatedA32(instr);
   59882                       return;
   59883                     }
   59884                     Condition condition((instr >> 28) & 0xf);
   59885                     unsigned rd = (instr >> 12) & 0xf;
   59886                     unsigned rn = (instr >> 16) & 0xf;
   59887                     unsigned rm = instr & 0xf;
   59888                     Shift shift((instr >> 5) & 0x3);
   59889                     unsigned rs = (instr >> 8) & 0xf;
   59890                     // ADDS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
   59891                     adds(condition,
   59892                          Best,
   59893                          Register(rd),
   59894                          Register(rn),
   59895                          Operand(Register(rm), shift.GetType(), Register(rs)));
   59896                     break;
   59897                   }
   59898                   case 0x00a00000: {
   59899                     // 0x00b00010
   59900                     if (((instr & 0xf0000000) == 0xf0000000)) {
   59901                       UnallocatedA32(instr);
   59902                       return;
   59903                     }
   59904                     Condition condition((instr >> 28) & 0xf);
   59905                     unsigned rd = (instr >> 12) & 0xf;
   59906                     unsigned rn = (instr >> 16) & 0xf;
   59907                     unsigned rm = instr & 0xf;
   59908                     Shift shift((instr >> 5) & 0x3);
   59909                     unsigned rs = (instr >> 8) & 0xf;
   59910                     // ADCS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
   59911                     adcs(condition,
   59912                          Best,
   59913                          Register(rd),
   59914                          Register(rn),
   59915                          Operand(Register(rm), shift.GetType(), Register(rs)));
   59916                     break;
   59917                   }
   59918                   case 0x01000000: {
   59919                     // 0x01100010
   59920                     if (((instr & 0xf0000000) == 0xf0000000)) {
   59921                       UnallocatedA32(instr);
   59922                       return;
   59923                     }
   59924                     Condition condition((instr >> 28) & 0xf);
   59925                     unsigned rn = (instr >> 16) & 0xf;
   59926                     unsigned rm = instr & 0xf;
   59927                     Shift shift((instr >> 5) & 0x3);
   59928                     unsigned rs = (instr >> 8) & 0xf;
   59929                     // TST{<c>}{<q>} <Rn>, <Rm>, <shift> <Rs> ; A1
   59930                     tst(condition,
   59931                         Best,
   59932                         Register(rn),
   59933                         Operand(Register(rm), shift.GetType(), Register(rs)));
   59934                     if (((instr & 0xff0f090) != 0x1100010)) {
   59935                       UnpredictableA32(instr);
   59936                     }
   59937                     break;
   59938                   }
   59939                   case 0x01200000: {
   59940                     // 0x01300010
   59941                     if (((instr & 0xf0000000) == 0xf0000000)) {
   59942                       UnallocatedA32(instr);
   59943                       return;
   59944                     }
   59945                     Condition condition((instr >> 28) & 0xf);
   59946                     unsigned rn = (instr >> 16) & 0xf;
   59947                     unsigned rm = instr & 0xf;
   59948                     Shift shift((instr >> 5) & 0x3);
   59949                     unsigned rs = (instr >> 8) & 0xf;
   59950                     // TEQ{<c>}{<q>} <Rn>, <Rm>, <shift> <Rs> ; A1
   59951                     teq(condition,
   59952                         Register(rn),
   59953                         Operand(Register(rm), shift.GetType(), Register(rs)));
   59954                     if (((instr & 0xff0f090) != 0x1300010)) {
   59955                       UnpredictableA32(instr);
   59956                     }
   59957                     break;
   59958                   }
   59959                   case 0x01800000: {
   59960                     // 0x01900010
   59961                     if (((instr & 0xf0000000) == 0xf0000000)) {
   59962                       UnallocatedA32(instr);
   59963                       return;
   59964                     }
   59965                     Condition condition((instr >> 28) & 0xf);
   59966                     unsigned rd = (instr >> 12) & 0xf;
   59967                     unsigned rn = (instr >> 16) & 0xf;
   59968                     unsigned rm = instr & 0xf;
   59969                     Shift shift((instr >> 5) & 0x3);
   59970                     unsigned rs = (instr >> 8) & 0xf;
   59971                     // ORRS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
   59972                     orrs(condition,
   59973                          Best,
   59974                          Register(rd),
   59975                          Register(rn),
   59976                          Operand(Register(rm), shift.GetType(), Register(rs)));
   59977                     break;
   59978                   }
   59979                   case 0x01a00000: {
   59980                     // 0x01b00010
   59981                     if (((instr & 0xf0000000) == 0xf0000000)) {
   59982                       UnallocatedA32(instr);
   59983                       return;
   59984                     }
   59985                     if (((Uint32((instr >> 5)) & Uint32(0x3)) == Uint32(0x2)) &&
   59986                         ((instr & 0xf0000000) != 0xf0000000)) {
   59987                       Condition condition((instr >> 28) & 0xf);
   59988                       unsigned rd = (instr >> 12) & 0xf;
   59989                       unsigned rm = instr & 0xf;
   59990                       unsigned rs = (instr >> 8) & 0xf;
   59991                       // ASRS{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; A1
   59992                       asrs(condition,
   59993                            Best,
   59994                            Register(rd),
   59995                            Register(rm),
   59996                            Register(rs));
   59997                       if (((instr & 0xfff00f0) != 0x1b00050)) {
   59998                         UnpredictableA32(instr);
   59999                       }
   60000                       return;
   60001                     }
   60002                     if (((Uint32((instr >> 5)) & Uint32(0x3)) == Uint32(0x0)) &&
   60003                         ((instr & 0xf0000000) != 0xf0000000)) {
   60004                       Condition condition((instr >> 28) & 0xf);
   60005                       unsigned rd = (instr >> 12) & 0xf;
   60006                       unsigned rm = instr & 0xf;
   60007                       unsigned rs = (instr >> 8) & 0xf;
   60008                       // LSLS{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; A1
   60009                       lsls(condition,
   60010                            Best,
   60011                            Register(rd),
   60012                            Register(rm),
   60013                            Register(rs));
   60014                       if (((instr & 0xfff00f0) != 0x1b00010)) {
   60015                         UnpredictableA32(instr);
   60016                       }
   60017                       return;
   60018                     }
   60019                     if (((Uint32((instr >> 5)) & Uint32(0x3)) == Uint32(0x1)) &&
   60020                         ((instr & 0xf0000000) != 0xf0000000)) {
   60021                       Condition condition((instr >> 28) & 0xf);
   60022                       unsigned rd = (instr >> 12) & 0xf;
   60023                       unsigned rm = instr & 0xf;
   60024                       unsigned rs = (instr >> 8) & 0xf;
   60025                       // LSRS{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; A1
   60026                       lsrs(condition,
   60027                            Best,
   60028                            Register(rd),
   60029                            Register(rm),
   60030                            Register(rs));
   60031                       if (((instr & 0xfff00f0) != 0x1b00030)) {
   60032                         UnpredictableA32(instr);
   60033                       }
   60034                       return;
   60035                     }
   60036                     if (((Uint32((instr >> 5)) & Uint32(0x3)) == Uint32(0x3)) &&
   60037                         ((instr & 0xf0000000) != 0xf0000000)) {
   60038                       Condition condition((instr >> 28) & 0xf);
   60039                       unsigned rd = (instr >> 12) & 0xf;
   60040                       unsigned rm = instr & 0xf;
   60041                       unsigned rs = (instr >> 8) & 0xf;
   60042                       // RORS{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; A1
   60043                       rors(condition,
   60044                            Best,
   60045                            Register(rd),
   60046                            Register(rm),
   60047                            Register(rs));
   60048                       if (((instr & 0xfff00f0) != 0x1b00070)) {
   60049                         UnpredictableA32(instr);
   60050                       }
   60051                       return;
   60052                     }
   60053                     Condition condition((instr >> 28) & 0xf);
   60054                     unsigned rd = (instr >> 12) & 0xf;
   60055                     unsigned rm = instr & 0xf;
   60056                     Shift shift((instr >> 5) & 0x3);
   60057                     unsigned rs = (instr >> 8) & 0xf;
   60058                     // MOVS{<c>}{<q>} <Rd>, <Rm>, <shift> <Rs> ; A1
   60059                     movs(condition,
   60060                          Best,
   60061                          Register(rd),
   60062                          Operand(Register(rm), shift.GetType(), Register(rs)));
   60063                     if (((instr & 0xfff0090) != 0x1b00010)) {
   60064                       UnpredictableA32(instr);
   60065                     }
   60066                     break;
   60067                   }
   60068                 }
   60069                 break;
   60070               }
   60071               case 0x00000080: {
   60072                 // 0x00100090
   60073                 switch (instr & 0x01200060) {
   60074                   case 0x00000000: {
   60075                     // 0x00100090
   60076                     switch (instr & 0x00800000) {
   60077                       case 0x00000000: {
   60078                         // 0x00100090
   60079                         if (((instr & 0xf0000000) == 0xf0000000)) {
   60080                           UnallocatedA32(instr);
   60081                           return;
   60082                         }
   60083                         Condition condition((instr >> 28) & 0xf);
   60084                         unsigned rd = (instr >> 16) & 0xf;
   60085                         unsigned rn = instr & 0xf;
   60086                         unsigned rm = (instr >> 8) & 0xf;
   60087                         // MULS{<c>}{<q>} <Rd>, <Rn>, {<Rm>} ; A1
   60088                         muls(condition,
   60089                              Register(rd),
   60090                              Register(rn),
   60091                              Register(rm));
   60092                         if (((instr & 0xff0f0f0) != 0x100090)) {
   60093                           UnpredictableA32(instr);
   60094                         }
   60095                         break;
   60096                       }
   60097                       case 0x00800000: {
   60098                         // 0x00900090
   60099                         if (((instr & 0xf0000000) == 0xf0000000)) {
   60100                           UnallocatedA32(instr);
   60101                           return;
   60102                         }
   60103                         Condition condition((instr >> 28) & 0xf);
   60104                         unsigned rdlo = (instr >> 12) & 0xf;
   60105                         unsigned rdhi = (instr >> 16) & 0xf;
   60106                         unsigned rn = instr & 0xf;
   60107                         unsigned rm = (instr >> 8) & 0xf;
   60108                         // UMULLS{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
   60109                         umulls(condition,
   60110                                Register(rdlo),
   60111                                Register(rdhi),
   60112                                Register(rn),
   60113                                Register(rm));
   60114                         break;
   60115                       }
   60116                     }
   60117                     break;
   60118                   }
   60119                   case 0x00000020: {
   60120                     // 0x001000b0
   60121                     if (((instr & 0xf0000000) == 0xf0000000)) {
   60122                       UnallocatedA32(instr);
   60123                       return;
   60124                     }
   60125                     Condition condition((instr >> 28) & 0xf);
   60126                     unsigned rt = (instr >> 12) & 0xf;
   60127                     unsigned rn = (instr >> 16) & 0xf;
   60128                     Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
   60129                     unsigned rm = instr & 0xf;
   60130                     // LDRH{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<Rm> ; A1
   60131                     ldrh(condition,
   60132                          Best,
   60133                          Register(rt),
   60134                          MemOperand(Register(rn),
   60135                                     sign,
   60136                                     Register(rm),
   60137                                     PostIndex));
   60138                     if (((instr & 0xf700ff0) != 0x1000b0)) {
   60139                       UnpredictableA32(instr);
   60140                     }
   60141                     break;
   60142                   }
   60143                   case 0x00000040: {
   60144                     // 0x001000d0
   60145                     if (((instr & 0xf0000000) == 0xf0000000)) {
   60146                       UnallocatedA32(instr);
   60147                       return;
   60148                     }
   60149                     Condition condition((instr >> 28) & 0xf);
   60150                     unsigned rt = (instr >> 12) & 0xf;
   60151                     unsigned rn = (instr >> 16) & 0xf;
   60152                     Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
   60153                     unsigned rm = instr & 0xf;
   60154                     // LDRSB{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<Rm> ; A1
   60155                     ldrsb(condition,
   60156                           Best,
   60157                           Register(rt),
   60158                           MemOperand(Register(rn),
   60159                                      sign,
   60160                                      Register(rm),
   60161                                      PostIndex));
   60162                     if (((instr & 0xf700ff0) != 0x1000d0)) {
   60163                       UnpredictableA32(instr);
   60164                     }
   60165                     break;
   60166                   }
   60167                   case 0x00000060: {
   60168                     // 0x001000f0
   60169                     if (((instr & 0xf0000000) == 0xf0000000)) {
   60170                       UnallocatedA32(instr);
   60171                       return;
   60172                     }
   60173                     Condition condition((instr >> 28) & 0xf);
   60174                     unsigned rt = (instr >> 12) & 0xf;
   60175                     unsigned rn = (instr >> 16) & 0xf;
   60176                     Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
   60177                     unsigned rm = instr & 0xf;
   60178                     // LDRSH{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<Rm> ; A1
   60179                     ldrsh(condition,
   60180                           Best,
   60181                           Register(rt),
   60182                           MemOperand(Register(rn),
   60183                                      sign,
   60184                                      Register(rm),
   60185                                      PostIndex));
   60186                     if (((instr & 0xf700ff0) != 0x1000f0)) {
   60187                       UnpredictableA32(instr);
   60188                     }
   60189                     break;
   60190                   }
   60191                   case 0x00200000: {
   60192                     // 0x00300090
   60193                     switch (instr & 0x00800000) {
   60194                       case 0x00000000: {
   60195                         // 0x00300090
   60196                         if (((instr & 0xf0000000) == 0xf0000000)) {
   60197                           UnallocatedA32(instr);
   60198                           return;
   60199                         }
   60200                         Condition condition((instr >> 28) & 0xf);
   60201                         unsigned rd = (instr >> 16) & 0xf;
   60202                         unsigned rn = instr & 0xf;
   60203                         unsigned rm = (instr >> 8) & 0xf;
   60204                         unsigned ra = (instr >> 12) & 0xf;
   60205                         // MLAS{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
   60206                         mlas(condition,
   60207                              Register(rd),
   60208                              Register(rn),
   60209                              Register(rm),
   60210                              Register(ra));
   60211                         break;
   60212                       }
   60213                       case 0x00800000: {
   60214                         // 0x00b00090
   60215                         if (((instr & 0xf0000000) == 0xf0000000)) {
   60216                           UnallocatedA32(instr);
   60217                           return;
   60218                         }
   60219                         Condition condition((instr >> 28) & 0xf);
   60220                         unsigned rdlo = (instr >> 12) & 0xf;
   60221                         unsigned rdhi = (instr >> 16) & 0xf;
   60222                         unsigned rn = instr & 0xf;
   60223                         unsigned rm = (instr >> 8) & 0xf;
   60224                         // UMLALS{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
   60225                         umlals(condition,
   60226                                Register(rdlo),
   60227                                Register(rdhi),
   60228                                Register(rn),
   60229                                Register(rm));
   60230                         break;
   60231                       }
   60232                     }
   60233                     break;
   60234                   }
   60235                   case 0x00200020: {
   60236                     // 0x003000b0
   60237                     if (((instr & 0xf0000000) == 0xf0000000)) {
   60238                       UnallocatedA32(instr);
   60239                       return;
   60240                     }
   60241                     UnimplementedA32("LDRHT", instr);
   60242                     break;
   60243                   }
   60244                   case 0x00200040: {
   60245                     // 0x003000d0
   60246                     if (((instr & 0xf0000000) == 0xf0000000)) {
   60247                       UnallocatedA32(instr);
   60248                       return;
   60249                     }
   60250                     UnimplementedA32("LDRSBT", instr);
   60251                     break;
   60252                   }
   60253                   case 0x00200060: {
   60254                     // 0x003000f0
   60255                     if (((instr & 0xf0000000) == 0xf0000000)) {
   60256                       UnallocatedA32(instr);
   60257                       return;
   60258                     }
   60259                     UnimplementedA32("LDRSHT", instr);
   60260                     break;
   60261                   }
   60262                   case 0x01000000: {
   60263                     // 0x01100090
   60264                     switch (instr & 0x00800300) {
   60265                       case 0x00800000: {
   60266                         // 0x01900090
   60267                         if (((instr & 0xf0000000) == 0xf0000000)) {
   60268                           UnallocatedA32(instr);
   60269                           return;
   60270                         }
   60271                         Condition condition((instr >> 28) & 0xf);
   60272                         unsigned rt = (instr >> 12) & 0xf;
   60273                         unsigned rn = (instr >> 16) & 0xf;
   60274                         // LDA{<c>}{<q>} <Rt>, [<Rn>] ; A1
   60275                         lda(condition,
   60276                             Register(rt),
   60277                             MemOperand(Register(rn), Offset));
   60278                         if (((instr & 0xff00fff) != 0x1900c9f)) {
   60279                           UnpredictableA32(instr);
   60280                         }
   60281                         break;
   60282                       }
   60283                       case 0x00800200: {
   60284                         // 0x01900290
   60285                         if (((instr & 0xf0000000) == 0xf0000000)) {
   60286                           UnallocatedA32(instr);
   60287                           return;
   60288                         }
   60289                         Condition condition((instr >> 28) & 0xf);
   60290                         unsigned rt = (instr >> 12) & 0xf;
   60291                         unsigned rn = (instr >> 16) & 0xf;
   60292                         // LDAEX{<c>}{<q>} <Rt>, [<Rn>] ; A1
   60293                         ldaex(condition,
   60294                               Register(rt),
   60295                               MemOperand(Register(rn), Offset));
   60296                         if (((instr & 0xff00fff) != 0x1900e9f)) {
   60297                           UnpredictableA32(instr);
   60298                         }
   60299                         break;
   60300                       }
   60301                       case 0x00800300: {
   60302                         // 0x01900390
   60303                         if (((instr & 0xf0000000) == 0xf0000000)) {
   60304                           UnallocatedA32(instr);
   60305                           return;
   60306                         }
   60307                         Condition condition((instr >> 28) & 0xf);
   60308                         unsigned rt = (instr >> 12) & 0xf;
   60309                         unsigned rn = (instr >> 16) & 0xf;
   60310                         // LDREX{<c>}{<q>} <Rt>, [<Rn>{, #<imm_1>}] ; A1
   60311                         ldrex(condition,
   60312                               Register(rt),
   60313                               MemOperand(Register(rn), plus, 0, Offset));
   60314                         if (((instr & 0xff00fff) != 0x1900f9f)) {
   60315                           UnpredictableA32(instr);
   60316                         }
   60317                         break;
   60318                       }
   60319                       default:
   60320                         UnallocatedA32(instr);
   60321                         break;
   60322                     }
   60323                     break;
   60324                   }
   60325                   case 0x01000020: {
   60326                     // 0x011000b0
   60327                     if (((instr & 0xf0000000) == 0xf0000000)) {
   60328                       UnallocatedA32(instr);
   60329                       return;
   60330                     }
   60331                     Condition condition((instr >> 28) & 0xf);
   60332                     unsigned rt = (instr >> 12) & 0xf;
   60333                     unsigned rn = (instr >> 16) & 0xf;
   60334                     Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
   60335                     unsigned rm = instr & 0xf;
   60336                     AddrMode addrmode = Offset;
   60337                     // LDRH{<c>}{<q>} <Rt>, [<Rn>, #{+/-}<Rm>] ; A1
   60338                     ldrh(condition,
   60339                          Best,
   60340                          Register(rt),
   60341                          MemOperand(Register(rn),
   60342                                     sign,
   60343                                     Register(rm),
   60344                                     addrmode));
   60345                     if (((instr & 0xf700ff0) != 0x11000b0)) {
   60346                       UnpredictableA32(instr);
   60347                     }
   60348                     break;
   60349                   }
   60350                   case 0x01000040: {
   60351                     // 0x011000d0
   60352                     if (((instr & 0xf0000000) == 0xf0000000)) {
   60353                       UnallocatedA32(instr);
   60354                       return;
   60355                     }
   60356                     Condition condition((instr >> 28) & 0xf);
   60357                     unsigned rt = (instr >> 12) & 0xf;
   60358                     unsigned rn = (instr >> 16) & 0xf;
   60359                     Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
   60360                     unsigned rm = instr & 0xf;
   60361                     AddrMode addrmode = Offset;
   60362                     // LDRSB{<c>}{<q>} <Rt>, [<Rn>, #{+/-}<Rm>] ; A1
   60363                     ldrsb(condition,
   60364                           Best,
   60365                           Register(rt),
   60366                           MemOperand(Register(rn),
   60367                                      sign,
   60368                                      Register(rm),
   60369                                      addrmode));
   60370                     if (((instr & 0xf700ff0) != 0x11000d0)) {
   60371                       UnpredictableA32(instr);
   60372                     }
   60373                     break;
   60374                   }
   60375                   case 0x01000060: {
   60376                     // 0x011000f0
   60377                     if (((instr & 0xf0000000) == 0xf0000000)) {
   60378                       UnallocatedA32(instr);
   60379                       return;
   60380                     }
   60381                     Condition condition((instr >> 28) & 0xf);
   60382                     unsigned rt = (instr >> 12) & 0xf;
   60383                     unsigned rn = (instr >> 16) & 0xf;
   60384                     Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
   60385                     unsigned rm = instr & 0xf;
   60386                     AddrMode addrmode = Offset;
   60387                     // LDRSH{<c>}{<q>} <Rt>, [<Rn>, #{+/-}<Rm>] ; A1
   60388                     ldrsh(condition,
   60389                           Best,
   60390                           Register(rt),
   60391                           MemOperand(Register(rn),
   60392                                      sign,
   60393                                      Register(rm),
   60394                                      addrmode));
   60395                     if (((instr & 0xf700ff0) != 0x11000f0)) {
   60396                       UnpredictableA32(instr);
   60397                     }
   60398                     break;
   60399                   }
   60400                   case 0x01200000: {
   60401                     // 0x01300090
   60402                     switch (instr & 0x00800300) {
   60403                       case 0x00800200: {
   60404                         // 0x01b00290
   60405                         if (((instr & 0xf0000000) == 0xf0000000)) {
   60406                           UnallocatedA32(instr);
   60407                           return;
   60408                         }
   60409                         Condition condition((instr >> 28) & 0xf);
   60410                         unsigned rt = (instr >> 12) & 0xf;
   60411                         unsigned rn = (instr >> 16) & 0xf;
   60412                         // LDAEXD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>] ; A1
   60413                         ldaexd(condition,
   60414                                Register(rt),
   60415                                Register(rt + 1),
   60416                                MemOperand(Register(rn), Offset));
   60417                         if (((instr & 0xff00fff) != 0x1b00e9f)) {
   60418                           UnpredictableA32(instr);
   60419                         }
   60420                         break;
   60421                       }
   60422                       case 0x00800300: {
   60423                         // 0x01b00390
   60424                         if (((instr & 0xf0000000) == 0xf0000000)) {
   60425                           UnallocatedA32(instr);
   60426                           return;
   60427                         }
   60428                         Condition condition((instr >> 28) & 0xf);
   60429                         unsigned rt = (instr >> 12) & 0xf;
   60430                         unsigned rn = (instr >> 16) & 0xf;
   60431                         // LDREXD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>] ; A1
   60432                         ldrexd(condition,
   60433                                Register(rt),
   60434                                Register(rt + 1),
   60435                                MemOperand(Register(rn), Offset));
   60436                         if (((instr & 0xff00fff) != 0x1b00f9f)) {
   60437                           UnpredictableA32(instr);
   60438                         }
   60439                         break;
   60440                       }
   60441                       default:
   60442                         UnallocatedA32(instr);
   60443                         break;
   60444                     }
   60445                     break;
   60446                   }
   60447                   case 0x01200020: {
   60448                     // 0x013000b0
   60449                     if (((instr & 0xf0000000) == 0xf0000000)) {
   60450                       UnallocatedA32(instr);
   60451                       return;
   60452                     }
   60453                     Condition condition((instr >> 28) & 0xf);
   60454                     unsigned rt = (instr >> 12) & 0xf;
   60455                     unsigned rn = (instr >> 16) & 0xf;
   60456                     Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
   60457                     unsigned rm = instr & 0xf;
   60458                     AddrMode addrmode = PreIndex;
   60459                     // LDRH{<c>}{<q>} <Rt>, [<Rn>, #{+/-}<Rm>]! ; A1
   60460                     ldrh(condition,
   60461                          Best,
   60462                          Register(rt),
   60463                          MemOperand(Register(rn),
   60464                                     sign,
   60465                                     Register(rm),
   60466                                     addrmode));
   60467                     if (((instr & 0xf700ff0) != 0x13000b0)) {
   60468                       UnpredictableA32(instr);
   60469                     }
   60470                     break;
   60471                   }
   60472                   case 0x01200040: {
   60473                     // 0x013000d0
   60474                     if (((instr & 0xf0000000) == 0xf0000000)) {
   60475                       UnallocatedA32(instr);
   60476                       return;
   60477                     }
   60478                     Condition condition((instr >> 28) & 0xf);
   60479                     unsigned rt = (instr >> 12) & 0xf;
   60480                     unsigned rn = (instr >> 16) & 0xf;
   60481                     Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
   60482                     unsigned rm = instr & 0xf;
   60483                     AddrMode addrmode = PreIndex;
   60484                     // LDRSB{<c>}{<q>} <Rt>, [<Rn>, #{+/-}<Rm>]! ; A1
   60485                     ldrsb(condition,
   60486                           Best,
   60487                           Register(rt),
   60488                           MemOperand(Register(rn),
   60489                                      sign,
   60490                                      Register(rm),
   60491                                      addrmode));
   60492                     if (((instr & 0xf700ff0) != 0x13000d0)) {
   60493                       UnpredictableA32(instr);
   60494                     }
   60495                     break;
   60496                   }
   60497                   case 0x01200060: {
   60498                     // 0x013000f0
   60499                     if (((instr & 0xf0000000) == 0xf0000000)) {
   60500                       UnallocatedA32(instr);
   60501                       return;
   60502                     }
   60503                     Condition condition((instr >> 28) & 0xf);
   60504                     unsigned rt = (instr >> 12) & 0xf;
   60505                     unsigned rn = (instr >> 16) & 0xf;
   60506                     Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
   60507                     unsigned rm = instr & 0xf;
   60508                     AddrMode addrmode = PreIndex;
   60509                     // LDRSH{<c>}{<q>} <Rt>, [<Rn>, #{+/-}<Rm>]! ; A1
   60510                     ldrsh(condition,
   60511                           Best,
   60512                           Register(rt),
   60513                           MemOperand(Register(rn),
   60514                                      sign,
   60515                                      Register(rm),
   60516                                      addrmode));
   60517                     if (((instr & 0xf700ff0) != 0x13000f0)) {
   60518                       UnpredictableA32(instr);
   60519                     }
   60520                     break;
   60521                   }
   60522                 }
   60523                 break;
   60524               }
   60525               case 0x00400000: {
   60526                 // 0x00500010
   60527                 switch (instr & 0x01a00000) {
   60528                   case 0x00000000: {
   60529                     // 0x00500010
   60530                     if (((instr & 0xf0000000) == 0xf0000000)) {
   60531                       UnallocatedA32(instr);
   60532                       return;
   60533                     }
   60534                     Condition condition((instr >> 28) & 0xf);
   60535                     unsigned rd = (instr >> 12) & 0xf;
   60536                     unsigned rn = (instr >> 16) & 0xf;
   60537                     unsigned rm = instr & 0xf;
   60538                     Shift shift((instr >> 5) & 0x3);
   60539                     unsigned rs = (instr >> 8) & 0xf;
   60540                     // SUBS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
   60541                     subs(condition,
   60542                          Best,
   60543                          Register(rd),
   60544                          Register(rn),
   60545                          Operand(Register(rm), shift.GetType(), Register(rs)));
   60546                     break;
   60547                   }
   60548                   case 0x00200000: {
   60549                     // 0x00700010
   60550                     if (((instr & 0xf0000000) == 0xf0000000)) {
   60551                       UnallocatedA32(instr);
   60552                       return;
   60553                     }
   60554                     Condition condition((instr >> 28) & 0xf);
   60555                     unsigned rd = (instr >> 12) & 0xf;
   60556                     unsigned rn = (instr >> 16) & 0xf;
   60557                     unsigned rm = instr & 0xf;
   60558                     Shift shift((instr >> 5) & 0x3);
   60559                     unsigned rs = (instr >> 8) & 0xf;
   60560                     // RSBS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
   60561                     rsbs(condition,
   60562                          Best,
   60563                          Register(rd),
   60564                          Register(rn),
   60565                          Operand(Register(rm), shift.GetType(), Register(rs)));
   60566                     break;
   60567                   }
   60568                   case 0x00800000: {
   60569                     // 0x00d00010
   60570                     if (((instr & 0xf0000000) == 0xf0000000)) {
   60571                       UnallocatedA32(instr);
   60572                       return;
   60573                     }
   60574                     Condition condition((instr >> 28) & 0xf);
   60575                     unsigned rd = (instr >> 12) & 0xf;
   60576                     unsigned rn = (instr >> 16) & 0xf;
   60577                     unsigned rm = instr & 0xf;
   60578                     Shift shift((instr >> 5) & 0x3);
   60579                     unsigned rs = (instr >> 8) & 0xf;
   60580                     // SBCS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
   60581                     sbcs(condition,
   60582                          Best,
   60583                          Register(rd),
   60584                          Register(rn),
   60585                          Operand(Register(rm), shift.GetType(), Register(rs)));
   60586                     break;
   60587                   }
   60588                   case 0x00a00000: {
   60589                     // 0x00f00010
   60590                     if (((instr & 0xf0000000) == 0xf0000000)) {
   60591                       UnallocatedA32(instr);
   60592                       return;
   60593                     }
   60594                     Condition condition((instr >> 28) & 0xf);
   60595                     unsigned rd = (instr >> 12) & 0xf;
   60596                     unsigned rn = (instr >> 16) & 0xf;
   60597                     unsigned rm = instr & 0xf;
   60598                     Shift shift((instr >> 5) & 0x3);
   60599                     unsigned rs = (instr >> 8) & 0xf;
   60600                     // RSCS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
   60601                     rscs(condition,
   60602                          Register(rd),
   60603                          Register(rn),
   60604                          Operand(Register(rm), shift.GetType(), Register(rs)));
   60605                     break;
   60606                   }
   60607                   case 0x01000000: {
   60608                     // 0x01500010
   60609                     if (((instr & 0xf0000000) == 0xf0000000)) {
   60610                       UnallocatedA32(instr);
   60611                       return;
   60612                     }
   60613                     Condition condition((instr >> 28) & 0xf);
   60614                     unsigned rn = (instr >> 16) & 0xf;
   60615                     unsigned rm = instr & 0xf;
   60616                     Shift shift((instr >> 5) & 0x3);
   60617                     unsigned rs = (instr >> 8) & 0xf;
   60618                     // CMP{<c>}{<q>} <Rn>, <Rm>, <shift> <Rs> ; A1
   60619                     cmp(condition,
   60620                         Best,
   60621                         Register(rn),
   60622                         Operand(Register(rm), shift.GetType(), Register(rs)));
   60623                     if (((instr & 0xff0f090) != 0x1500010)) {
   60624                       UnpredictableA32(instr);
   60625                     }
   60626                     break;
   60627                   }
   60628                   case 0x01200000: {
   60629                     // 0x01700010
   60630                     if (((instr & 0xf0000000) == 0xf0000000)) {
   60631                       UnallocatedA32(instr);
   60632                       return;
   60633                     }
   60634                     Condition condition((instr >> 28) & 0xf);
   60635                     unsigned rn = (instr >> 16) & 0xf;
   60636                     unsigned rm = instr & 0xf;
   60637                     Shift shift((instr >> 5) & 0x3);
   60638                     unsigned rs = (instr >> 8) & 0xf;
   60639                     // CMN{<c>}{<q>} <Rn>, <Rm>, <shift> <Rs> ; A1
   60640                     cmn(condition,
   60641                         Best,
   60642                         Register(rn),
   60643                         Operand(Register(rm), shift.GetType(), Register(rs)));
   60644                     if (((instr & 0xff0f090) != 0x1700010)) {
   60645                       UnpredictableA32(instr);
   60646                     }
   60647                     break;
   60648                   }
   60649                   case 0x01800000: {
   60650                     // 0x01d00010
   60651                     if (((instr & 0xf0000000) == 0xf0000000)) {
   60652                       UnallocatedA32(instr);
   60653                       return;
   60654                     }
   60655                     Condition condition((instr >> 28) & 0xf);
   60656                     unsigned rd = (instr >> 12) & 0xf;
   60657                     unsigned rn = (instr >> 16) & 0xf;
   60658                     unsigned rm = instr & 0xf;
   60659                     Shift shift((instr >> 5) & 0x3);
   60660                     unsigned rs = (instr >> 8) & 0xf;
   60661                     // BICS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
   60662                     bics(condition,
   60663                          Best,
   60664                          Register(rd),
   60665                          Register(rn),
   60666                          Operand(Register(rm), shift.GetType(), Register(rs)));
   60667                     break;
   60668                   }
   60669                   case 0x01a00000: {
   60670                     // 0x01f00010
   60671                     if (((instr & 0xf0000000) == 0xf0000000)) {
   60672                       UnallocatedA32(instr);
   60673                       return;
   60674                     }
   60675                     Condition condition((instr >> 28) & 0xf);
   60676                     unsigned rd = (instr >> 12) & 0xf;
   60677                     unsigned rm = instr & 0xf;
   60678                     Shift shift((instr >> 5) & 0x3);
   60679                     unsigned rs = (instr >> 8) & 0xf;
   60680                     // MVNS{<c>}{<q>} <Rd>, <Rm>, <shift> <Rs> ; A1
   60681                     mvns(condition,
   60682                          Best,
   60683                          Register(rd),
   60684                          Operand(Register(rm), shift.GetType(), Register(rs)));
   60685                     if (((instr & 0xfff0090) != 0x1f00010)) {
   60686                       UnpredictableA32(instr);
   60687                     }
   60688                     break;
   60689                   }
   60690                 }
   60691                 break;
   60692               }
   60693               case 0x00400080: {
   60694                 // 0x00500090
   60695                 switch (instr & 0x00000060) {
   60696                   case 0x00000000: {
   60697                     // 0x00500090
   60698                     switch (instr & 0x01a00000) {
   60699                       case 0x00800000: {
   60700                         // 0x00d00090
   60701                         if (((instr & 0xf0000000) == 0xf0000000)) {
   60702                           UnallocatedA32(instr);
   60703                           return;
   60704                         }
   60705                         Condition condition((instr >> 28) & 0xf);
   60706                         unsigned rdlo = (instr >> 12) & 0xf;
   60707                         unsigned rdhi = (instr >> 16) & 0xf;
   60708                         unsigned rn = instr & 0xf;
   60709                         unsigned rm = (instr >> 8) & 0xf;
   60710                         // SMULLS{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
   60711                         smulls(condition,
   60712                                Register(rdlo),
   60713                                Register(rdhi),
   60714                                Register(rn),
   60715                                Register(rm));
   60716                         break;
   60717                       }
   60718                       case 0x00a00000: {
   60719                         // 0x00f00090
   60720                         if (((instr & 0xf0000000) == 0xf0000000)) {
   60721                           UnallocatedA32(instr);
   60722                           return;
   60723                         }
   60724                         Condition condition((instr >> 28) & 0xf);
   60725                         unsigned rdlo = (instr >> 12) & 0xf;
   60726                         unsigned rdhi = (instr >> 16) & 0xf;
   60727                         unsigned rn = instr & 0xf;
   60728                         unsigned rm = (instr >> 8) & 0xf;
   60729                         // SMLALS{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
   60730                         smlals(condition,
   60731                                Register(rdlo),
   60732                                Register(rdhi),
   60733                                Register(rn),
   60734                                Register(rm));
   60735                         break;
   60736                       }
   60737                       case 0x01800000: {
   60738                         // 0x01d00090
   60739                         switch (instr & 0x00000300) {
   60740                           case 0x00000000: {
   60741                             // 0x01d00090
   60742                             if (((instr & 0xf0000000) == 0xf0000000)) {
   60743                               UnallocatedA32(instr);
   60744                               return;
   60745                             }
   60746                             Condition condition((instr >> 28) & 0xf);
   60747                             unsigned rt = (instr >> 12) & 0xf;
   60748                             unsigned rn = (instr >> 16) & 0xf;
   60749                             // LDAB{<c>}{<q>} <Rt>, [<Rn>] ; A1
   60750                             ldab(condition,
   60751                                  Register(rt),
   60752                                  MemOperand(Register(rn), Offset));
   60753                             if (((instr & 0xff00fff) != 0x1d00c9f)) {
   60754                               UnpredictableA32(instr);
   60755                             }
   60756                             break;
   60757                           }
   60758                           case 0x00000200: {
   60759                             // 0x01d00290
   60760                             if (((instr & 0xf0000000) == 0xf0000000)) {
   60761                               UnallocatedA32(instr);
   60762                               return;
   60763                             }
   60764                             Condition condition((instr >> 28) & 0xf);
   60765                             unsigned rt = (instr >> 12) & 0xf;
   60766                             unsigned rn = (instr >> 16) & 0xf;
   60767                             // LDAEXB{<c>}{<q>} <Rt>, [<Rn>] ; A1
   60768                             ldaexb(condition,
   60769                                    Register(rt),
   60770                                    MemOperand(Register(rn), Offset));
   60771                             if (((instr & 0xff00fff) != 0x1d00e9f)) {
   60772                               UnpredictableA32(instr);
   60773                             }
   60774                             break;
   60775                           }
   60776                           case 0x00000300: {
   60777                             // 0x01d00390
   60778                             if (((instr & 0xf0000000) == 0xf0000000)) {
   60779                               UnallocatedA32(instr);
   60780                               return;
   60781                             }
   60782                             Condition condition((instr >> 28) & 0xf);
   60783                             unsigned rt = (instr >> 12) & 0xf;
   60784                             unsigned rn = (instr >> 16) & 0xf;
   60785                             // LDREXB{<c>}{<q>} <Rt>, [<Rn>] ; A1
   60786                             ldrexb(condition,
   60787                                    Register(rt),
   60788                                    MemOperand(Register(rn), Offset));
   60789                             if (((instr & 0xff00fff) != 0x1d00f9f)) {
   60790                               UnpredictableA32(instr);
   60791                             }
   60792                             break;
   60793                           }
   60794                           default:
   60795                             UnallocatedA32(instr);
   60796                             break;
   60797                         }
   60798                         break;
   60799                       }
   60800                       case 0x01a00000: {
   60801                         // 0x01f00090
   60802                         switch (instr & 0x00000300) {
   60803                           case 0x00000000: {
   60804                             // 0x01f00090
   60805                             if (((instr & 0xf0000000) == 0xf0000000)) {
   60806                               UnallocatedA32(instr);
   60807                               return;
   60808                             }
   60809                             Condition condition((instr >> 28) & 0xf);
   60810                             unsigned rt = (instr >> 12) & 0xf;
   60811                             unsigned rn = (instr >> 16) & 0xf;
   60812                             // LDAH{<c>}{<q>} <Rt>, [<Rn>] ; A1
   60813                             ldah(condition,
   60814                                  Register(rt),
   60815                                  MemOperand(Register(rn), Offset));
   60816                             if (((instr & 0xff00fff) != 0x1f00c9f)) {
   60817                               UnpredictableA32(instr);
   60818                             }
   60819                             break;
   60820                           }
   60821                           case 0x00000200: {
   60822                             // 0x01f00290
   60823                             if (((instr & 0xf0000000) == 0xf0000000)) {
   60824                               UnallocatedA32(instr);
   60825                               return;
   60826                             }
   60827                             Condition condition((instr >> 28) & 0xf);
   60828                             unsigned rt = (instr >> 12) & 0xf;
   60829                             unsigned rn = (instr >> 16) & 0xf;
   60830                             // LDAEXH{<c>}{<q>} <Rt>, [<Rn>] ; A1
   60831                             ldaexh(condition,
   60832                                    Register(rt),
   60833                                    MemOperand(Register(rn), Offset));
   60834                             if (((instr & 0xff00fff) != 0x1f00e9f)) {
   60835                               UnpredictableA32(instr);
   60836                             }
   60837                             break;
   60838                           }
   60839                           case 0x00000300: {
   60840                             // 0x01f00390
   60841                             if (((instr & 0xf0000000) == 0xf0000000)) {
   60842                               UnallocatedA32(instr);
   60843                               return;
   60844                             }
   60845                             Condition condition((instr >> 28) & 0xf);
   60846                             unsigned rt = (instr >> 12) & 0xf;
   60847                             unsigned rn = (instr >> 16) & 0xf;
   60848                             // LDREXH{<c>}{<q>} <Rt>, [<Rn>] ; A1
   60849                             ldrexh(condition,
   60850                                    Register(rt),
   60851                                    MemOperand(Register(rn), Offset));
   60852                             if (((instr & 0xff00fff) != 0x1f00f9f)) {
   60853                               UnpredictableA32(instr);
   60854                             }
   60855                             break;
   60856                           }
   60857                           default:
   60858                             UnallocatedA32(instr);
   60859                             break;
   60860                         }
   60861                         break;
   60862                       }
   60863                       default:
   60864                         UnallocatedA32(instr);
   60865                         break;
   60866                     }
   60867                     break;
   60868                   }
   60869                   case 0x00000020: {
   60870                     // 0x005000b0
   60871                     switch (instr & 0x01200000) {
   60872                       case 0x00000000: {
   60873                         // 0x005000b0
   60874                         switch (instr & 0x000f0000) {
   60875                           case 0x000f0000: {
   60876                             // 0x005f00b0
   60877                             if (((instr & 0xf0000000) == 0xf0000000) ||
   60878                                 ((instr & 0x1200000) == 0x200000)) {
   60879                               UnallocatedA32(instr);
   60880                               return;
   60881                             }
   60882                             Condition condition((instr >> 28) & 0xf);
   60883                             unsigned rt = (instr >> 12) & 0xf;
   60884                             uint32_t U = (instr >> 23) & 0x1;
   60885                             int32_t imm = (instr & 0xf) | ((instr >> 4) & 0xf0);
   60886                             if (U == 0) imm = -imm;
   60887                             bool minus_zero = (imm == 0) && (U == 0);
   60888                             Label label(imm, kA32PcDelta, minus_zero);
   60889                             // LDRH{<c>}{<q>} <Rt>, <label> ; A1
   60890                             ldrh(condition, Register(rt), &label);
   60891                             if (((instr & 0xf7f00f0) != 0x15f00b0)) {
   60892                               UnpredictableA32(instr);
   60893                             }
   60894                             break;
   60895                           }
   60896                           default: {
   60897                             if (((instr & 0xf0000000) == 0xf0000000) ||
   60898                                 ((instr & 0xf0000) == 0xf0000)) {
   60899                               UnallocatedA32(instr);
   60900                               return;
   60901                             }
   60902                             Condition condition((instr >> 28) & 0xf);
   60903                             unsigned rt = (instr >> 12) & 0xf;
   60904                             unsigned rn = (instr >> 16) & 0xf;
   60905                             Sign sign((((instr >> 23) & 0x1) == 0) ? minus
   60906                                                                    : plus);
   60907                             int32_t offset =
   60908                                 (instr & 0xf) | ((instr >> 4) & 0xf0);
   60909                             // LDRH{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_3> ; A1
   60910                             ldrh(condition,
   60911                                  Best,
   60912                                  Register(rt),
   60913                                  MemOperand(Register(rn),
   60914                                             sign,
   60915                                             offset,
   60916                                             PostIndex));
   60917                             break;
   60918                           }
   60919                         }
   60920                         break;
   60921                       }
   60922                       case 0x00200000: {
   60923                         // 0x007000b0
   60924                         if (((instr & 0xf0000000) == 0xf0000000)) {
   60925                           UnallocatedA32(instr);
   60926                           return;
   60927                         }
   60928                         UnimplementedA32("LDRHT", instr);
   60929                         break;
   60930                       }
   60931                       case 0x01000000: {
   60932                         // 0x015000b0
   60933                         switch (instr & 0x000f0000) {
   60934                           case 0x000f0000: {
   60935                             // 0x015f00b0
   60936                             if (((instr & 0xf0000000) == 0xf0000000) ||
   60937                                 ((instr & 0x1200000) == 0x200000)) {
   60938                               UnallocatedA32(instr);
   60939                               return;
   60940                             }
   60941                             Condition condition((instr >> 28) & 0xf);
   60942                             unsigned rt = (instr >> 12) & 0xf;
   60943                             uint32_t U = (instr >> 23) & 0x1;
   60944                             int32_t imm = (instr & 0xf) | ((instr >> 4) & 0xf0);
   60945                             if (U == 0) imm = -imm;
   60946                             bool minus_zero = (imm == 0) && (U == 0);
   60947                             Label label(imm, kA32PcDelta, minus_zero);
   60948                             // LDRH{<c>}{<q>} <Rt>, <label> ; A1
   60949                             ldrh(condition, Register(rt), &label);
   60950                             if (((instr & 0xf7f00f0) != 0x15f00b0)) {
   60951                               UnpredictableA32(instr);
   60952                             }
   60953                             break;
   60954                           }
   60955                           default: {
   60956                             if (((instr & 0xf0000000) == 0xf0000000) ||
   60957                                 ((instr & 0xf0000) == 0xf0000)) {
   60958                               UnallocatedA32(instr);
   60959                               return;
   60960                             }
   60961                             Condition condition((instr >> 28) & 0xf);
   60962                             unsigned rt = (instr >> 12) & 0xf;
   60963                             unsigned rn = (instr >> 16) & 0xf;
   60964                             Sign sign((((instr >> 23) & 0x1) == 0) ? minus
   60965                                                                    : plus);
   60966                             int32_t offset =
   60967                                 (instr & 0xf) | ((instr >> 4) & 0xf0);
   60968                             // LDRH{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_3>}] ; A1
   60969                             ldrh(condition,
   60970                                  Best,
   60971                                  Register(rt),
   60972                                  MemOperand(Register(rn),
   60973                                             sign,
   60974                                             offset,
   60975                                             Offset));
   60976                             break;
   60977                           }
   60978                         }
   60979                         break;
   60980                       }
   60981                       case 0x01200000: {
   60982                         // 0x017000b0
   60983                         switch (instr & 0x000f0000) {
   60984                           case 0x000f0000: {
   60985                             // 0x017f00b0
   60986                             if (((instr & 0xf0000000) == 0xf0000000) ||
   60987                                 ((instr & 0x1200000) == 0x200000)) {
   60988                               UnallocatedA32(instr);
   60989                               return;
   60990                             }
   60991                             Condition condition((instr >> 28) & 0xf);
   60992                             unsigned rt = (instr >> 12) & 0xf;
   60993                             uint32_t U = (instr >> 23) & 0x1;
   60994                             int32_t imm = (instr & 0xf) | ((instr >> 4) & 0xf0);
   60995                             if (U == 0) imm = -imm;
   60996                             bool minus_zero = (imm == 0) && (U == 0);
   60997                             Label label(imm, kA32PcDelta, minus_zero);
   60998                             // LDRH{<c>}{<q>} <Rt>, <label> ; A1
   60999                             ldrh(condition, Register(rt), &label);
   61000                             if (((instr & 0xf7f00f0) != 0x15f00b0)) {
   61001                               UnpredictableA32(instr);
   61002                             }
   61003                             break;
   61004                           }
   61005                           default: {
   61006                             if (((instr & 0xf0000000) == 0xf0000000) ||
   61007                                 ((instr & 0xf0000) == 0xf0000)) {
   61008                               UnallocatedA32(instr);
   61009                               return;
   61010                             }
   61011                             Condition condition((instr >> 28) & 0xf);
   61012                             unsigned rt = (instr >> 12) & 0xf;
   61013                             unsigned rn = (instr >> 16) & 0xf;
   61014                             Sign sign((((instr >> 23) & 0x1) == 0) ? minus
   61015                                                                    : plus);
   61016                             int32_t offset =
   61017                                 (instr & 0xf) | ((instr >> 4) & 0xf0);
   61018                             // LDRH{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_3>}]! ; A1 NOLINT(whitespace/line_length)
   61019                             ldrh(condition,
   61020                                  Best,
   61021                                  Register(rt),
   61022                                  MemOperand(Register(rn),
   61023                                             sign,
   61024                                             offset,
   61025                                             PreIndex));
   61026                             break;
   61027                           }
   61028                         }
   61029                         break;
   61030                       }
   61031                     }
   61032                     break;
   61033                   }
   61034                   case 0x00000040: {
   61035                     // 0x005000d0
   61036                     switch (instr & 0x01200000) {
   61037                       case 0x00000000: {
   61038                         // 0x005000d0
   61039                         switch (instr & 0x000f0000) {
   61040                           case 0x000f0000: {
   61041                             // 0x005f00d0
   61042                             if (((instr & 0xf0000000) == 0xf0000000) ||
   61043                                 ((instr & 0x1200000) == 0x200000)) {
   61044                               UnallocatedA32(instr);
   61045                               return;
   61046                             }
   61047                             Condition condition((instr >> 28) & 0xf);
   61048                             unsigned rt = (instr >> 12) & 0xf;
   61049                             uint32_t U = (instr >> 23) & 0x1;
   61050                             int32_t imm = (instr & 0xf) | ((instr >> 4) & 0xf0);
   61051                             if (U == 0) imm = -imm;
   61052                             bool minus_zero = (imm == 0) && (U == 0);
   61053                             Label label(imm, kA32PcDelta, minus_zero);
   61054                             // LDRSB{<c>}{<q>} <Rt>, <label> ; A1
   61055                             ldrsb(condition, Register(rt), &label);
   61056                             if (((instr & 0xf7f00f0) != 0x15f00d0)) {
   61057                               UnpredictableA32(instr);
   61058                             }
   61059                             break;
   61060                           }
   61061                           default: {
   61062                             if (((instr & 0xf0000000) == 0xf0000000) ||
   61063                                 ((instr & 0xf0000) == 0xf0000)) {
   61064                               UnallocatedA32(instr);
   61065                               return;
   61066                             }
   61067                             Condition condition((instr >> 28) & 0xf);
   61068                             unsigned rt = (instr >> 12) & 0xf;
   61069                             unsigned rn = (instr >> 16) & 0xf;
   61070                             Sign sign((((instr >> 23) & 0x1) == 0) ? minus
   61071                                                                    : plus);
   61072                             int32_t offset =
   61073                                 (instr & 0xf) | ((instr >> 4) & 0xf0);
   61074                             // LDRSB{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_2> ; A1
   61075                             ldrsb(condition,
   61076                                   Best,
   61077                                   Register(rt),
   61078                                   MemOperand(Register(rn),
   61079                                              sign,
   61080                                              offset,
   61081                                              PostIndex));
   61082                             break;
   61083                           }
   61084                         }
   61085                         break;
   61086                       }
   61087                       case 0x00200000: {
   61088                         // 0x007000d0
   61089                         if (((instr & 0xf0000000) == 0xf0000000)) {
   61090                           UnallocatedA32(instr);
   61091                           return;
   61092                         }
   61093                         UnimplementedA32("LDRSBT", instr);
   61094                         break;
   61095                       }
   61096                       case 0x01000000: {
   61097                         // 0x015000d0
   61098                         switch (instr & 0x000f0000) {
   61099                           case 0x000f0000: {
   61100                             // 0x015f00d0
   61101                             if (((instr & 0xf0000000) == 0xf0000000) ||
   61102                                 ((instr & 0x1200000) == 0x200000)) {
   61103                               UnallocatedA32(instr);
   61104                               return;
   61105                             }
   61106                             Condition condition((instr >> 28) & 0xf);
   61107                             unsigned rt = (instr >> 12) & 0xf;
   61108                             uint32_t U = (instr >> 23) & 0x1;
   61109                             int32_t imm = (instr & 0xf) | ((instr >> 4) & 0xf0);
   61110                             if (U == 0) imm = -imm;
   61111                             bool minus_zero = (imm == 0) && (U == 0);
   61112                             Label label(imm, kA32PcDelta, minus_zero);
   61113                             // LDRSB{<c>}{<q>} <Rt>, <label> ; A1
   61114                             ldrsb(condition, Register(rt), &label);
   61115                             if (((instr & 0xf7f00f0) != 0x15f00d0)) {
   61116                               UnpredictableA32(instr);
   61117                             }
   61118                             break;
   61119                           }
   61120                           default: {
   61121                             if (((instr & 0xf0000000) == 0xf0000000) ||
   61122                                 ((instr & 0xf0000) == 0xf0000)) {
   61123                               UnallocatedA32(instr);
   61124                               return;
   61125                             }
   61126                             Condition condition((instr >> 28) & 0xf);
   61127                             unsigned rt = (instr >> 12) & 0xf;
   61128                             unsigned rn = (instr >> 16) & 0xf;
   61129                             Sign sign((((instr >> 23) & 0x1) == 0) ? minus
   61130                                                                    : plus);
   61131                             int32_t offset =
   61132                                 (instr & 0xf) | ((instr >> 4) & 0xf0);
   61133                             // LDRSB{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_2>}] ; A1 NOLINT(whitespace/line_length)
   61134                             ldrsb(condition,
   61135                                   Best,
   61136                                   Register(rt),
   61137                                   MemOperand(Register(rn),
   61138                                              sign,
   61139                                              offset,
   61140                                              Offset));
   61141                             break;
   61142                           }
   61143                         }
   61144                         break;
   61145                       }
   61146                       case 0x01200000: {
   61147                         // 0x017000d0
   61148                         switch (instr & 0x000f0000) {
   61149                           case 0x000f0000: {
   61150                             // 0x017f00d0
   61151                             if (((instr & 0xf0000000) == 0xf0000000) ||
   61152                                 ((instr & 0x1200000) == 0x200000)) {
   61153                               UnallocatedA32(instr);
   61154                               return;
   61155                             }
   61156                             Condition condition((instr >> 28) & 0xf);
   61157                             unsigned rt = (instr >> 12) & 0xf;
   61158                             uint32_t U = (instr >> 23) & 0x1;
   61159                             int32_t imm = (instr & 0xf) | ((instr >> 4) & 0xf0);
   61160                             if (U == 0) imm = -imm;
   61161                             bool minus_zero = (imm == 0) && (U == 0);
   61162                             Label label(imm, kA32PcDelta, minus_zero);
   61163                             // LDRSB{<c>}{<q>} <Rt>, <label> ; A1
   61164                             ldrsb(condition, Register(rt), &label);
   61165                             if (((instr & 0xf7f00f0) != 0x15f00d0)) {
   61166                               UnpredictableA32(instr);
   61167                             }
   61168                             break;
   61169                           }
   61170                           default: {
   61171                             if (((instr & 0xf0000000) == 0xf0000000) ||
   61172                                 ((instr & 0xf0000) == 0xf0000)) {
   61173                               UnallocatedA32(instr);
   61174                               return;
   61175                             }
   61176                             Condition condition((instr >> 28) & 0xf);
   61177                             unsigned rt = (instr >> 12) & 0xf;
   61178                             unsigned rn = (instr >> 16) & 0xf;
   61179                             Sign sign((((instr >> 23) & 0x1) == 0) ? minus
   61180                                                                    : plus);
   61181                             int32_t offset =
   61182                                 (instr & 0xf) | ((instr >> 4) & 0xf0);
   61183                             // LDRSB{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_2>}]! ; A1 NOLINT(whitespace/line_length)
   61184                             ldrsb(condition,
   61185                                   Best,
   61186                                   Register(rt),
   61187                                   MemOperand(Register(rn),
   61188                                              sign,
   61189                                              offset,
   61190                                              PreIndex));
   61191                             break;
   61192                           }
   61193                         }
   61194                         break;
   61195                       }
   61196                     }
   61197                     break;
   61198                   }
   61199                   case 0x00000060: {
   61200                     // 0x005000f0
   61201                     switch (instr & 0x01200000) {
   61202                       case 0x00000000: {
   61203                         // 0x005000f0
   61204                         switch (instr & 0x000f0000) {
   61205                           case 0x000f0000: {
   61206                             // 0x005f00f0
   61207                             if (((instr & 0xf0000000) == 0xf0000000) ||
   61208                                 ((instr & 0x1200000) == 0x200000)) {
   61209                               UnallocatedA32(instr);
   61210                               return;
   61211                             }
   61212                             Condition condition((instr >> 28) & 0xf);
   61213                             unsigned rt = (instr >> 12) & 0xf;
   61214                             uint32_t U = (instr >> 23) & 0x1;
   61215                             int32_t imm = (instr & 0xf) | ((instr >> 4) & 0xf0);
   61216                             if (U == 0) imm = -imm;
   61217                             bool minus_zero = (imm == 0) && (U == 0);
   61218                             Label label(imm, kA32PcDelta, minus_zero);
   61219                             // LDRSH{<c>}{<q>} <Rt>, <label> ; A1
   61220                             ldrsh(condition, Register(rt), &label);
   61221                             if (((instr & 0xf7f00f0) != 0x15f00f0)) {
   61222                               UnpredictableA32(instr);
   61223                             }
   61224                             break;
   61225                           }
   61226                           default: {
   61227                             if (((instr & 0xf0000000) == 0xf0000000) ||
   61228                                 ((instr & 0xf0000) == 0xf0000)) {
   61229                               UnallocatedA32(instr);
   61230                               return;
   61231                             }
   61232                             Condition condition((instr >> 28) & 0xf);
   61233                             unsigned rt = (instr >> 12) & 0xf;
   61234                             unsigned rn = (instr >> 16) & 0xf;
   61235                             Sign sign((((instr >> 23) & 0x1) == 0) ? minus
   61236                                                                    : plus);
   61237                             int32_t offset =
   61238                                 (instr & 0xf) | ((instr >> 4) & 0xf0);
   61239                             // LDRSH{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_2> ; A1
   61240                             ldrsh(condition,
   61241                                   Best,
   61242                                   Register(rt),
   61243                                   MemOperand(Register(rn),
   61244                                              sign,
   61245                                              offset,
   61246                                              PostIndex));
   61247                             break;
   61248                           }
   61249                         }
   61250                         break;
   61251                       }
   61252                       case 0x00200000: {
   61253                         // 0x007000f0
   61254                         if (((instr & 0xf0000000) == 0xf0000000)) {
   61255                           UnallocatedA32(instr);
   61256                           return;
   61257                         }
   61258                         UnimplementedA32("LDRSHT", instr);
   61259                         break;
   61260                       }
   61261                       case 0x01000000: {
   61262                         // 0x015000f0
   61263                         switch (instr & 0x000f0000) {
   61264                           case 0x000f0000: {
   61265                             // 0x015f00f0
   61266                             if (((instr & 0xf0000000) == 0xf0000000) ||
   61267                                 ((instr & 0x1200000) == 0x200000)) {
   61268                               UnallocatedA32(instr);
   61269                               return;
   61270                             }
   61271                             Condition condition((instr >> 28) & 0xf);
   61272                             unsigned rt = (instr >> 12) & 0xf;
   61273                             uint32_t U = (instr >> 23) & 0x1;
   61274                             int32_t imm = (instr & 0xf) | ((instr >> 4) & 0xf0);
   61275                             if (U == 0) imm = -imm;
   61276                             bool minus_zero = (imm == 0) && (U == 0);
   61277                             Label label(imm, kA32PcDelta, minus_zero);
   61278                             // LDRSH{<c>}{<q>} <Rt>, <label> ; A1
   61279                             ldrsh(condition, Register(rt), &label);
   61280                             if (((instr & 0xf7f00f0) != 0x15f00f0)) {
   61281                               UnpredictableA32(instr);
   61282                             }
   61283                             break;
   61284                           }
   61285                           default: {
   61286                             if (((instr & 0xf0000000) == 0xf0000000) ||
   61287                                 ((instr & 0xf0000) == 0xf0000)) {
   61288                               UnallocatedA32(instr);
   61289                               return;
   61290                             }
   61291                             Condition condition((instr >> 28) & 0xf);
   61292                             unsigned rt = (instr >> 12) & 0xf;
   61293                             unsigned rn = (instr >> 16) & 0xf;
   61294                             Sign sign((((instr >> 23) & 0x1) == 0) ? minus
   61295                                                                    : plus);
   61296                             int32_t offset =
   61297                                 (instr & 0xf) | ((instr >> 4) & 0xf0);
   61298                             // LDRSH{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_2>}] ; A1 NOLINT(whitespace/line_length)
   61299                             ldrsh(condition,
   61300                                   Best,
   61301                                   Register(rt),
   61302                                   MemOperand(Register(rn),
   61303                                              sign,
   61304                                              offset,
   61305                                              Offset));
   61306                             break;
   61307                           }
   61308                         }
   61309                         break;
   61310                       }
   61311                       case 0x01200000: {
   61312                         // 0x017000f0
   61313                         switch (instr & 0x000f0000) {
   61314                           case 0x000f0000: {
   61315                             // 0x017f00f0
   61316                             if (((instr & 0xf0000000) == 0xf0000000) ||
   61317                                 ((instr & 0x1200000) == 0x200000)) {
   61318                               UnallocatedA32(instr);
   61319                               return;
   61320                             }
   61321                             Condition condition((instr >> 28) & 0xf);
   61322                             unsigned rt = (instr >> 12) & 0xf;
   61323                             uint32_t U = (instr >> 23) & 0x1;
   61324                             int32_t imm = (instr & 0xf) | ((instr >> 4) & 0xf0);
   61325                             if (U == 0) imm = -imm;
   61326                             bool minus_zero = (imm == 0) && (U == 0);
   61327                             Label label(imm, kA32PcDelta, minus_zero);
   61328                             // LDRSH{<c>}{<q>} <Rt>, <label> ; A1
   61329                             ldrsh(condition, Register(rt), &label);
   61330                             if (((instr & 0xf7f00f0) != 0x15f00f0)) {
   61331                               UnpredictableA32(instr);
   61332                             }
   61333                             break;
   61334                           }
   61335                           default: {
   61336                             if (((instr & 0xf0000000) == 0xf0000000) ||
   61337                                 ((instr & 0xf0000) == 0xf0000)) {
   61338                               UnallocatedA32(instr);
   61339                               return;
   61340                             }
   61341                             Condition condition((instr >> 28) & 0xf);
   61342                             unsigned rt = (instr >> 12) & 0xf;
   61343                             unsigned rn = (instr >> 16) & 0xf;
   61344                             Sign sign((((instr >> 23) & 0x1) == 0) ? minus
   61345                                                                    : plus);
   61346                             int32_t offset =
   61347                                 (instr & 0xf) | ((instr >> 4) & 0xf0);
   61348                             // LDRSH{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_2>}]! ; A1 NOLINT(whitespace/line_length)
   61349                             ldrsh(condition,
   61350                                   Best,
   61351                                   Register(rt),
   61352                                   MemOperand(Register(rn),
   61353                                              sign,
   61354                                              offset,
   61355                                              PreIndex));
   61356                             break;
   61357                           }
   61358                         }
   61359                         break;
   61360                       }
   61361                     }
   61362                     break;
   61363                   }
   61364                 }
   61365                 break;
   61366               }
   61367             }
   61368             break;
   61369           }
   61370         }
   61371         break;
   61372       }
   61373       case 0x02000000: {
   61374         // 0x02000000
   61375         switch (instr & 0x01b00000) {
   61376           case 0x00000000: {
   61377             // 0x02000000
   61378             switch (instr & 0x00400000) {
   61379               case 0x00000000: {
   61380                 // 0x02000000
   61381                 if (((instr & 0xf0000000) == 0xf0000000)) {
   61382                   UnallocatedA32(instr);
   61383                   return;
   61384                 }
   61385                 Condition condition((instr >> 28) & 0xf);
   61386                 unsigned rd = (instr >> 12) & 0xf;
   61387                 unsigned rn = (instr >> 16) & 0xf;
   61388                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
   61389                 // AND{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
   61390                 and_(condition, Best, Register(rd), Register(rn), imm);
   61391                 break;
   61392               }
   61393               case 0x00400000: {
   61394                 // 0x02400000
   61395                 switch (instr & 0x000d0000) {
   61396                   case 0x000d0000: {
   61397                     // 0x024d0000
   61398                     switch (instr & 0x00020000) {
   61399                       case 0x00000000: {
   61400                         // 0x024d0000
   61401                         if (((instr & 0xf0000000) == 0xf0000000)) {
   61402                           UnallocatedA32(instr);
   61403                           return;
   61404                         }
   61405                         Condition condition((instr >> 28) & 0xf);
   61406                         unsigned rd = (instr >> 12) & 0xf;
   61407                         uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
   61408                         // SUB{<c>}{<q>} {<Rd>}, SP, #<const> ; A1
   61409                         sub(condition, Best, Register(rd), sp, imm);
   61410                         break;
   61411                       }
   61412                       case 0x00020000: {
   61413                         // 0x024f0000
   61414                         if (((instr & 0xf0000000) == 0xf0000000)) {
   61415                           UnallocatedA32(instr);
   61416                           return;
   61417                         }
   61418                         if (((instr & 0xf0000000) != 0xf0000000) &&
   61419                             ((Uint32(instr) & Uint32(0xfff)) == Uint32(0x0))) {
   61420                           Condition condition((instr >> 28) & 0xf);
   61421                           unsigned rd = (instr >> 12) & 0xf;
   61422                           uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
   61423                           // SUB{<c>}{<q>} <Rd>, PC, #<const> ; A2
   61424                           sub(condition, Best, Register(rd), pc, imm);
   61425                           return;
   61426                         }
   61427                         Condition condition((instr >> 28) & 0xf);
   61428                         unsigned rd = (instr >> 12) & 0xf;
   61429                         uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
   61430                         Label label(-imm, kA32PcDelta);
   61431                         // ADR{<c>}{<q>} <Rd>, <label> ; A2
   61432                         adr(condition, Best, Register(rd), &label);
   61433                         break;
   61434                       }
   61435                     }
   61436                     break;
   61437                   }
   61438                   default: {
   61439                     if (((instr & 0xf0000000) == 0xf0000000) ||
   61440                         ((instr & 0xd0000) == 0xd0000)) {
   61441                       UnallocatedA32(instr);
   61442                       return;
   61443                     }
   61444                     Condition condition((instr >> 28) & 0xf);
   61445                     unsigned rd = (instr >> 12) & 0xf;
   61446                     unsigned rn = (instr >> 16) & 0xf;
   61447                     uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
   61448                     // SUB{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
   61449                     sub(condition, Best, Register(rd), Register(rn), imm);
   61450                     break;
   61451                   }
   61452                 }
   61453                 break;
   61454               }
   61455             }
   61456             break;
   61457           }
   61458           case 0x00100000: {
   61459             // 0x02100000
   61460             switch (instr & 0x00400000) {
   61461               case 0x00000000: {
   61462                 // 0x02100000
   61463                 if (((instr & 0xf0000000) == 0xf0000000)) {
   61464                   UnallocatedA32(instr);
   61465                   return;
   61466                 }
   61467                 Condition condition((instr >> 28) & 0xf);
   61468                 unsigned rd = (instr >> 12) & 0xf;
   61469                 unsigned rn = (instr >> 16) & 0xf;
   61470                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
   61471                 // ANDS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
   61472                 ands(condition, Best, Register(rd), Register(rn), imm);
   61473                 break;
   61474               }
   61475               case 0x00400000: {
   61476                 // 0x02500000
   61477                 switch (instr & 0x000f0000) {
   61478                   case 0x000d0000: {
   61479                     // 0x025d0000
   61480                     if (((instr & 0xf0000000) == 0xf0000000)) {
   61481                       UnallocatedA32(instr);
   61482                       return;
   61483                     }
   61484                     Condition condition((instr >> 28) & 0xf);
   61485                     unsigned rd = (instr >> 12) & 0xf;
   61486                     uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
   61487                     // SUBS{<c>}{<q>} {<Rd>}, SP, #<const> ; A1
   61488                     subs(condition, Best, Register(rd), sp, imm);
   61489                     break;
   61490                   }
   61491                   default: {
   61492                     if (((instr & 0xf0000000) == 0xf0000000) ||
   61493                         ((instr & 0xf0000) == 0xd0000)) {
   61494                       UnallocatedA32(instr);
   61495                       return;
   61496                     }
   61497                     Condition condition((instr >> 28) & 0xf);
   61498                     unsigned rd = (instr >> 12) & 0xf;
   61499                     unsigned rn = (instr >> 16) & 0xf;
   61500                     uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
   61501                     // SUBS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
   61502                     subs(condition, Best, Register(rd), Register(rn), imm);
   61503                     break;
   61504                   }
   61505                 }
   61506                 break;
   61507               }
   61508             }
   61509             break;
   61510           }
   61511           case 0x00200000: {
   61512             // 0x02200000
   61513             switch (instr & 0x00400000) {
   61514               case 0x00000000: {
   61515                 // 0x02200000
   61516                 if (((instr & 0xf0000000) == 0xf0000000)) {
   61517                   UnallocatedA32(instr);
   61518                   return;
   61519                 }
   61520                 Condition condition((instr >> 28) & 0xf);
   61521                 unsigned rd = (instr >> 12) & 0xf;
   61522                 unsigned rn = (instr >> 16) & 0xf;
   61523                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
   61524                 // EOR{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
   61525                 eor(condition, Best, Register(rd), Register(rn), imm);
   61526                 break;
   61527               }
   61528               case 0x00400000: {
   61529                 // 0x02600000
   61530                 if (((instr & 0xf0000000) == 0xf0000000)) {
   61531                   UnallocatedA32(instr);
   61532                   return;
   61533                 }
   61534                 Condition condition((instr >> 28) & 0xf);
   61535                 unsigned rd = (instr >> 12) & 0xf;
   61536                 unsigned rn = (instr >> 16) & 0xf;
   61537                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
   61538                 // RSB{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
   61539                 rsb(condition, Best, Register(rd), Register(rn), imm);
   61540                 break;
   61541               }
   61542             }
   61543             break;
   61544           }
   61545           case 0x00300000: {
   61546             // 0x02300000
   61547             switch (instr & 0x00400000) {
   61548               case 0x00000000: {
   61549                 // 0x02300000
   61550                 if (((instr & 0xf0000000) == 0xf0000000)) {
   61551                   UnallocatedA32(instr);
   61552                   return;
   61553                 }
   61554                 Condition condition((instr >> 28) & 0xf);
   61555                 unsigned rd = (instr >> 12) & 0xf;
   61556                 unsigned rn = (instr >> 16) & 0xf;
   61557                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
   61558                 // EORS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
   61559                 eors(condition, Best, Register(rd), Register(rn), imm);
   61560                 break;
   61561               }
   61562               case 0x00400000: {
   61563                 // 0x02700000
   61564                 if (((instr & 0xf0000000) == 0xf0000000)) {
   61565                   UnallocatedA32(instr);
   61566                   return;
   61567                 }
   61568                 Condition condition((instr >> 28) & 0xf);
   61569                 unsigned rd = (instr >> 12) & 0xf;
   61570                 unsigned rn = (instr >> 16) & 0xf;
   61571                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
   61572                 // RSBS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
   61573                 rsbs(condition, Best, Register(rd), Register(rn), imm);
   61574                 break;
   61575               }
   61576             }
   61577             break;
   61578           }
   61579           case 0x00800000: {
   61580             // 0x02800000
   61581             switch (instr & 0x00400000) {
   61582               case 0x00000000: {
   61583                 // 0x02800000
   61584                 switch (instr & 0x000d0000) {
   61585                   case 0x000d0000: {
   61586                     // 0x028d0000
   61587                     switch (instr & 0x00020000) {
   61588                       case 0x00000000: {
   61589                         // 0x028d0000
   61590                         if (((instr & 0xf0000000) == 0xf0000000)) {
   61591                           UnallocatedA32(instr);
   61592                           return;
   61593                         }
   61594                         Condition condition((instr >> 28) & 0xf);
   61595                         unsigned rd = (instr >> 12) & 0xf;
   61596                         uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
   61597                         // ADD{<c>}{<q>} {<Rd>}, SP, #<const> ; A1
   61598                         add(condition, Best, Register(rd), sp, imm);
   61599                         break;
   61600                       }
   61601                       case 0x00020000: {
   61602                         // 0x028f0000
   61603                         if (((instr & 0xf0000000) == 0xf0000000)) {
   61604                           UnallocatedA32(instr);
   61605                           return;
   61606                         }
   61607                         Condition condition((instr >> 28) & 0xf);
   61608                         unsigned rd = (instr >> 12) & 0xf;
   61609                         uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
   61610                         Label label(imm, kA32PcDelta);
   61611                         // ADR{<c>}{<q>} <Rd>, <label> ; A1
   61612                         adr(condition, Best, Register(rd), &label);
   61613                         break;
   61614                       }
   61615                     }
   61616                     break;
   61617                   }
   61618                   default: {
   61619                     if (((instr & 0xf0000000) == 0xf0000000) ||
   61620                         ((instr & 0xd0000) == 0xd0000)) {
   61621                       UnallocatedA32(instr);
   61622                       return;
   61623                     }
   61624                     Condition condition((instr >> 28) & 0xf);
   61625                     unsigned rd = (instr >> 12) & 0xf;
   61626                     unsigned rn = (instr >> 16) & 0xf;
   61627                     uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
   61628                     // ADD{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
   61629                     add(condition, Best, Register(rd), Register(rn), imm);
   61630                     break;
   61631                   }
   61632                 }
   61633                 break;
   61634               }
   61635               case 0x00400000: {
   61636                 // 0x02c00000
   61637                 if (((instr & 0xf0000000) == 0xf0000000)) {
   61638                   UnallocatedA32(instr);
   61639                   return;
   61640                 }
   61641                 Condition condition((instr >> 28) & 0xf);
   61642                 unsigned rd = (instr >> 12) & 0xf;
   61643                 unsigned rn = (instr >> 16) & 0xf;
   61644                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
   61645                 // SBC{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
   61646                 sbc(condition, Best, Register(rd), Register(rn), imm);
   61647                 break;
   61648               }
   61649             }
   61650             break;
   61651           }
   61652           case 0x00900000: {
   61653             // 0x02900000
   61654             switch (instr & 0x00400000) {
   61655               case 0x00000000: {
   61656                 // 0x02900000
   61657                 switch (instr & 0x000f0000) {
   61658                   case 0x000d0000: {
   61659                     // 0x029d0000
   61660                     if (((instr & 0xf0000000) == 0xf0000000)) {
   61661                       UnallocatedA32(instr);
   61662                       return;
   61663                     }
   61664                     Condition condition((instr >> 28) & 0xf);
   61665                     unsigned rd = (instr >> 12) & 0xf;
   61666                     uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
   61667                     // ADDS{<c>}{<q>} {<Rd>}, SP, #<const> ; A1
   61668                     adds(condition, Best, Register(rd), sp, imm);
   61669                     break;
   61670                   }
   61671                   default: {
   61672                     if (((instr & 0xf0000000) == 0xf0000000) ||
   61673                         ((instr & 0xf0000) == 0xd0000)) {
   61674                       UnallocatedA32(instr);
   61675                       return;
   61676                     }
   61677                     Condition condition((instr >> 28) & 0xf);
   61678                     unsigned rd = (instr >> 12) & 0xf;
   61679                     unsigned rn = (instr >> 16) & 0xf;
   61680                     uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
   61681                     // ADDS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
   61682                     adds(condition, Best, Register(rd), Register(rn), imm);
   61683                     break;
   61684                   }
   61685                 }
   61686                 break;
   61687               }
   61688               case 0x00400000: {
   61689                 // 0x02d00000
   61690                 if (((instr & 0xf0000000) == 0xf0000000)) {
   61691                   UnallocatedA32(instr);
   61692                   return;
   61693                 }
   61694                 Condition condition((instr >> 28) & 0xf);
   61695                 unsigned rd = (instr >> 12) & 0xf;
   61696                 unsigned rn = (instr >> 16) & 0xf;
   61697                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
   61698                 // SBCS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
   61699                 sbcs(condition, Best, Register(rd), Register(rn), imm);
   61700                 break;
   61701               }
   61702             }
   61703             break;
   61704           }
   61705           case 0x00a00000: {
   61706             // 0x02a00000
   61707             switch (instr & 0x00400000) {
   61708               case 0x00000000: {
   61709                 // 0x02a00000
   61710                 if (((instr & 0xf0000000) == 0xf0000000)) {
   61711                   UnallocatedA32(instr);
   61712                   return;
   61713                 }
   61714                 Condition condition((instr >> 28) & 0xf);
   61715                 unsigned rd = (instr >> 12) & 0xf;
   61716                 unsigned rn = (instr >> 16) & 0xf;
   61717                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
   61718                 // ADC{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
   61719                 adc(condition, Best, Register(rd), Register(rn), imm);
   61720                 break;
   61721               }
   61722               case 0x00400000: {
   61723                 // 0x02e00000
   61724                 if (((instr & 0xf0000000) == 0xf0000000)) {
   61725                   UnallocatedA32(instr);
   61726                   return;
   61727                 }
   61728                 Condition condition((instr >> 28) & 0xf);
   61729                 unsigned rd = (instr >> 12) & 0xf;
   61730                 unsigned rn = (instr >> 16) & 0xf;
   61731                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
   61732                 // RSC{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
   61733                 rsc(condition, Register(rd), Register(rn), imm);
   61734                 break;
   61735               }
   61736             }
   61737             break;
   61738           }
   61739           case 0x00b00000: {
   61740             // 0x02b00000
   61741             switch (instr & 0x00400000) {
   61742               case 0x00000000: {
   61743                 // 0x02b00000
   61744                 if (((instr & 0xf0000000) == 0xf0000000)) {
   61745                   UnallocatedA32(instr);
   61746                   return;
   61747                 }
   61748                 Condition condition((instr >> 28) & 0xf);
   61749                 unsigned rd = (instr >> 12) & 0xf;
   61750                 unsigned rn = (instr >> 16) & 0xf;
   61751                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
   61752                 // ADCS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
   61753                 adcs(condition, Best, Register(rd), Register(rn), imm);
   61754                 break;
   61755               }
   61756               case 0x00400000: {
   61757                 // 0x02f00000
   61758                 if (((instr & 0xf0000000) == 0xf0000000)) {
   61759                   UnallocatedA32(instr);
   61760                   return;
   61761                 }
   61762                 Condition condition((instr >> 28) & 0xf);
   61763                 unsigned rd = (instr >> 12) & 0xf;
   61764                 unsigned rn = (instr >> 16) & 0xf;
   61765                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
   61766                 // RSCS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
   61767                 rscs(condition, Register(rd), Register(rn), imm);
   61768                 break;
   61769               }
   61770             }
   61771             break;
   61772           }
   61773           case 0x01000000: {
   61774             // 0x03000000
   61775             switch (instr & 0x00400000) {
   61776               case 0x00000000: {
   61777                 // 0x03000000
   61778                 if (((instr & 0xf0000000) == 0xf0000000)) {
   61779                   UnallocatedA32(instr);
   61780                   return;
   61781                 }
   61782                 Condition condition((instr >> 28) & 0xf);
   61783                 unsigned rd = (instr >> 12) & 0xf;
   61784                 uint32_t imm = (instr & 0xfff) | ((instr >> 4) & 0xf000);
   61785                 if (!ImmediateA32::IsImmediateA32(imm)) {
   61786                   // MOV{<c>}{<q>} <Rd>, #<imm16> ; A2
   61787                   mov(condition, Best, Register(rd), imm);
   61788                 } else {
   61789                   // MOVW{<c>}{<q>} <Rd>, #<imm16> ; A2
   61790                   movw(condition, Register(rd), imm);
   61791                 }
   61792                 break;
   61793               }
   61794               case 0x00400000: {
   61795                 // 0x03400000
   61796                 if (((instr & 0xf0000000) == 0xf0000000)) {
   61797                   UnallocatedA32(instr);
   61798                   return;
   61799                 }
   61800                 Condition condition((instr >> 28) & 0xf);
   61801                 unsigned rd = (instr >> 12) & 0xf;
   61802                 uint32_t imm = (instr & 0xfff) | ((instr >> 4) & 0xf000);
   61803                 // MOVT{<c>}{<q>} <Rd>, #<imm16> ; A1
   61804                 movt(condition, Register(rd), imm);
   61805                 break;
   61806               }
   61807             }
   61808             break;
   61809           }
   61810           case 0x01100000: {
   61811             // 0x03100000
   61812             switch (instr & 0x00400000) {
   61813               case 0x00000000: {
   61814                 // 0x03100000
   61815                 if (((instr & 0xf0000000) == 0xf0000000)) {
   61816                   UnallocatedA32(instr);
   61817                   return;
   61818                 }
   61819                 Condition condition((instr >> 28) & 0xf);
   61820                 unsigned rn = (instr >> 16) & 0xf;
   61821                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
   61822                 // TST{<c>}{<q>} <Rn>, #<const> ; A1
   61823                 tst(condition, Best, Register(rn), imm);
   61824                 if (((instr & 0xff0f000) != 0x3100000)) {
   61825                   UnpredictableA32(instr);
   61826                 }
   61827                 break;
   61828               }
   61829               case 0x00400000: {
   61830                 // 0x03500000
   61831                 if (((instr & 0xf0000000) == 0xf0000000)) {
   61832                   UnallocatedA32(instr);
   61833                   return;
   61834                 }
   61835                 Condition condition((instr >> 28) & 0xf);
   61836                 unsigned rn = (instr >> 16) & 0xf;
   61837                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
   61838                 // CMP{<c>}{<q>} <Rn>, #<const> ; A1
   61839                 cmp(condition, Best, Register(rn), imm);
   61840                 if (((instr & 0xff0f000) != 0x3500000)) {
   61841                   UnpredictableA32(instr);
   61842                 }
   61843                 break;
   61844               }
   61845             }
   61846             break;
   61847           }
   61848           case 0x01200000: {
   61849             // 0x03200000
   61850             switch (instr & 0x004f0000) {
   61851               case 0x00000000: {
   61852                 // 0x03200000
   61853                 switch (instr & 0x000000f0) {
   61854                   case 0x00000000: {
   61855                     // 0x03200000
   61856                     switch (instr & 0x0000000f) {
   61857                       case 0x00000000: {
   61858                         // 0x03200000
   61859                         if (((instr & 0xf0000000) == 0xf0000000)) {
   61860                           UnallocatedA32(instr);
   61861                           return;
   61862                         }
   61863                         Condition condition((instr >> 28) & 0xf);
   61864                         // NOP{<c>}{<q>} ; A1
   61865                         nop(condition, Best);
   61866                         if (((instr & 0xfffffff) != 0x320f000)) {
   61867                           UnpredictableA32(instr);
   61868                         }
   61869                         break;
   61870                       }
   61871                       case 0x00000001: {
   61872                         // 0x03200001
   61873                         if (((instr & 0xf0000000) == 0xf0000000)) {
   61874                           UnallocatedA32(instr);
   61875                           return;
   61876                         }
   61877                         Condition condition((instr >> 28) & 0xf);
   61878                         // YIELD{<c>}{<q>} ; A1
   61879                         yield(condition, Best);
   61880                         if (((instr & 0xfffffff) != 0x320f001)) {
   61881                           UnpredictableA32(instr);
   61882                         }
   61883                         break;
   61884                       }
   61885                       case 0x00000002: {
   61886                         // 0x03200002
   61887                         if (((instr & 0xf0000000) == 0xf0000000)) {
   61888                           UnallocatedA32(instr);
   61889                           return;
   61890                         }
   61891                         UnimplementedA32("WFE", instr);
   61892                         break;
   61893                       }
   61894                       case 0x00000003: {
   61895                         // 0x03200003
   61896                         if (((instr & 0xf0000000) == 0xf0000000)) {
   61897                           UnallocatedA32(instr);
   61898                           return;
   61899                         }
   61900                         UnimplementedA32("WFI", instr);
   61901                         break;
   61902                       }
   61903                       case 0x00000004: {
   61904                         // 0x03200004
   61905                         if (((instr & 0xf0000000) == 0xf0000000)) {
   61906                           UnallocatedA32(instr);
   61907                           return;
   61908                         }
   61909                         UnimplementedA32("SEV", instr);
   61910                         break;
   61911                       }
   61912                       case 0x00000005: {
   61913                         // 0x03200005
   61914                         if (((instr & 0xf0000000) == 0xf0000000)) {
   61915                           UnallocatedA32(instr);
   61916                           return;
   61917                         }
   61918                         UnimplementedA32("SEVL", instr);
   61919                         break;
   61920                       }
   61921                       default:
   61922                         UnallocatedA32(instr);
   61923                         break;
   61924                     }
   61925                     break;
   61926                   }
   61927                   case 0x000000f0: {
   61928                     // 0x032000f0
   61929                     if (((instr & 0xf0000000) == 0xf0000000)) {
   61930                       UnallocatedA32(instr);
   61931                       return;
   61932                     }
   61933                     UnimplementedA32("DBG", instr);
   61934                     break;
   61935                   }
   61936                   default:
   61937                     UnallocatedA32(instr);
   61938                     break;
   61939                 }
   61940                 break;
   61941               }
   61942               default: {
   61943                 if (((instr & 0xf0000000) == 0xf0000000) ||
   61944                     ((instr & 0x4f0000) == 0x0)) {
   61945                   UnallocatedA32(instr);
   61946                   return;
   61947                 }
   61948                 Condition condition((instr >> 28) & 0xf);
   61949                 unsigned spec_reg =
   61950                     ((instr >> 16) & 0xf) | ((instr >> 18) & 0x10);
   61951                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
   61952                 // MSR{<c>}{<q>} <spec_reg>, #<imm> ; A1
   61953                 msr(condition, MaskedSpecialRegister(spec_reg), imm);
   61954                 if (((instr & 0xfb0f000) != 0x320f000)) {
   61955                   UnpredictableA32(instr);
   61956                 }
   61957                 break;
   61958               }
   61959             }
   61960             break;
   61961           }
   61962           case 0x01300000: {
   61963             // 0x03300000
   61964             switch (instr & 0x00400000) {
   61965               case 0x00000000: {
   61966                 // 0x03300000
   61967                 if (((instr & 0xf0000000) == 0xf0000000)) {
   61968                   UnallocatedA32(instr);
   61969                   return;
   61970                 }
   61971                 Condition condition((instr >> 28) & 0xf);
   61972                 unsigned rn = (instr >> 16) & 0xf;
   61973                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
   61974                 // TEQ{<c>}{<q>} <Rn>, #<const> ; A1
   61975                 teq(condition, Register(rn), imm);
   61976                 if (((instr & 0xff0f000) != 0x3300000)) {
   61977                   UnpredictableA32(instr);
   61978                 }
   61979                 break;
   61980               }
   61981               case 0x00400000: {
   61982                 // 0x03700000
   61983                 if (((instr & 0xf0000000) == 0xf0000000)) {
   61984                   UnallocatedA32(instr);
   61985                   return;
   61986                 }
   61987                 Condition condition((instr >> 28) & 0xf);
   61988                 unsigned rn = (instr >> 16) & 0xf;
   61989                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
   61990                 // CMN{<c>}{<q>} <Rn>, #<const> ; A1
   61991                 cmn(condition, Best, Register(rn), imm);
   61992                 if (((instr & 0xff0f000) != 0x3700000)) {
   61993                   UnpredictableA32(instr);
   61994                 }
   61995                 break;
   61996               }
   61997             }
   61998             break;
   61999           }
   62000           case 0x01800000: {
   62001             // 0x03800000
   62002             switch (instr & 0x00400000) {
   62003               case 0x00000000: {
   62004                 // 0x03800000
   62005                 if (((instr & 0xf0000000) == 0xf0000000)) {
   62006                   UnallocatedA32(instr);
   62007                   return;
   62008                 }
   62009                 Condition condition((instr >> 28) & 0xf);
   62010                 unsigned rd = (instr >> 12) & 0xf;
   62011                 unsigned rn = (instr >> 16) & 0xf;
   62012                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
   62013                 // ORR{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
   62014                 orr(condition, Best, Register(rd), Register(rn), imm);
   62015                 break;
   62016               }
   62017               case 0x00400000: {
   62018                 // 0x03c00000
   62019                 if (((instr & 0xf0000000) == 0xf0000000)) {
   62020                   UnallocatedA32(instr);
   62021                   return;
   62022                 }
   62023                 Condition condition((instr >> 28) & 0xf);
   62024                 unsigned rd = (instr >> 12) & 0xf;
   62025                 unsigned rn = (instr >> 16) & 0xf;
   62026                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
   62027                 // BIC{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
   62028                 bic(condition, Best, Register(rd), Register(rn), imm);
   62029                 break;
   62030               }
   62031             }
   62032             break;
   62033           }
   62034           case 0x01900000: {
   62035             // 0x03900000
   62036             switch (instr & 0x00400000) {
   62037               case 0x00000000: {
   62038                 // 0x03900000
   62039                 if (((instr & 0xf0000000) == 0xf0000000)) {
   62040                   UnallocatedA32(instr);
   62041                   return;
   62042                 }
   62043                 Condition condition((instr >> 28) & 0xf);
   62044                 unsigned rd = (instr >> 12) & 0xf;
   62045                 unsigned rn = (instr >> 16) & 0xf;
   62046                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
   62047                 // ORRS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
   62048                 orrs(condition, Best, Register(rd), Register(rn), imm);
   62049                 break;
   62050               }
   62051               case 0x00400000: {
   62052                 // 0x03d00000
   62053                 if (((instr & 0xf0000000) == 0xf0000000)) {
   62054                   UnallocatedA32(instr);
   62055                   return;
   62056                 }
   62057                 Condition condition((instr >> 28) & 0xf);
   62058                 unsigned rd = (instr >> 12) & 0xf;
   62059                 unsigned rn = (instr >> 16) & 0xf;
   62060                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
   62061                 // BICS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
   62062                 bics(condition, Best, Register(rd), Register(rn), imm);
   62063                 break;
   62064               }
   62065             }
   62066             break;
   62067           }
   62068           case 0x01a00000: {
   62069             // 0x03a00000
   62070             switch (instr & 0x00400000) {
   62071               case 0x00000000: {
   62072                 // 0x03a00000
   62073                 if (((instr & 0xf0000000) == 0xf0000000)) {
   62074                   UnallocatedA32(instr);
   62075                   return;
   62076                 }
   62077                 Condition condition((instr >> 28) & 0xf);
   62078                 unsigned rd = (instr >> 12) & 0xf;
   62079                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
   62080                 // MOV{<c>}{<q>} <Rd>, #<const> ; A1
   62081                 mov(condition, Best, Register(rd), imm);
   62082                 if (((instr & 0xfff0000) != 0x3a00000)) {
   62083                   UnpredictableA32(instr);
   62084                 }
   62085                 break;
   62086               }
   62087               case 0x00400000: {
   62088                 // 0x03e00000
   62089                 if (((instr & 0xf0000000) == 0xf0000000)) {
   62090                   UnallocatedA32(instr);
   62091                   return;
   62092                 }
   62093                 Condition condition((instr >> 28) & 0xf);
   62094                 unsigned rd = (instr >> 12) & 0xf;
   62095                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
   62096                 // MVN{<c>}{<q>} <Rd>, #<const> ; A1
   62097                 mvn(condition, Best, Register(rd), imm);
   62098                 if (((instr & 0xfff0000) != 0x3e00000)) {
   62099                   UnpredictableA32(instr);
   62100                 }
   62101                 break;
   62102               }
   62103             }
   62104             break;
   62105           }
   62106           case 0x01b00000: {
   62107             // 0x03b00000
   62108             switch (instr & 0x00400000) {
   62109               case 0x00000000: {
   62110                 // 0x03b00000
   62111                 if (((instr & 0xf0000000) == 0xf0000000)) {
   62112                   UnallocatedA32(instr);
   62113                   return;
   62114                 }
   62115                 Condition condition((instr >> 28) & 0xf);
   62116                 unsigned rd = (instr >> 12) & 0xf;
   62117                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
   62118                 // MOVS{<c>}{<q>} <Rd>, #<const> ; A1
   62119                 movs(condition, Best, Register(rd), imm);
   62120                 if (((instr & 0xfff0000) != 0x3b00000)) {
   62121                   UnpredictableA32(instr);
   62122                 }
   62123                 break;
   62124               }
   62125               case 0x00400000: {
   62126                 // 0x03f00000
   62127                 if (((instr & 0xf0000000) == 0xf0000000)) {
   62128                   UnallocatedA32(instr);
   62129                   return;
   62130                 }
   62131                 Condition condition((instr >> 28) & 0xf);
   62132                 unsigned rd = (instr >> 12) & 0xf;
   62133                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
   62134                 // MVNS{<c>}{<q>} <Rd>, #<const> ; A1
   62135                 mvns(condition, Best, Register(rd), imm);
   62136                 if (((instr & 0xfff0000) != 0x3f00000)) {
   62137                   UnpredictableA32(instr);
   62138                 }
   62139                 break;
   62140               }
   62141             }
   62142             break;
   62143           }
   62144         }
   62145         break;
   62146       }
   62147       case 0x04000000: {
   62148         // 0x04000000
   62149         switch (instr & 0x00500000) {
   62150           case 0x00000000: {
   62151             // 0x04000000
   62152             switch (instr & 0x01200000) {
   62153               case 0x00000000: {
   62154                 // 0x04000000
   62155                 if (((instr & 0xf0000000) == 0xf0000000)) {
   62156                   UnallocatedA32(instr);
   62157                   return;
   62158                 }
   62159                 Condition condition((instr >> 28) & 0xf);
   62160                 unsigned rt = (instr >> 12) & 0xf;
   62161                 unsigned rn = (instr >> 16) & 0xf;
   62162                 Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
   62163                 int32_t offset = instr & 0xfff;
   62164                 // STR{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_3> ; A1
   62165                 str(condition,
   62166                     Best,
   62167                     Register(rt),
   62168                     MemOperand(Register(rn), sign, offset, PostIndex));
   62169                 break;
   62170               }
   62171               case 0x00200000: {
   62172                 // 0x04200000
   62173                 if (((instr & 0xf0000000) == 0xf0000000)) {
   62174                   UnallocatedA32(instr);
   62175                   return;
   62176                 }
   62177                 UnimplementedA32("STRT", instr);
   62178                 break;
   62179               }
   62180               case 0x01000000: {
   62181                 // 0x05000000
   62182                 if (((instr & 0xf0000000) == 0xf0000000)) {
   62183                   UnallocatedA32(instr);
   62184                   return;
   62185                 }
   62186                 Condition condition((instr >> 28) & 0xf);
   62187                 unsigned rt = (instr >> 12) & 0xf;
   62188                 unsigned rn = (instr >> 16) & 0xf;
   62189                 Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
   62190                 int32_t offset = instr & 0xfff;
   62191                 // STR{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_3>}] ; A1
   62192                 str(condition,
   62193                     Best,
   62194                     Register(rt),
   62195                     MemOperand(Register(rn), sign, offset, Offset));
   62196                 break;
   62197               }
   62198               case 0x01200000: {
   62199                 // 0x05200000
   62200                 if (((instr & 0xf0000000) == 0xf0000000)) {
   62201                   UnallocatedA32(instr);
   62202                   return;
   62203                 }
   62204                 if (((Uint32((instr >> 23)) & Uint32(0x1)) == Uint32(0x0)) &&
   62205                     ((Uint32((instr >> 16)) & Uint32(0xf)) == Uint32(0xd)) &&
   62206                     ((Uint32(instr) & Uint32(0xfff)) == Uint32(0x4)) &&
   62207                     ((instr & 0xf0000000) != 0xf0000000)) {
   62208                   Condition condition((instr >> 28) & 0xf);
   62209                   unsigned rt = (instr >> 12) & 0xf;
   62210                   // PUSH{<c>}{<q>} <single_register_list> ; A1
   62211                   push(condition, Best, Register(rt));
   62212                   return;
   62213                 }
   62214                 Condition condition((instr >> 28) & 0xf);
   62215                 unsigned rt = (instr >> 12) & 0xf;
   62216                 unsigned rn = (instr >> 16) & 0xf;
   62217                 Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
   62218                 int32_t offset = instr & 0xfff;
   62219                 // STR{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_3>}]! ; A1
   62220                 str(condition,
   62221                     Best,
   62222                     Register(rt),
   62223                     MemOperand(Register(rn), sign, offset, PreIndex));
   62224                 break;
   62225               }
   62226             }
   62227             break;
   62228           }
   62229           case 0x00100000: {
   62230             // 0x04100000
   62231             switch (instr & 0x01200000) {
   62232               case 0x00000000: {
   62233                 // 0x04100000
   62234                 switch (instr & 0x000f0000) {
   62235                   case 0x000f0000: {
   62236                     // 0x041f0000
   62237                     if (((instr & 0xf0000000) == 0xf0000000) ||
   62238                         ((instr & 0x1200000) == 0x200000)) {
   62239                       UnallocatedA32(instr);
   62240                       return;
   62241                     }
   62242                     Condition condition((instr >> 28) & 0xf);
   62243                     unsigned rt = (instr >> 12) & 0xf;
   62244                     uint32_t U = (instr >> 23) & 0x1;
   62245                     int32_t imm = instr & 0xfff;
   62246                     if (U == 0) imm = -imm;
   62247                     bool minus_zero = (imm == 0) && (U == 0);
   62248                     Label label(imm, kA32PcDelta, minus_zero);
   62249                     // LDR{<c>}{<q>} <Rt>, <label> ; A1
   62250                     ldr(condition, Best, Register(rt), &label);
   62251                     if (((instr & 0xf7f0000) != 0x51f0000)) {
   62252                       UnpredictableA32(instr);
   62253                     }
   62254                     break;
   62255                   }
   62256                   default: {
   62257                     if (((instr & 0xf0000000) == 0xf0000000) ||
   62258                         ((instr & 0xf0000) == 0xf0000)) {
   62259                       UnallocatedA32(instr);
   62260                       return;
   62261                     }
   62262                     if (((Uint32((instr >> 23)) & Uint32(0x1)) ==
   62263                          Uint32(0x1)) &&
   62264                         ((Uint32((instr >> 16)) & Uint32(0xf)) ==
   62265                          Uint32(0xd)) &&
   62266                         ((Uint32(instr) & Uint32(0xfff)) == Uint32(0x4)) &&
   62267                         ((instr & 0xf0000000) != 0xf0000000)) {
   62268                       Condition condition((instr >> 28) & 0xf);
   62269                       unsigned rt = (instr >> 12) & 0xf;
   62270                       // POP{<c>}{<q>} <single_register_list> ; A1
   62271                       pop(condition, Best, Register(rt));
   62272                       return;
   62273                     }
   62274                     Condition condition((instr >> 28) & 0xf);
   62275                     unsigned rt = (instr >> 12) & 0xf;
   62276                     unsigned rn = (instr >> 16) & 0xf;
   62277                     Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
   62278                     int32_t offset = instr & 0xfff;
   62279                     // LDR{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_3> ; A1
   62280                     ldr(condition,
   62281                         Best,
   62282                         Register(rt),
   62283                         MemOperand(Register(rn), sign, offset, PostIndex));
   62284                     break;
   62285                   }
   62286                 }
   62287                 break;
   62288               }
   62289               case 0x00200000: {
   62290                 // 0x04300000
   62291                 if (((instr & 0xf0000000) == 0xf0000000)) {
   62292                   UnallocatedA32(instr);
   62293                   return;
   62294                 }
   62295                 UnimplementedA32("LDRT", instr);
   62296                 break;
   62297               }
   62298               case 0x01000000: {
   62299                 // 0x05100000
   62300                 switch (instr & 0x000f0000) {
   62301                   case 0x000f0000: {
   62302                     // 0x051f0000
   62303                     if (((instr & 0xf0000000) == 0xf0000000) ||
   62304                         ((instr & 0x1200000) == 0x200000)) {
   62305                       UnallocatedA32(instr);
   62306                       return;
   62307                     }
   62308                     Condition condition((instr >> 28) & 0xf);
   62309                     unsigned rt = (instr >> 12) & 0xf;
   62310                     uint32_t U = (instr >> 23) & 0x1;
   62311                     int32_t imm = instr & 0xfff;
   62312                     if (U == 0) imm = -imm;
   62313                     bool minus_zero = (imm == 0) && (U == 0);
   62314                     Label label(imm, kA32PcDelta, minus_zero);
   62315                     // LDR{<c>}{<q>} <Rt>, <label> ; A1
   62316                     ldr(condition, Best, Register(rt), &label);
   62317                     if (((instr & 0xf7f0000) != 0x51f0000)) {
   62318                       UnpredictableA32(instr);
   62319                     }
   62320                     break;
   62321                   }
   62322                   default: {
   62323                     if (((instr & 0xf0000000) == 0xf0000000) ||
   62324                         ((instr & 0xf0000) == 0xf0000)) {
   62325                       UnallocatedA32(instr);
   62326                       return;
   62327                     }
   62328                     Condition condition((instr >> 28) & 0xf);
   62329                     unsigned rt = (instr >> 12) & 0xf;
   62330                     unsigned rn = (instr >> 16) & 0xf;
   62331                     Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
   62332                     int32_t offset = instr & 0xfff;
   62333                     // LDR{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_3>}] ; A1
   62334                     ldr(condition,
   62335                         Best,
   62336                         Register(rt),
   62337                         MemOperand(Register(rn), sign, offset, Offset));
   62338                     break;
   62339                   }
   62340                 }
   62341                 break;
   62342               }
   62343               case 0x01200000: {
   62344                 // 0x05300000
   62345                 switch (instr & 0x000f0000) {
   62346                   case 0x000f0000: {
   62347                     // 0x053f0000
   62348                     if (((instr & 0xf0000000) == 0xf0000000) ||
   62349                         ((instr & 0x1200000) == 0x200000)) {
   62350                       UnallocatedA32(instr);
   62351                       return;
   62352                     }
   62353                     Condition condition((instr >> 28) & 0xf);
   62354                     unsigned rt = (instr >> 12) & 0xf;
   62355                     uint32_t U = (instr >> 23) & 0x1;
   62356                     int32_t imm = instr & 0xfff;
   62357                     if (U == 0) imm = -imm;
   62358                     bool minus_zero = (imm == 0) && (U == 0);
   62359                     Label label(imm, kA32PcDelta, minus_zero);
   62360                     // LDR{<c>}{<q>} <Rt>, <label> ; A1
   62361                     ldr(condition, Best, Register(rt), &label);
   62362                     if (((instr & 0xf7f0000) != 0x51f0000)) {
   62363                       UnpredictableA32(instr);
   62364                     }
   62365                     break;
   62366                   }
   62367                   default: {
   62368                     if (((instr & 0xf0000000) == 0xf0000000) ||
   62369                         ((instr & 0xf0000) == 0xf0000)) {
   62370                       UnallocatedA32(instr);
   62371                       return;
   62372                     }
   62373                     Condition condition((instr >> 28) & 0xf);
   62374                     unsigned rt = (instr >> 12) & 0xf;
   62375                     unsigned rn = (instr >> 16) & 0xf;
   62376                     Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
   62377                     int32_t offset = instr & 0xfff;
   62378                     // LDR{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_3>}]! ; A1
   62379                     ldr(condition,
   62380                         Best,
   62381                         Register(rt),
   62382                         MemOperand(Register(rn), sign, offset, PreIndex));
   62383                     break;
   62384                   }
   62385                 }
   62386                 break;
   62387               }
   62388             }
   62389             break;
   62390           }
   62391           case 0x00400000: {
   62392             // 0x04400000
   62393             switch (instr & 0x01200000) {
   62394               case 0x00000000: {
   62395                 // 0x04400000
   62396                 if (((instr & 0xf0000000) == 0xf0000000)) {
   62397                   UnallocatedA32(instr);
   62398                   return;
   62399                 }
   62400                 Condition condition((instr >> 28) & 0xf);
   62401                 unsigned rt = (instr >> 12) & 0xf;
   62402                 unsigned rn = (instr >> 16) & 0xf;
   62403                 Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
   62404                 int32_t offset = instr & 0xfff;
   62405                 // STRB{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_3> ; A1
   62406                 strb(condition,
   62407                      Best,
   62408                      Register(rt),
   62409                      MemOperand(Register(rn), sign, offset, PostIndex));
   62410                 break;
   62411               }
   62412               case 0x00200000: {
   62413                 // 0x04600000
   62414                 if (((instr & 0xf0000000) == 0xf0000000)) {
   62415                   UnallocatedA32(instr);
   62416                   return;
   62417                 }
   62418                 UnimplementedA32("STRBT", instr);
   62419                 break;
   62420               }
   62421               case 0x01000000: {
   62422                 // 0x05400000
   62423                 if (((instr & 0xf0000000) == 0xf0000000)) {
   62424                   UnallocatedA32(instr);
   62425                   return;
   62426                 }
   62427                 Condition condition((instr >> 28) & 0xf);
   62428                 unsigned rt = (instr >> 12) & 0xf;
   62429                 unsigned rn = (instr >> 16) & 0xf;
   62430                 Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
   62431                 int32_t offset = instr & 0xfff;
   62432                 // STRB{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_3>}] ; A1
   62433                 strb(condition,
   62434                      Best,
   62435                      Register(rt),
   62436                      MemOperand(Register(rn), sign, offset, Offset));
   62437                 break;
   62438               }
   62439               case 0x01200000: {
   62440                 // 0x05600000
   62441                 if (((instr & 0xf0000000) == 0xf0000000)) {
   62442                   UnallocatedA32(instr);
   62443                   return;
   62444                 }
   62445                 Condition condition((instr >> 28) & 0xf);
   62446                 unsigned rt = (instr >> 12) & 0xf;
   62447                 unsigned rn = (instr >> 16) & 0xf;
   62448                 Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
   62449                 int32_t offset = instr & 0xfff;
   62450                 // STRB{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_3>}]! ; A1
   62451                 strb(condition,
   62452                      Best,
   62453                      Register(rt),
   62454                      MemOperand(Register(rn), sign, offset, PreIndex));
   62455                 break;
   62456               }
   62457             }
   62458             break;
   62459           }
   62460           case 0x00500000: {
   62461             // 0x04500000
   62462             switch (instr & 0x01200000) {
   62463               case 0x00000000: {
   62464                 // 0x04500000
   62465                 switch (instr & 0x000f0000) {
   62466                   case 0x000f0000: {
   62467                     // 0x045f0000
   62468                     if (((instr & 0xf0000000) == 0xf0000000) ||
   62469                         ((instr & 0x1200000) == 0x200000)) {
   62470                       UnallocatedA32(instr);
   62471                       return;
   62472                     }
   62473                     Condition condition((instr >> 28) & 0xf);
   62474                     unsigned rt = (instr >> 12) & 0xf;
   62475                     uint32_t U = (instr >> 23) & 0x1;
   62476                     int32_t imm = instr & 0xfff;
   62477                     if (U == 0) imm = -imm;
   62478                     bool minus_zero = (imm == 0) && (U == 0);
   62479                     Label label(imm, kA32PcDelta, minus_zero);
   62480                     // LDRB{<c>}{<q>} <Rt>, <label> ; A1
   62481                     ldrb(condition, Register(rt), &label);
   62482                     if (((instr & 0xf7f0000) != 0x55f0000)) {
   62483                       UnpredictableA32(instr);
   62484                     }
   62485                     break;
   62486                   }
   62487                   default: {
   62488                     if (((instr & 0xf0000000) == 0xf0000000) ||
   62489                         ((instr & 0xf0000) == 0xf0000)) {
   62490                       UnallocatedA32(instr);
   62491                       return;
   62492                     }
   62493                     Condition condition((instr >> 28) & 0xf);
   62494                     unsigned rt = (instr >> 12) & 0xf;
   62495                     unsigned rn = (instr >> 16) & 0xf;
   62496                     Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
   62497                     int32_t offset = instr & 0xfff;
   62498                     // LDRB{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_3> ; A1
   62499                     ldrb(condition,
   62500                          Best,
   62501                          Register(rt),
   62502                          MemOperand(Register(rn), sign, offset, PostIndex));
   62503                     break;
   62504                   }
   62505                 }
   62506                 break;
   62507               }
   62508               case 0x00200000: {
   62509                 // 0x04700000
   62510                 if (((instr & 0xf0000000) == 0xf0000000)) {
   62511                   UnallocatedA32(instr);
   62512                   return;
   62513                 }
   62514                 UnimplementedA32("LDRBT", instr);
   62515                 break;
   62516               }
   62517               case 0x01000000: {
   62518                 // 0x05500000
   62519                 switch (instr & 0x000f0000) {
   62520                   case 0x000f0000: {
   62521                     // 0x055f0000
   62522                     if (((instr & 0xf0000000) == 0xf0000000) ||
   62523                         ((instr & 0x1200000) == 0x200000)) {
   62524                       UnallocatedA32(instr);
   62525                       return;
   62526                     }
   62527                     Condition condition((instr >> 28) & 0xf);
   62528                     unsigned rt = (instr >> 12) & 0xf;
   62529                     uint32_t U = (instr >> 23) & 0x1;
   62530                     int32_t imm = instr & 0xfff;
   62531                     if (U == 0) imm = -imm;
   62532                     bool minus_zero = (imm == 0) && (U == 0);
   62533                     Label label(imm, kA32PcDelta, minus_zero);
   62534                     // LDRB{<c>}{<q>} <Rt>, <label> ; A1
   62535                     ldrb(condition, Register(rt), &label);
   62536                     if (((instr & 0xf7f0000) != 0x55f0000)) {
   62537                       UnpredictableA32(instr);
   62538                     }
   62539                     break;
   62540                   }
   62541                   default: {
   62542                     if (((instr & 0xf0000000) == 0xf0000000) ||
   62543                         ((instr & 0xf0000) == 0xf0000)) {
   62544                       UnallocatedA32(instr);
   62545                       return;
   62546                     }
   62547                     Condition condition((instr >> 28) & 0xf);
   62548                     unsigned rt = (instr >> 12) & 0xf;
   62549                     unsigned rn = (instr >> 16) & 0xf;
   62550                     Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
   62551                     int32_t offset = instr & 0xfff;
   62552                     // LDRB{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_3>}] ; A1
   62553                     ldrb(condition,
   62554                          Best,
   62555                          Register(rt),
   62556                          MemOperand(Register(rn), sign, offset, Offset));
   62557                     break;
   62558                   }
   62559                 }
   62560                 break;
   62561               }
   62562               case 0x01200000: {
   62563                 // 0x05700000
   62564                 switch (instr & 0x000f0000) {
   62565                   case 0x000f0000: {
   62566                     // 0x057f0000
   62567                     if (((instr & 0xf0000000) == 0xf0000000) ||
   62568                         ((instr & 0x1200000) == 0x200000)) {
   62569                       UnallocatedA32(instr);
   62570                       return;
   62571                     }
   62572                     Condition condition((instr >> 28) & 0xf);
   62573                     unsigned rt = (instr >> 12) & 0xf;
   62574                     uint32_t U = (instr >> 23) & 0x1;
   62575                     int32_t imm = instr & 0xfff;
   62576                     if (U == 0) imm = -imm;
   62577                     bool minus_zero = (imm == 0) && (U == 0);
   62578                     Label label(imm, kA32PcDelta, minus_zero);
   62579                     // LDRB{<c>}{<q>} <Rt>, <label> ; A1
   62580                     ldrb(condition, Register(rt), &label);
   62581                     if (((instr & 0xf7f0000) != 0x55f0000)) {
   62582                       UnpredictableA32(instr);
   62583                     }
   62584                     break;
   62585                   }
   62586                   default: {
   62587                     if (((instr & 0xf0000000) == 0xf0000000) ||
   62588                         ((instr & 0xf0000) == 0xf0000)) {
   62589                       UnallocatedA32(instr);
   62590                       return;
   62591                     }
   62592                     Condition condition((instr >> 28) & 0xf);
   62593                     unsigned rt = (instr >> 12) & 0xf;
   62594                     unsigned rn = (instr >> 16) & 0xf;
   62595                     Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
   62596                     int32_t offset = instr & 0xfff;
   62597                     // LDRB{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_3>}]! ; A1
   62598                     ldrb(condition,
   62599                          Best,
   62600                          Register(rt),
   62601                          MemOperand(Register(rn), sign, offset, PreIndex));
   62602                     break;
   62603                   }
   62604                 }
   62605                 break;
   62606               }
   62607             }
   62608             break;
   62609           }
   62610         }
   62611         break;
   62612       }
   62613       case 0x06000000: {
   62614         // 0x06000000
   62615         switch (instr & 0x01600010) {
   62616           case 0x00000000: {
   62617             // 0x06000000
   62618             switch (instr & 0x00100000) {
   62619               case 0x00000000: {
   62620                 // 0x06000000
   62621                 if (((instr & 0xf0000000) == 0xf0000000)) {
   62622                   UnallocatedA32(instr);
   62623                   return;
   62624                 }
   62625                 Condition condition((instr >> 28) & 0xf);
   62626                 unsigned rt = (instr >> 12) & 0xf;
   62627                 unsigned rn = (instr >> 16) & 0xf;
   62628                 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
   62629                 unsigned rm = instr & 0xf;
   62630                 uint32_t imm_and_type_ = ((instr >> 5) & 0x7f);
   62631                 ImmediateShiftOperand shift_operand(imm_and_type_ & 0x3,
   62632                                                     (imm_and_type_ & 0x7c) >>
   62633                                                         2);
   62634                 Shift shift = shift_operand.GetShift();
   62635                 uint32_t amount = shift_operand.GetAmount();
   62636                 // STR{<c>}{<q>} <Rt>, [<Rn>], {+/-}<Rm>{, <shift>} ; A1
   62637                 str(condition,
   62638                     Best,
   62639                     Register(rt),
   62640                     MemOperand(Register(rn),
   62641                                sign,
   62642                                Register(rm),
   62643                                shift,
   62644                                amount,
   62645                                PostIndex));
   62646                 break;
   62647               }
   62648               case 0x00100000: {
   62649                 // 0x06100000
   62650                 if (((instr & 0xf0000000) == 0xf0000000)) {
   62651                   UnallocatedA32(instr);
   62652                   return;
   62653                 }
   62654                 Condition condition((instr >> 28) & 0xf);
   62655                 unsigned rt = (instr >> 12) & 0xf;
   62656                 unsigned rn = (instr >> 16) & 0xf;
   62657                 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
   62658                 unsigned rm = instr & 0xf;
   62659                 uint32_t imm_and_type_ = ((instr >> 5) & 0x7f);
   62660                 ImmediateShiftOperand shift_operand(imm_and_type_ & 0x3,
   62661                                                     (imm_and_type_ & 0x7c) >>
   62662                                                         2);
   62663                 Shift shift = shift_operand.GetShift();
   62664                 uint32_t amount = shift_operand.GetAmount();
   62665                 // LDR{<c>}{<q>} <Rt>, [<Rn>], {+/-}<Rm>{, <shift>} ; A1
   62666                 ldr(condition,
   62667                     Best,
   62668                     Register(rt),
   62669                     MemOperand(Register(rn),
   62670                                sign,
   62671                                Register(rm),
   62672                                shift,
   62673                                amount,
   62674                                PostIndex));
   62675                 break;
   62676               }
   62677             }
   62678             break;
   62679           }
   62680           case 0x00000010: {
   62681             // 0x06000010
   62682             switch (instr & 0x00900060) {
   62683               case 0x00100000: {
   62684                 // 0x06100010
   62685                 switch (instr & 0x00000080) {
   62686                   case 0x00000000: {
   62687                     // 0x06100010
   62688                     if (((instr & 0xf0000000) == 0xf0000000)) {
   62689                       UnallocatedA32(instr);
   62690                       return;
   62691                     }
   62692                     Condition condition((instr >> 28) & 0xf);
   62693                     unsigned rd = (instr >> 12) & 0xf;
   62694                     unsigned rn = (instr >> 16) & 0xf;
   62695                     unsigned rm = instr & 0xf;
   62696                     // SADD16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
   62697                     sadd16(condition, Register(rd), Register(rn), Register(rm));
   62698                     if (((instr & 0xff00ff0) != 0x6100f10)) {
   62699                       UnpredictableA32(instr);
   62700                     }
   62701                     break;
   62702                   }
   62703                   case 0x00000080: {
   62704                     // 0x06100090
   62705                     if (((instr & 0xf0000000) == 0xf0000000)) {
   62706                       UnallocatedA32(instr);
   62707                       return;
   62708                     }
   62709                     Condition condition((instr >> 28) & 0xf);
   62710                     unsigned rd = (instr >> 12) & 0xf;
   62711                     unsigned rn = (instr >> 16) & 0xf;
   62712                     unsigned rm = instr & 0xf;
   62713                     // SADD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
   62714                     sadd8(condition, Register(rd), Register(rn), Register(rm));
   62715                     if (((instr & 0xff00ff0) != 0x6100f90)) {
   62716                       UnpredictableA32(instr);
   62717                     }
   62718                     break;
   62719                   }
   62720                 }
   62721                 break;
   62722               }
   62723               case 0x00100020: {
   62724                 // 0x06100030
   62725                 if ((instr & 0x00000080) == 0x00000000) {
   62726                   if (((instr & 0xf0000000) == 0xf0000000)) {
   62727                     UnallocatedA32(instr);
   62728                     return;
   62729                   }
   62730                   Condition condition((instr >> 28) & 0xf);
   62731                   unsigned rd = (instr >> 12) & 0xf;
   62732                   unsigned rn = (instr >> 16) & 0xf;
   62733                   unsigned rm = instr & 0xf;
   62734                   // SASX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
   62735                   sasx(condition, Register(rd), Register(rn), Register(rm));
   62736                   if (((instr & 0xff00ff0) != 0x6100f30)) {
   62737                     UnpredictableA32(instr);
   62738                   }
   62739                 } else {
   62740                   UnallocatedA32(instr);
   62741                 }
   62742                 break;
   62743               }
   62744               case 0x00100040: {
   62745                 // 0x06100050
   62746                 if ((instr & 0x00000080) == 0x00000000) {
   62747                   if (((instr & 0xf0000000) == 0xf0000000)) {
   62748                     UnallocatedA32(instr);
   62749                     return;
   62750                   }
   62751                   Condition condition((instr >> 28) & 0xf);
   62752                   unsigned rd = (instr >> 12) & 0xf;
   62753                   unsigned rn = (instr >> 16) & 0xf;
   62754                   unsigned rm = instr & 0xf;
   62755                   // SSAX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
   62756                   ssax(condition, Register(rd), Register(rn), Register(rm));
   62757                   if (((instr & 0xff00ff0) != 0x6100f50)) {
   62758                     UnpredictableA32(instr);
   62759                   }
   62760                 } else {
   62761                   UnallocatedA32(instr);
   62762                 }
   62763                 break;
   62764               }
   62765               case 0x00100060: {
   62766                 // 0x06100070
   62767                 switch (instr & 0x00000080) {
   62768                   case 0x00000000: {
   62769                     // 0x06100070
   62770                     if (((instr & 0xf0000000) == 0xf0000000)) {
   62771                       UnallocatedA32(instr);
   62772                       return;
   62773                     }
   62774                     Condition condition((instr >> 28) & 0xf);
   62775                     unsigned rd = (instr >> 12) & 0xf;
   62776                     unsigned rn = (instr >> 16) & 0xf;
   62777                     unsigned rm = instr & 0xf;
   62778                     // SSUB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
   62779                     ssub16(condition, Register(rd), Register(rn), Register(rm));
   62780                     if (((instr & 0xff00ff0) != 0x6100f70)) {
   62781                       UnpredictableA32(instr);
   62782                     }
   62783                     break;
   62784                   }
   62785                   case 0x00000080: {
   62786                     // 0x061000f0
   62787                     if (((instr & 0xf0000000) == 0xf0000000)) {
   62788                       UnallocatedA32(instr);
   62789                       return;
   62790                     }
   62791                     Condition condition((instr >> 28) & 0xf);
   62792                     unsigned rd = (instr >> 12) & 0xf;
   62793                     unsigned rn = (instr >> 16) & 0xf;
   62794                     unsigned rm = instr & 0xf;
   62795                     // SSUB8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
   62796                     ssub8(condition, Register(rd), Register(rn), Register(rm));
   62797                     if (((instr & 0xff00ff0) != 0x6100ff0)) {
   62798                       UnpredictableA32(instr);
   62799                     }
   62800                     break;
   62801                   }
   62802                 }
   62803                 break;
   62804               }
   62805               case 0x00800000: {
   62806                 // 0x06800010
   62807                 if (((instr & 0xf0000000) == 0xf0000000)) {
   62808                   UnallocatedA32(instr);
   62809                   return;
   62810                 }
   62811                 Condition condition((instr >> 28) & 0xf);
   62812                 unsigned rd = (instr >> 12) & 0xf;
   62813                 unsigned rn = (instr >> 16) & 0xf;
   62814                 unsigned rm = instr & 0xf;
   62815                 uint32_t amount = (instr >> 7) & 0x1f;
   62816                 // PKHBT{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, LSL #<imm> } ; A1
   62817                 pkhbt(condition,
   62818                       Register(rd),
   62819                       Register(rn),
   62820                       Operand(Register(rm), LSL, amount));
   62821                 break;
   62822               }
   62823               case 0x00800020: {
   62824                 // 0x06800030
   62825                 if ((instr & 0x00000080) == 0x00000080) {
   62826                   if (((instr & 0xf0000000) == 0xf0000000)) {
   62827                     UnallocatedA32(instr);
   62828                     return;
   62829                   }
   62830                   Condition condition((instr >> 28) & 0xf);
   62831                   unsigned rd = (instr >> 12) & 0xf;
   62832                   unsigned rn = (instr >> 16) & 0xf;
   62833                   unsigned rm = instr & 0xf;
   62834                   // SEL{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
   62835                   sel(condition, Register(rd), Register(rn), Register(rm));
   62836                   if (((instr & 0xff00ff0) != 0x6800fb0)) {
   62837                     UnpredictableA32(instr);
   62838                   }
   62839                 } else {
   62840                   UnallocatedA32(instr);
   62841                 }
   62842                 break;
   62843               }
   62844               case 0x00800040: {
   62845                 // 0x06800050
   62846                 if (((instr & 0xf0000000) == 0xf0000000)) {
   62847                   UnallocatedA32(instr);
   62848                   return;
   62849                 }
   62850                 Condition condition((instr >> 28) & 0xf);
   62851                 unsigned rd = (instr >> 12) & 0xf;
   62852                 unsigned rn = (instr >> 16) & 0xf;
   62853                 unsigned rm = instr & 0xf;
   62854                 uint32_t amount = (instr >> 7) & 0x1f;
   62855                 if (amount == 0) amount = 32;
   62856                 // PKHTB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ASR #<imm> } ; A1
   62857                 pkhtb(condition,
   62858                       Register(rd),
   62859                       Register(rn),
   62860                       Operand(Register(rm), ASR, amount));
   62861                 break;
   62862               }
   62863               case 0x00800060: {
   62864                 // 0x06800070
   62865                 switch (instr & 0x00000080) {
   62866                   case 0x00000000: {
   62867                     // 0x06800070
   62868                     switch (instr & 0x000f0000) {
   62869                       case 0x000f0000: {
   62870                         // 0x068f0070
   62871                         if (((instr & 0xf0000000) == 0xf0000000)) {
   62872                           UnallocatedA32(instr);
   62873                           return;
   62874                         }
   62875                         Condition condition((instr >> 28) & 0xf);
   62876                         unsigned rd = (instr >> 12) & 0xf;
   62877                         unsigned rm = instr & 0xf;
   62878                         uint32_t amount = ((instr >> 10) & 0x3) * 8;
   62879                         // SXTB16{<c>}{<q>} {<Rd>}, <Rm> {, ROR #<amount> } ; A1
   62880                         sxtb16(condition,
   62881                                Register(rd),
   62882                                Operand(Register(rm), ROR, amount));
   62883                         if (((instr & 0xfff03f0) != 0x68f0070)) {
   62884                           UnpredictableA32(instr);
   62885                         }
   62886                         break;
   62887                       }
   62888                       default: {
   62889                         if (((instr & 0xf0000000) == 0xf0000000) ||
   62890                             ((instr & 0xf0000) == 0xf0000)) {
   62891                           UnallocatedA32(instr);
   62892                           return;
   62893                         }
   62894                         Condition condition((instr >> 28) & 0xf);
   62895                         unsigned rd = (instr >> 12) & 0xf;
   62896                         unsigned rn = (instr >> 16) & 0xf;
   62897                         unsigned rm = instr & 0xf;
   62898                         uint32_t amount = ((instr >> 10) & 0x3) * 8;
   62899                         // SXTAB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ROR #<amount> } ; A1 NOLINT(whitespace/line_length)
   62900                         sxtab16(condition,
   62901                                 Register(rd),
   62902                                 Register(rn),
   62903                                 Operand(Register(rm), ROR, amount));
   62904                         if (((instr & 0xff003f0) != 0x6800070)) {
   62905                           UnpredictableA32(instr);
   62906                         }
   62907                         break;
   62908                       }
   62909                     }
   62910                     break;
   62911                   }
   62912                   default:
   62913                     UnallocatedA32(instr);
   62914                     break;
   62915                 }
   62916                 break;
   62917               }
   62918               default:
   62919                 UnallocatedA32(instr);
   62920                 break;
   62921             }
   62922             break;
   62923           }
   62924           case 0x00200000: {
   62925             // 0x06200000
   62926             switch (instr & 0x00100000) {
   62927               case 0x00000000: {
   62928                 // 0x06200000
   62929                 if (((instr & 0xf0000000) == 0xf0000000)) {
   62930                   UnallocatedA32(instr);
   62931                   return;
   62932                 }
   62933                 UnimplementedA32("STRT", instr);
   62934                 break;
   62935               }
   62936               case 0x00100000: {
   62937                 // 0x06300000
   62938                 if (((instr & 0xf0000000) == 0xf0000000)) {
   62939                   UnallocatedA32(instr);
   62940                   return;
   62941                 }
   62942                 UnimplementedA32("LDRT", instr);
   62943                 break;
   62944               }
   62945             }
   62946             break;
   62947           }
   62948           case 0x00200010: {
   62949             // 0x06200010
   62950             switch (instr & 0x00800060) {
   62951               case 0x00000000: {
   62952                 // 0x06200010
   62953                 switch (instr & 0x00100080) {
   62954                   case 0x00000000: {
   62955                     // 0x06200010
   62956                     if (((instr & 0xf0000000) == 0xf0000000)) {
   62957                       UnallocatedA32(instr);
   62958                       return;
   62959                     }
   62960                     Condition condition((instr >> 28) & 0xf);
   62961                     unsigned rd = (instr >> 12) & 0xf;
   62962                     unsigned rn = (instr >> 16) & 0xf;
   62963                     unsigned rm = instr & 0xf;
   62964                     // QADD16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
   62965                     qadd16(condition, Register(rd), Register(rn), Register(rm));
   62966                     if (((instr & 0xff00ff0) != 0x6200f10)) {
   62967                       UnpredictableA32(instr);
   62968                     }
   62969                     break;
   62970                   }
   62971                   case 0x00000080: {
   62972                     // 0x06200090
   62973                     if (((instr & 0xf0000000) == 0xf0000000)) {
   62974                       UnallocatedA32(instr);
   62975                       return;
   62976                     }
   62977                     Condition condition((instr >> 28) & 0xf);
   62978                     unsigned rd = (instr >> 12) & 0xf;
   62979                     unsigned rn = (instr >> 16) & 0xf;
   62980                     unsigned rm = instr & 0xf;
   62981                     // QADD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
   62982                     qadd8(condition, Register(rd), Register(rn), Register(rm));
   62983                     if (((instr & 0xff00ff0) != 0x6200f90)) {
   62984                       UnpredictableA32(instr);
   62985                     }
   62986                     break;
   62987                   }
   62988                   case 0x00100000: {
   62989                     // 0x06300010
   62990                     if (((instr & 0xf0000000) == 0xf0000000)) {
   62991                       UnallocatedA32(instr);
   62992                       return;
   62993                     }
   62994                     Condition condition((instr >> 28) & 0xf);
   62995                     unsigned rd = (instr >> 12) & 0xf;
   62996                     unsigned rn = (instr >> 16) & 0xf;
   62997                     unsigned rm = instr & 0xf;
   62998                     // SHADD16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
   62999                     shadd16(condition,
   63000                             Register(rd),
   63001                             Register(rn),
   63002                             Register(rm));
   63003                     if (((instr & 0xff00ff0) != 0x6300f10)) {
   63004                       UnpredictableA32(instr);
   63005                     }
   63006                     break;
   63007                   }
   63008                   case 0x00100080: {
   63009                     // 0x06300090
   63010                     if (((instr & 0xf0000000) == 0xf0000000)) {
   63011                       UnallocatedA32(instr);
   63012                       return;
   63013                     }
   63014                     Condition condition((instr >> 28) & 0xf);
   63015                     unsigned rd = (instr >> 12) & 0xf;
   63016                     unsigned rn = (instr >> 16) & 0xf;
   63017                     unsigned rm = instr & 0xf;
   63018                     // SHADD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
   63019                     shadd8(condition, Register(rd), Register(rn), Register(rm));
   63020                     if (((instr & 0xff00ff0) != 0x6300f90)) {
   63021                       UnpredictableA32(instr);
   63022                     }
   63023                     break;
   63024                   }
   63025                 }
   63026                 break;
   63027               }
   63028               case 0x00000020: {
   63029                 // 0x06200030
   63030                 switch (instr & 0x00100080) {
   63031                   case 0x00000000: {
   63032                     // 0x06200030
   63033                     if (((instr & 0xf0000000) == 0xf0000000)) {
   63034                       UnallocatedA32(instr);
   63035                       return;
   63036                     }
   63037                     Condition condition((instr >> 28) & 0xf);
   63038                     unsigned rd = (instr >> 12) & 0xf;
   63039                     unsigned rn = (instr >> 16) & 0xf;
   63040                     unsigned rm = instr & 0xf;
   63041                     // QASX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
   63042                     qasx(condition, Register(rd), Register(rn), Register(rm));
   63043                     if (((instr & 0xff00ff0) != 0x6200f30)) {
   63044                       UnpredictableA32(instr);
   63045                     }
   63046                     break;
   63047                   }
   63048                   case 0x00100000: {
   63049                     // 0x06300030
   63050                     if (((instr & 0xf0000000) == 0xf0000000)) {
   63051                       UnallocatedA32(instr);
   63052                       return;
   63053                     }
   63054                     Condition condition((instr >> 28) & 0xf);
   63055                     unsigned rd = (instr >> 12) & 0xf;
   63056                     unsigned rn = (instr >> 16) & 0xf;
   63057                     unsigned rm = instr & 0xf;
   63058                     // SHASX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
   63059                     shasx(condition, Register(rd), Register(rn), Register(rm));
   63060                     if (((instr & 0xff00ff0) != 0x6300f30)) {
   63061                       UnpredictableA32(instr);
   63062                     }
   63063                     break;
   63064                   }
   63065                   default:
   63066                     UnallocatedA32(instr);
   63067                     break;
   63068                 }
   63069                 break;
   63070               }
   63071               case 0x00000040: {
   63072                 // 0x06200050
   63073                 switch (instr & 0x00100080) {
   63074                   case 0x00000000: {
   63075                     // 0x06200050
   63076                     if (((instr & 0xf0000000) == 0xf0000000)) {
   63077                       UnallocatedA32(instr);
   63078                       return;
   63079                     }
   63080                     Condition condition((instr >> 28) & 0xf);
   63081                     unsigned rd = (instr >> 12) & 0xf;
   63082                     unsigned rn = (instr >> 16) & 0xf;
   63083                     unsigned rm = instr & 0xf;
   63084                     // QSAX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
   63085                     qsax(condition, Register(rd), Register(rn), Register(rm));
   63086                     if (((instr & 0xff00ff0) != 0x6200f50)) {
   63087                       UnpredictableA32(instr);
   63088                     }
   63089                     break;
   63090                   }
   63091                   case 0x00100000: {
   63092                     // 0x06300050
   63093                     if (((instr & 0xf0000000) == 0xf0000000)) {
   63094                       UnallocatedA32(instr);
   63095                       return;
   63096                     }
   63097                     Condition condition((instr >> 28) & 0xf);
   63098                     unsigned rd = (instr >> 12) & 0xf;
   63099                     unsigned rn = (instr >> 16) & 0xf;
   63100                     unsigned rm = instr & 0xf;
   63101                     // SHSAX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
   63102                     shsax(condition, Register(rd), Register(rn), Register(rm));
   63103                     if (((instr & 0xff00ff0) != 0x6300f50)) {
   63104                       UnpredictableA32(instr);
   63105                     }
   63106                     break;
   63107                   }
   63108                   default:
   63109                     UnallocatedA32(instr);
   63110                     break;
   63111                 }
   63112                 break;
   63113               }
   63114               case 0x00000060: {
   63115                 // 0x06200070
   63116                 switch (instr & 0x00100080) {
   63117                   case 0x00000000: {
   63118                     // 0x06200070
   63119                     if (((instr & 0xf0000000) == 0xf0000000)) {
   63120                       UnallocatedA32(instr);
   63121                       return;
   63122                     }
   63123                     Condition condition((instr >> 28) & 0xf);
   63124                     unsigned rd = (instr >> 12) & 0xf;
   63125                     unsigned rn = (instr >> 16) & 0xf;
   63126                     unsigned rm = instr & 0xf;
   63127                     // QSUB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
   63128                     qsub16(condition, Register(rd), Register(rn), Register(rm));
   63129                     if (((instr & 0xff00ff0) != 0x6200f70)) {
   63130                       UnpredictableA32(instr);
   63131                     }
   63132                     break;
   63133                   }
   63134                   case 0x00000080: {
   63135                     // 0x062000f0
   63136                     if (((instr & 0xf0000000) == 0xf0000000)) {
   63137                       UnallocatedA32(instr);
   63138                       return;
   63139                     }
   63140                     Condition condition((instr >> 28) & 0xf);
   63141                     unsigned rd = (instr >> 12) & 0xf;
   63142                     unsigned rn = (instr >> 16) & 0xf;
   63143                     unsigned rm = instr & 0xf;
   63144                     // QSUB8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
   63145                     qsub8(condition, Register(rd), Register(rn), Register(rm));
   63146                     if (((instr & 0xff00ff0) != 0x6200ff0)) {
   63147                       UnpredictableA32(instr);
   63148                     }
   63149                     break;
   63150                   }
   63151                   case 0x00100000: {
   63152                     // 0x06300070
   63153                     if (((instr & 0xf0000000) == 0xf0000000)) {
   63154                       UnallocatedA32(instr);
   63155                       return;
   63156                     }
   63157                     Condition condition((instr >> 28) & 0xf);
   63158                     unsigned rd = (instr >> 12) & 0xf;
   63159                     unsigned rn = (instr >> 16) & 0xf;
   63160                     unsigned rm = instr & 0xf;
   63161                     // SHSUB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
   63162                     shsub16(condition,
   63163                             Register(rd),
   63164                             Register(rn),
   63165                             Register(rm));
   63166                     if (((instr & 0xff00ff0) != 0x6300f70)) {
   63167                       UnpredictableA32(instr);
   63168                     }
   63169                     break;
   63170                   }
   63171                   case 0x00100080: {
   63172                     // 0x063000f0
   63173                     if (((instr & 0xf0000000) == 0xf0000000)) {
   63174                       UnallocatedA32(instr);
   63175                       return;
   63176                     }
   63177                     Condition condition((instr >> 28) & 0xf);
   63178                     unsigned rd = (instr >> 12) & 0xf;
   63179                     unsigned rn = (instr >> 16) & 0xf;
   63180                     unsigned rm = instr & 0xf;
   63181                     // SHSUB8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
   63182                     shsub8(condition, Register(rd), Register(rn), Register(rm));
   63183                     if (((instr & 0xff00ff0) != 0x6300ff0)) {
   63184                       UnpredictableA32(instr);
   63185                     }
   63186                     break;
   63187                   }
   63188                 }
   63189                 break;
   63190               }
   63191               case 0x00800000: {
   63192                 // 0x06a00010
   63193                 if (((instr & 0xf0000000) == 0xf0000000)) {
   63194                   UnallocatedA32(instr);
   63195                   return;
   63196                 }
   63197                 Condition condition((instr >> 28) & 0xf);
   63198                 unsigned rd = (instr >> 12) & 0xf;
   63199                 uint32_t imm = ((instr >> 16) & 0x1f) + 1;
   63200                 unsigned rn = instr & 0xf;
   63201                 uint32_t amount = (instr >> 7) & 0x1f;
   63202                 // SSAT{<c>}{<q>} <Rd>, #<imm>, <Rn> {, LSL #<amount> } ; A1
   63203                 ssat(condition,
   63204                      Register(rd),
   63205                      imm,
   63206                      Operand(Register(rn), LSL, amount));
   63207                 break;
   63208               }
   63209               case 0x00800020: {
   63210                 // 0x06a00030
   63211                 switch (instr & 0x00100080) {
   63212                   case 0x00000000: {
   63213                     // 0x06a00030
   63214                     if (((instr & 0xf0000000) == 0xf0000000)) {
   63215                       UnallocatedA32(instr);
   63216                       return;
   63217                     }
   63218                     Condition condition((instr >> 28) & 0xf);
   63219                     unsigned rd = (instr >> 12) & 0xf;
   63220                     uint32_t imm = ((instr >> 16) & 0xf) + 1;
   63221                     unsigned rn = instr & 0xf;
   63222                     // SSAT16{<c>}{<q>} <Rd>, #<imm>, <Rn> ; A1
   63223                     ssat16(condition, Register(rd), imm, Register(rn));
   63224                     if (((instr & 0xff00ff0) != 0x6a00f30)) {
   63225                       UnpredictableA32(instr);
   63226                     }
   63227                     break;
   63228                   }
   63229                   case 0x00100000: {
   63230                     // 0x06b00030
   63231                     if (((instr & 0xf0000000) == 0xf0000000)) {
   63232                       UnallocatedA32(instr);
   63233                       return;
   63234                     }
   63235                     Condition condition((instr >> 28) & 0xf);
   63236                     unsigned rd = (instr >> 12) & 0xf;
   63237                     unsigned rm = instr & 0xf;
   63238                     // REV{<c>}{<q>} <Rd>, <Rm> ; A1
   63239                     rev(condition, Best, Register(rd), Register(rm));
   63240                     if (((instr & 0xfff0ff0) != 0x6bf0f30)) {
   63241                       UnpredictableA32(instr);
   63242                     }
   63243                     break;
   63244                   }
   63245                   case 0x00100080: {
   63246                     // 0x06b000b0
   63247                     if (((instr & 0xf0000000) == 0xf0000000)) {
   63248                       UnallocatedA32(instr);
   63249                       return;
   63250                     }
   63251                     Condition condition((instr >> 28) & 0xf);
   63252                     unsigned rd = (instr >> 12) & 0xf;
   63253                     unsigned rm = instr & 0xf;
   63254                     // REV16{<c>}{<q>} <Rd>, <Rm> ; A1
   63255                     rev16(condition, Best, Register(rd), Register(rm));
   63256                     if (((instr & 0xfff0ff0) != 0x6bf0fb0)) {
   63257                       UnpredictableA32(instr);
   63258                     }
   63259                     break;
   63260                   }
   63261                   default:
   63262                     UnallocatedA32(instr);
   63263                     break;
   63264                 }
   63265                 break;
   63266               }
   63267               case 0x00800040: {
   63268                 // 0x06a00050
   63269                 if (((instr & 0xf0000000) == 0xf0000000)) {
   63270                   UnallocatedA32(instr);
   63271                   return;
   63272                 }
   63273                 Condition condition((instr >> 28) & 0xf);
   63274                 unsigned rd = (instr >> 12) & 0xf;
   63275                 uint32_t imm = ((instr >> 16) & 0x1f) + 1;
   63276                 unsigned rn = instr & 0xf;
   63277                 uint32_t amount = (instr >> 7) & 0x1f;
   63278                 if (amount == 0) amount = 32;
   63279                 // SSAT{<c>}{<q>} <Rd>, #<imm>, <Rn>, ASR #<amount> ; A1
   63280                 ssat(condition,
   63281                      Register(rd),
   63282                      imm,
   63283                      Operand(Register(rn), ASR, amount));
   63284                 break;
   63285               }
   63286               case 0x00800060: {
   63287                 // 0x06a00070
   63288                 switch (instr & 0x00100080) {
   63289                   case 0x00000000: {
   63290                     // 0x06a00070
   63291                     switch (instr & 0x000f0000) {
   63292                       case 0x000f0000: {
   63293                         // 0x06af0070
   63294                         if (((instr & 0xf0000000) == 0xf0000000)) {
   63295                           UnallocatedA32(instr);
   63296                           return;
   63297                         }
   63298                         Condition condition((instr >> 28) & 0xf);
   63299                         unsigned rd = (instr >> 12) & 0xf;
   63300                         unsigned rm = instr & 0xf;
   63301                         uint32_t amount = ((instr >> 10) & 0x3) * 8;
   63302                         // SXTB{<c>}{<q>} {<Rd>}, <Rm> {, ROR #<amount> } ; A1
   63303                         sxtb(condition,
   63304                              Best,
   63305                              Register(rd),
   63306                              Operand(Register(rm), ROR, amount));
   63307                         if (((instr & 0xfff03f0) != 0x6af0070)) {
   63308                           UnpredictableA32(instr);
   63309                         }
   63310                         break;
   63311                       }
   63312                       default: {
   63313                         if (((instr & 0xf0000000) == 0xf0000000) ||
   63314                             ((instr & 0xf0000) == 0xf0000)) {
   63315                           UnallocatedA32(instr);
   63316                           return;
   63317                         }
   63318                         Condition condition((instr >> 28) & 0xf);
   63319                         unsigned rd = (instr >> 12) & 0xf;
   63320                         unsigned rn = (instr >> 16) & 0xf;
   63321                         unsigned rm = instr & 0xf;
   63322                         uint32_t amount = ((instr >> 10) & 0x3) * 8;
   63323                         // SXTAB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ROR #<amount> } ; A1 NOLINT(whitespace/line_length)
   63324                         sxtab(condition,
   63325                               Register(rd),
   63326                               Register(rn),
   63327                               Operand(Register(rm), ROR, amount));
   63328                         if (((instr & 0xff003f0) != 0x6a00070)) {
   63329                           UnpredictableA32(instr);
   63330                         }
   63331                         break;
   63332                       }
   63333                     }
   63334                     break;
   63335                   }
   63336                   case 0x00100000: {
   63337                     // 0x06b00070
   63338                     switch (instr & 0x000f0000) {
   63339                       case 0x000f0000: {
   63340                         // 0x06bf0070
   63341                         if (((instr & 0xf0000000) == 0xf0000000)) {
   63342                           UnallocatedA32(instr);
   63343                           return;
   63344                         }
   63345                         Condition condition((instr >> 28) & 0xf);
   63346                         unsigned rd = (instr >> 12) & 0xf;
   63347                         unsigned rm = instr & 0xf;
   63348                         uint32_t amount = ((instr >> 10) & 0x3) * 8;
   63349                         // SXTH{<c>}{<q>} {<Rd>}, <Rm> {, ROR #<amount> } ; A1
   63350                         sxth(condition,
   63351                              Best,
   63352                              Register(rd),
   63353                              Operand(Register(rm), ROR, amount));
   63354                         if (((instr & 0xfff03f0) != 0x6bf0070)) {
   63355                           UnpredictableA32(instr);
   63356                         }
   63357                         break;
   63358                       }
   63359                       default: {
   63360                         if (((instr & 0xf0000000) == 0xf0000000) ||
   63361                             ((instr & 0xf0000) == 0xf0000)) {
   63362                           UnallocatedA32(instr);
   63363                           return;
   63364                         }
   63365                         Condition condition((instr >> 28) & 0xf);
   63366                         unsigned rd = (instr >> 12) & 0xf;
   63367                         unsigned rn = (instr >> 16) & 0xf;
   63368                         unsigned rm = instr & 0xf;
   63369                         uint32_t amount = ((instr >> 10) & 0x3) * 8;
   63370                         // SXTAH{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ROR #<amount> } ; A1 NOLINT(whitespace/line_length)
   63371                         sxtah(condition,
   63372                               Register(rd),
   63373                               Register(rn),
   63374                               Operand(Register(rm), ROR, amount));
   63375                         if (((instr & 0xff003f0) != 0x6b00070)) {
   63376                           UnpredictableA32(instr);
   63377                         }
   63378                         break;
   63379                       }
   63380                     }
   63381                     break;
   63382                   }
   63383                   default:
   63384                     UnallocatedA32(instr);
   63385                     break;
   63386                 }
   63387                 break;
   63388               }
   63389             }
   63390             break;
   63391           }
   63392           case 0x00400000: {
   63393             // 0x06400000
   63394             switch (instr & 0x00100000) {
   63395               case 0x00000000: {
   63396                 // 0x06400000
   63397                 if (((instr & 0xf0000000) == 0xf0000000)) {
   63398                   UnallocatedA32(instr);
   63399                   return;
   63400                 }
   63401                 Condition condition((instr >> 28) & 0xf);
   63402                 unsigned rt = (instr >> 12) & 0xf;
   63403                 unsigned rn = (instr >> 16) & 0xf;
   63404                 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
   63405                 unsigned rm = instr & 0xf;
   63406                 uint32_t imm_and_type_ = ((instr >> 5) & 0x7f);
   63407                 ImmediateShiftOperand shift_operand(imm_and_type_ & 0x3,
   63408                                                     (imm_and_type_ & 0x7c) >>
   63409                                                         2);
   63410                 Shift shift = shift_operand.GetShift();
   63411                 uint32_t amount = shift_operand.GetAmount();
   63412                 // STRB{<c>}{<q>} <Rt>, [<Rn>], {+/-}<Rm>{, <shift>} ; A1
   63413                 strb(condition,
   63414                      Best,
   63415                      Register(rt),
   63416                      MemOperand(Register(rn),
   63417                                 sign,
   63418                                 Register(rm),
   63419                                 shift,
   63420                                 amount,
   63421                                 PostIndex));
   63422                 break;
   63423               }
   63424               case 0x00100000: {
   63425                 // 0x06500000
   63426                 if (((instr & 0xf0000000) == 0xf0000000)) {
   63427                   UnallocatedA32(instr);
   63428                   return;
   63429                 }
   63430                 Condition condition((instr >> 28) & 0xf);
   63431                 unsigned rt = (instr >> 12) & 0xf;
   63432                 unsigned rn = (instr >> 16) & 0xf;
   63433                 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
   63434                 unsigned rm = instr & 0xf;
   63435                 uint32_t imm_and_type_ = ((instr >> 5) & 0x7f);
   63436                 ImmediateShiftOperand shift_operand(imm_and_type_ & 0x3,
   63437                                                     (imm_and_type_ & 0x7c) >>
   63438                                                         2);
   63439                 Shift shift = shift_operand.GetShift();
   63440                 uint32_t amount = shift_operand.GetAmount();
   63441                 // LDRB{<c>}{<q>} <Rt>, [<Rn>], {+/-}<Rm>{, <shift>} ; A1
   63442                 ldrb(condition,
   63443                      Best,
   63444                      Register(rt),
   63445                      MemOperand(Register(rn),
   63446                                 sign,
   63447                                 Register(rm),
   63448                                 shift,
   63449                                 amount,
   63450                                 PostIndex));
   63451                 break;
   63452               }
   63453             }
   63454             break;
   63455           }
   63456           case 0x00400010: {
   63457             // 0x06400010
   63458             switch (instr & 0x009000e0) {
   63459               case 0x00100000: {
   63460                 // 0x06500010
   63461                 if (((instr & 0xf0000000) == 0xf0000000)) {
   63462                   UnallocatedA32(instr);
   63463                   return;
   63464                 }
   63465                 Condition condition((instr >> 28) & 0xf);
   63466                 unsigned rd = (instr >> 12) & 0xf;
   63467                 unsigned rn = (instr >> 16) & 0xf;
   63468                 unsigned rm = instr & 0xf;
   63469                 // UADD16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
   63470                 uadd16(condition, Register(rd), Register(rn), Register(rm));
   63471                 if (((instr & 0xff00ff0) != 0x6500f10)) {
   63472                   UnpredictableA32(instr);
   63473                 }
   63474                 break;
   63475               }
   63476               case 0x00100020: {
   63477                 // 0x06500030
   63478                 if (((instr & 0xf0000000) == 0xf0000000)) {
   63479                   UnallocatedA32(instr);
   63480                   return;
   63481                 }
   63482                 Condition condition((instr >> 28) & 0xf);
   63483                 unsigned rd = (instr >> 12) & 0xf;
   63484                 unsigned rn = (instr >> 16) & 0xf;
   63485                 unsigned rm = instr & 0xf;
   63486                 // UASX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
   63487                 uasx(condition, Register(rd), Register(rn), Register(rm));
   63488                 if (((instr & 0xff00ff0) != 0x6500f30)) {
   63489                   UnpredictableA32(instr);
   63490                 }
   63491                 break;
   63492               }
   63493               case 0x00100040: {
   63494                 // 0x06500050
   63495                 if (((instr & 0xf0000000) == 0xf0000000)) {
   63496                   UnallocatedA32(instr);
   63497                   return;
   63498                 }
   63499                 Condition condition((instr >> 28) & 0xf);
   63500                 unsigned rd = (instr >> 12) & 0xf;
   63501                 unsigned rn = (instr >> 16) & 0xf;
   63502                 unsigned rm = instr & 0xf;
   63503                 // USAX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
   63504                 usax(condition, Register(rd), Register(rn), Register(rm));
   63505                 if (((instr & 0xff00ff0) != 0x6500f50)) {
   63506                   UnpredictableA32(instr);
   63507                 }
   63508                 break;
   63509               }
   63510               case 0x00100060: {
   63511                 // 0x06500070
   63512                 if (((instr & 0xf0000000) == 0xf0000000)) {
   63513                   UnallocatedA32(instr);
   63514                   return;
   63515                 }
   63516                 Condition condition((instr >> 28) & 0xf);
   63517                 unsigned rd = (instr >> 12) & 0xf;
   63518                 unsigned rn = (instr >> 16) & 0xf;
   63519                 unsigned rm = instr & 0xf;
   63520                 // USUB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
   63521                 usub16(condition, Register(rd), Register(rn), Register(rm));
   63522                 if (((instr & 0xff00ff0) != 0x6500f70)) {
   63523                   UnpredictableA32(instr);
   63524                 }
   63525                 break;
   63526               }
   63527               case 0x00100080: {
   63528                 // 0x06500090
   63529                 if (((instr & 0xf0000000) == 0xf0000000)) {
   63530                   UnallocatedA32(instr);
   63531                   return;
   63532                 }
   63533                 Condition condition((instr >> 28) & 0xf);
   63534                 unsigned rd = (instr >> 12) & 0xf;
   63535                 unsigned rn = (instr >> 16) & 0xf;
   63536                 unsigned rm = instr & 0xf;
   63537                 // UADD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
   63538                 uadd8(condition, Register(rd), Register(rn), Register(rm));
   63539                 if (((instr & 0xff00ff0) != 0x6500f90)) {
   63540                   UnpredictableA32(instr);
   63541                 }
   63542                 break;
   63543               }
   63544               case 0x001000e0: {
   63545                 // 0x065000f0
   63546                 if (((instr & 0xf0000000) == 0xf0000000)) {
   63547                   UnallocatedA32(instr);
   63548                   return;
   63549                 }
   63550                 Condition condition((instr >> 28) & 0xf);
   63551                 unsigned rd = (instr >> 12) & 0xf;
   63552                 unsigned rn = (instr >> 16) & 0xf;
   63553                 unsigned rm = instr & 0xf;
   63554                 // USUB8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
   63555                 usub8(condition, Register(rd), Register(rn), Register(rm));
   63556                 if (((instr & 0xff00ff0) != 0x6500ff0)) {
   63557                   UnpredictableA32(instr);
   63558                 }
   63559                 break;
   63560               }
   63561               case 0x00800060: {
   63562                 // 0x06c00070
   63563                 switch (instr & 0x000f0000) {
   63564                   case 0x000f0000: {
   63565                     // 0x06cf0070
   63566                     if (((instr & 0xf0000000) == 0xf0000000)) {
   63567                       UnallocatedA32(instr);
   63568                       return;
   63569                     }
   63570                     Condition condition((instr >> 28) & 0xf);
   63571                     unsigned rd = (instr >> 12) & 0xf;
   63572                     unsigned rm = instr & 0xf;
   63573                     uint32_t amount = ((instr >> 10) & 0x3) * 8;
   63574                     // UXTB16{<c>}{<q>} {<Rd>}, <Rm> {, ROR #<amount> } ; A1
   63575                     uxtb16(condition,
   63576                            Register(rd),
   63577                            Operand(Register(rm), ROR, amount));
   63578                     if (((instr & 0xfff03f0) != 0x6cf0070)) {
   63579                       UnpredictableA32(instr);
   63580                     }
   63581                     break;
   63582                   }
   63583                   default: {
   63584                     if (((instr & 0xf0000000) == 0xf0000000) ||
   63585                         ((instr & 0xf0000) == 0xf0000)) {
   63586                       UnallocatedA32(instr);
   63587                       return;
   63588                     }
   63589                     Condition condition((instr >> 28) & 0xf);
   63590                     unsigned rd = (instr >> 12) & 0xf;
   63591                     unsigned rn = (instr >> 16) & 0xf;
   63592                     unsigned rm = instr & 0xf;
   63593                     uint32_t amount = ((instr >> 10) & 0x3) * 8;
   63594                     // UXTAB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ROR #<amount> } ; A1 NOLINT(whitespace/line_length)
   63595                     uxtab16(condition,
   63596                             Register(rd),
   63597                             Register(rn),
   63598                             Operand(Register(rm), ROR, amount));
   63599                     if (((instr & 0xff003f0) != 0x6c00070)) {
   63600                       UnpredictableA32(instr);
   63601                     }
   63602                     break;
   63603                   }
   63604                 }
   63605                 break;
   63606               }
   63607               default:
   63608                 UnallocatedA32(instr);
   63609                 break;
   63610             }
   63611             break;
   63612           }
   63613           case 0x00600000: {
   63614             // 0x06600000
   63615             switch (instr & 0x00100000) {
   63616               case 0x00000000: {
   63617                 // 0x06600000
   63618                 if (((instr & 0xf0000000) == 0xf0000000)) {
   63619                   UnallocatedA32(instr);
   63620                   return;
   63621                 }
   63622                 UnimplementedA32("STRBT", instr);
   63623                 break;
   63624               }
   63625               case 0x00100000: {
   63626                 // 0x06700000
   63627                 if (((instr & 0xf0000000) == 0xf0000000)) {
   63628                   UnallocatedA32(instr);
   63629                   return;
   63630                 }
   63631                 UnimplementedA32("LDRBT", instr);
   63632                 break;
   63633               }
   63634             }
   63635             break;
   63636           }
   63637           case 0x00600010: {
   63638             // 0x06600010
   63639             switch (instr & 0x00800060) {
   63640               case 0x00000000: {
   63641                 // 0x06600010
   63642                 switch (instr & 0x00100080) {
   63643                   case 0x00000000: {
   63644                     // 0x06600010
   63645                     if (((instr & 0xf0000000) == 0xf0000000)) {
   63646                       UnallocatedA32(instr);
   63647                       return;
   63648                     }
   63649                     Condition condition((instr >> 28) & 0xf);
   63650                     unsigned rd = (instr >> 12) & 0xf;
   63651                     unsigned rn = (instr >> 16) & 0xf;
   63652                     unsigned rm = instr & 0xf;
   63653                     // UQADD16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
   63654                     uqadd16(condition,
   63655                             Register(rd),
   63656                             Register(rn),
   63657                             Register(rm));
   63658                     if (((instr & 0xff00ff0) != 0x6600f10)) {
   63659                       UnpredictableA32(instr);
   63660                     }
   63661                     break;
   63662                   }
   63663                   case 0x00000080: {
   63664                     // 0x06600090
   63665                     if (((instr & 0xf0000000) == 0xf0000000)) {
   63666                       UnallocatedA32(instr);
   63667                       return;
   63668                     }
   63669                     Condition condition((instr >> 28) & 0xf);
   63670                     unsigned rd = (instr >> 12) & 0xf;
   63671                     unsigned rn = (instr >> 16) & 0xf;
   63672                     unsigned rm = instr & 0xf;
   63673                     // UQADD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
   63674                     uqadd8(condition, Register(rd), Register(rn), Register(rm));
   63675                     if (((instr & 0xff00ff0) != 0x6600f90)) {
   63676                       UnpredictableA32(instr);
   63677                     }
   63678                     break;
   63679                   }
   63680                   case 0x00100000: {
   63681                     // 0x06700010
   63682                     if (((instr & 0xf0000000) == 0xf0000000)) {
   63683                       UnallocatedA32(instr);
   63684                       return;
   63685                     }
   63686                     Condition condition((instr >> 28) & 0xf);
   63687                     unsigned rd = (instr >> 12) & 0xf;
   63688                     unsigned rn = (instr >> 16) & 0xf;
   63689                     unsigned rm = instr & 0xf;
   63690                     // UHADD16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
   63691                     uhadd16(condition,
   63692                             Register(rd),
   63693                             Register(rn),
   63694                             Register(rm));
   63695                     if (((instr & 0xff00ff0) != 0x6700f10)) {
   63696                       UnpredictableA32(instr);
   63697                     }
   63698                     break;
   63699                   }
   63700                   case 0x00100080: {
   63701                     // 0x06700090
   63702                     if (((instr & 0xf0000000) == 0xf0000000)) {
   63703                       UnallocatedA32(instr);
   63704                       return;
   63705                     }
   63706                     Condition condition((instr >> 28) & 0xf);
   63707                     unsigned rd = (instr >> 12) & 0xf;
   63708                     unsigned rn = (instr >> 16) & 0xf;
   63709                     unsigned rm = instr & 0xf;
   63710                     // UHADD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
   63711                     uhadd8(condition, Register(rd), Register(rn), Register(rm));
   63712                     if (((instr & 0xff00ff0) != 0x6700f90)) {
   63713                       UnpredictableA32(instr);
   63714                     }
   63715                     break;
   63716                   }
   63717                 }
   63718                 break;
   63719               }
   63720               case 0x00000020: {
   63721                 // 0x06600030
   63722                 switch (instr & 0x00100080) {
   63723                   case 0x00000000: {
   63724                     // 0x06600030
   63725                     if (((instr & 0xf0000000) == 0xf0000000)) {
   63726                       UnallocatedA32(instr);
   63727                       return;
   63728                     }
   63729                     Condition condition((instr >> 28) & 0xf);
   63730                     unsigned rd = (instr >> 12) & 0xf;
   63731                     unsigned rn = (instr >> 16) & 0xf;
   63732                     unsigned rm = instr & 0xf;
   63733                     // UQASX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
   63734                     uqasx(condition, Register(rd), Register(rn), Register(rm));
   63735                     if (((instr & 0xff00ff0) != 0x6600f30)) {
   63736                       UnpredictableA32(instr);
   63737                     }
   63738                     break;
   63739                   }
   63740                   case 0x00100000: {
   63741                     // 0x06700030
   63742                     if (((instr & 0xf0000000) == 0xf0000000)) {
   63743                       UnallocatedA32(instr);
   63744                       return;
   63745                     }
   63746                     Condition condition((instr >> 28) & 0xf);
   63747                     unsigned rd = (instr >> 12) & 0xf;
   63748                     unsigned rn = (instr >> 16) & 0xf;
   63749                     unsigned rm = instr & 0xf;
   63750                     // UHASX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
   63751                     uhasx(condition, Register(rd), Register(rn), Register(rm));
   63752                     if (((instr & 0xff00ff0) != 0x6700f30)) {
   63753                       UnpredictableA32(instr);
   63754                     }
   63755                     break;
   63756                   }
   63757                   default:
   63758                     UnallocatedA32(instr);
   63759                     break;
   63760                 }
   63761                 break;
   63762               }
   63763               case 0x00000040: {
   63764                 // 0x06600050
   63765                 switch (instr & 0x00100080) {
   63766                   case 0x00000000: {
   63767                     // 0x06600050
   63768                     if (((instr & 0xf0000000) == 0xf0000000)) {
   63769                       UnallocatedA32(instr);
   63770                       return;
   63771                     }
   63772                     Condition condition((instr >> 28) & 0xf);
   63773                     unsigned rd = (instr >> 12) & 0xf;
   63774                     unsigned rn = (instr >> 16) & 0xf;
   63775                     unsigned rm = instr & 0xf;
   63776                     // UQSAX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
   63777                     uqsax(condition, Register(rd), Register(rn), Register(rm));
   63778                     if (((instr & 0xff00ff0) != 0x6600f50)) {
   63779                       UnpredictableA32(instr);
   63780                     }
   63781                     break;
   63782                   }
   63783                   case 0x00100000: {
   63784                     // 0x06700050
   63785                     if (((instr & 0xf0000000) == 0xf0000000)) {
   63786                       UnallocatedA32(instr);
   63787                       return;
   63788                     }
   63789                     Condition condition((instr >> 28) & 0xf);
   63790                     unsigned rd = (instr >> 12) & 0xf;
   63791                     unsigned rn = (instr >> 16) & 0xf;
   63792                     unsigned rm = instr & 0xf;
   63793                     // UHSAX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
   63794                     uhsax(condition, Register(rd), Register(rn), Register(rm));
   63795                     if (((instr & 0xff00ff0) != 0x6700f50)) {
   63796                       UnpredictableA32(instr);
   63797                     }
   63798                     break;
   63799                   }
   63800                   default:
   63801                     UnallocatedA32(instr);
   63802                     break;
   63803                 }
   63804                 break;
   63805               }
   63806               case 0x00000060: {
   63807                 // 0x06600070
   63808                 switch (instr & 0x00100080) {
   63809                   case 0x00000000: {
   63810                     // 0x06600070
   63811                     if (((instr & 0xf0000000) == 0xf0000000)) {
   63812                       UnallocatedA32(instr);
   63813                       return;
   63814                     }
   63815                     Condition condition((instr >> 28) & 0xf);
   63816                     unsigned rd = (instr >> 12) & 0xf;
   63817                     unsigned rn = (instr >> 16) & 0xf;
   63818                     unsigned rm = instr & 0xf;
   63819                     // UQSUB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
   63820                     uqsub16(condition,
   63821                             Register(rd),
   63822                             Register(rn),
   63823                             Register(rm));
   63824                     if (((instr & 0xff00ff0) != 0x6600f70)) {
   63825                       UnpredictableA32(instr);
   63826                     }
   63827                     break;
   63828                   }
   63829                   case 0x00000080: {
   63830                     // 0x066000f0
   63831                     if (((instr & 0xf0000000) == 0xf0000000)) {
   63832                       UnallocatedA32(instr);
   63833                       return;
   63834                     }
   63835                     Condition condition((instr >> 28) & 0xf);
   63836                     unsigned rd = (instr >> 12) & 0xf;
   63837                     unsigned rn = (instr >> 16) & 0xf;
   63838                     unsigned rm = instr & 0xf;
   63839                     // UQSUB8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
   63840                     uqsub8(condition, Register(rd), Register(rn), Register(rm));
   63841                     if (((instr & 0xff00ff0) != 0x6600ff0)) {
   63842                       UnpredictableA32(instr);
   63843                     }
   63844                     break;
   63845                   }
   63846                   case 0x00100000: {
   63847                     // 0x06700070
   63848                     if (((instr & 0xf0000000) == 0xf0000000)) {
   63849                       UnallocatedA32(instr);
   63850                       return;
   63851                     }
   63852                     Condition condition((instr >> 28) & 0xf);
   63853                     unsigned rd = (instr >> 12) & 0xf;
   63854                     unsigned rn = (instr >> 16) & 0xf;
   63855                     unsigned rm = instr & 0xf;
   63856                     // UHSUB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
   63857                     uhsub16(condition,
   63858                             Register(rd),
   63859                             Register(rn),
   63860                             Register(rm));
   63861                     if (((instr & 0xff00ff0) != 0x6700f70)) {
   63862                       UnpredictableA32(instr);
   63863                     }
   63864                     break;
   63865                   }
   63866                   case 0x00100080: {
   63867                     // 0x067000f0
   63868                     if (((instr & 0xf0000000) == 0xf0000000)) {
   63869                       UnallocatedA32(instr);
   63870                       return;
   63871                     }
   63872                     Condition condition((instr >> 28) & 0xf);
   63873                     unsigned rd = (instr >> 12) & 0xf;
   63874                     unsigned rn = (instr >> 16) & 0xf;
   63875                     unsigned rm = instr & 0xf;
   63876                     // UHSUB8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
   63877                     uhsub8(condition, Register(rd), Register(rn), Register(rm));
   63878                     if (((instr & 0xff00ff0) != 0x6700ff0)) {
   63879                       UnpredictableA32(instr);
   63880                     }
   63881                     break;
   63882                   }
   63883                 }
   63884                 break;
   63885               }
   63886               case 0x00800000: {
   63887                 // 0x06e00010
   63888                 if (((instr & 0xf0000000) == 0xf0000000)) {
   63889                   UnallocatedA32(instr);
   63890                   return;
   63891                 }
   63892                 Condition condition((instr >> 28) & 0xf);
   63893                 unsigned rd = (instr >> 12) & 0xf;
   63894                 uint32_t imm = (instr >> 16) & 0x1f;
   63895                 unsigned rn = instr & 0xf;
   63896                 uint32_t amount = (instr >> 7) & 0x1f;
   63897                 // USAT{<c>}{<q>} <Rd>, #<imm>, <Rn> {, LSL #<amount> } ; A1
   63898                 usat(condition,
   63899                      Register(rd),
   63900                      imm,
   63901                      Operand(Register(rn), LSL, amount));
   63902                 break;
   63903               }
   63904               case 0x00800020: {
   63905                 // 0x06e00030
   63906                 switch (instr & 0x00100080) {
   63907                   case 0x00000000: {
   63908                     // 0x06e00030
   63909                     if (((instr & 0xf0000000) == 0xf0000000)) {
   63910                       UnallocatedA32(instr);
   63911                       return;
   63912                     }
   63913                     Condition condition((instr >> 28) & 0xf);
   63914                     unsigned rd = (instr >> 12) & 0xf;
   63915                     uint32_t imm = (instr >> 16) & 0xf;
   63916                     unsigned rn = instr & 0xf;
   63917                     // USAT16{<c>}{<q>} <Rd>, #<imm>, <Rn> ; A1
   63918                     usat16(condition, Register(rd), imm, Register(rn));
   63919                     if (((instr & 0xff00ff0) != 0x6e00f30)) {
   63920                       UnpredictableA32(instr);
   63921                     }
   63922                     break;
   63923                   }
   63924                   case 0x00100000: {
   63925                     // 0x06f00030
   63926                     if (((instr & 0xf0000000) == 0xf0000000)) {
   63927                       UnallocatedA32(instr);
   63928                       return;
   63929                     }
   63930                     Condition condition((instr >> 28) & 0xf);
   63931                     unsigned rd = (instr >> 12) & 0xf;
   63932                     unsigned rm = instr & 0xf;
   63933                     // RBIT{<c>}{<q>} <Rd>, <Rm> ; A1
   63934                     rbit(condition, Register(rd), Register(rm));
   63935                     if (((instr & 0xfff0ff0) != 0x6ff0f30)) {
   63936                       UnpredictableA32(instr);
   63937                     }
   63938                     break;
   63939                   }
   63940                   case 0x00100080: {
   63941                     // 0x06f000b0
   63942                     if (((instr & 0xf0000000) == 0xf0000000)) {
   63943                       UnallocatedA32(instr);
   63944                       return;
   63945                     }
   63946                     Condition condition((instr >> 28) & 0xf);
   63947                     unsigned rd = (instr >> 12) & 0xf;
   63948                     unsigned rm = instr & 0xf;
   63949                     // REVSH{<c>}{<q>} <Rd>, <Rm> ; A1
   63950                     revsh(condition, Best, Register(rd), Register(rm));
   63951                     if (((instr & 0xfff0ff0) != 0x6ff0fb0)) {
   63952                       UnpredictableA32(instr);
   63953                     }
   63954                     break;
   63955                   }
   63956                   default:
   63957                     UnallocatedA32(instr);
   63958                     break;
   63959                 }
   63960                 break;
   63961               }
   63962               case 0x00800040: {
   63963                 // 0x06e00050
   63964                 if (((instr & 0xf0000000) == 0xf0000000)) {
   63965                   UnallocatedA32(instr);
   63966                   return;
   63967                 }
   63968                 Condition condition((instr >> 28) & 0xf);
   63969                 unsigned rd = (instr >> 12) & 0xf;
   63970                 uint32_t imm = (instr >> 16) & 0x1f;
   63971                 unsigned rn = instr & 0xf;
   63972                 uint32_t amount = (instr >> 7) & 0x1f;
   63973                 if (amount == 0) amount = 32;
   63974                 // USAT{<c>}{<q>} <Rd>, #<imm>, <Rn>, ASR #<amount> ; A1
   63975                 usat(condition,
   63976                      Register(rd),
   63977                      imm,
   63978                      Operand(Register(rn), ASR, amount));
   63979                 break;
   63980               }
   63981               case 0x00800060: {
   63982                 // 0x06e00070
   63983                 switch (instr & 0x00100080) {
   63984                   case 0x00000000: {
   63985                     // 0x06e00070
   63986                     switch (instr & 0x000f0000) {
   63987                       case 0x000f0000: {
   63988                         // 0x06ef0070
   63989                         if (((instr & 0xf0000000) == 0xf0000000)) {
   63990                           UnallocatedA32(instr);
   63991                           return;
   63992                         }
   63993                         Condition condition((instr >> 28) & 0xf);
   63994                         unsigned rd = (instr >> 12) & 0xf;
   63995                         unsigned rm = instr & 0xf;
   63996                         uint32_t amount = ((instr >> 10) & 0x3) * 8;
   63997                         // UXTB{<c>}{<q>} {<Rd>}, <Rm> {, ROR #<amount> } ; A1
   63998                         uxtb(condition,
   63999                              Best,
   64000                              Register(rd),
   64001                              Operand(Register(rm), ROR, amount));
   64002                         if (((instr & 0xfff03f0) != 0x6ef0070)) {
   64003                           UnpredictableA32(instr);
   64004                         }
   64005                         break;
   64006                       }
   64007                       default: {
   64008                         if (((instr & 0xf0000000) == 0xf0000000) ||
   64009                             ((instr & 0xf0000) == 0xf0000)) {
   64010                           UnallocatedA32(instr);
   64011                           return;
   64012                         }
   64013                         Condition condition((instr >> 28) & 0xf);
   64014                         unsigned rd = (instr >> 12) & 0xf;
   64015                         unsigned rn = (instr >> 16) & 0xf;
   64016                         unsigned rm = instr & 0xf;
   64017                         uint32_t amount = ((instr >> 10) & 0x3) * 8;
   64018                         // UXTAB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ROR #<amount> } ; A1 NOLINT(whitespace/line_length)
   64019                         uxtab(condition,
   64020                               Register(rd),
   64021                               Register(rn),
   64022                               Operand(Register(rm), ROR, amount));
   64023                         if (((instr & 0xff003f0) != 0x6e00070)) {
   64024                           UnpredictableA32(instr);
   64025                         }
   64026                         break;
   64027                       }
   64028                     }
   64029                     break;
   64030                   }
   64031                   case 0x00100000: {
   64032                     // 0x06f00070
   64033                     switch (instr & 0x000f0000) {
   64034                       case 0x000f0000: {
   64035                         // 0x06ff0070
   64036                         if (((instr & 0xf0000000) == 0xf0000000)) {
   64037                           UnallocatedA32(instr);
   64038                           return;
   64039                         }
   64040                         Condition condition((instr >> 28) & 0xf);
   64041                         unsigned rd = (instr >> 12) & 0xf;
   64042                         unsigned rm = instr & 0xf;
   64043                         uint32_t amount = ((instr >> 10) & 0x3) * 8;
   64044                         // UXTH{<c>}{<q>} {<Rd>}, <Rm> {, ROR #<amount> } ; A1
   64045                         uxth(condition,
   64046                              Best,
   64047                              Register(rd),
   64048                              Operand(Register(rm), ROR, amount));
   64049                         if (((instr & 0xfff03f0) != 0x6ff0070)) {
   64050                           UnpredictableA32(instr);
   64051                         }
   64052                         break;
   64053                       }
   64054                       default: {
   64055                         if (((instr & 0xf0000000) == 0xf0000000) ||
   64056                             ((instr & 0xf0000) == 0xf0000)) {
   64057                           UnallocatedA32(instr);
   64058                           return;
   64059                         }
   64060                         Condition condition((instr >> 28) & 0xf);
   64061                         unsigned rd = (instr >> 12) & 0xf;
   64062                         unsigned rn = (instr >> 16) & 0xf;
   64063                         unsigned rm = instr & 0xf;
   64064                         uint32_t amount = ((instr >> 10) & 0x3) * 8;
   64065                         // UXTAH{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ROR #<amount> } ; A1 NOLINT(whitespace/line_length)
   64066                         uxtah(condition,
   64067                               Register(rd),
   64068                               Register(rn),
   64069                               Operand(Register(rm), ROR, amount));
   64070                         if (((instr & 0xff003f0) != 0x6f00070)) {
   64071                           UnpredictableA32(instr);
   64072                         }
   64073                         break;
   64074                       }
   64075                     }
   64076                     break;
   64077                   }
   64078                   default:
   64079                     UnallocatedA32(instr);
   64080                     break;
   64081                 }
   64082                 break;
   64083               }
   64084             }
   64085             break;
   64086           }
   64087           case 0x01000000: {
   64088             // 0x07000000
   64089             switch (instr & 0x00100000) {
   64090               case 0x00000000: {
   64091                 // 0x07000000
   64092                 if (((instr & 0xf0000000) == 0xf0000000)) {
   64093                   UnallocatedA32(instr);
   64094                   return;
   64095                 }
   64096                 Condition condition((instr >> 28) & 0xf);
   64097                 unsigned rt = (instr >> 12) & 0xf;
   64098                 unsigned rn = (instr >> 16) & 0xf;
   64099                 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
   64100                 unsigned rm = instr & 0xf;
   64101                 uint32_t imm_and_type_ = ((instr >> 5) & 0x7f);
   64102                 ImmediateShiftOperand shift_operand(imm_and_type_ & 0x3,
   64103                                                     (imm_and_type_ & 0x7c) >>
   64104                                                         2);
   64105                 Shift shift = shift_operand.GetShift();
   64106                 uint32_t amount = shift_operand.GetAmount();
   64107                 AddrMode addrmode = Offset;
   64108                 // STR{<c>}{<q>} <Rt>, [<Rn>, {+/-}<Rm>{, <shift>}] ; A1
   64109                 str(condition,
   64110                     Best,
   64111                     Register(rt),
   64112                     MemOperand(Register(rn),
   64113                                sign,
   64114                                Register(rm),
   64115                                shift,
   64116                                amount,
   64117                                addrmode));
   64118                 break;
   64119               }
   64120               case 0x00100000: {
   64121                 // 0x07100000
   64122                 if (((instr & 0xf0000000) == 0xf0000000)) {
   64123                   UnallocatedA32(instr);
   64124                   return;
   64125                 }
   64126                 Condition condition((instr >> 28) & 0xf);
   64127                 unsigned rt = (instr >> 12) & 0xf;
   64128                 unsigned rn = (instr >> 16) & 0xf;
   64129                 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
   64130                 unsigned rm = instr & 0xf;
   64131                 uint32_t imm_and_type_ = ((instr >> 5) & 0x7f);
   64132                 ImmediateShiftOperand shift_operand(imm_and_type_ & 0x3,
   64133                                                     (imm_and_type_ & 0x7c) >>
   64134                                                         2);
   64135                 Shift shift = shift_operand.GetShift();
   64136                 uint32_t amount = shift_operand.GetAmount();
   64137                 AddrMode addrmode = Offset;
   64138                 // LDR{<c>}{<q>} <Rt>, [<Rn>, {+/-}<Rm>{, <shift>}] ; A1
   64139                 ldr(condition,
   64140                     Best,
   64141                     Register(rt),
   64142                     MemOperand(Register(rn),
   64143                                sign,
   64144                                Register(rm),
   64145                                shift,
   64146                                amount,
   64147                                addrmode));
   64148                 break;
   64149               }
   64150             }
   64151             break;
   64152           }
   64153           case 0x01000010: {
   64154             // 0x07000010
   64155             switch (instr & 0x009000e0) {
   64156               case 0x00000000: {
   64157                 // 0x07000010
   64158                 switch (instr & 0x0000f000) {
   64159                   case 0x0000f000: {
   64160                     // 0x0700f010
   64161                     if (((instr & 0xf0000000) == 0xf0000000)) {
   64162                       UnallocatedA32(instr);
   64163                       return;
   64164                     }
   64165                     Condition condition((instr >> 28) & 0xf);
   64166                     unsigned rd = (instr >> 16) & 0xf;
   64167                     unsigned rn = instr & 0xf;
   64168                     unsigned rm = (instr >> 8) & 0xf;
   64169                     // SMUAD{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
   64170                     smuad(condition, Register(rd), Register(rn), Register(rm));
   64171                     break;
   64172                   }
   64173                   default: {
   64174                     if (((instr & 0xf0000000) == 0xf0000000) ||
   64175                         ((instr & 0xf000) == 0xf000)) {
   64176                       UnallocatedA32(instr);
   64177                       return;
   64178                     }
   64179                     Condition condition((instr >> 28) & 0xf);
   64180                     unsigned rd = (instr >> 16) & 0xf;
   64181                     unsigned rn = instr & 0xf;
   64182                     unsigned rm = (instr >> 8) & 0xf;
   64183                     unsigned ra = (instr >> 12) & 0xf;
   64184                     // SMLAD{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
   64185                     smlad(condition,
   64186                           Register(rd),
   64187                           Register(rn),
   64188                           Register(rm),
   64189                           Register(ra));
   64190                     break;
   64191                   }
   64192                 }
   64193                 break;
   64194               }
   64195               case 0x00000020: {
   64196                 // 0x07000030
   64197                 switch (instr & 0x0000f000) {
   64198                   case 0x0000f000: {
   64199                     // 0x0700f030
   64200                     if (((instr & 0xf0000000) == 0xf0000000)) {
   64201                       UnallocatedA32(instr);
   64202                       return;
   64203                     }
   64204                     Condition condition((instr >> 28) & 0xf);
   64205                     unsigned rd = (instr >> 16) & 0xf;
   64206                     unsigned rn = instr & 0xf;
   64207                     unsigned rm = (instr >> 8) & 0xf;
   64208                     // SMUADX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
   64209                     smuadx(condition, Register(rd), Register(rn), Register(rm));
   64210                     break;
   64211                   }
   64212                   default: {
   64213                     if (((instr & 0xf0000000) == 0xf0000000) ||
   64214                         ((instr & 0xf000) == 0xf000)) {
   64215                       UnallocatedA32(instr);
   64216                       return;
   64217                     }
   64218                     Condition condition((instr >> 28) & 0xf);
   64219                     unsigned rd = (instr >> 16) & 0xf;
   64220                     unsigned rn = instr & 0xf;
   64221                     unsigned rm = (instr >> 8) & 0xf;
   64222                     unsigned ra = (instr >> 12) & 0xf;
   64223                     // SMLADX{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
   64224                     smladx(condition,
   64225                            Register(rd),
   64226                            Register(rn),
   64227                            Register(rm),
   64228                            Register(ra));
   64229                     break;
   64230                   }
   64231                 }
   64232                 break;
   64233               }
   64234               case 0x00000040: {
   64235                 // 0x07000050
   64236                 switch (instr & 0x0000f000) {
   64237                   case 0x0000f000: {
   64238                     // 0x0700f050
   64239                     if (((instr & 0xf0000000) == 0xf0000000)) {
   64240                       UnallocatedA32(instr);
   64241                       return;
   64242                     }
   64243                     Condition condition((instr >> 28) & 0xf);
   64244                     unsigned rd = (instr >> 16) & 0xf;
   64245                     unsigned rn = instr & 0xf;
   64246                     unsigned rm = (instr >> 8) & 0xf;
   64247                     // SMUSD{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
   64248                     smusd(condition, Register(rd), Register(rn), Register(rm));
   64249                     break;
   64250                   }
   64251                   default: {
   64252                     if (((instr & 0xf0000000) == 0xf0000000) ||
   64253                         ((instr & 0xf000) == 0xf000)) {
   64254                       UnallocatedA32(instr);
   64255                       return;
   64256                     }
   64257                     Condition condition((instr >> 28) & 0xf);
   64258                     unsigned rd = (instr >> 16) & 0xf;
   64259                     unsigned rn = instr & 0xf;
   64260                     unsigned rm = (instr >> 8) & 0xf;
   64261                     unsigned ra = (instr >> 12) & 0xf;
   64262                     // SMLSD{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
   64263                     smlsd(condition,
   64264                           Register(rd),
   64265                           Register(rn),
   64266                           Register(rm),
   64267                           Register(ra));
   64268                     break;
   64269                   }
   64270                 }
   64271                 break;
   64272               }
   64273               case 0x00000060: {
   64274                 // 0x07000070
   64275                 switch (instr & 0x0000f000) {
   64276                   case 0x0000f000: {
   64277                     // 0x0700f070
   64278                     if (((instr & 0xf0000000) == 0xf0000000)) {
   64279                       UnallocatedA32(instr);
   64280                       return;
   64281                     }
   64282                     Condition condition((instr >> 28) & 0xf);
   64283                     unsigned rd = (instr >> 16) & 0xf;
   64284                     unsigned rn = instr & 0xf;
   64285                     unsigned rm = (instr >> 8) & 0xf;
   64286                     // SMUSDX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
   64287                     smusdx(condition, Register(rd), Register(rn), Register(rm));
   64288                     break;
   64289                   }
   64290                   default: {
   64291                     if (((instr & 0xf0000000) == 0xf0000000) ||
   64292                         ((instr & 0xf000) == 0xf000)) {
   64293                       UnallocatedA32(instr);
   64294                       return;
   64295                     }
   64296                     Condition condition((instr >> 28) & 0xf);
   64297                     unsigned rd = (instr >> 16) & 0xf;
   64298                     unsigned rn = instr & 0xf;
   64299                     unsigned rm = (instr >> 8) & 0xf;
   64300                     unsigned ra = (instr >> 12) & 0xf;
   64301                     // SMLSDX{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
   64302                     smlsdx(condition,
   64303                            Register(rd),
   64304                            Register(rn),
   64305                            Register(rm),
   64306                            Register(ra));
   64307                     break;
   64308                   }
   64309                 }
   64310                 break;
   64311               }
   64312               case 0x00100000: {
   64313                 // 0x07100010
   64314                 if (((instr & 0xf0000000) == 0xf0000000)) {
   64315                   UnallocatedA32(instr);
   64316                   return;
   64317                 }
   64318                 Condition condition((instr >> 28) & 0xf);
   64319                 unsigned rd = (instr >> 16) & 0xf;
   64320                 unsigned rn = instr & 0xf;
   64321                 unsigned rm = (instr >> 8) & 0xf;
   64322                 // SDIV{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
   64323                 sdiv(condition, Register(rd), Register(rn), Register(rm));
   64324                 if (((instr & 0xff0f0f0) != 0x710f010)) {
   64325                   UnpredictableA32(instr);
   64326                 }
   64327                 break;
   64328               }
   64329               case 0x00800000: {
   64330                 // 0x07800010
   64331                 switch (instr & 0x0000f000) {
   64332                   case 0x0000f000: {
   64333                     // 0x0780f010
   64334                     if (((instr & 0xf0000000) == 0xf0000000)) {
   64335                       UnallocatedA32(instr);
   64336                       return;
   64337                     }
   64338                     Condition condition((instr >> 28) & 0xf);
   64339                     unsigned rd = (instr >> 16) & 0xf;
   64340                     unsigned rn = instr & 0xf;
   64341                     unsigned rm = (instr >> 8) & 0xf;
   64342                     // USAD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
   64343                     usad8(condition, Register(rd), Register(rn), Register(rm));
   64344                     break;
   64345                   }
   64346                   default: {
   64347                     if (((instr & 0xf0000000) == 0xf0000000) ||
   64348                         ((instr & 0xf000) == 0xf000)) {
   64349                       UnallocatedA32(instr);
   64350                       return;
   64351                     }
   64352                     Condition condition((instr >> 28) & 0xf);
   64353                     unsigned rd = (instr >> 16) & 0xf;
   64354                     unsigned rn = instr & 0xf;
   64355                     unsigned rm = (instr >> 8) & 0xf;
   64356                     unsigned ra = (instr >> 12) & 0xf;
   64357                     // USADA8{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
   64358                     usada8(condition,
   64359                            Register(rd),
   64360                            Register(rn),
   64361                            Register(rm),
   64362                            Register(ra));
   64363                     break;
   64364                   }
   64365                 }
   64366                 break;
   64367               }
   64368               default:
   64369                 UnallocatedA32(instr);
   64370                 break;
   64371             }
   64372             break;
   64373           }
   64374           case 0x01200000: {
   64375             // 0x07200000
   64376             switch (instr & 0x00100000) {
   64377               case 0x00000000: {
   64378                 // 0x07200000
   64379                 if (((instr & 0xf0000000) == 0xf0000000)) {
   64380                   UnallocatedA32(instr);
   64381                   return;
   64382                 }
   64383                 Condition condition((instr >> 28) & 0xf);
   64384                 unsigned rt = (instr >> 12) & 0xf;
   64385                 unsigned rn = (instr >> 16) & 0xf;
   64386                 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
   64387                 unsigned rm = instr & 0xf;
   64388                 uint32_t imm_and_type_ = ((instr >> 5) & 0x7f);
   64389                 ImmediateShiftOperand shift_operand(imm_and_type_ & 0x3,
   64390                                                     (imm_and_type_ & 0x7c) >>
   64391                                                         2);
   64392                 Shift shift = shift_operand.GetShift();
   64393                 uint32_t amount = shift_operand.GetAmount();
   64394                 AddrMode addrmode = PreIndex;
   64395                 // STR{<c>}{<q>} <Rt>, [<Rn>, {+/-}<Rm>{, <shift>}]! ; A1
   64396                 str(condition,
   64397                     Best,
   64398                     Register(rt),
   64399                     MemOperand(Register(rn),
   64400                                sign,
   64401                                Register(rm),
   64402                                shift,
   64403                                amount,
   64404                                addrmode));
   64405                 break;
   64406               }
   64407               case 0x00100000: {
   64408                 // 0x07300000
   64409                 if (((instr & 0xf0000000) == 0xf0000000)) {
   64410                   UnallocatedA32(instr);
   64411                   return;
   64412                 }
   64413                 Condition condition((instr >> 28) & 0xf);
   64414                 unsigned rt = (instr >> 12) & 0xf;
   64415                 unsigned rn = (instr >> 16) & 0xf;
   64416                 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
   64417                 unsigned rm = instr & 0xf;
   64418                 uint32_t imm_and_type_ = ((instr >> 5) & 0x7f);
   64419                 ImmediateShiftOperand shift_operand(imm_and_type_ & 0x3,
   64420                                                     (imm_and_type_ & 0x7c) >>
   64421                                                         2);
   64422                 Shift shift = shift_operand.GetShift();
   64423                 uint32_t amount = shift_operand.GetAmount();
   64424                 AddrMode addrmode = PreIndex;
   64425                 // LDR{<c>}{<q>} <Rt>, [<Rn>, {+/-}<Rm>{, <shift>}]! ; A1
   64426                 ldr(condition,
   64427                     Best,
   64428                     Register(rt),
   64429                     MemOperand(Register(rn),
   64430                                sign,
   64431                                Register(rm),
   64432                                shift,
   64433                                amount,
   64434                                addrmode));
   64435                 break;
   64436               }
   64437             }
   64438             break;
   64439           }
   64440           case 0x01200010: {
   64441             // 0x07200010
   64442             switch (instr & 0x00800060) {
   64443               case 0x00000000: {
   64444                 // 0x07200010
   64445                 if ((instr & 0x00100080) == 0x00100000) {
   64446                   if (((instr & 0xf0000000) == 0xf0000000)) {
   64447                     UnallocatedA32(instr);
   64448                     return;
   64449                   }
   64450                   Condition condition((instr >> 28) & 0xf);
   64451                   unsigned rd = (instr >> 16) & 0xf;
   64452                   unsigned rn = instr & 0xf;
   64453                   unsigned rm = (instr >> 8) & 0xf;
   64454                   // UDIV{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
   64455                   udiv(condition, Register(rd), Register(rn), Register(rm));
   64456                   if (((instr & 0xff0f0f0) != 0x730f010)) {
   64457                     UnpredictableA32(instr);
   64458                   }
   64459                 } else {
   64460                   UnallocatedA32(instr);
   64461                 }
   64462                 break;
   64463               }
   64464               case 0x00800040: {
   64465                 // 0x07a00050
   64466                 if (((instr & 0xf0000000) == 0xf0000000)) {
   64467                   UnallocatedA32(instr);
   64468                   return;
   64469                 }
   64470                 Condition condition((instr >> 28) & 0xf);
   64471                 unsigned rd = (instr >> 12) & 0xf;
   64472                 unsigned rn = instr & 0xf;
   64473                 uint32_t lsb = (instr >> 7) & 0x1f;
   64474                 uint32_t widthm1 = (instr >> 16) & 0x1f;
   64475                 uint32_t width = widthm1 + 1;
   64476                 // SBFX{<c>}{<q>} <Rd>, <Rn>, #<lsb>, #<width> ; A1
   64477                 sbfx(condition, Register(rd), Register(rn), lsb, width);
   64478                 break;
   64479               }
   64480               default:
   64481                 UnallocatedA32(instr);
   64482                 break;
   64483             }
   64484             break;
   64485           }
   64486           case 0x01400000: {
   64487             // 0x07400000
   64488             switch (instr & 0x00100000) {
   64489               case 0x00000000: {
   64490                 // 0x07400000
   64491                 if (((instr & 0xf0000000) == 0xf0000000)) {
   64492                   UnallocatedA32(instr);
   64493                   return;
   64494                 }
   64495                 Condition condition((instr >> 28) & 0xf);
   64496                 unsigned rt = (instr >> 12) & 0xf;
   64497                 unsigned rn = (instr >> 16) & 0xf;
   64498                 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
   64499                 unsigned rm = instr & 0xf;
   64500                 uint32_t imm_and_type_ = ((instr >> 5) & 0x7f);
   64501                 ImmediateShiftOperand shift_operand(imm_and_type_ & 0x3,
   64502                                                     (imm_and_type_ & 0x7c) >>
   64503                                                         2);
   64504                 Shift shift = shift_operand.GetShift();
   64505                 uint32_t amount = shift_operand.GetAmount();
   64506                 AddrMode addrmode = Offset;
   64507                 // STRB{<c>}{<q>} <Rt>, [<Rn>, {+/-}<Rm>{, <shift>}] ; A1
   64508                 strb(condition,
   64509                      Best,
   64510                      Register(rt),
   64511                      MemOperand(Register(rn),
   64512                                 sign,
   64513                                 Register(rm),
   64514                                 shift,
   64515                                 amount,
   64516                                 addrmode));
   64517                 break;
   64518               }
   64519               case 0x00100000: {
   64520                 // 0x07500000
   64521                 if (((instr & 0xf0000000) == 0xf0000000)) {
   64522                   UnallocatedA32(instr);
   64523                   return;
   64524                 }
   64525                 Condition condition((instr >> 28) & 0xf);
   64526                 unsigned rt = (instr >> 12) & 0xf;
   64527                 unsigned rn = (instr >> 16) & 0xf;
   64528                 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
   64529                 unsigned rm = instr & 0xf;
   64530                 uint32_t imm_and_type_ = ((instr >> 5) & 0x7f);
   64531                 ImmediateShiftOperand shift_operand(imm_and_type_ & 0x3,
   64532                                                     (imm_and_type_ & 0x7c) >>
   64533                                                         2);
   64534                 Shift shift = shift_operand.GetShift();
   64535                 uint32_t amount = shift_operand.GetAmount();
   64536                 AddrMode addrmode = Offset;
   64537                 // LDRB{<c>}{<q>} <Rt>, [<Rn>, {+/-}<Rm>{, <shift>}] ; A1
   64538                 ldrb(condition,
   64539                      Best,
   64540                      Register(rt),
   64541                      MemOperand(Register(rn),
   64542                                 sign,
   64543                                 Register(rm),
   64544                                 shift,
   64545                                 amount,
   64546                                 addrmode));
   64547                 break;
   64548               }
   64549             }
   64550             break;
   64551           }
   64552           case 0x01400010: {
   64553             // 0x07400010
   64554             switch (instr & 0x00800060) {
   64555               case 0x00000000: {
   64556                 // 0x07400010
   64557                 switch (instr & 0x00100080) {
   64558                   case 0x00000000: {
   64559                     // 0x07400010
   64560                     if (((instr & 0xf0000000) == 0xf0000000)) {
   64561                       UnallocatedA32(instr);
   64562                       return;
   64563                     }
   64564                     Condition condition((instr >> 28) & 0xf);
   64565                     unsigned rdlo = (instr >> 12) & 0xf;
   64566                     unsigned rdhi = (instr >> 16) & 0xf;
   64567                     unsigned rn = instr & 0xf;
   64568                     unsigned rm = (instr >> 8) & 0xf;
   64569                     // SMLALD{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
   64570                     smlald(condition,
   64571                            Register(rdlo),
   64572                            Register(rdhi),
   64573                            Register(rn),
   64574                            Register(rm));
   64575                     break;
   64576                   }
   64577                   case 0x00100000: {
   64578                     // 0x07500010
   64579                     switch (instr & 0x0000f000) {
   64580                       case 0x0000f000: {
   64581                         // 0x0750f010
   64582                         if (((instr & 0xf0000000) == 0xf0000000)) {
   64583                           UnallocatedA32(instr);
   64584                           return;
   64585                         }
   64586                         Condition condition((instr >> 28) & 0xf);
   64587                         unsigned rd = (instr >> 16) & 0xf;
   64588                         unsigned rn = instr & 0xf;
   64589                         unsigned rm = (instr >> 8) & 0xf;
   64590                         // SMMUL{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
   64591                         smmul(condition,
   64592                               Register(rd),
   64593                               Register(rn),
   64594                               Register(rm));
   64595                         break;
   64596                       }
   64597                       default: {
   64598                         if (((instr & 0xf0000000) == 0xf0000000) ||
   64599                             ((instr & 0xf000) == 0xf000)) {
   64600                           UnallocatedA32(instr);
   64601                           return;
   64602                         }
   64603                         Condition condition((instr >> 28) & 0xf);
   64604                         unsigned rd = (instr >> 16) & 0xf;
   64605                         unsigned rn = instr & 0xf;
   64606                         unsigned rm = (instr >> 8) & 0xf;
   64607                         unsigned ra = (instr >> 12) & 0xf;
   64608                         // SMMLA{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
   64609                         smmla(condition,
   64610                               Register(rd),
   64611                               Register(rn),
   64612                               Register(rm),
   64613                               Register(ra));
   64614                         break;
   64615                       }
   64616                     }
   64617                     break;
   64618                   }
   64619                   default:
   64620                     UnallocatedA32(instr);
   64621                     break;
   64622                 }
   64623                 break;
   64624               }
   64625               case 0x00000020: {
   64626                 // 0x07400030
   64627                 switch (instr & 0x00100080) {
   64628                   case 0x00000000: {
   64629                     // 0x07400030
   64630                     if (((instr & 0xf0000000) == 0xf0000000)) {
   64631                       UnallocatedA32(instr);
   64632                       return;
   64633                     }
   64634                     Condition condition((instr >> 28) & 0xf);
   64635                     unsigned rdlo = (instr >> 12) & 0xf;
   64636                     unsigned rdhi = (instr >> 16) & 0xf;
   64637                     unsigned rn = instr & 0xf;
   64638                     unsigned rm = (instr >> 8) & 0xf;
   64639                     // SMLALDX{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
   64640                     smlaldx(condition,
   64641                             Register(rdlo),
   64642                             Register(rdhi),
   64643                             Register(rn),
   64644                             Register(rm));
   64645                     break;
   64646                   }
   64647                   case 0x00100000: {
   64648                     // 0x07500030
   64649                     switch (instr & 0x0000f000) {
   64650                       case 0x0000f000: {
   64651                         // 0x0750f030
   64652                         if (((instr & 0xf0000000) == 0xf0000000)) {
   64653                           UnallocatedA32(instr);
   64654                           return;
   64655                         }
   64656                         Condition condition((instr >> 28) & 0xf);
   64657                         unsigned rd = (instr >> 16) & 0xf;
   64658                         unsigned rn = instr & 0xf;
   64659                         unsigned rm = (instr >> 8) & 0xf;
   64660                         // SMMULR{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
   64661                         smmulr(condition,
   64662                                Register(rd),
   64663                                Register(rn),
   64664                                Register(rm));
   64665                         break;
   64666                       }
   64667                       default: {
   64668                         if (((instr & 0xf0000000) == 0xf0000000) ||
   64669                             ((instr & 0xf000) == 0xf000)) {
   64670                           UnallocatedA32(instr);
   64671                           return;
   64672                         }
   64673                         Condition condition((instr >> 28) & 0xf);
   64674                         unsigned rd = (instr >> 16) & 0xf;
   64675                         unsigned rn = instr & 0xf;
   64676                         unsigned rm = (instr >> 8) & 0xf;
   64677                         unsigned ra = (instr >> 12) & 0xf;
   64678                         // SMMLAR{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
   64679                         smmlar(condition,
   64680                                Register(rd),
   64681                                Register(rn),
   64682                                Register(rm),
   64683                                Register(ra));
   64684                         break;
   64685                       }
   64686                     }
   64687                     break;
   64688                   }
   64689                   default:
   64690                     UnallocatedA32(instr);
   64691                     break;
   64692                 }
   64693                 break;
   64694               }
   64695               case 0x00000040: {
   64696                 // 0x07400050
   64697                 switch (instr & 0x00100080) {
   64698                   case 0x00000000: {
   64699                     // 0x07400050
   64700                     if (((instr & 0xf0000000) == 0xf0000000)) {
   64701                       UnallocatedA32(instr);
   64702                       return;
   64703                     }
   64704                     Condition condition((instr >> 28) & 0xf);
   64705                     unsigned rdlo = (instr >> 12) & 0xf;
   64706                     unsigned rdhi = (instr >> 16) & 0xf;
   64707                     unsigned rn = instr & 0xf;
   64708                     unsigned rm = (instr >> 8) & 0xf;
   64709                     // SMLSLD{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
   64710                     smlsld(condition,
   64711                            Register(rdlo),
   64712                            Register(rdhi),
   64713                            Register(rn),
   64714                            Register(rm));
   64715                     break;
   64716                   }
   64717                   case 0x00100080: {
   64718                     // 0x075000d0
   64719                     if (((instr & 0xf0000000) == 0xf0000000)) {
   64720                       UnallocatedA32(instr);
   64721                       return;
   64722                     }
   64723                     Condition condition((instr >> 28) & 0xf);
   64724                     unsigned rd = (instr >> 16) & 0xf;
   64725                     unsigned rn = instr & 0xf;
   64726                     unsigned rm = (instr >> 8) & 0xf;
   64727                     unsigned ra = (instr >> 12) & 0xf;
   64728                     // SMMLS{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
   64729                     smmls(condition,
   64730                           Register(rd),
   64731                           Register(rn),
   64732                           Register(rm),
   64733                           Register(ra));
   64734                     break;
   64735                   }
   64736                   default:
   64737                     UnallocatedA32(instr);
   64738                     break;
   64739                 }
   64740                 break;
   64741               }
   64742               case 0x00000060: {
   64743                 // 0x07400070
   64744                 switch (instr & 0x00100080) {
   64745                   case 0x00000000: {
   64746                     // 0x07400070
   64747                     if (((instr & 0xf0000000) == 0xf0000000)) {
   64748                       UnallocatedA32(instr);
   64749                       return;
   64750                     }
   64751                     Condition condition((instr >> 28) & 0xf);
   64752                     unsigned rdlo = (instr >> 12) & 0xf;
   64753                     unsigned rdhi = (instr >> 16) & 0xf;
   64754                     unsigned rn = instr & 0xf;
   64755                     unsigned rm = (instr >> 8) & 0xf;
   64756                     // SMLSLDX{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
   64757                     smlsldx(condition,
   64758                             Register(rdlo),
   64759                             Register(rdhi),
   64760                             Register(rn),
   64761                             Register(rm));
   64762                     break;
   64763                   }
   64764                   case 0x00100080: {
   64765                     // 0x075000f0
   64766                     if (((instr & 0xf0000000) == 0xf0000000)) {
   64767                       UnallocatedA32(instr);
   64768                       return;
   64769                     }
   64770                     Condition condition((instr >> 28) & 0xf);
   64771                     unsigned rd = (instr >> 16) & 0xf;
   64772                     unsigned rn = instr & 0xf;
   64773                     unsigned rm = (instr >> 8) & 0xf;
   64774                     unsigned ra = (instr >> 12) & 0xf;
   64775                     // SMMLSR{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
   64776                     smmlsr(condition,
   64777                            Register(rd),
   64778                            Register(rn),
   64779                            Register(rm),
   64780                            Register(ra));
   64781                     break;
   64782                   }
   64783                   default:
   64784                     UnallocatedA32(instr);
   64785                     break;
   64786                 }
   64787                 break;
   64788               }
   64789               case 0x00800000: {
   64790                 // 0x07c00010
   64791                 switch (instr & 0x0000000f) {
   64792                   case 0x0000000f: {
   64793                     // 0x07c0001f
   64794                     if (((instr & 0xf0000000) == 0xf0000000)) {
   64795                       UnallocatedA32(instr);
   64796                       return;
   64797                     }
   64798                     Condition condition((instr >> 28) & 0xf);
   64799                     unsigned rd = (instr >> 12) & 0xf;
   64800                     uint32_t lsb = (instr >> 7) & 0x1f;
   64801                     uint32_t msb = (instr >> 16) & 0x1f;
   64802                     uint32_t width = msb - lsb + 1;
   64803                     // BFC{<c>}{<q>} <Rd>, #<lsb>, #<width> ; A1
   64804                     bfc(condition, Register(rd), lsb, width);
   64805                     break;
   64806                   }
   64807                   default: {
   64808                     if (((instr & 0xf0000000) == 0xf0000000) ||
   64809                         ((instr & 0xf) == 0xf)) {
   64810                       UnallocatedA32(instr);
   64811                       return;
   64812                     }
   64813                     Condition condition((instr >> 28) & 0xf);
   64814                     unsigned rd = (instr >> 12) & 0xf;
   64815                     unsigned rn = instr & 0xf;
   64816                     uint32_t lsb = (instr >> 7) & 0x1f;
   64817                     uint32_t msb = (instr >> 16) & 0x1f;
   64818                     uint32_t width = msb - lsb + 1;
   64819                     // BFI{<c>}{<q>} <Rd>, <Rn>, #<lsb>, #<width> ; A1
   64820                     bfi(condition, Register(rd), Register(rn), lsb, width);
   64821                     break;
   64822                   }
   64823                 }
   64824                 break;
   64825               }
   64826               default:
   64827                 UnallocatedA32(instr);
   64828                 break;
   64829             }
   64830             break;
   64831           }
   64832           case 0x01600000: {
   64833             // 0x07600000
   64834             switch (instr & 0x00100000) {
   64835               case 0x00000000: {
   64836                 // 0x07600000
   64837                 if (((instr & 0xf0000000) == 0xf0000000)) {
   64838                   UnallocatedA32(instr);
   64839                   return;
   64840                 }
   64841                 Condition condition((instr >> 28) & 0xf);
   64842                 unsigned rt = (instr >> 12) & 0xf;
   64843                 unsigned rn = (instr >> 16) & 0xf;
   64844                 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
   64845                 unsigned rm = instr & 0xf;
   64846                 uint32_t imm_and_type_ = ((instr >> 5) & 0x7f);
   64847                 ImmediateShiftOperand shift_operand(imm_and_type_ & 0x3,
   64848                                                     (imm_and_type_ & 0x7c) >>
   64849                                                         2);
   64850                 Shift shift = shift_operand.GetShift();
   64851                 uint32_t amount = shift_operand.GetAmount();
   64852                 AddrMode addrmode = PreIndex;
   64853                 // STRB{<c>}{<q>} <Rt>, [<Rn>, {+/-}<Rm>{, <shift>}]! ; A1
   64854                 strb(condition,
   64855                      Best,
   64856                      Register(rt),
   64857                      MemOperand(Register(rn),
   64858                                 sign,
   64859                                 Register(rm),
   64860                                 shift,
   64861                                 amount,
   64862                                 addrmode));
   64863                 break;
   64864               }
   64865               case 0x00100000: {
   64866                 // 0x07700000
   64867                 if (((instr & 0xf0000000) == 0xf0000000)) {
   64868                   UnallocatedA32(instr);
   64869                   return;
   64870                 }
   64871                 Condition condition((instr >> 28) & 0xf);
   64872                 unsigned rt = (instr >> 12) & 0xf;
   64873                 unsigned rn = (instr >> 16) & 0xf;
   64874                 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
   64875                 unsigned rm = instr & 0xf;
   64876                 uint32_t imm_and_type_ = ((instr >> 5) & 0x7f);
   64877                 ImmediateShiftOperand shift_operand(imm_and_type_ & 0x3,
   64878                                                     (imm_and_type_ & 0x7c) >>
   64879                                                         2);
   64880                 Shift shift = shift_operand.GetShift();
   64881                 uint32_t amount = shift_operand.GetAmount();
   64882                 AddrMode addrmode = PreIndex;
   64883                 // LDRB{<c>}{<q>} <Rt>, [<Rn>, {+/-}<Rm>{, <shift>}]! ; A1
   64884                 ldrb(condition,
   64885                      Best,
   64886                      Register(rt),
   64887                      MemOperand(Register(rn),
   64888                                 sign,
   64889                                 Register(rm),
   64890                                 shift,
   64891                                 amount,
   64892                                 addrmode));
   64893                 break;
   64894               }
   64895             }
   64896             break;
   64897           }
   64898           case 0x01600010: {
   64899             // 0x07600010
   64900             switch (instr & 0x00800060) {
   64901               case 0x00800040: {
   64902                 // 0x07e00050
   64903                 if (((instr & 0xf0000000) == 0xf0000000)) {
   64904                   UnallocatedA32(instr);
   64905                   return;
   64906                 }
   64907                 Condition condition((instr >> 28) & 0xf);
   64908                 unsigned rd = (instr >> 12) & 0xf;
   64909                 unsigned rn = instr & 0xf;
   64910                 uint32_t lsb = (instr >> 7) & 0x1f;
   64911                 uint32_t widthm1 = (instr >> 16) & 0x1f;
   64912                 uint32_t width = widthm1 + 1;
   64913                 // UBFX{<c>}{<q>} <Rd>, <Rn>, #<lsb>, #<width> ; A1
   64914                 ubfx(condition, Register(rd), Register(rn), lsb, width);
   64915                 break;
   64916               }
   64917               case 0x00800060: {
   64918                 // 0x07e00070
   64919                 if ((instr & 0xf0100080) == 0xe0100080) {
   64920                   uint32_t imm = (instr & 0xf) | ((instr >> 4) & 0xfff0);
   64921                   // UDF{<c>}{<q>} {#}<imm> ; A1
   64922                   udf(al, Best, imm);
   64923                 } else {
   64924                   UnallocatedA32(instr);
   64925                 }
   64926                 break;
   64927               }
   64928               default:
   64929                 UnallocatedA32(instr);
   64930                 break;
   64931             }
   64932             break;
   64933           }
   64934         }
   64935         break;
   64936       }
   64937       case 0x08000000: {
   64938         // 0x08000000
   64939         switch (instr & 0x00500000) {
   64940           case 0x00000000: {
   64941             // 0x08000000
   64942             switch (instr & 0x01800000) {
   64943               case 0x00000000: {
   64944                 // 0x08000000
   64945                 if (((instr & 0xf0000000) == 0xf0000000)) {
   64946                   UnallocatedA32(instr);
   64947                   return;
   64948                 }
   64949                 Condition condition((instr >> 28) & 0xf);
   64950                 unsigned rn = (instr >> 16) & 0xf;
   64951                 WriteBack write_back((instr >> 21) & 0x1);
   64952                 RegisterList registers((instr & 0xffff));
   64953                 // STMDA{<c>}{<q>} <Rn>{!}, <registers> ; A1
   64954                 stmda(condition, Register(rn), write_back, registers);
   64955                 break;
   64956               }
   64957               case 0x00800000: {
   64958                 // 0x08800000
   64959                 if (((instr & 0xf0000000) == 0xf0000000)) {
   64960                   UnallocatedA32(instr);
   64961                   return;
   64962                 }
   64963                 Condition condition((instr >> 28) & 0xf);
   64964                 unsigned rn = (instr >> 16) & 0xf;
   64965                 WriteBack write_back((instr >> 21) & 0x1);
   64966                 RegisterList registers((instr & 0xffff));
   64967                 // STM{<c>}{<q>} <Rn>{!}, <registers> ; A1
   64968                 stm(condition, Best, Register(rn), write_back, registers);
   64969                 break;
   64970               }
   64971               case 0x01000000: {
   64972                 // 0x09000000
   64973                 if (((instr & 0xf0000000) == 0xf0000000)) {
   64974                   UnallocatedA32(instr);
   64975                   return;
   64976                 }
   64977                 if (((Uint32((instr >> 21)) & Uint32(0x1)) == Uint32(0x1)) &&
   64978                     ((Uint32((instr >> 16)) & Uint32(0xf)) == Uint32(0xd)) &&
   64979                     ((instr & 0xf0000000) != 0xf0000000) &&
   64980                     (BitCount((Uint32(instr) & Uint32(0xffff))) > Int64(1))) {
   64981                   Condition condition((instr >> 28) & 0xf);
   64982                   RegisterList registers((instr & 0xffff));
   64983                   // PUSH{<c>}{<q>} <registers> ; A1
   64984                   push(condition, Best, registers);
   64985                   return;
   64986                 }
   64987                 Condition condition((instr >> 28) & 0xf);
   64988                 unsigned rn = (instr >> 16) & 0xf;
   64989                 WriteBack write_back((instr >> 21) & 0x1);
   64990                 RegisterList registers((instr & 0xffff));
   64991                 // STMDB{<c>}{<q>} <Rn>{!}, <registers> ; A1
   64992                 stmdb(condition, Best, Register(rn), write_back, registers);
   64993                 break;
   64994               }
   64995               case 0x01800000: {
   64996                 // 0x09800000
   64997                 if (((instr & 0xf0000000) == 0xf0000000)) {
   64998                   UnallocatedA32(instr);
   64999                   return;
   65000                 }
   65001                 Condition condition((instr >> 28) & 0xf);
   65002                 unsigned rn = (instr >> 16) & 0xf;
   65003                 WriteBack write_back((instr >> 21) & 0x1);
   65004                 RegisterList registers((instr & 0xffff));
   65005                 // STMIB{<c>}{<q>} <Rn>{!}, <registers> ; A1
   65006                 stmib(condition, Register(rn), write_back, registers);
   65007                 break;
   65008               }
   65009             }
   65010             break;
   65011           }
   65012           case 0x00100000: {
   65013             // 0x08100000
   65014             switch (instr & 0x01800000) {
   65015               case 0x00000000: {
   65016                 // 0x08100000
   65017                 if (((instr & 0xf0000000) == 0xf0000000)) {
   65018                   UnallocatedA32(instr);
   65019                   return;
   65020                 }
   65021                 Condition condition((instr >> 28) & 0xf);
   65022                 unsigned rn = (instr >> 16) & 0xf;
   65023                 WriteBack write_back((instr >> 21) & 0x1);
   65024                 RegisterList registers((instr & 0xffff));
   65025                 // LDMDA{<c>}{<q>} <Rn>{!}, <registers> ; A1
   65026                 ldmda(condition, Register(rn), write_back, registers);
   65027                 break;
   65028               }
   65029               case 0x00800000: {
   65030                 // 0x08900000
   65031                 if (((instr & 0xf0000000) == 0xf0000000)) {
   65032                   UnallocatedA32(instr);
   65033                   return;
   65034                 }
   65035                 if (((Uint32((instr >> 21)) & Uint32(0x1)) == Uint32(0x1)) &&
   65036                     ((Uint32((instr >> 16)) & Uint32(0xf)) == Uint32(0xd)) &&
   65037                     ((instr & 0xf0000000) != 0xf0000000) &&
   65038                     (BitCount((Uint32(instr) & Uint32(0xffff))) > Int64(1))) {
   65039                   Condition condition((instr >> 28) & 0xf);
   65040                   RegisterList registers((instr & 0xffff));
   65041                   // POP{<c>}{<q>} <registers> ; A1
   65042                   pop(condition, Best, registers);
   65043                   return;
   65044                 }
   65045                 Condition condition((instr >> 28) & 0xf);
   65046                 unsigned rn = (instr >> 16) & 0xf;
   65047                 WriteBack write_back((instr >> 21) & 0x1);
   65048                 RegisterList registers((instr & 0xffff));
   65049                 // LDM{<c>}{<q>} <Rn>{!}, <registers> ; A1
   65050                 ldm(condition, Best, Register(rn), write_back, registers);
   65051                 break;
   65052               }
   65053               case 0x01000000: {
   65054                 // 0x09100000
   65055                 if (((instr & 0xf0000000) == 0xf0000000)) {
   65056                   UnallocatedA32(instr);
   65057                   return;
   65058                 }
   65059                 Condition condition((instr >> 28) & 0xf);
   65060                 unsigned rn = (instr >> 16) & 0xf;
   65061                 WriteBack write_back((instr >> 21) & 0x1);
   65062                 RegisterList registers((instr & 0xffff));
   65063                 // LDMDB{<c>}{<q>} <Rn>{!}, <registers> ; A1
   65064                 ldmdb(condition, Register(rn), write_back, registers);
   65065                 break;
   65066               }
   65067               case 0x01800000: {
   65068                 // 0x09900000
   65069                 if (((instr & 0xf0000000) == 0xf0000000)) {
   65070                   UnallocatedA32(instr);
   65071                   return;
   65072                 }
   65073                 Condition condition((instr >> 28) & 0xf);
   65074                 unsigned rn = (instr >> 16) & 0xf;
   65075                 WriteBack write_back((instr >> 21) & 0x1);
   65076                 RegisterList registers((instr & 0xffff));
   65077                 // LDMIB{<c>}{<q>} <Rn>{!}, <registers> ; A1
   65078                 ldmib(condition, Register(rn), write_back, registers);
   65079                 break;
   65080               }
   65081             }
   65082             break;
   65083           }
   65084           case 0x00400000: {
   65085             // 0x08400000
   65086             if (((instr & 0xf0000000) == 0xf0000000)) {
   65087               UnallocatedA32(instr);
   65088               return;
   65089             }
   65090             UnimplementedA32("STM", instr);
   65091             break;
   65092           }
   65093           case 0x00500000: {
   65094             // 0x08500000
   65095             switch (instr & 0x00008000) {
   65096               case 0x00000000: {
   65097                 // 0x08500000
   65098                 if (((instr & 0xf0000000) == 0xf0000000)) {
   65099                   UnallocatedA32(instr);
   65100                   return;
   65101                 }
   65102                 UnimplementedA32("LDM", instr);
   65103                 break;
   65104               }
   65105               case 0x00008000: {
   65106                 // 0x08508000
   65107                 if (((instr & 0xf0000000) == 0xf0000000)) {
   65108                   UnallocatedA32(instr);
   65109                   return;
   65110                 }
   65111                 UnimplementedA32("LDM", instr);
   65112                 break;
   65113               }
   65114             }
   65115             break;
   65116           }
   65117         }
   65118         break;
   65119       }
   65120       case 0x0a000000: {
   65121         // 0x0a000000
   65122         switch (instr & 0x01000000) {
   65123           case 0x00000000: {
   65124             // 0x0a000000
   65125             if (((instr & 0xf0000000) == 0xf0000000)) {
   65126               UnallocatedA32(instr);
   65127               return;
   65128             }
   65129             Condition condition((instr >> 28) & 0xf);
   65130             int32_t imm = SignExtend<int32_t>(instr & 0xffffff, 24) << 2;
   65131             Label label(imm, kA32PcDelta);
   65132             // B{<c>}{<q>} <label> ; A1
   65133             b(condition, Best, &label);
   65134             break;
   65135           }
   65136           case 0x01000000: {
   65137             // 0x0b000000
   65138             if (((instr & 0xf0000000) == 0xf0000000)) {
   65139               UnallocatedA32(instr);
   65140               return;
   65141             }
   65142             Condition condition((instr >> 28) & 0xf);
   65143             int32_t imm = SignExtend<int32_t>(instr & 0xffffff, 24) << 2;
   65144             Label label(imm, kA32PcDelta);
   65145             // BL{<c>}{<q>} <label> ; A1
   65146             bl(condition, &label);
   65147             break;
   65148           }
   65149         }
   65150         break;
   65151       }
   65152       case 0x0c000000: {
   65153         // 0x0c000000
   65154         switch (instr & 0x01100000) {
   65155           case 0x00000000: {
   65156             // 0x0c000000
   65157             switch (instr & 0x00000e00) {
   65158               case 0x00000a00: {
   65159                 // 0x0c000a00
   65160                 switch (instr & 0x00800100) {
   65161                   case 0x00000000: {
   65162                     // 0x0c000a00
   65163                     if ((instr & 0x006000d0) == 0x00400010) {
   65164                       if (((instr & 0xf0000000) == 0xf0000000)) {
   65165                         UnallocatedA32(instr);
   65166                         return;
   65167                       }
   65168                       Condition condition((instr >> 28) & 0xf);
   65169                       unsigned rm = ExtractSRegister(instr, 5, 0);
   65170                       unsigned rt = (instr >> 12) & 0xf;
   65171                       unsigned rt2 = (instr >> 16) & 0xf;
   65172                       // VMOV{<c>}{<q>} <Sm>, <Sm1>, <Rt>, <Rt2> ; A1
   65173                       vmov(condition,
   65174                            SRegister(rm),
   65175                            SRegister(rm + 1),
   65176                            Register(rt),
   65177                            Register(rt2));
   65178                     } else {
   65179                       UnallocatedA32(instr);
   65180                     }
   65181                     break;
   65182                   }
   65183                   case 0x00000100: {
   65184                     // 0x0c000b00
   65185                     if ((instr & 0x006000d0) == 0x00400010) {
   65186                       if (((instr & 0xf0000000) == 0xf0000000)) {
   65187                         UnallocatedA32(instr);
   65188                         return;
   65189                       }
   65190                       Condition condition((instr >> 28) & 0xf);
   65191                       unsigned rm = ExtractDRegister(instr, 5, 0);
   65192                       unsigned rt = (instr >> 12) & 0xf;
   65193                       unsigned rt2 = (instr >> 16) & 0xf;
   65194                       // VMOV{<c>}{<q>} <Dm>, <Rt>, <Rt2> ; A1
   65195                       vmov(condition,
   65196                            DRegister(rm),
   65197                            Register(rt),
   65198                            Register(rt2));
   65199                     } else {
   65200                       UnallocatedA32(instr);
   65201                     }
   65202                     break;
   65203                   }
   65204                   case 0x00800000: {
   65205                     // 0x0c800a00
   65206                     if (((instr & 0xf0000000) == 0xf0000000)) {
   65207                       UnallocatedA32(instr);
   65208                       return;
   65209                     }
   65210                     Condition condition((instr >> 28) & 0xf);
   65211                     unsigned rn = (instr >> 16) & 0xf;
   65212                     WriteBack write_back((instr >> 21) & 0x1);
   65213                     unsigned first = ExtractSRegister(instr, 22, 12);
   65214                     unsigned len = instr & 0xff;
   65215                     // VSTM{<c>}{<q>}{.<size>} <Rn>{!}, <sreglist> ; A2
   65216                     vstm(condition,
   65217                          kDataTypeValueNone,
   65218                          Register(rn),
   65219                          write_back,
   65220                          SRegisterList(SRegister(first), len));
   65221                     if ((len == 0) || ((first + len) > kNumberOfSRegisters)) {
   65222                       UnpredictableA32(instr);
   65223                     }
   65224                     break;
   65225                   }
   65226                   case 0x00800100: {
   65227                     // 0x0c800b00
   65228                     switch (instr & 0x00000001) {
   65229                       case 0x00000000: {
   65230                         // 0x0c800b00
   65231                         if (((instr & 0xf0000000) == 0xf0000000)) {
   65232                           UnallocatedA32(instr);
   65233                           return;
   65234                         }
   65235                         Condition condition((instr >> 28) & 0xf);
   65236                         unsigned rn = (instr >> 16) & 0xf;
   65237                         WriteBack write_back((instr >> 21) & 0x1);
   65238                         unsigned first = ExtractDRegister(instr, 22, 12);
   65239                         unsigned imm8 = (instr & 0xff);
   65240                         unsigned len = imm8 / 2;
   65241                         unsigned end = first + len;
   65242                         // VSTM{<c>}{<q>}{.<size>} <Rn>{!}, <dreglist> ; A1
   65243                         vstm(condition,
   65244                              kDataTypeValueNone,
   65245                              Register(rn),
   65246                              write_back,
   65247                              DRegisterList(DRegister(first), len));
   65248                         if ((len == 0) || (len > 16) ||
   65249                             (end > kMaxNumberOfDRegisters)) {
   65250                           UnpredictableA32(instr);
   65251                         }
   65252                         break;
   65253                       }
   65254                       case 0x00000001: {
   65255                         // 0x0c800b01
   65256                         if (((instr & 0xf0000000) == 0xf0000000)) {
   65257                           UnallocatedA32(instr);
   65258                           return;
   65259                         }
   65260                         Condition condition((instr >> 28) & 0xf);
   65261                         unsigned rn = (instr >> 16) & 0xf;
   65262                         WriteBack write_back((instr >> 21) & 0x1);
   65263                         unsigned first = ExtractDRegister(instr, 22, 12);
   65264                         unsigned imm8 = (instr & 0xff);
   65265                         unsigned len = imm8 / 2;
   65266                         unsigned end = first + len;
   65267                         // FSTMIAX{<c>}{<q>} <Rn>{!}, <dreglist> ; A1
   65268                         fstmiax(condition,
   65269                                 Register(rn),
   65270                                 write_back,
   65271                                 DRegisterList(DRegister(first), len));
   65272                         if ((len == 0) || (len > 16) || (end > 16)) {
   65273                           UnpredictableA32(instr);
   65274                         }
   65275                         break;
   65276                       }
   65277                     }
   65278                     break;
   65279                   }
   65280                 }
   65281                 break;
   65282               }
   65283               default: {
   65284                 switch (instr & 0x00200000) {
   65285                   case 0x00000000: {
   65286                     // 0x0c000000
   65287                     switch (instr & 0x00800000) {
   65288                       case 0x00000000: {
   65289                         // 0x0c000000
   65290                         if ((instr & 0x00400000) == 0x00400000) {
   65291                           if (((instr & 0xf0000000) == 0xf0000000) ||
   65292                               ((instr & 0xe00) == 0xa00)) {
   65293                             UnallocatedA32(instr);
   65294                             return;
   65295                           }
   65296                           UnimplementedA32("MCRR", instr);
   65297                         } else {
   65298                           UnallocatedA32(instr);
   65299                         }
   65300                         break;
   65301                       }
   65302                       case 0x00800000: {
   65303                         // 0x0c800000
   65304                         if (((instr & 0xf0000000) == 0xf0000000) ||
   65305                             ((instr & 0xe00) == 0xa00)) {
   65306                           UnallocatedA32(instr);
   65307                           return;
   65308                         }
   65309                         UnimplementedA32("STC", instr);
   65310                         break;
   65311                       }
   65312                     }
   65313                     break;
   65314                   }
   65315                   case 0x00200000: {
   65316                     // 0x0c200000
   65317                     if (((instr & 0xf0000000) == 0xf0000000) ||
   65318                         ((instr & 0xe00) == 0xa00)) {
   65319                       UnallocatedA32(instr);
   65320                       return;
   65321                     }
   65322                     UnimplementedA32("STC", instr);
   65323                     break;
   65324                   }
   65325                 }
   65326                 break;
   65327               }
   65328             }
   65329             break;
   65330           }
   65331           case 0x00100000: {
   65332             // 0x0c100000
   65333             switch (instr & 0x00000e00) {
   65334               case 0x00000a00: {
   65335                 // 0x0c100a00
   65336                 switch (instr & 0x00800100) {
   65337                   case 0x00000000: {
   65338                     // 0x0c100a00
   65339                     if ((instr & 0x006000d0) == 0x00400010) {
   65340                       if (((instr & 0xf0000000) == 0xf0000000)) {
   65341                         UnallocatedA32(instr);
   65342                         return;
   65343                       }
   65344                       Condition condition((instr >> 28) & 0xf);
   65345                       unsigned rt = (instr >> 12) & 0xf;
   65346                       unsigned rt2 = (instr >> 16) & 0xf;
   65347                       unsigned rm = ExtractSRegister(instr, 5, 0);
   65348                       // VMOV{<c>}{<q>} <Rt>, <Rt2>, <Sm>, <Sm1> ; A1
   65349                       vmov(condition,
   65350                            Register(rt),
   65351                            Register(rt2),
   65352                            SRegister(rm),
   65353                            SRegister(rm + 1));
   65354                     } else {
   65355                       UnallocatedA32(instr);
   65356                     }
   65357                     break;
   65358                   }
   65359                   case 0x00000100: {
   65360                     // 0x0c100b00
   65361                     if ((instr & 0x006000d0) == 0x00400010) {
   65362                       if (((instr & 0xf0000000) == 0xf0000000)) {
   65363                         UnallocatedA32(instr);
   65364                         return;
   65365                       }
   65366                       Condition condition((instr >> 28) & 0xf);
   65367                       unsigned rt = (instr >> 12) & 0xf;
   65368                       unsigned rt2 = (instr >> 16) & 0xf;
   65369                       unsigned rm = ExtractDRegister(instr, 5, 0);
   65370                       // VMOV{<c>}{<q>} <Rt>, <Rt2>, <Dm> ; A1
   65371                       vmov(condition,
   65372                            Register(rt),
   65373                            Register(rt2),
   65374                            DRegister(rm));
   65375                     } else {
   65376                       UnallocatedA32(instr);
   65377                     }
   65378                     break;
   65379                   }
   65380                   case 0x00800000: {
   65381                     // 0x0c900a00
   65382                     if (((instr & 0xf0000000) == 0xf0000000)) {
   65383                       UnallocatedA32(instr);
   65384                       return;
   65385                     }
   65386                     if (((Uint32((instr >> 21)) & Uint32(0x1)) ==
   65387                          Uint32(0x1)) &&
   65388                         ((Uint32((instr >> 16)) & Uint32(0xf)) ==
   65389                          Uint32(0xd)) &&
   65390                         ((instr & 0xf0000000) != 0xf0000000)) {
   65391                       Condition condition((instr >> 28) & 0xf);
   65392                       unsigned first = ExtractSRegister(instr, 22, 12);
   65393                       unsigned len = instr & 0xff;
   65394                       // VPOP{<c>}{<q>}{.<size>} <sreglist> ; A2
   65395                       vpop(condition,
   65396                            kDataTypeValueNone,
   65397                            SRegisterList(SRegister(first), len));
   65398                       if ((len == 0) || ((first + len) > kNumberOfSRegisters)) {
   65399                         UnpredictableA32(instr);
   65400                       }
   65401                       return;
   65402                     }
   65403                     Condition condition((instr >> 28) & 0xf);
   65404                     unsigned rn = (instr >> 16) & 0xf;
   65405                     WriteBack write_back((instr >> 21) & 0x1);
   65406                     unsigned first = ExtractSRegister(instr, 22, 12);
   65407                     unsigned len = instr & 0xff;
   65408                     // VLDM{<c>}{<q>}{.<size>} <Rn>{!}, <sreglist> ; A2
   65409                     vldm(condition,
   65410                          kDataTypeValueNone,
   65411                          Register(rn),
   65412                          write_back,
   65413                          SRegisterList(SRegister(first), len));
   65414                     if ((len == 0) || ((first + len) > kNumberOfSRegisters)) {
   65415                       UnpredictableA32(instr);
   65416                     }
   65417                     break;
   65418                   }
   65419                   case 0x00800100: {
   65420                     // 0x0c900b00
   65421                     switch (instr & 0x00000001) {
   65422                       case 0x00000000: {
   65423                         // 0x0c900b00
   65424                         if (((instr & 0xf0000000) == 0xf0000000)) {
   65425                           UnallocatedA32(instr);
   65426                           return;
   65427                         }
   65428                         if (((Uint32((instr >> 21)) & Uint32(0x1)) ==
   65429                              Uint32(0x1)) &&
   65430                             ((Uint32((instr >> 16)) & Uint32(0xf)) ==
   65431                              Uint32(0xd)) &&
   65432                             ((instr & 0xf0000000) != 0xf0000000)) {
   65433                           Condition condition((instr >> 28) & 0xf);
   65434                           unsigned first = ExtractDRegister(instr, 22, 12);
   65435                           unsigned imm8 = (instr & 0xff);
   65436                           unsigned len = imm8 / 2;
   65437                           unsigned end = first + len;
   65438                           // VPOP{<c>}{<q>}{.<size>} <dreglist> ; A1
   65439                           vpop(condition,
   65440                                kDataTypeValueNone,
   65441                                DRegisterList(DRegister(first), len));
   65442                           if ((len == 0) || (len > 16) ||
   65443                               (end > kMaxNumberOfDRegisters)) {
   65444                             UnpredictableA32(instr);
   65445                           }
   65446                           return;
   65447                         }
   65448                         Condition condition((instr >> 28) & 0xf);
   65449                         unsigned rn = (instr >> 16) & 0xf;
   65450                         WriteBack write_back((instr >> 21) & 0x1);
   65451                         unsigned first = ExtractDRegister(instr, 22, 12);
   65452                         unsigned imm8 = (instr & 0xff);
   65453                         unsigned len = imm8 / 2;
   65454                         unsigned end = first + len;
   65455                         // VLDM{<c>}{<q>}{.<size>} <Rn>{!}, <dreglist> ; A1
   65456                         vldm(condition,
   65457                              kDataTypeValueNone,
   65458                              Register(rn),
   65459                              write_back,
   65460                              DRegisterList(DRegister(first), len));
   65461                         if ((len == 0) || (len > 16) ||
   65462                             (end > kMaxNumberOfDRegisters)) {
   65463                           UnpredictableA32(instr);
   65464                         }
   65465                         break;
   65466                       }
   65467                       case 0x00000001: {
   65468                         // 0x0c900b01
   65469                         if (((instr & 0xf0000000) == 0xf0000000)) {
   65470                           UnallocatedA32(instr);
   65471                           return;
   65472                         }
   65473                         Condition condition((instr >> 28) & 0xf);
   65474                         unsigned rn = (instr >> 16) & 0xf;
   65475                         WriteBack write_back((instr >> 21) & 0x1);
   65476                         unsigned first = ExtractDRegister(instr, 22, 12);
   65477                         unsigned imm8 = (instr & 0xff);
   65478                         unsigned len = imm8 / 2;
   65479                         unsigned end = first + len;
   65480                         // FLDMIAX{<c>}{<q>} <Rn>{!}, <dreglist> ; A1
   65481                         fldmiax(condition,
   65482                                 Register(rn),
   65483                                 write_back,
   65484                                 DRegisterList(DRegister(first), len));
   65485                         if ((len == 0) || (len > 16) || (end > 16)) {
   65486                           UnpredictableA32(instr);
   65487                         }
   65488                         break;
   65489                       }
   65490                     }
   65491                     break;
   65492                   }
   65493                 }
   65494                 break;
   65495               }
   65496               default: {
   65497                 switch (instr & 0x00200000) {
   65498                   case 0x00000000: {
   65499                     // 0x0c100000
   65500                     switch (instr & 0x00800000) {
   65501                       case 0x00000000: {
   65502                         // 0x0c100000
   65503                         if ((instr & 0x00400000) == 0x00400000) {
   65504                           if (((instr & 0xf0000000) == 0xf0000000) ||
   65505                               ((instr & 0xe00) == 0xa00)) {
   65506                             UnallocatedA32(instr);
   65507                             return;
   65508                           }
   65509                           UnimplementedA32("MRRC", instr);
   65510                         } else {
   65511                           UnallocatedA32(instr);
   65512                         }
   65513                         break;
   65514                       }
   65515                       case 0x00800000: {
   65516                         // 0x0c900000
   65517                         switch (instr & 0x000f0000) {
   65518                           case 0x000f0000: {
   65519                             // 0x0c9f0000
   65520                             if (((instr & 0xf0000000) == 0xf0000000) ||
   65521                                 ((instr & 0xe00) == 0xa00)) {
   65522                               UnallocatedA32(instr);
   65523                               return;
   65524                             }
   65525                             UnimplementedA32("LDC", instr);
   65526                             break;
   65527                           }
   65528                           default: {
   65529                             if (((instr & 0xf0000000) == 0xf0000000) ||
   65530                                 ((instr & 0xf0000) == 0xf0000) ||
   65531                                 ((instr & 0xe00) == 0xa00)) {
   65532                               UnallocatedA32(instr);
   65533                               return;
   65534                             }
   65535                             UnimplementedA32("LDC", instr);
   65536                             break;
   65537                           }
   65538                         }
   65539                         break;
   65540                       }
   65541                     }
   65542                     break;
   65543                   }
   65544                   case 0x00200000: {
   65545                     // 0x0c300000
   65546                     if (((instr & 0xf0000000) == 0xf0000000) ||
   65547                         ((instr & 0xf0000) == 0xf0000) ||
   65548                         ((instr & 0xe00) == 0xa00)) {
   65549                       UnallocatedA32(instr);
   65550                       return;
   65551                     }
   65552                     UnimplementedA32("LDC", instr);
   65553                     break;
   65554                   }
   65555                 }
   65556                 break;
   65557               }
   65558             }
   65559             break;
   65560           }
   65561           case 0x01000000: {
   65562             // 0x0d000000
   65563             switch (instr & 0x00200000) {
   65564               case 0x00000000: {
   65565                 // 0x0d000000
   65566                 switch (instr & 0x00000e00) {
   65567                   case 0x00000a00: {
   65568                     // 0x0d000a00
   65569                     switch (instr & 0x00000100) {
   65570                       case 0x00000000: {
   65571                         // 0x0d000a00
   65572                         if (((instr & 0xf0000000) == 0xf0000000)) {
   65573                           UnallocatedA32(instr);
   65574                           return;
   65575                         }
   65576                         Condition condition((instr >> 28) & 0xf);
   65577                         unsigned rd = ExtractSRegister(instr, 22, 12);
   65578                         unsigned rn = (instr >> 16) & 0xf;
   65579                         Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
   65580                         int32_t offset = (instr & 0xff) << 2;
   65581                         // VSTR{<c>}{<q>}{.32} <Sd>, [<Rn>{, #{+/-}<imm>}] ; A2
   65582                         vstr(condition,
   65583                              kDataTypeValueNone,
   65584                              SRegister(rd),
   65585                              MemOperand(Register(rn), sign, offset, Offset));
   65586                         break;
   65587                       }
   65588                       case 0x00000100: {
   65589                         // 0x0d000b00
   65590                         if (((instr & 0xf0000000) == 0xf0000000)) {
   65591                           UnallocatedA32(instr);
   65592                           return;
   65593                         }
   65594                         Condition condition((instr >> 28) & 0xf);
   65595                         unsigned rd = ExtractDRegister(instr, 22, 12);
   65596                         unsigned rn = (instr >> 16) & 0xf;
   65597                         Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
   65598                         int32_t offset = (instr & 0xff) << 2;
   65599                         // VSTR{<c>}{<q>}{.64} <Dd>, [<Rn>{, #{+/-}<imm>}] ; A1
   65600                         vstr(condition,
   65601                              kDataTypeValueNone,
   65602                              DRegister(rd),
   65603                              MemOperand(Register(rn), sign, offset, Offset));
   65604                         break;
   65605                       }
   65606                     }
   65607                     break;
   65608                   }
   65609                   default: {
   65610                     if (((instr & 0xf0000000) == 0xf0000000) ||
   65611                         ((instr & 0xe00) == 0xa00)) {
   65612                       UnallocatedA32(instr);
   65613                       return;
   65614                     }
   65615                     UnimplementedA32("STC", instr);
   65616                     break;
   65617                   }
   65618                 }
   65619                 break;
   65620               }
   65621               case 0x00200000: {
   65622                 // 0x0d200000
   65623                 switch (instr & 0x00000e00) {
   65624                   case 0x00000a00: {
   65625                     // 0x0d200a00
   65626                     switch (instr & 0x00800100) {
   65627                       case 0x00000000: {
   65628                         // 0x0d200a00
   65629                         if (((instr & 0xf0000000) == 0xf0000000)) {
   65630                           UnallocatedA32(instr);
   65631                           return;
   65632                         }
   65633                         if (((Uint32((instr >> 16)) & Uint32(0xf)) ==
   65634                              Uint32(0xd)) &&
   65635                             ((instr & 0xf0000000) != 0xf0000000)) {
   65636                           Condition condition((instr >> 28) & 0xf);
   65637                           unsigned first = ExtractSRegister(instr, 22, 12);
   65638                           unsigned len = instr & 0xff;
   65639                           // VPUSH{<c>}{<q>}{.<size>} <sreglist> ; A2
   65640                           vpush(condition,
   65641                                 kDataTypeValueNone,
   65642                                 SRegisterList(SRegister(first), len));
   65643                           if ((len == 0) ||
   65644                               ((first + len) > kNumberOfSRegisters)) {
   65645                             UnpredictableA32(instr);
   65646                           }
   65647                           return;
   65648                         }
   65649                         Condition condition((instr >> 28) & 0xf);
   65650                         unsigned rn = (instr >> 16) & 0xf;
   65651                         unsigned first = ExtractSRegister(instr, 22, 12);
   65652                         unsigned len = instr & 0xff;
   65653                         // VSTMDB{<c>}{<q>}{.<size>} <Rn>!, <sreglist> ; A2
   65654                         vstmdb(condition,
   65655                                kDataTypeValueNone,
   65656                                Register(rn),
   65657                                WriteBack(WRITE_BACK),
   65658                                SRegisterList(SRegister(first), len));
   65659                         if ((len == 0) ||
   65660                             ((first + len) > kNumberOfSRegisters)) {
   65661                           UnpredictableA32(instr);
   65662                         }
   65663                         break;
   65664                       }
   65665                       case 0x00000100: {
   65666                         // 0x0d200b00
   65667                         switch (instr & 0x00000001) {
   65668                           case 0x00000000: {
   65669                             // 0x0d200b00
   65670                             if (((instr & 0xf0000000) == 0xf0000000)) {
   65671                               UnallocatedA32(instr);
   65672                               return;
   65673                             }
   65674                             if (((Uint32((instr >> 16)) & Uint32(0xf)) ==
   65675                                  Uint32(0xd)) &&
   65676                                 ((instr & 0xf0000000) != 0xf0000000)) {
   65677                               Condition condition((instr >> 28) & 0xf);
   65678                               unsigned first = ExtractDRegister(instr, 22, 12);
   65679                               unsigned imm8 = (instr & 0xff);
   65680                               unsigned len = imm8 / 2;
   65681                               unsigned end = first + len;
   65682                               // VPUSH{<c>}{<q>}{.<size>} <dreglist> ; A1
   65683                               vpush(condition,
   65684                                     kDataTypeValueNone,
   65685                                     DRegisterList(DRegister(first), len));
   65686                               if ((len == 0) || (len > 16) ||
   65687                                   (end > kMaxNumberOfDRegisters)) {
   65688                                 UnpredictableA32(instr);
   65689                               }
   65690                               return;
   65691                             }
   65692                             Condition condition((instr >> 28) & 0xf);
   65693                             unsigned rn = (instr >> 16) & 0xf;
   65694                             unsigned first = ExtractDRegister(instr, 22, 12);
   65695                             unsigned imm8 = (instr & 0xff);
   65696                             unsigned len = imm8 / 2;
   65697                             unsigned end = first + len;
   65698                             // VSTMDB{<c>}{<q>}{.<size>} <Rn>!, <dreglist> ; A1
   65699                             vstmdb(condition,
   65700                                    kDataTypeValueNone,
   65701                                    Register(rn),
   65702                                    WriteBack(WRITE_BACK),
   65703                                    DRegisterList(DRegister(first), len));
   65704                             if ((len == 0) || (len > 16) ||
   65705                                 (end > kMaxNumberOfDRegisters)) {
   65706                               UnpredictableA32(instr);
   65707                             }
   65708                             break;
   65709                           }
   65710                           case 0x00000001: {
   65711                             // 0x0d200b01
   65712                             if (((instr & 0xf0000000) == 0xf0000000)) {
   65713                               UnallocatedA32(instr);
   65714                               return;
   65715                             }
   65716                             Condition condition((instr >> 28) & 0xf);
   65717                             unsigned rn = (instr >> 16) & 0xf;
   65718                             unsigned first = ExtractDRegister(instr, 22, 12);
   65719                             unsigned imm8 = (instr & 0xff);
   65720                             unsigned len = imm8 / 2;
   65721                             unsigned end = first + len;
   65722                             // FSTMDBX{<c>}{<q>} <Rn>!, <dreglist> ; A1
   65723                             fstmdbx(condition,
   65724                                     Register(rn),
   65725                                     WriteBack(WRITE_BACK),
   65726                                     DRegisterList(DRegister(first), len));
   65727                             if ((len == 0) || (len > 16) || (end > 16)) {
   65728                               UnpredictableA32(instr);
   65729                             }
   65730                             break;
   65731                           }
   65732                         }
   65733                         break;
   65734                       }
   65735                       default:
   65736                         UnallocatedA32(instr);
   65737                         break;
   65738                     }
   65739                     break;
   65740                   }
   65741                   default: {
   65742                     if (((instr & 0xf0000000) == 0xf0000000) ||
   65743                         ((instr & 0xe00) == 0xa00)) {
   65744                       UnallocatedA32(instr);
   65745                       return;
   65746                     }
   65747                     UnimplementedA32("STC", instr);
   65748                     break;
   65749                   }
   65750                 }
   65751                 break;
   65752               }
   65753             }
   65754             break;
   65755           }
   65756           case 0x01100000: {
   65757             // 0x0d100000
   65758             switch (instr & 0x00200000) {
   65759               case 0x00000000: {
   65760                 // 0x0d100000
   65761                 switch (instr & 0x000f0000) {
   65762                   case 0x000f0000: {
   65763                     // 0x0d1f0000
   65764                     switch (instr & 0x00000e00) {
   65765                       case 0x00000a00: {
   65766                         // 0x0d1f0a00
   65767                         switch (instr & 0x00000100) {
   65768                           case 0x00000000: {
   65769                             // 0x0d1f0a00
   65770                             if (((instr & 0xf0000000) == 0xf0000000)) {
   65771                               UnallocatedA32(instr);
   65772                               return;
   65773                             }
   65774                             Condition condition((instr >> 28) & 0xf);
   65775                             unsigned rd = ExtractSRegister(instr, 22, 12);
   65776                             uint32_t U = (instr >> 23) & 0x1;
   65777                             int32_t imm = instr & 0xff;
   65778                             imm <<= 2;
   65779                             if (U == 0) imm = -imm;
   65780                             bool minus_zero = (imm == 0) && (U == 0);
   65781                             Label label(imm, kA32PcDelta, minus_zero);
   65782                             // VLDR{<c>}{<q>}{.32} <Sd>, <label> ; A2
   65783                             vldr(condition,
   65784                                  kDataTypeValueNone,
   65785                                  SRegister(rd),
   65786                                  &label);
   65787                             break;
   65788                           }
   65789                           case 0x00000100: {
   65790                             // 0x0d1f0b00
   65791                             if (((instr & 0xf0000000) == 0xf0000000)) {
   65792                               UnallocatedA32(instr);
   65793                               return;
   65794                             }
   65795                             Condition condition((instr >> 28) & 0xf);
   65796                             unsigned rd = ExtractDRegister(instr, 22, 12);
   65797                             uint32_t U = (instr >> 23) & 0x1;
   65798                             int32_t imm = instr & 0xff;
   65799                             imm <<= 2;
   65800                             if (U == 0) imm = -imm;
   65801                             bool minus_zero = (imm == 0) && (U == 0);
   65802                             Label label(imm, kA32PcDelta, minus_zero);
   65803                             // VLDR{<c>}{<q>}{.64} <Dd>, <label> ; A1
   65804                             vldr(condition,
   65805                                  kDataTypeValueNone,
   65806                                  DRegister(rd),
   65807                                  &label);
   65808                             break;
   65809                           }
   65810                         }
   65811                         break;
   65812                       }
   65813                       default: {
   65814                         if (((instr & 0xf0000000) == 0xf0000000) ||
   65815                             ((instr & 0xe00) == 0xa00)) {
   65816                           UnallocatedA32(instr);
   65817                           return;
   65818                         }
   65819                         UnimplementedA32("LDC", instr);
   65820                         break;
   65821                       }
   65822                     }
   65823                     break;
   65824                   }
   65825                   default: {
   65826                     switch (instr & 0x00000e00) {
   65827                       case 0x00000a00: {
   65828                         // 0x0d100a00
   65829                         switch (instr & 0x00000100) {
   65830                           case 0x00000000: {
   65831                             // 0x0d100a00
   65832                             if (((instr & 0xf0000000) == 0xf0000000) ||
   65833                                 ((instr & 0xf0000) == 0xf0000)) {
   65834                               UnallocatedA32(instr);
   65835                               return;
   65836                             }
   65837                             Condition condition((instr >> 28) & 0xf);
   65838                             unsigned rd = ExtractSRegister(instr, 22, 12);
   65839                             unsigned rn = (instr >> 16) & 0xf;
   65840                             Sign sign((((instr >> 23) & 0x1) == 0) ? minus
   65841                                                                    : plus);
   65842                             int32_t offset = (instr & 0xff) << 2;
   65843                             // VLDR{<c>}{<q>}{.32} <Sd>, [<Rn>{, #{+/-}<imm>}] ; A2 NOLINT(whitespace/line_length)
   65844                             vldr(condition,
   65845                                  kDataTypeValueNone,
   65846                                  SRegister(rd),
   65847                                  MemOperand(Register(rn),
   65848                                             sign,
   65849                                             offset,
   65850                                             Offset));
   65851                             break;
   65852                           }
   65853                           case 0x00000100: {
   65854                             // 0x0d100b00
   65855                             if (((instr & 0xf0000000) == 0xf0000000) ||
   65856                                 ((instr & 0xf0000) == 0xf0000)) {
   65857                               UnallocatedA32(instr);
   65858                               return;
   65859                             }
   65860                             Condition condition((instr >> 28) & 0xf);
   65861                             unsigned rd = ExtractDRegister(instr, 22, 12);
   65862                             unsigned rn = (instr >> 16) & 0xf;
   65863                             Sign sign((((instr >> 23) & 0x1) == 0) ? minus
   65864                                                                    : plus);
   65865                             int32_t offset = (instr & 0xff) << 2;
   65866                             // VLDR{<c>}{<q>}{.64} <Dd>, [<Rn>{, #{+/-}<imm>}] ; A1 NOLINT(whitespace/line_length)
   65867                             vldr(condition,
   65868                                  kDataTypeValueNone,
   65869                                  DRegister(rd),
   65870                                  MemOperand(Register(rn),
   65871                                             sign,
   65872                                             offset,
   65873                                             Offset));
   65874                             break;
   65875                           }
   65876                         }
   65877                         break;
   65878                       }
   65879                       default: {
   65880                         if (((instr & 0xf0000000) == 0xf0000000) ||
   65881                             ((instr & 0xf0000) == 0xf0000) ||
   65882                             ((instr & 0xe00) == 0xa00)) {
   65883                           UnallocatedA32(instr);
   65884                           return;
   65885                         }
   65886                         UnimplementedA32("LDC", instr);
   65887                         break;
   65888                       }
   65889                     }
   65890                     break;
   65891                   }
   65892                 }
   65893                 break;
   65894               }
   65895               case 0x00200000: {
   65896                 // 0x0d300000
   65897                 switch (instr & 0x00000e00) {
   65898                   case 0x00000a00: {
   65899                     // 0x0d300a00
   65900                     switch (instr & 0x00800100) {
   65901                       case 0x00000000: {
   65902                         // 0x0d300a00
   65903                         if (((instr & 0xf0000000) == 0xf0000000)) {
   65904                           UnallocatedA32(instr);
   65905                           return;
   65906                         }
   65907                         Condition condition((instr >> 28) & 0xf);
   65908                         unsigned rn = (instr >> 16) & 0xf;
   65909                         unsigned first = ExtractSRegister(instr, 22, 12);
   65910                         unsigned len = instr & 0xff;
   65911                         // VLDMDB{<c>}{<q>}{.<size>} <Rn>!, <sreglist> ; A2
   65912                         vldmdb(condition,
   65913                                kDataTypeValueNone,
   65914                                Register(rn),
   65915                                WriteBack(WRITE_BACK),
   65916                                SRegisterList(SRegister(first), len));
   65917                         if ((len == 0) ||
   65918                             ((first + len) > kNumberOfSRegisters)) {
   65919                           UnpredictableA32(instr);
   65920                         }
   65921                         break;
   65922                       }
   65923                       case 0x00000100: {
   65924                         // 0x0d300b00
   65925                         switch (instr & 0x00000001) {
   65926                           case 0x00000000: {
   65927                             // 0x0d300b00
   65928                             if (((instr & 0xf0000000) == 0xf0000000)) {
   65929                               UnallocatedA32(instr);
   65930                               return;
   65931                             }
   65932                             Condition condition((instr >> 28) & 0xf);
   65933                             unsigned rn = (instr >> 16) & 0xf;
   65934                             unsigned first = ExtractDRegister(instr, 22, 12);
   65935                             unsigned imm8 = (instr & 0xff);
   65936                             unsigned len = imm8 / 2;
   65937                             unsigned end = first + len;
   65938                             // VLDMDB{<c>}{<q>}{.<size>} <Rn>!, <dreglist> ; A1
   65939                             vldmdb(condition,
   65940                                    kDataTypeValueNone,
   65941                                    Register(rn),
   65942                                    WriteBack(WRITE_BACK),
   65943                                    DRegisterList(DRegister(first), len));
   65944                             if ((len == 0) || (len > 16) ||
   65945                                 (end > kMaxNumberOfDRegisters)) {
   65946                               UnpredictableA32(instr);
   65947                             }
   65948                             break;
   65949                           }
   65950                           case 0x00000001: {
   65951                             // 0x0d300b01
   65952                             if (((instr & 0xf0000000) == 0xf0000000)) {
   65953                               UnallocatedA32(instr);
   65954                               return;
   65955                             }
   65956                             Condition condition((instr >> 28) & 0xf);
   65957                             unsigned rn = (instr >> 16) & 0xf;
   65958                             unsigned first = ExtractDRegister(instr, 22, 12);
   65959                             unsigned imm8 = (instr & 0xff);
   65960                             unsigned len = imm8 / 2;
   65961                             unsigned end = first + len;
   65962                             // FLDMDBX{<c>}{<q>} <Rn>!, <dreglist> ; A1
   65963                             fldmdbx(condition,
   65964                                     Register(rn),
   65965                                     WriteBack(WRITE_BACK),
   65966                                     DRegisterList(DRegister(first), len));
   65967                             if ((len == 0) || (len > 16) || (end > 16)) {
   65968                               UnpredictableA32(instr);
   65969                             }
   65970                             break;
   65971                           }
   65972                         }
   65973                         break;
   65974                       }
   65975                       default:
   65976                         UnallocatedA32(instr);
   65977                         break;
   65978                     }
   65979                     break;
   65980                   }
   65981                   default: {
   65982                     if (((instr & 0xf0000000) == 0xf0000000) ||
   65983                         ((instr & 0xf0000) == 0xf0000) ||
   65984                         ((instr & 0xe00) == 0xa00)) {
   65985                       UnallocatedA32(instr);
   65986                       return;
   65987                     }
   65988                     UnimplementedA32("LDC", instr);
   65989                     break;
   65990                   }
   65991                 }
   65992                 break;
   65993               }
   65994             }
   65995             break;
   65996           }
   65997         }
   65998         break;
   65999       }
   66000       case 0x0e000000: {
   66001         // 0x0e000000
   66002         switch (instr & 0x01000000) {
   66003           case 0x00000000: {
   66004             // 0x0e000000
   66005             switch (instr & 0x00000010) {
   66006               case 0x00000000: {
   66007                 // 0x0e000000
   66008                 switch (instr & 0x00000e00) {
   66009                   case 0x00000a00: {
   66010                     // 0x0e000a00
   66011                     switch (instr & 0x00b00140) {
   66012                       case 0x00000000: {
   66013                         // 0x0e000a00
   66014                         if (((instr & 0xf0000000) == 0xf0000000)) {
   66015                           UnallocatedA32(instr);
   66016                           return;
   66017                         }
   66018                         Condition condition((instr >> 28) & 0xf);
   66019                         unsigned rd = ExtractSRegister(instr, 22, 12);
   66020                         unsigned rn = ExtractSRegister(instr, 7, 16);
   66021                         unsigned rm = ExtractSRegister(instr, 5, 0);
   66022                         // VMLA{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; A2
   66023                         vmla(condition,
   66024                              F32,
   66025                              SRegister(rd),
   66026                              SRegister(rn),
   66027                              SRegister(rm));
   66028                         break;
   66029                       }
   66030                       case 0x00000040: {
   66031                         // 0x0e000a40
   66032                         if (((instr & 0xf0000000) == 0xf0000000)) {
   66033                           UnallocatedA32(instr);
   66034                           return;
   66035                         }
   66036                         Condition condition((instr >> 28) & 0xf);
   66037                         unsigned rd = ExtractSRegister(instr, 22, 12);
   66038                         unsigned rn = ExtractSRegister(instr, 7, 16);
   66039                         unsigned rm = ExtractSRegister(instr, 5, 0);
   66040                         // VMLS{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; A2
   66041                         vmls(condition,
   66042                              F32,
   66043                              SRegister(rd),
   66044                              SRegister(rn),
   66045                              SRegister(rm));
   66046                         break;
   66047                       }
   66048                       case 0x00000100: {
   66049                         // 0x0e000b00
   66050                         if (((instr & 0xf0000000) == 0xf0000000)) {
   66051                           UnallocatedA32(instr);
   66052                           return;
   66053                         }
   66054                         Condition condition((instr >> 28) & 0xf);
   66055                         unsigned rd = ExtractDRegister(instr, 22, 12);
   66056                         unsigned rn = ExtractDRegister(instr, 7, 16);
   66057                         unsigned rm = ExtractDRegister(instr, 5, 0);
   66058                         // VMLA{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; A2
   66059                         vmla(condition,
   66060                              F64,
   66061                              DRegister(rd),
   66062                              DRegister(rn),
   66063                              DRegister(rm));
   66064                         break;
   66065                       }
   66066                       case 0x00000140: {
   66067                         // 0x0e000b40
   66068                         if (((instr & 0xf0000000) == 0xf0000000)) {
   66069                           UnallocatedA32(instr);
   66070                           return;
   66071                         }
   66072                         Condition condition((instr >> 28) & 0xf);
   66073                         unsigned rd = ExtractDRegister(instr, 22, 12);
   66074                         unsigned rn = ExtractDRegister(instr, 7, 16);
   66075                         unsigned rm = ExtractDRegister(instr, 5, 0);
   66076                         // VMLS{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; A2
   66077                         vmls(condition,
   66078                              F64,
   66079                              DRegister(rd),
   66080                              DRegister(rn),
   66081                              DRegister(rm));
   66082                         break;
   66083                       }
   66084                       case 0x00100000: {
   66085                         // 0x0e100a00
   66086                         if (((instr & 0xf0000000) == 0xf0000000)) {
   66087                           UnallocatedA32(instr);
   66088                           return;
   66089                         }
   66090                         Condition condition((instr >> 28) & 0xf);
   66091                         unsigned rd = ExtractSRegister(instr, 22, 12);
   66092                         unsigned rn = ExtractSRegister(instr, 7, 16);
   66093                         unsigned rm = ExtractSRegister(instr, 5, 0);
   66094                         // VNMLS{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; A1
   66095                         vnmls(condition,
   66096                               F32,
   66097                               SRegister(rd),
   66098                               SRegister(rn),
   66099                               SRegister(rm));
   66100                         break;
   66101                       }
   66102                       case 0x00100040: {
   66103                         // 0x0e100a40
   66104                         if (((instr & 0xf0000000) == 0xf0000000)) {
   66105                           UnallocatedA32(instr);
   66106                           return;
   66107                         }
   66108                         Condition condition((instr >> 28) & 0xf);
   66109                         unsigned rd = ExtractSRegister(instr, 22, 12);
   66110                         unsigned rn = ExtractSRegister(instr, 7, 16);
   66111                         unsigned rm = ExtractSRegister(instr, 5, 0);
   66112                         // VNMLA{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; A1
   66113                         vnmla(condition,
   66114                               F32,
   66115                               SRegister(rd),
   66116                               SRegister(rn),
   66117                               SRegister(rm));
   66118                         break;
   66119                       }
   66120                       case 0x00100100: {
   66121                         // 0x0e100b00
   66122                         if (((instr & 0xf0000000) == 0xf0000000)) {
   66123                           UnallocatedA32(instr);
   66124                           return;
   66125                         }
   66126                         Condition condition((instr >> 28) & 0xf);
   66127                         unsigned rd = ExtractDRegister(instr, 22, 12);
   66128                         unsigned rn = ExtractDRegister(instr, 7, 16);
   66129                         unsigned rm = ExtractDRegister(instr, 5, 0);
   66130                         // VNMLS{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; A1
   66131                         vnmls(condition,
   66132                               F64,
   66133                               DRegister(rd),
   66134                               DRegister(rn),
   66135                               DRegister(rm));
   66136                         break;
   66137                       }
   66138                       case 0x00100140: {
   66139                         // 0x0e100b40
   66140                         if (((instr & 0xf0000000) == 0xf0000000)) {
   66141                           UnallocatedA32(instr);
   66142                           return;
   66143                         }
   66144                         Condition condition((instr >> 28) & 0xf);
   66145                         unsigned rd = ExtractDRegister(instr, 22, 12);
   66146                         unsigned rn = ExtractDRegister(instr, 7, 16);
   66147                         unsigned rm = ExtractDRegister(instr, 5, 0);
   66148                         // VNMLA{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; A1
   66149                         vnmla(condition,
   66150                               F64,
   66151                               DRegister(rd),
   66152                               DRegister(rn),
   66153                               DRegister(rm));
   66154                         break;
   66155                       }
   66156                       case 0x00200000: {
   66157                         // 0x0e200a00
   66158                         if (((instr & 0xf0000000) == 0xf0000000)) {
   66159                           UnallocatedA32(instr);
   66160                           return;
   66161                         }
   66162                         Condition condition((instr >> 28) & 0xf);
   66163                         unsigned rd = ExtractSRegister(instr, 22, 12);
   66164                         unsigned rn = ExtractSRegister(instr, 7, 16);
   66165                         unsigned rm = ExtractSRegister(instr, 5, 0);
   66166                         // VMUL{<c>}{<q>}.F32 {<Sd>}, <Sn>, <Sm> ; A2
   66167                         vmul(condition,
   66168                              F32,
   66169                              SRegister(rd),
   66170                              SRegister(rn),
   66171                              SRegister(rm));
   66172                         break;
   66173                       }
   66174                       case 0x00200040: {
   66175                         // 0x0e200a40
   66176                         if (((instr & 0xf0000000) == 0xf0000000)) {
   66177                           UnallocatedA32(instr);
   66178                           return;
   66179                         }
   66180                         Condition condition((instr >> 28) & 0xf);
   66181                         unsigned rd = ExtractSRegister(instr, 22, 12);
   66182                         unsigned rn = ExtractSRegister(instr, 7, 16);
   66183                         unsigned rm = ExtractSRegister(instr, 5, 0);
   66184                         // VNMUL{<c>}{<q>}.F32 {<Sd>}, <Sn>, <Sm> ; A1
   66185                         vnmul(condition,
   66186                               F32,
   66187                               SRegister(rd),
   66188                               SRegister(rn),
   66189                               SRegister(rm));
   66190                         break;
   66191                       }
   66192                       case 0x00200100: {
   66193                         // 0x0e200b00
   66194                         if (((instr & 0xf0000000) == 0xf0000000)) {
   66195                           UnallocatedA32(instr);
   66196                           return;
   66197                         }
   66198                         Condition condition((instr >> 28) & 0xf);
   66199                         unsigned rd = ExtractDRegister(instr, 22, 12);
   66200                         unsigned rn = ExtractDRegister(instr, 7, 16);
   66201                         unsigned rm = ExtractDRegister(instr, 5, 0);
   66202                         // VMUL{<c>}{<q>}.F64 {<Dd>}, <Dn>, <Dm> ; A2
   66203                         vmul(condition,
   66204                              F64,
   66205                              DRegister(rd),
   66206                              DRegister(rn),
   66207                              DRegister(rm));
   66208                         break;
   66209                       }
   66210                       case 0x00200140: {
   66211                         // 0x0e200b40
   66212                         if (((instr & 0xf0000000) == 0xf0000000)) {
   66213                           UnallocatedA32(instr);
   66214                           return;
   66215                         }
   66216                         Condition condition((instr >> 28) & 0xf);
   66217                         unsigned rd = ExtractDRegister(instr, 22, 12);
   66218                         unsigned rn = ExtractDRegister(instr, 7, 16);
   66219                         unsigned rm = ExtractDRegister(instr, 5, 0);
   66220                         // VNMUL{<c>}{<q>}.F64 {<Dd>}, <Dn>, <Dm> ; A1
   66221                         vnmul(condition,
   66222                               F64,
   66223                               DRegister(rd),
   66224                               DRegister(rn),
   66225                               DRegister(rm));
   66226                         break;
   66227                       }
   66228                       case 0x00300000: {
   66229                         // 0x0e300a00
   66230                         if (((instr & 0xf0000000) == 0xf0000000)) {
   66231                           UnallocatedA32(instr);
   66232                           return;
   66233                         }
   66234                         Condition condition((instr >> 28) & 0xf);
   66235                         unsigned rd = ExtractSRegister(instr, 22, 12);
   66236                         unsigned rn = ExtractSRegister(instr, 7, 16);
   66237                         unsigned rm = ExtractSRegister(instr, 5, 0);
   66238                         // VADD{<c>}{<q>}.F32 {<Sd>}, <Sn>, <Sm> ; A2
   66239                         vadd(condition,
   66240                              F32,
   66241                              SRegister(rd),
   66242                              SRegister(rn),
   66243                              SRegister(rm));
   66244                         break;
   66245                       }
   66246                       case 0x00300040: {
   66247                         // 0x0e300a40
   66248                         if (((instr & 0xf0000000) == 0xf0000000)) {
   66249                           UnallocatedA32(instr);
   66250                           return;
   66251                         }
   66252                         Condition condition((instr >> 28) & 0xf);
   66253                         unsigned rd = ExtractSRegister(instr, 22, 12);
   66254                         unsigned rn = ExtractSRegister(instr, 7, 16);
   66255                         unsigned rm = ExtractSRegister(instr, 5, 0);
   66256                         // VSUB{<c>}{<q>}.F32 {<Sd>}, <Sn>, <Sm> ; A2
   66257                         vsub(condition,
   66258                              F32,
   66259                              SRegister(rd),
   66260                              SRegister(rn),
   66261                              SRegister(rm));
   66262                         break;
   66263                       }
   66264                       case 0x00300100: {
   66265                         // 0x0e300b00
   66266                         if (((instr & 0xf0000000) == 0xf0000000)) {
   66267                           UnallocatedA32(instr);
   66268                           return;
   66269                         }
   66270                         Condition condition((instr >> 28) & 0xf);
   66271                         unsigned rd = ExtractDRegister(instr, 22, 12);
   66272                         unsigned rn = ExtractDRegister(instr, 7, 16);
   66273                         unsigned rm = ExtractDRegister(instr, 5, 0);
   66274                         // VADD{<c>}{<q>}.F64 {<Dd>}, <Dn>, <Dm> ; A2
   66275                         vadd(condition,
   66276                              F64,
   66277                              DRegister(rd),
   66278                              DRegister(rn),
   66279                              DRegister(rm));
   66280                         break;
   66281                       }
   66282                       case 0x00300140: {
   66283                         // 0x0e300b40
   66284                         if (((instr & 0xf0000000) == 0xf0000000)) {
   66285                           UnallocatedA32(instr);
   66286                           return;
   66287                         }
   66288                         Condition condition((instr >> 28) & 0xf);
   66289                         unsigned rd = ExtractDRegister(instr, 22, 12);
   66290                         unsigned rn = ExtractDRegister(instr, 7, 16);
   66291                         unsigned rm = ExtractDRegister(instr, 5, 0);
   66292                         // VSUB{<c>}{<q>}.F64 {<Dd>}, <Dn>, <Dm> ; A2
   66293                         vsub(condition,
   66294                              F64,
   66295                              DRegister(rd),
   66296                              DRegister(rn),
   66297                              DRegister(rm));
   66298                         break;
   66299                       }
   66300                       case 0x00800000: {
   66301                         // 0x0e800a00
   66302                         if (((instr & 0xf0000000) == 0xf0000000)) {
   66303                           UnallocatedA32(instr);
   66304                           return;
   66305                         }
   66306                         Condition condition((instr >> 28) & 0xf);
   66307                         unsigned rd = ExtractSRegister(instr, 22, 12);
   66308                         unsigned rn = ExtractSRegister(instr, 7, 16);
   66309                         unsigned rm = ExtractSRegister(instr, 5, 0);
   66310                         // VDIV{<c>}{<q>}.F32 {<Sd>}, <Sn>, <Sm> ; A1
   66311                         vdiv(condition,
   66312                              F32,
   66313                              SRegister(rd),
   66314                              SRegister(rn),
   66315                              SRegister(rm));
   66316                         break;
   66317                       }
   66318                       case 0x00800100: {
   66319                         // 0x0e800b00
   66320                         if (((instr & 0xf0000000) == 0xf0000000)) {
   66321                           UnallocatedA32(instr);
   66322                           return;
   66323                         }
   66324                         Condition condition((instr >> 28) & 0xf);
   66325                         unsigned rd = ExtractDRegister(instr, 22, 12);
   66326                         unsigned rn = ExtractDRegister(instr, 7, 16);
   66327                         unsigned rm = ExtractDRegister(instr, 5, 0);
   66328                         // VDIV{<c>}{<q>}.F64 {<Dd>}, <Dn>, <Dm> ; A1
   66329                         vdiv(condition,
   66330                              F64,
   66331                              DRegister(rd),
   66332                              DRegister(rn),
   66333                              DRegister(rm));
   66334                         break;
   66335                       }
   66336                       case 0x00900000: {
   66337                         // 0x0e900a00
   66338                         if (((instr & 0xf0000000) == 0xf0000000)) {
   66339                           UnallocatedA32(instr);
   66340                           return;
   66341                         }
   66342                         Condition condition((instr >> 28) & 0xf);
   66343                         unsigned rd = ExtractSRegister(instr, 22, 12);
   66344                         unsigned rn = ExtractSRegister(instr, 7, 16);
   66345                         unsigned rm = ExtractSRegister(instr, 5, 0);
   66346                         // VFNMS{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; A1
   66347                         vfnms(condition,
   66348                               F32,
   66349                               SRegister(rd),
   66350                               SRegister(rn),
   66351                               SRegister(rm));
   66352                         break;
   66353                       }
   66354                       case 0x00900040: {
   66355                         // 0x0e900a40
   66356                         if (((instr & 0xf0000000) == 0xf0000000)) {
   66357                           UnallocatedA32(instr);
   66358                           return;
   66359                         }
   66360                         Condition condition((instr >> 28) & 0xf);
   66361                         unsigned rd = ExtractSRegister(instr, 22, 12);
   66362                         unsigned rn = ExtractSRegister(instr, 7, 16);
   66363                         unsigned rm = ExtractSRegister(instr, 5, 0);
   66364                         // VFNMA{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; A1
   66365                         vfnma(condition,
   66366                               F32,
   66367                               SRegister(rd),
   66368                               SRegister(rn),
   66369                               SRegister(rm));
   66370                         break;
   66371                       }
   66372                       case 0x00900100: {
   66373                         // 0x0e900b00
   66374                         if (((instr & 0xf0000000) == 0xf0000000)) {
   66375                           UnallocatedA32(instr);
   66376                           return;
   66377                         }
   66378                         Condition condition((instr >> 28) & 0xf);
   66379                         unsigned rd = ExtractDRegister(instr, 22, 12);
   66380                         unsigned rn = ExtractDRegister(instr, 7, 16);
   66381                         unsigned rm = ExtractDRegister(instr, 5, 0);
   66382                         // VFNMS{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; A1
   66383                         vfnms(condition,
   66384                               F64,
   66385                               DRegister(rd),
   66386                               DRegister(rn),
   66387                               DRegister(rm));
   66388                         break;
   66389                       }
   66390                       case 0x00900140: {
   66391                         // 0x0e900b40
   66392                         if (((instr & 0xf0000000) == 0xf0000000)) {
   66393                           UnallocatedA32(instr);
   66394                           return;
   66395                         }
   66396                         Condition condition((instr >> 28) & 0xf);
   66397                         unsigned rd = ExtractDRegister(instr, 22, 12);
   66398                         unsigned rn = ExtractDRegister(instr, 7, 16);
   66399                         unsigned rm = ExtractDRegister(instr, 5, 0);
   66400                         // VFNMA{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; A1
   66401                         vfnma(condition,
   66402                               F64,
   66403                               DRegister(rd),
   66404                               DRegister(rn),
   66405                               DRegister(rm));
   66406                         break;
   66407                       }
   66408                       case 0x00a00000: {
   66409                         // 0x0ea00a00
   66410                         if (((instr & 0xf0000000) == 0xf0000000)) {
   66411                           UnallocatedA32(instr);
   66412                           return;
   66413                         }
   66414                         Condition condition((instr >> 28) & 0xf);
   66415                         unsigned rd = ExtractSRegister(instr, 22, 12);
   66416                         unsigned rn = ExtractSRegister(instr, 7, 16);
   66417                         unsigned rm = ExtractSRegister(instr, 5, 0);
   66418                         // VFMA{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; A2
   66419                         vfma(condition,
   66420                              F32,
   66421                              SRegister(rd),
   66422                              SRegister(rn),
   66423                              SRegister(rm));
   66424                         break;
   66425                       }
   66426                       case 0x00a00040: {
   66427                         // 0x0ea00a40
   66428                         if (((instr & 0xf0000000) == 0xf0000000)) {
   66429                           UnallocatedA32(instr);
   66430                           return;
   66431                         }
   66432                         Condition condition((instr >> 28) & 0xf);
   66433                         unsigned rd = ExtractSRegister(instr, 22, 12);
   66434                         unsigned rn = ExtractSRegister(instr, 7, 16);
   66435                         unsigned rm = ExtractSRegister(instr, 5, 0);
   66436                         // VFMS{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; A2
   66437                         vfms(condition,
   66438                              F32,
   66439                              SRegister(rd),
   66440                              SRegister(rn),
   66441                              SRegister(rm));
   66442                         break;
   66443                       }
   66444                       case 0x00a00100: {
   66445                         // 0x0ea00b00
   66446                         if (((instr & 0xf0000000) == 0xf0000000)) {
   66447                           UnallocatedA32(instr);
   66448                           return;
   66449                         }
   66450                         Condition condition((instr >> 28) & 0xf);
   66451                         unsigned rd = ExtractDRegister(instr, 22, 12);
   66452                         unsigned rn = ExtractDRegister(instr, 7, 16);
   66453                         unsigned rm = ExtractDRegister(instr, 5, 0);
   66454                         // VFMA{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; A2
   66455                         vfma(condition,
   66456                              F64,
   66457                              DRegister(rd),
   66458                              DRegister(rn),
   66459                              DRegister(rm));
   66460                         break;
   66461                       }
   66462                       case 0x00a00140: {
   66463                         // 0x0ea00b40
   66464                         if (((instr & 0xf0000000) == 0xf0000000)) {
   66465                           UnallocatedA32(instr);
   66466                           return;
   66467                         }
   66468                         Condition condition((instr >> 28) & 0xf);
   66469                         unsigned rd = ExtractDRegister(instr, 22, 12);
   66470                         unsigned rn = ExtractDRegister(instr, 7, 16);
   66471                         unsigned rm = ExtractDRegister(instr, 5, 0);
   66472                         // VFMS{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; A2
   66473                         vfms(condition,
   66474                              F64,
   66475                              DRegister(rd),
   66476                              DRegister(rn),
   66477                              DRegister(rm));
   66478                         break;
   66479                       }
   66480                       case 0x00b00000: {
   66481                         // 0x0eb00a00
   66482                         if (((instr & 0xf0000000) == 0xf0000000)) {
   66483                           UnallocatedA32(instr);
   66484                           return;
   66485                         }
   66486                         Condition condition((instr >> 28) & 0xf);
   66487                         unsigned rd = ExtractSRegister(instr, 22, 12);
   66488                         uint32_t encoded_imm =
   66489                             (instr & 0xf) | ((instr >> 12) & 0xf0);
   66490                         NeonImmediate imm =
   66491                             ImmediateVFP::Decode<float>(encoded_imm);
   66492                         // VMOV{<c>}{<q>}.F32 <Sd>, #<imm> ; A2
   66493                         vmov(condition, F32, SRegister(rd), imm);
   66494                         if (((instr & 0xfb00ff0) != 0xeb00a00)) {
   66495                           UnpredictableA32(instr);
   66496                         }
   66497                         break;
   66498                       }
   66499                       case 0x00b00040: {
   66500                         // 0x0eb00a40
   66501                         switch (instr & 0x000e0000) {
   66502                           case 0x00000000: {
   66503                             // 0x0eb00a40
   66504                             switch (instr & 0x00010080) {
   66505                               case 0x00000000: {
   66506                                 // 0x0eb00a40
   66507                                 if (((instr & 0xf0000000) == 0xf0000000)) {
   66508                                   UnallocatedA32(instr);
   66509                                   return;
   66510                                 }
   66511                                 Condition condition((instr >> 28) & 0xf);
   66512                                 unsigned rd = ExtractSRegister(instr, 22, 12);
   66513                                 unsigned rm = ExtractSRegister(instr, 5, 0);
   66514                                 // VMOV{<c>}{<q>}.F32 <Sd>, <Sm> ; A2
   66515                                 vmov(condition,
   66516                                      F32,
   66517                                      SRegister(rd),
   66518                                      SRegister(rm));
   66519                                 break;
   66520                               }
   66521                               case 0x00000080: {
   66522                                 // 0x0eb00ac0
   66523                                 if (((instr & 0xf0000000) == 0xf0000000)) {
   66524                                   UnallocatedA32(instr);
   66525                                   return;
   66526                                 }
   66527                                 Condition condition((instr >> 28) & 0xf);
   66528                                 unsigned rd = ExtractSRegister(instr, 22, 12);
   66529                                 unsigned rm = ExtractSRegister(instr, 5, 0);
   66530                                 // VABS{<c>}{<q>}.F32 <Sd>, <Sm> ; A2
   66531                                 vabs(condition,
   66532                                      F32,
   66533                                      SRegister(rd),
   66534                                      SRegister(rm));
   66535                                 break;
   66536                               }
   66537                               case 0x00010000: {
   66538                                 // 0x0eb10a40
   66539                                 if (((instr & 0xf0000000) == 0xf0000000)) {
   66540                                   UnallocatedA32(instr);
   66541                                   return;
   66542                                 }
   66543                                 Condition condition((instr >> 28) & 0xf);
   66544                                 unsigned rd = ExtractSRegister(instr, 22, 12);
   66545                                 unsigned rm = ExtractSRegister(instr, 5, 0);
   66546                                 // VNEG{<c>}{<q>}.F32 <Sd>, <Sm> ; A2
   66547                                 vneg(condition,
   66548                                      F32,
   66549                                      SRegister(rd),
   66550                                      SRegister(rm));
   66551                                 break;
   66552                               }
   66553                               case 0x00010080: {
   66554                                 // 0x0eb10ac0
   66555                                 if (((instr & 0xf0000000) == 0xf0000000)) {
   66556                                   UnallocatedA32(instr);
   66557                                   return;
   66558                                 }
   66559                                 Condition condition((instr >> 28) & 0xf);
   66560                                 unsigned rd = ExtractSRegister(instr, 22, 12);
   66561                                 unsigned rm = ExtractSRegister(instr, 5, 0);
   66562                                 // VSQRT{<c>}{<q>}.F32 <Sd>, <Sm> ; A1
   66563                                 vsqrt(condition,
   66564                                       F32,
   66565                                       SRegister(rd),
   66566                                       SRegister(rm));
   66567                                 break;
   66568                               }
   66569                             }
   66570                             break;
   66571                           }
   66572                           case 0x00020000: {
   66573                             // 0x0eb20a40
   66574                             switch (instr & 0x00010080) {
   66575                               case 0x00000000: {
   66576                                 // 0x0eb20a40
   66577                                 if (((instr & 0xf0000000) == 0xf0000000)) {
   66578                                   UnallocatedA32(instr);
   66579                                   return;
   66580                                 }
   66581                                 Condition condition((instr >> 28) & 0xf);
   66582                                 unsigned rd = ExtractSRegister(instr, 22, 12);
   66583                                 unsigned rm = ExtractSRegister(instr, 5, 0);
   66584                                 // VCVTB{<c>}{<q>}.F32.F16 <Sd>, <Sm> ; A1
   66585                                 vcvtb(condition,
   66586                                       F32,
   66587                                       F16,
   66588                                       SRegister(rd),
   66589                                       SRegister(rm));
   66590                                 break;
   66591                               }
   66592                               case 0x00000080: {
   66593                                 // 0x0eb20ac0
   66594                                 if (((instr & 0xf0000000) == 0xf0000000)) {
   66595                                   UnallocatedA32(instr);
   66596                                   return;
   66597                                 }
   66598                                 Condition condition((instr >> 28) & 0xf);
   66599                                 unsigned rd = ExtractSRegister(instr, 22, 12);
   66600                                 unsigned rm = ExtractSRegister(instr, 5, 0);
   66601                                 // VCVTT{<c>}{<q>}.F32.F16 <Sd>, <Sm> ; A1
   66602                                 vcvtt(condition,
   66603                                       F32,
   66604                                       F16,
   66605                                       SRegister(rd),
   66606                                       SRegister(rm));
   66607                                 break;
   66608                               }
   66609                               case 0x00010000: {
   66610                                 // 0x0eb30a40
   66611                                 if (((instr & 0xf0000000) == 0xf0000000)) {
   66612                                   UnallocatedA32(instr);
   66613                                   return;
   66614                                 }
   66615                                 Condition condition((instr >> 28) & 0xf);
   66616                                 unsigned rd = ExtractSRegister(instr, 22, 12);
   66617                                 unsigned rm = ExtractSRegister(instr, 5, 0);
   66618                                 // VCVTB{<c>}{<q>}.F16.F32 <Sd>, <Sm> ; A1
   66619                                 vcvtb(condition,
   66620                                       F16,
   66621                                       F32,
   66622                                       SRegister(rd),
   66623                                       SRegister(rm));
   66624                                 break;
   66625                               }
   66626                               case 0x00010080: {
   66627                                 // 0x0eb30ac0
   66628                                 if (((instr & 0xf0000000) == 0xf0000000)) {
   66629                                   UnallocatedA32(instr);
   66630                                   return;
   66631                                 }
   66632                                 Condition condition((instr >> 28) & 0xf);
   66633                                 unsigned rd = ExtractSRegister(instr, 22, 12);
   66634                                 unsigned rm = ExtractSRegister(instr, 5, 0);
   66635                                 // VCVTT{<c>}{<q>}.F16.F32 <Sd>, <Sm> ; A1
   66636                                 vcvtt(condition,
   66637                                       F16,
   66638                                       F32,
   66639                                       SRegister(rd),
   66640                                       SRegister(rm));
   66641                                 break;
   66642                               }
   66643                             }
   66644                             break;
   66645                           }
   66646                           case 0x00040000: {
   66647                             // 0x0eb40a40
   66648                             switch (instr & 0x00010080) {
   66649                               case 0x00000000: {
   66650                                 // 0x0eb40a40
   66651                                 if (((instr & 0xf0000000) == 0xf0000000)) {
   66652                                   UnallocatedA32(instr);
   66653                                   return;
   66654                                 }
   66655                                 Condition condition((instr >> 28) & 0xf);
   66656                                 unsigned rd = ExtractSRegister(instr, 22, 12);
   66657                                 unsigned rm = ExtractSRegister(instr, 5, 0);
   66658                                 // VCMP{<c>}{<q>}.F32 <Sd>, <Sm> ; A1
   66659                                 vcmp(condition,
   66660                                      F32,
   66661                                      SRegister(rd),
   66662                                      SRegister(rm));
   66663                                 break;
   66664                               }
   66665                               case 0x00000080: {
   66666                                 // 0x0eb40ac0
   66667                                 if (((instr & 0xf0000000) == 0xf0000000)) {
   66668                                   UnallocatedA32(instr);
   66669                                   return;
   66670                                 }
   66671                                 Condition condition((instr >> 28) & 0xf);
   66672                                 unsigned rd = ExtractSRegister(instr, 22, 12);
   66673                                 unsigned rm = ExtractSRegister(instr, 5, 0);
   66674                                 // VCMPE{<c>}{<q>}.F32 <Sd>, <Sm> ; A1
   66675                                 vcmpe(condition,
   66676                                       F32,
   66677                                       SRegister(rd),
   66678                                       SRegister(rm));
   66679                                 break;
   66680                               }
   66681                               case 0x00010000: {
   66682                                 // 0x0eb50a40
   66683                                 if (((instr & 0xf0000000) == 0xf0000000)) {
   66684                                   UnallocatedA32(instr);
   66685                                   return;
   66686                                 }
   66687                                 Condition condition((instr >> 28) & 0xf);
   66688                                 unsigned rd = ExtractSRegister(instr, 22, 12);
   66689                                 // VCMP{<c>}{<q>}.F32 <Sd>, #0.0 ; A2
   66690                                 vcmp(condition, F32, SRegister(rd), 0.0);
   66691                                 if (((instr & 0xfbf0fff) != 0xeb50a40)) {
   66692                                   UnpredictableA32(instr);
   66693                                 }
   66694                                 break;
   66695                               }
   66696                               case 0x00010080: {
   66697                                 // 0x0eb50ac0
   66698                                 if (((instr & 0xf0000000) == 0xf0000000)) {
   66699                                   UnallocatedA32(instr);
   66700                                   return;
   66701                                 }
   66702                                 Condition condition((instr >> 28) & 0xf);
   66703                                 unsigned rd = ExtractSRegister(instr, 22, 12);
   66704                                 // VCMPE{<c>}{<q>}.F32 <Sd>, #0.0 ; A2
   66705                                 vcmpe(condition, F32, SRegister(rd), 0.0);
   66706                                 if (((instr & 0xfbf0fff) != 0xeb50ac0)) {
   66707                                   UnpredictableA32(instr);
   66708                                 }
   66709                                 break;
   66710                               }
   66711                             }
   66712                             break;
   66713                           }
   66714                           case 0x00060000: {
   66715                             // 0x0eb60a40
   66716                             switch (instr & 0x00010080) {
   66717                               case 0x00000000: {
   66718                                 // 0x0eb60a40
   66719                                 if (((instr & 0xf0000000) == 0xf0000000)) {
   66720                                   UnallocatedA32(instr);
   66721                                   return;
   66722                                 }
   66723                                 Condition condition((instr >> 28) & 0xf);
   66724                                 unsigned rd = ExtractSRegister(instr, 22, 12);
   66725                                 unsigned rm = ExtractSRegister(instr, 5, 0);
   66726                                 // VRINTR{<c>}{<q>}.F32.F32 <Sd>, <Sm> ; A1
   66727                                 vrintr(condition,
   66728                                        F32,
   66729                                        F32,
   66730                                        SRegister(rd),
   66731                                        SRegister(rm));
   66732                                 break;
   66733                               }
   66734                               case 0x00000080: {
   66735                                 // 0x0eb60ac0
   66736                                 if (((instr & 0xf0000000) == 0xf0000000)) {
   66737                                   UnallocatedA32(instr);
   66738                                   return;
   66739                                 }
   66740                                 Condition condition((instr >> 28) & 0xf);
   66741                                 unsigned rd = ExtractSRegister(instr, 22, 12);
   66742                                 unsigned rm = ExtractSRegister(instr, 5, 0);
   66743                                 // VRINTZ{<c>}{<q>}.F32.F32 <Sd>, <Sm> ; A1
   66744                                 vrintz(condition,
   66745                                        F32,
   66746                                        F32,
   66747                                        SRegister(rd),
   66748                                        SRegister(rm));
   66749                                 break;
   66750                               }
   66751                               case 0x00010000: {
   66752                                 // 0x0eb70a40
   66753                                 if (((instr & 0xf0000000) == 0xf0000000)) {
   66754                                   UnallocatedA32(instr);
   66755                                   return;
   66756                                 }
   66757                                 Condition condition((instr >> 28) & 0xf);
   66758                                 unsigned rd = ExtractSRegister(instr, 22, 12);
   66759                                 unsigned rm = ExtractSRegister(instr, 5, 0);
   66760                                 // VRINTX{<c>}{<q>}.F32.F32 <Sd>, <Sm> ; A1
   66761                                 vrintx(condition,
   66762                                        F32,
   66763                                        F32,
   66764                                        SRegister(rd),
   66765                                        SRegister(rm));
   66766                                 break;
   66767                               }
   66768                               case 0x00010080: {
   66769                                 // 0x0eb70ac0
   66770                                 if (((instr & 0xf0000000) == 0xf0000000)) {
   66771                                   UnallocatedA32(instr);
   66772                                   return;
   66773                                 }
   66774                                 Condition condition((instr >> 28) & 0xf);
   66775                                 unsigned rd = ExtractDRegister(instr, 22, 12);
   66776                                 unsigned rm = ExtractSRegister(instr, 5, 0);
   66777                                 // VCVT{<c>}{<q>}.F64.F32 <Dd>, <Sm> ; A1
   66778                                 vcvt(condition,
   66779                                      F64,
   66780                                      F32,
   66781                                      DRegister(rd),
   66782                                      SRegister(rm));
   66783                                 break;
   66784                               }
   66785                             }
   66786                             break;
   66787                           }
   66788                           case 0x00080000: {
   66789                             // 0x0eb80a40
   66790                             if ((instr & 0x00010000) == 0x00000000) {
   66791                               if (((instr & 0xf0000000) == 0xf0000000)) {
   66792                                 UnallocatedA32(instr);
   66793                                 return;
   66794                               }
   66795                               Condition condition((instr >> 28) & 0xf);
   66796                               DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
   66797                               if (dt.Is(kDataTypeValueInvalid)) {
   66798                                 UnallocatedA32(instr);
   66799                                 return;
   66800                               }
   66801                               unsigned rd = ExtractSRegister(instr, 22, 12);
   66802                               unsigned rm = ExtractSRegister(instr, 5, 0);
   66803                               // VCVT{<c>}{<q>}.F32.<dt> <Sd>, <Sm> ; A1
   66804                               vcvt(condition,
   66805                                    F32,
   66806                                    dt,
   66807                                    SRegister(rd),
   66808                                    SRegister(rm));
   66809                             } else {
   66810                               UnallocatedA32(instr);
   66811                             }
   66812                             break;
   66813                           }
   66814                           case 0x000a0000: {
   66815                             // 0x0eba0a40
   66816                             if (((instr & 0xf0000000) == 0xf0000000)) {
   66817                               UnallocatedA32(instr);
   66818                               return;
   66819                             }
   66820                             Condition condition((instr >> 28) & 0xf);
   66821                             DataType dt = Dt_U_sx_1_Decode(
   66822                                 ((instr >> 7) & 0x1) | ((instr >> 15) & 0x2));
   66823                             if (dt.Is(kDataTypeValueInvalid)) {
   66824                               UnallocatedA32(instr);
   66825                               return;
   66826                             }
   66827                             unsigned rd = ExtractSRegister(instr, 22, 12);
   66828                             unsigned offset = 32;
   66829                             if (dt.Is(S16) || dt.Is(U16)) {
   66830                               offset = 16;
   66831                             }
   66832                             uint32_t fbits = offset - (((instr >> 5) & 0x1) |
   66833                                                        ((instr << 1) & 0x1e));
   66834                             // VCVT{<c>}{<q>}.F32.<dt> <Sdm>, <Sdm>, #<fbits> ; A1 NOLINT(whitespace/line_length)
   66835                             vcvt(condition,
   66836                                  F32,
   66837                                  dt,
   66838                                  SRegister(rd),
   66839                                  SRegister(rd),
   66840                                  fbits);
   66841                             break;
   66842                           }
   66843                           case 0x000c0000: {
   66844                             // 0x0ebc0a40
   66845                             switch (instr & 0x00010080) {
   66846                               case 0x00000000: {
   66847                                 // 0x0ebc0a40
   66848                                 if (((instr & 0xf0000000) == 0xf0000000)) {
   66849                                   UnallocatedA32(instr);
   66850                                   return;
   66851                                 }
   66852                                 Condition condition((instr >> 28) & 0xf);
   66853                                 unsigned rd = ExtractSRegister(instr, 22, 12);
   66854                                 unsigned rm = ExtractSRegister(instr, 5, 0);
   66855                                 // VCVTR{<c>}{<q>}.U32.F32 <Sd>, <Sm> ; A1
   66856                                 vcvtr(condition,
   66857                                       U32,
   66858                                       F32,
   66859                                       SRegister(rd),
   66860                                       SRegister(rm));
   66861                                 break;
   66862                               }
   66863                               case 0x00000080: {
   66864                                 // 0x0ebc0ac0
   66865                                 if (((instr & 0xf0000000) == 0xf0000000)) {
   66866                                   UnallocatedA32(instr);
   66867                                   return;
   66868                                 }
   66869                                 Condition condition((instr >> 28) & 0xf);
   66870                                 unsigned rd = ExtractSRegister(instr, 22, 12);
   66871                                 unsigned rm = ExtractSRegister(instr, 5, 0);
   66872                                 // VCVT{<c>}{<q>}.U32.F32 <Sd>, <Sm> ; A1
   66873                                 vcvt(condition,
   66874                                      U32,
   66875                                      F32,
   66876                                      SRegister(rd),
   66877                                      SRegister(rm));
   66878                                 break;
   66879                               }
   66880                               case 0x00010000: {
   66881                                 // 0x0ebd0a40
   66882                                 if (((instr & 0xf0000000) == 0xf0000000)) {
   66883                                   UnallocatedA32(instr);
   66884                                   return;
   66885                                 }
   66886                                 Condition condition((instr >> 28) & 0xf);
   66887                                 unsigned rd = ExtractSRegister(instr, 22, 12);
   66888                                 unsigned rm = ExtractSRegister(instr, 5, 0);
   66889                                 // VCVTR{<c>}{<q>}.S32.F32 <Sd>, <Sm> ; A1
   66890                                 vcvtr(condition,
   66891                                       S32,
   66892                                       F32,
   66893                                       SRegister(rd),
   66894                                       SRegister(rm));
   66895                                 break;
   66896                               }
   66897                               case 0x00010080: {
   66898                                 // 0x0ebd0ac0
   66899                                 if (((instr & 0xf0000000) == 0xf0000000)) {
   66900                                   UnallocatedA32(instr);
   66901                                   return;
   66902                                 }
   66903                                 Condition condition((instr >> 28) & 0xf);
   66904                                 unsigned rd = ExtractSRegister(instr, 22, 12);
   66905                                 unsigned rm = ExtractSRegister(instr, 5, 0);
   66906                                 // VCVT{<c>}{<q>}.S32.F32 <Sd>, <Sm> ; A1
   66907                                 vcvt(condition,
   66908                                      S32,
   66909                                      F32,
   66910                                      SRegister(rd),
   66911                                      SRegister(rm));
   66912                                 break;
   66913                               }
   66914                             }
   66915                             break;
   66916                           }
   66917                           case 0x000e0000: {
   66918                             // 0x0ebe0a40
   66919                             if (((instr & 0xf0000000) == 0xf0000000)) {
   66920                               UnallocatedA32(instr);
   66921                               return;
   66922                             }
   66923                             Condition condition((instr >> 28) & 0xf);
   66924                             DataType dt = Dt_U_sx_1_Decode(
   66925                                 ((instr >> 7) & 0x1) | ((instr >> 15) & 0x2));
   66926                             if (dt.Is(kDataTypeValueInvalid)) {
   66927                               UnallocatedA32(instr);
   66928                               return;
   66929                             }
   66930                             unsigned rd = ExtractSRegister(instr, 22, 12);
   66931                             unsigned offset = 32;
   66932                             if (dt.Is(S16) || dt.Is(U16)) {
   66933                               offset = 16;
   66934                             }
   66935                             uint32_t fbits = offset - (((instr >> 5) & 0x1) |
   66936                                                        ((instr << 1) & 0x1e));
   66937                             // VCVT{<c>}{<q>}.<dt>.F32 <Sdm>, <Sdm>, #<fbits> ; A1 NOLINT(whitespace/line_length)
   66938                             vcvt(condition,
   66939                                  dt,
   66940                                  F32,
   66941                                  SRegister(rd),
   66942                                  SRegister(rd),
   66943                                  fbits);
   66944                             break;
   66945                           }
   66946                         }
   66947                         break;
   66948                       }
   66949                       case 0x00b00100: {
   66950                         // 0x0eb00b00
   66951                         if (((instr & 0xf0000000) == 0xf0000000)) {
   66952                           UnallocatedA32(instr);
   66953                           return;
   66954                         }
   66955                         Condition condition((instr >> 28) & 0xf);
   66956                         unsigned rd = ExtractDRegister(instr, 22, 12);
   66957                         uint32_t encoded_imm =
   66958                             (instr & 0xf) | ((instr >> 12) & 0xf0);
   66959                         NeonImmediate imm =
   66960                             ImmediateVFP::Decode<double>(encoded_imm);
   66961                         // VMOV{<c>}{<q>}.F64 <Dd>, #<imm> ; A2
   66962                         vmov(condition, F64, DRegister(rd), imm);
   66963                         if (((instr & 0xfb00ff0) != 0xeb00b00)) {
   66964                           UnpredictableA32(instr);
   66965                         }
   66966                         break;
   66967                       }
   66968                       case 0x00b00140: {
   66969                         // 0x0eb00b40
   66970                         switch (instr & 0x000e0000) {
   66971                           case 0x00000000: {
   66972                             // 0x0eb00b40
   66973                             switch (instr & 0x00010080) {
   66974                               case 0x00000000: {
   66975                                 // 0x0eb00b40
   66976                                 if (((instr & 0xf0000000) == 0xf0000000)) {
   66977                                   UnallocatedA32(instr);
   66978                                   return;
   66979                                 }
   66980                                 Condition condition((instr >> 28) & 0xf);
   66981                                 unsigned rd = ExtractDRegister(instr, 22, 12);
   66982                                 unsigned rm = ExtractDRegister(instr, 5, 0);
   66983                                 // VMOV{<c>}{<q>}.F64 <Dd>, <Dm> ; A2
   66984                                 vmov(condition,
   66985                                      F64,
   66986                                      DRegister(rd),
   66987                                      DRegister(rm));
   66988                                 break;
   66989                               }
   66990                               case 0x00000080: {
   66991                                 // 0x0eb00bc0
   66992                                 if (((instr & 0xf0000000) == 0xf0000000)) {
   66993                                   UnallocatedA32(instr);
   66994                                   return;
   66995                                 }
   66996                                 Condition condition((instr >> 28) & 0xf);
   66997                                 unsigned rd = ExtractDRegister(instr, 22, 12);
   66998                                 unsigned rm = ExtractDRegister(instr, 5, 0);
   66999                                 // VABS{<c>}{<q>}.F64 <Dd>, <Dm> ; A2
   67000                                 vabs(condition,
   67001                                      F64,
   67002                                      DRegister(rd),
   67003                                      DRegister(rm));
   67004                                 break;
   67005                               }
   67006                               case 0x00010000: {
   67007                                 // 0x0eb10b40
   67008                                 if (((instr & 0xf0000000) == 0xf0000000)) {
   67009                                   UnallocatedA32(instr);
   67010                                   return;
   67011                                 }
   67012                                 Condition condition((instr >> 28) & 0xf);
   67013                                 unsigned rd = ExtractDRegister(instr, 22, 12);
   67014                                 unsigned rm = ExtractDRegister(instr, 5, 0);
   67015                                 // VNEG{<c>}{<q>}.F64 <Dd>, <Dm> ; A2
   67016                                 vneg(condition,
   67017                                      F64,
   67018                                      DRegister(rd),
   67019                                      DRegister(rm));
   67020                                 break;
   67021                               }
   67022                               case 0x00010080: {
   67023                                 // 0x0eb10bc0
   67024                                 if (((instr & 0xf0000000) == 0xf0000000)) {
   67025                                   UnallocatedA32(instr);
   67026                                   return;
   67027                                 }
   67028                                 Condition condition((instr >> 28) & 0xf);
   67029                                 unsigned rd = ExtractDRegister(instr, 22, 12);
   67030                                 unsigned rm = ExtractDRegister(instr, 5, 0);
   67031                                 // VSQRT{<c>}{<q>}.F64 <Dd>, <Dm> ; A1
   67032                                 vsqrt(condition,
   67033                                       F64,
   67034                                       DRegister(rd),
   67035                                       DRegister(rm));
   67036                                 break;
   67037                               }
   67038                             }
   67039                             break;
   67040                           }
   67041                           case 0x00020000: {
   67042                             // 0x0eb20b40
   67043                             switch (instr & 0x00010080) {
   67044                               case 0x00000000: {
   67045                                 // 0x0eb20b40
   67046                                 if (((instr & 0xf0000000) == 0xf0000000)) {
   67047                                   UnallocatedA32(instr);
   67048                                   return;
   67049                                 }
   67050                                 Condition condition((instr >> 28) & 0xf);
   67051                                 unsigned rd = ExtractDRegister(instr, 22, 12);
   67052                                 unsigned rm = ExtractSRegister(instr, 5, 0);
   67053                                 // VCVTB{<c>}{<q>}.F64.F16 <Dd>, <Sm> ; A1
   67054                                 vcvtb(condition,
   67055                                       F64,
   67056                                       F16,
   67057                                       DRegister(rd),
   67058                                       SRegister(rm));
   67059                                 break;
   67060                               }
   67061                               case 0x00000080: {
   67062                                 // 0x0eb20bc0
   67063                                 if (((instr & 0xf0000000) == 0xf0000000)) {
   67064                                   UnallocatedA32(instr);
   67065                                   return;
   67066                                 }
   67067                                 Condition condition((instr >> 28) & 0xf);
   67068                                 unsigned rd = ExtractDRegister(instr, 22, 12);
   67069                                 unsigned rm = ExtractSRegister(instr, 5, 0);
   67070                                 // VCVTT{<c>}{<q>}.F64.F16 <Dd>, <Sm> ; A1
   67071                                 vcvtt(condition,
   67072                                       F64,
   67073                                       F16,
   67074                                       DRegister(rd),
   67075                                       SRegister(rm));
   67076                                 break;
   67077                               }
   67078                               case 0x00010000: {
   67079                                 // 0x0eb30b40
   67080                                 if (((instr & 0xf0000000) == 0xf0000000)) {
   67081                                   UnallocatedA32(instr);
   67082                                   return;
   67083                                 }
   67084                                 Condition condition((instr >> 28) & 0xf);
   67085                                 unsigned rd = ExtractSRegister(instr, 22, 12);
   67086                                 unsigned rm = ExtractDRegister(instr, 5, 0);
   67087                                 // VCVTB{<c>}{<q>}.F16.F64 <Sd>, <Dm> ; A1
   67088                                 vcvtb(condition,
   67089                                       F16,
   67090                                       F64,
   67091                                       SRegister(rd),
   67092                                       DRegister(rm));
   67093                                 break;
   67094                               }
   67095                               case 0x00010080: {
   67096                                 // 0x0eb30bc0
   67097                                 if (((instr & 0xf0000000) == 0xf0000000)) {
   67098                                   UnallocatedA32(instr);
   67099                                   return;
   67100                                 }
   67101                                 Condition condition((instr >> 28) & 0xf);
   67102                                 unsigned rd = ExtractSRegister(instr, 22, 12);
   67103                                 unsigned rm = ExtractDRegister(instr, 5, 0);
   67104                                 // VCVTT{<c>}{<q>}.F16.F64 <Sd>, <Dm> ; A1
   67105                                 vcvtt(condition,
   67106                                       F16,
   67107                                       F64,
   67108                                       SRegister(rd),
   67109                                       DRegister(rm));
   67110                                 break;
   67111                               }
   67112                             }
   67113                             break;
   67114                           }
   67115                           case 0x00040000: {
   67116                             // 0x0eb40b40
   67117                             switch (instr & 0x00010080) {
   67118                               case 0x00000000: {
   67119                                 // 0x0eb40b40
   67120                                 if (((instr & 0xf0000000) == 0xf0000000)) {
   67121                                   UnallocatedA32(instr);
   67122                                   return;
   67123                                 }
   67124                                 Condition condition((instr >> 28) & 0xf);
   67125                                 unsigned rd = ExtractDRegister(instr, 22, 12);
   67126                                 unsigned rm = ExtractDRegister(instr, 5, 0);
   67127                                 // VCMP{<c>}{<q>}.F64 <Dd>, <Dm> ; A1
   67128                                 vcmp(condition,
   67129                                      F64,
   67130                                      DRegister(rd),
   67131                                      DRegister(rm));
   67132                                 break;
   67133                               }
   67134                               case 0x00000080: {
   67135                                 // 0x0eb40bc0
   67136                                 if (((instr & 0xf0000000) == 0xf0000000)) {
   67137                                   UnallocatedA32(instr);
   67138                                   return;
   67139                                 }
   67140                                 Condition condition((instr >> 28) & 0xf);
   67141                                 unsigned rd = ExtractDRegister(instr, 22, 12);
   67142                                 unsigned rm = ExtractDRegister(instr, 5, 0);
   67143                                 // VCMPE{<c>}{<q>}.F64 <Dd>, <Dm> ; A1
   67144                                 vcmpe(condition,
   67145                                       F64,
   67146                                       DRegister(rd),
   67147                                       DRegister(rm));
   67148                                 break;
   67149                               }
   67150                               case 0x00010000: {
   67151                                 // 0x0eb50b40
   67152                                 if (((instr & 0xf0000000) == 0xf0000000)) {
   67153                                   UnallocatedA32(instr);
   67154                                   return;
   67155                                 }
   67156                                 Condition condition((instr >> 28) & 0xf);
   67157                                 unsigned rd = ExtractDRegister(instr, 22, 12);
   67158                                 // VCMP{<c>}{<q>}.F64 <Dd>, #0.0 ; A2
   67159                                 vcmp(condition, F64, DRegister(rd), 0.0);
   67160                                 if (((instr & 0xfbf0fff) != 0xeb50b40)) {
   67161                                   UnpredictableA32(instr);
   67162                                 }
   67163                                 break;
   67164                               }
   67165                               case 0x00010080: {
   67166                                 // 0x0eb50bc0
   67167                                 if (((instr & 0xf0000000) == 0xf0000000)) {
   67168                                   UnallocatedA32(instr);
   67169                                   return;
   67170                                 }
   67171                                 Condition condition((instr >> 28) & 0xf);
   67172                                 unsigned rd = ExtractDRegister(instr, 22, 12);
   67173                                 // VCMPE{<c>}{<q>}.F64 <Dd>, #0.0 ; A2
   67174                                 vcmpe(condition, F64, DRegister(rd), 0.0);
   67175                                 if (((instr & 0xfbf0fff) != 0xeb50bc0)) {
   67176                                   UnpredictableA32(instr);
   67177                                 }
   67178                                 break;
   67179                               }
   67180                             }
   67181                             break;
   67182                           }
   67183                           case 0x00060000: {
   67184                             // 0x0eb60b40
   67185                             switch (instr & 0x00010080) {
   67186                               case 0x00000000: {
   67187                                 // 0x0eb60b40
   67188                                 if (((instr & 0xf0000000) == 0xf0000000)) {
   67189                                   UnallocatedA32(instr);
   67190                                   return;
   67191                                 }
   67192                                 Condition condition((instr >> 28) & 0xf);
   67193                                 unsigned rd = ExtractDRegister(instr, 22, 12);
   67194                                 unsigned rm = ExtractDRegister(instr, 5, 0);
   67195                                 // VRINTR{<c>}{<q>}.F64.F64 <Dd>, <Dm> ; A1
   67196                                 vrintr(condition,
   67197                                        F64,
   67198                                        F64,
   67199                                        DRegister(rd),
   67200                                        DRegister(rm));
   67201                                 break;
   67202                               }
   67203                               case 0x00000080: {
   67204                                 // 0x0eb60bc0
   67205                                 if (((instr & 0xf0000000) == 0xf0000000)) {
   67206                                   UnallocatedA32(instr);
   67207                                   return;
   67208                                 }
   67209                                 Condition condition((instr >> 28) & 0xf);
   67210                                 unsigned rd = ExtractDRegister(instr, 22, 12);
   67211                                 unsigned rm = ExtractDRegister(instr, 5, 0);
   67212                                 // VRINTZ{<c>}{<q>}.F64.F64 <Dd>, <Dm> ; A1
   67213                                 vrintz(condition,
   67214                                        F64,
   67215                                        F64,
   67216                                        DRegister(rd),
   67217                                        DRegister(rm));
   67218                                 break;
   67219                               }
   67220                               case 0x00010000: {
   67221                                 // 0x0eb70b40
   67222                                 if (((instr & 0xf0000000) == 0xf0000000)) {
   67223                                   UnallocatedA32(instr);
   67224                                   return;
   67225                                 }
   67226                                 Condition condition((instr >> 28) & 0xf);
   67227                                 unsigned rd = ExtractDRegister(instr, 22, 12);
   67228                                 unsigned rm = ExtractDRegister(instr, 5, 0);
   67229                                 // VRINTX{<c>}{<q>}.F64.F64 <Dd>, <Dm> ; A1
   67230                                 vrintx(condition,
   67231                                        F64,
   67232                                        F64,
   67233                                        DRegister(rd),
   67234                                        DRegister(rm));
   67235                                 break;
   67236                               }
   67237                               case 0x00010080: {
   67238                                 // 0x0eb70bc0
   67239                                 if (((instr & 0xf0000000) == 0xf0000000)) {
   67240                                   UnallocatedA32(instr);
   67241                                   return;
   67242                                 }
   67243                                 Condition condition((instr >> 28) & 0xf);
   67244                                 unsigned rd = ExtractSRegister(instr, 22, 12);
   67245                                 unsigned rm = ExtractDRegister(instr, 5, 0);
   67246                                 // VCVT{<c>}{<q>}.F32.F64 <Sd>, <Dm> ; A1
   67247                                 vcvt(condition,
   67248                                      F32,
   67249                                      F64,
   67250                                      SRegister(rd),
   67251                                      DRegister(rm));
   67252                                 break;
   67253                               }
   67254                             }
   67255                             break;
   67256                           }
   67257                           case 0x00080000: {
   67258                             // 0x0eb80b40
   67259                             if ((instr & 0x00010000) == 0x00000000) {
   67260                               if (((instr & 0xf0000000) == 0xf0000000)) {
   67261                                 UnallocatedA32(instr);
   67262                                 return;
   67263                               }
   67264                               Condition condition((instr >> 28) & 0xf);
   67265                               DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
   67266                               if (dt.Is(kDataTypeValueInvalid)) {
   67267                                 UnallocatedA32(instr);
   67268                                 return;
   67269                               }
   67270                               unsigned rd = ExtractDRegister(instr, 22, 12);
   67271                               unsigned rm = ExtractSRegister(instr, 5, 0);
   67272                               // VCVT{<c>}{<q>}.F64.<dt> <Dd>, <Sm> ; A1
   67273                               vcvt(condition,
   67274                                    F64,
   67275                                    dt,
   67276                                    DRegister(rd),
   67277                                    SRegister(rm));
   67278                             } else {
   67279                               UnallocatedA32(instr);
   67280                             }
   67281                             break;
   67282                           }
   67283                           case 0x000a0000: {
   67284                             // 0x0eba0b40
   67285                             if (((instr & 0xf0000000) == 0xf0000000)) {
   67286                               UnallocatedA32(instr);
   67287                               return;
   67288                             }
   67289                             Condition condition((instr >> 28) & 0xf);
   67290                             DataType dt = Dt_U_sx_1_Decode(
   67291                                 ((instr >> 7) & 0x1) | ((instr >> 15) & 0x2));
   67292                             if (dt.Is(kDataTypeValueInvalid)) {
   67293                               UnallocatedA32(instr);
   67294                               return;
   67295                             }
   67296                             unsigned rd = ExtractDRegister(instr, 22, 12);
   67297                             unsigned offset = 32;
   67298                             if (dt.Is(S16) || dt.Is(U16)) {
   67299                               offset = 16;
   67300                             }
   67301                             uint32_t fbits = offset - (((instr >> 5) & 0x1) |
   67302                                                        ((instr << 1) & 0x1e));
   67303                             // VCVT{<c>}{<q>}.F64.<dt> <Ddm>, <Ddm>, #<fbits> ; A1 NOLINT(whitespace/line_length)
   67304                             vcvt(condition,
   67305                                  F64,
   67306                                  dt,
   67307                                  DRegister(rd),
   67308                                  DRegister(rd),
   67309                                  fbits);
   67310                             break;
   67311                           }
   67312                           case 0x000c0000: {
   67313                             // 0x0ebc0b40
   67314                             switch (instr & 0x00010080) {
   67315                               case 0x00000000: {
   67316                                 // 0x0ebc0b40
   67317                                 if (((instr & 0xf0000000) == 0xf0000000)) {
   67318                                   UnallocatedA32(instr);
   67319                                   return;
   67320                                 }
   67321                                 Condition condition((instr >> 28) & 0xf);
   67322                                 unsigned rd = ExtractSRegister(instr, 22, 12);
   67323                                 unsigned rm = ExtractDRegister(instr, 5, 0);
   67324                                 // VCVTR{<c>}{<q>}.U32.F64 <Sd>, <Dm> ; A1
   67325                                 vcvtr(condition,
   67326                                       U32,
   67327                                       F64,
   67328                                       SRegister(rd),
   67329                                       DRegister(rm));
   67330                                 break;
   67331                               }
   67332                               case 0x00000080: {
   67333                                 // 0x0ebc0bc0
   67334                                 if (((instr & 0xf0000000) == 0xf0000000)) {
   67335                                   UnallocatedA32(instr);
   67336                                   return;
   67337                                 }
   67338                                 Condition condition((instr >> 28) & 0xf);
   67339                                 unsigned rd = ExtractSRegister(instr, 22, 12);
   67340                                 unsigned rm = ExtractDRegister(instr, 5, 0);
   67341                                 // VCVT{<c>}{<q>}.U32.F64 <Sd>, <Dm> ; A1
   67342                                 vcvt(condition,
   67343                                      U32,
   67344                                      F64,
   67345                                      SRegister(rd),
   67346                                      DRegister(rm));
   67347                                 break;
   67348                               }
   67349                               case 0x00010000: {
   67350                                 // 0x0ebd0b40
   67351                                 if (((instr & 0xf0000000) == 0xf0000000)) {
   67352                                   UnallocatedA32(instr);
   67353                                   return;
   67354                                 }
   67355                                 Condition condition((instr >> 28) & 0xf);
   67356                                 unsigned rd = ExtractSRegister(instr, 22, 12);
   67357                                 unsigned rm = ExtractDRegister(instr, 5, 0);
   67358                                 // VCVTR{<c>}{<q>}.S32.F64 <Sd>, <Dm> ; A1
   67359                                 vcvtr(condition,
   67360                                       S32,
   67361                                       F64,
   67362                                       SRegister(rd),
   67363                                       DRegister(rm));
   67364                                 break;
   67365                               }
   67366                               case 0x00010080: {
   67367                                 // 0x0ebd0bc0
   67368                                 if (((instr & 0xf0000000) == 0xf0000000)) {
   67369                                   UnallocatedA32(instr);
   67370                                   return;
   67371                                 }
   67372                                 Condition condition((instr >> 28) & 0xf);
   67373                                 unsigned rd = ExtractSRegister(instr, 22, 12);
   67374                                 unsigned rm = ExtractDRegister(instr, 5, 0);
   67375                                 // VCVT{<c>}{<q>}.S32.F64 <Sd>, <Dm> ; A1
   67376                                 vcvt(condition,
   67377                                      S32,
   67378                                      F64,
   67379                                      SRegister(rd),
   67380                                      DRegister(rm));
   67381                                 break;
   67382                               }
   67383                             }
   67384                             break;
   67385                           }
   67386                           case 0x000e0000: {
   67387                             // 0x0ebe0b40
   67388                             if (((instr & 0xf0000000) == 0xf0000000)) {
   67389                               UnallocatedA32(instr);
   67390                               return;
   67391                             }
   67392                             Condition condition((instr >> 28) & 0xf);
   67393                             DataType dt = Dt_U_sx_1_Decode(
   67394                                 ((instr >> 7) & 0x1) | ((instr >> 15) & 0x2));
   67395                             if (dt.Is(kDataTypeValueInvalid)) {
   67396                               UnallocatedA32(instr);
   67397                               return;
   67398                             }
   67399                             unsigned rd = ExtractDRegister(instr, 22, 12);
   67400                             unsigned offset = 32;
   67401                             if (dt.Is(S16) || dt.Is(U16)) {
   67402                               offset = 16;
   67403                             }
   67404                             uint32_t fbits = offset - (((instr >> 5) & 0x1) |
   67405                                                        ((instr << 1) & 0x1e));
   67406                             // VCVT{<c>}{<q>}.<dt>.F64 <Ddm>, <Ddm>, #<fbits> ; A1 NOLINT(whitespace/line_length)
   67407                             vcvt(condition,
   67408                                  dt,
   67409                                  F64,
   67410                                  DRegister(rd),
   67411                                  DRegister(rd),
   67412                                  fbits);
   67413                             break;
   67414                           }
   67415                         }
   67416                         break;
   67417                       }
   67418                       default:
   67419                         UnallocatedA32(instr);
   67420                         break;
   67421                     }
   67422                     break;
   67423                   }
   67424                   default: {
   67425                     if (((instr & 0xf0000000) == 0xf0000000) ||
   67426                         ((instr & 0xe00) == 0xa00)) {
   67427                       UnallocatedA32(instr);
   67428                       return;
   67429                     }
   67430                     UnimplementedA32("CDP", instr);
   67431                     break;
   67432                   }
   67433                 }
   67434                 break;
   67435               }
   67436               case 0x00000010: {
   67437                 // 0x0e000010
   67438                 switch (instr & 0x00100000) {
   67439                   case 0x00000000: {
   67440                     // 0x0e000010
   67441                     switch (instr & 0x00000e00) {
   67442                       case 0x00000a00: {
   67443                         // 0x0e000a10
   67444                         switch (instr & 0x00800100) {
   67445                           case 0x00000000: {
   67446                             // 0x0e000a10
   67447                             if ((instr & 0x00600000) == 0x00000000) {
   67448                               if (((instr & 0xf0000000) == 0xf0000000)) {
   67449                                 UnallocatedA32(instr);
   67450                                 return;
   67451                               }
   67452                               Condition condition((instr >> 28) & 0xf);
   67453                               unsigned rn = ExtractSRegister(instr, 7, 16);
   67454                               unsigned rt = (instr >> 12) & 0xf;
   67455                               // VMOV{<c>}{<q>} <Sn>, <Rt> ; A1
   67456                               vmov(condition, SRegister(rn), Register(rt));
   67457                               if (((instr & 0xff00f7f) != 0xe000a10)) {
   67458                                 UnpredictableA32(instr);
   67459                               }
   67460                             } else {
   67461                               UnallocatedA32(instr);
   67462                             }
   67463                             break;
   67464                           }
   67465                           case 0x00000100: {
   67466                             // 0x0e000b10
   67467                             if (((instr & 0xf0000000) == 0xf0000000)) {
   67468                               UnallocatedA32(instr);
   67469                               return;
   67470                             }
   67471                             Condition condition((instr >> 28) & 0xf);
   67472                             unsigned lane;
   67473                             DataType dt =
   67474                                 Dt_opc1_opc2_1_Decode(((instr >> 5) & 0x3) |
   67475                                                           ((instr >> 19) & 0xc),
   67476                                                       &lane);
   67477                             if (dt.Is(kDataTypeValueInvalid)) {
   67478                               UnallocatedA32(instr);
   67479                               return;
   67480                             }
   67481                             unsigned rd = ExtractDRegister(instr, 7, 16);
   67482                             unsigned rt = (instr >> 12) & 0xf;
   67483                             // VMOV{<c>}{<q>}{.<size>} <Dd[x]>, <Rt> ; A1
   67484                             vmov(condition,
   67485                                  dt,
   67486                                  DRegisterLane(rd, lane),
   67487                                  Register(rt));
   67488                             if (((instr & 0xf900f1f) != 0xe000b10)) {
   67489                               UnpredictableA32(instr);
   67490                             }
   67491                             break;
   67492                           }
   67493                           case 0x00800000: {
   67494                             // 0x0e800a10
   67495                             if ((instr & 0x00600000) == 0x00600000) {
   67496                               if (((instr & 0xf0000000) == 0xf0000000)) {
   67497                                 UnallocatedA32(instr);
   67498                                 return;
   67499                               }
   67500                               Condition condition((instr >> 28) & 0xf);
   67501                               unsigned spec_reg = (instr >> 16) & 0xf;
   67502                               unsigned rt = (instr >> 12) & 0xf;
   67503                               switch (spec_reg) {
   67504                                 case 0x0:
   67505                                 case 0x1:
   67506                                 case 0x8: {
   67507                                   // VMSR{<c>}{<q>} <spec_reg>, <Rt> ; A1
   67508                                   vmsr(condition,
   67509                                        SpecialFPRegister(spec_reg),
   67510                                        Register(rt));
   67511                                   if (((instr & 0xff00fff) != 0xee00a10)) {
   67512                                     UnpredictableA32(instr);
   67513                                   }
   67514                                   break;
   67515                                 }
   67516                                 default:
   67517                                   UnallocatedA32(instr);
   67518                                   break;
   67519                               }
   67520                             } else {
   67521                               UnallocatedA32(instr);
   67522                             }
   67523                             break;
   67524                           }
   67525                           case 0x00800100: {
   67526                             // 0x0e800b10
   67527                             switch (instr & 0x00200040) {
   67528                               case 0x00000000: {
   67529                                 // 0x0e800b10
   67530                                 if (((instr & 0xf0000000) == 0xf0000000)) {
   67531                                   UnallocatedA32(instr);
   67532                                   return;
   67533                                 }
   67534                                 Condition condition((instr >> 28) & 0xf);
   67535                                 DataType dt =
   67536                                     Dt_B_E_1_Decode(((instr >> 5) & 0x1) |
   67537                                                     ((instr >> 21) & 0x2));
   67538                                 if (dt.Is(kDataTypeValueInvalid)) {
   67539                                   UnallocatedA32(instr);
   67540                                   return;
   67541                                 }
   67542                                 unsigned rd = ExtractDRegister(instr, 7, 16);
   67543                                 unsigned rt = (instr >> 12) & 0xf;
   67544                                 // VDUP{<c>}{<q>}.<dt> <Dd>, <Rt> ; A1
   67545                                 vdup(condition,
   67546                                      dt,
   67547                                      DRegister(rd),
   67548                                      Register(rt));
   67549                                 if (((instr & 0xfb00f5f) != 0xe800b10)) {
   67550                                   UnpredictableA32(instr);
   67551                                 }
   67552                                 break;
   67553                               }
   67554                               case 0x00200000: {
   67555                                 // 0x0ea00b10
   67556                                 if (((instr & 0xf0000000) == 0xf0000000)) {
   67557                                   UnallocatedA32(instr);
   67558                                   return;
   67559                                 }
   67560                                 Condition condition((instr >> 28) & 0xf);
   67561                                 DataType dt =
   67562                                     Dt_B_E_1_Decode(((instr >> 5) & 0x1) |
   67563                                                     ((instr >> 21) & 0x2));
   67564                                 if (dt.Is(kDataTypeValueInvalid)) {
   67565                                   UnallocatedA32(instr);
   67566                                   return;
   67567                                 }
   67568                                 if (((instr >> 16) & 1) != 0) {
   67569                                   UnallocatedA32(instr);
   67570                                   return;
   67571                                 }
   67572                                 unsigned rd = ExtractQRegister(instr, 7, 16);
   67573                                 unsigned rt = (instr >> 12) & 0xf;
   67574                                 // VDUP{<c>}{<q>}.<dt> <Qd>, <Rt> ; A1
   67575                                 vdup(condition,
   67576                                      dt,
   67577                                      QRegister(rd),
   67578                                      Register(rt));
   67579                                 if (((instr & 0xfb00f5f) != 0xea00b10)) {
   67580                                   UnpredictableA32(instr);
   67581                                 }
   67582                                 break;
   67583                               }
   67584                               default:
   67585                                 UnallocatedA32(instr);
   67586                                 break;
   67587                             }
   67588                             break;
   67589                           }
   67590                         }
   67591                         break;
   67592                       }
   67593                       default: {
   67594                         if (((instr & 0xf0000000) == 0xf0000000) ||
   67595                             ((instr & 0xe00) == 0xa00)) {
   67596                           UnallocatedA32(instr);
   67597                           return;
   67598                         }
   67599                         UnimplementedA32("MCR", instr);
   67600                         break;
   67601                       }
   67602                     }
   67603                     break;
   67604                   }
   67605                   case 0x00100000: {
   67606                     // 0x0e100010
   67607                     switch (instr & 0x00000e00) {
   67608                       case 0x00000a00: {
   67609                         // 0x0e100a10
   67610                         switch (instr & 0x00000100) {
   67611                           case 0x00000000: {
   67612                             // 0x0e100a10
   67613                             switch (instr & 0x00e00000) {
   67614                               case 0x00000000: {
   67615                                 // 0x0e100a10
   67616                                 if (((instr & 0xf0000000) == 0xf0000000)) {
   67617                                   UnallocatedA32(instr);
   67618                                   return;
   67619                                 }
   67620                                 Condition condition((instr >> 28) & 0xf);
   67621                                 unsigned rt = (instr >> 12) & 0xf;
   67622                                 unsigned rn = ExtractSRegister(instr, 7, 16);
   67623                                 // VMOV{<c>}{<q>} <Rt>, <Sn> ; A1
   67624                                 vmov(condition, Register(rt), SRegister(rn));
   67625                                 if (((instr & 0xff00f7f) != 0xe100a10)) {
   67626                                   UnpredictableA32(instr);
   67627                                 }
   67628                                 break;
   67629                               }
   67630                               case 0x00e00000: {
   67631                                 // 0x0ef00a10
   67632                                 if (((instr & 0xf0000000) == 0xf0000000)) {
   67633                                   UnallocatedA32(instr);
   67634                                   return;
   67635                                 }
   67636                                 Condition condition((instr >> 28) & 0xf);
   67637                                 unsigned rt = (instr >> 12) & 0xf;
   67638                                 unsigned spec_reg = (instr >> 16) & 0xf;
   67639                                 switch (spec_reg) {
   67640                                   case 0x0:
   67641                                   case 0x1:
   67642                                   case 0x5:
   67643                                   case 0x6:
   67644                                   case 0x7:
   67645                                   case 0x8: {
   67646                                     // VMRS{<c>}{<q>} <Rt>, <spec_reg> ; A1
   67647                                     vmrs(condition,
   67648                                          RegisterOrAPSR_nzcv(rt),
   67649                                          SpecialFPRegister(spec_reg));
   67650                                     if (((instr & 0xff00fff) != 0xef00a10)) {
   67651                                       UnpredictableA32(instr);
   67652                                     }
   67653                                     break;
   67654                                   }
   67655                                   default:
   67656                                     UnallocatedA32(instr);
   67657                                     break;
   67658                                 }
   67659                                 break;
   67660                               }
   67661                               default:
   67662                                 UnallocatedA32(instr);
   67663                                 break;
   67664                             }
   67665                             break;
   67666                           }
   67667                           case 0x00000100: {
   67668                             // 0x0e100b10
   67669                             if (((instr & 0xf0000000) == 0xf0000000)) {
   67670                               UnallocatedA32(instr);
   67671                               return;
   67672                             }
   67673                             Condition condition((instr >> 28) & 0xf);
   67674                             unsigned lane;
   67675                             DataType dt =
   67676                                 Dt_U_opc1_opc2_1_Decode(((instr >> 5) & 0x3) |
   67677                                                             ((instr >> 19) &
   67678                                                              0xc) |
   67679                                                             ((instr >> 19) &
   67680                                                              0x10),
   67681                                                         &lane);
   67682                             if (dt.Is(kDataTypeValueInvalid)) {
   67683                               UnallocatedA32(instr);
   67684                               return;
   67685                             }
   67686                             unsigned rt = (instr >> 12) & 0xf;
   67687                             unsigned rn = ExtractDRegister(instr, 7, 16);
   67688                             // VMOV{<c>}{<q>}{.<dt>} <Rt>, <Dn[x]> ; A1
   67689                             vmov(condition,
   67690                                  dt,
   67691                                  Register(rt),
   67692                                  DRegisterLane(rn, lane));
   67693                             if (((instr & 0xf100f1f) != 0xe100b10)) {
   67694                               UnpredictableA32(instr);
   67695                             }
   67696                             break;
   67697                           }
   67698                         }
   67699                         break;
   67700                       }
   67701                       default: {
   67702                         if (((instr & 0xf0000000) == 0xf0000000) ||
   67703                             ((instr & 0xe00) == 0xa00)) {
   67704                           UnallocatedA32(instr);
   67705                           return;
   67706                         }
   67707                         UnimplementedA32("MRC", instr);
   67708                         break;
   67709                       }
   67710                     }
   67711                     break;
   67712                   }
   67713                 }
   67714                 break;
   67715               }
   67716             }
   67717             break;
   67718           }
   67719           case 0x01000000: {
   67720             // 0x0f000000
   67721             if (((instr & 0xf0000000) == 0xf0000000)) {
   67722               UnallocatedA32(instr);
   67723               return;
   67724             }
   67725             Condition condition((instr >> 28) & 0xf);
   67726             uint32_t imm = instr & 0xffffff;
   67727             // SVC{<c>}{<q>} {#}<imm> ; A1
   67728             svc(condition, imm);
   67729             break;
   67730           }
   67731         }
   67732         break;
   67733       }
   67734     }
   67735   }
   67736 }  // NOLINT(readability/fn_size)
   67737 // End of generated code.
   67738 
   67739 const uint16_t* PrintDisassembler::DecodeT32At(
   67740     const uint16_t* instruction_address, const uint16_t* buffer_end) {
   67741   uint32_t instruction = *instruction_address++ << 16;
   67742 
   67743   if (instruction >= kLowestT32_32Opcode) {
   67744     if (instruction_address >= buffer_end) {
   67745       os() << "?\n";
   67746       return instruction_address;
   67747     }
   67748     instruction |= *instruction_address++;
   67749   }
   67750 
   67751   DecodeT32(instruction);
   67752   return instruction_address;
   67753 }
   67754 
   67755 void PrintDisassembler::DecodeT32(uint32_t instruction) {
   67756   PrintCodeAddress(GetCodeAddress());
   67757   if (T32Size(instruction) == 2) {
   67758     PrintOpcode16(instruction >> 16);
   67759     Disassembler::DecodeT32(instruction);
   67760   } else {
   67761     PrintOpcode32(instruction);
   67762     Disassembler::DecodeT32(instruction);
   67763   }
   67764   os() << "\n";
   67765 }
   67766 
   67767 
   67768 void PrintDisassembler::DecodeA32(uint32_t instruction) {
   67769   PrintCodeAddress(GetCodeAddress());
   67770   PrintOpcode32(instruction);
   67771   Disassembler::DecodeA32(instruction);
   67772   os() << "\n";
   67773 }
   67774 
   67775 
   67776 void PrintDisassembler::DisassembleA32Buffer(const uint32_t* buffer,
   67777                                              size_t size_in_bytes) {
   67778   VIXL_ASSERT(IsAligned<sizeof(buffer[0])>(buffer));
   67779   VIXL_ASSERT(IsMultiple<sizeof(buffer[0])>(size_in_bytes));
   67780   const uint32_t* const end_buffer =
   67781       buffer + (size_in_bytes / sizeof(uint32_t));
   67782   while (buffer < end_buffer) {
   67783     DecodeA32(*buffer++);
   67784   }
   67785 }
   67786 
   67787 
   67788 void PrintDisassembler::DisassembleT32Buffer(const uint16_t* buffer,
   67789                                              size_t size_in_bytes) {
   67790   VIXL_ASSERT(IsAligned<sizeof(buffer[0])>(buffer));
   67791   VIXL_ASSERT(IsMultiple<sizeof(buffer[0])>(size_in_bytes));
   67792   const uint16_t* const end_buffer =
   67793       buffer + (size_in_bytes / sizeof(uint16_t));
   67794   while (buffer < end_buffer) {
   67795     buffer = DecodeT32At(buffer, end_buffer);
   67796   }
   67797   VIXL_ASSERT(buffer == end_buffer);
   67798 }
   67799 
   67800 }  // namespace aarch32
   67801 }  // namespace vixl
   67802